| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h" | 5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/mac_util.h" | 7 #include "base/mac/mac_util.h" |
| 8 #include "base/sys_string_conversions.h" | 8 #include "base/sys_string_conversions.h" |
| 9 #include "chrome/browser/bookmarks/bookmark_model.h" | 9 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 10 #include "chrome/browser/bookmarks/bookmark_utils.h" | 10 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 } | 451 } |
| 452 // Unhappy; do the best we can. | 452 // Unhappy; do the best we can. |
| 453 return NSMaxX([[[self window] screen] frame]) - windowWidth; | 453 return NSMaxX([[[self window] screen] frame]) - windowWidth; |
| 454 } | 454 } |
| 455 | 455 |
| 456 | 456 |
| 457 // Compute and return the top left point of our window (screen | 457 // Compute and return the top left point of our window (screen |
| 458 // coordinates). The top left is positioned in a manner similar to | 458 // coordinates). The top left is positioned in a manner similar to |
| 459 // cascading menus. Windows may grow to either the right or left of | 459 // cascading menus. Windows may grow to either the right or left of |
| 460 // their parent (if a sub-folder) so we need to know |windowWidth|. | 460 // their parent (if a sub-folder) so we need to know |windowWidth|. |
| 461 - (NSPoint)windowTopLeftForWidth:(int)windowWidth height:(int)windowHeight { | 461 - (NSPoint)windowTopLeftForWidth:(int)windowWidth { |
| 462 CGFloat kMinSqueezedMenuHeight = bookmarks::kBookmarkFolderButtonHeight * 2.0; | |
| 463 NSPoint newWindowTopLeft; | 462 NSPoint newWindowTopLeft; |
| 464 if (![parentController_ isKindOfClass:[self class]]) { | 463 if (![parentController_ isKindOfClass:[self class]]) { |
| 465 // If we're not popping up from one of ourselves, we must be | 464 // If we're not popping up from one of ourselves, we must be |
| 466 // popping up from the bookmark bar itself. In this case, start | 465 // popping up from the bookmark bar itself. In this case, start |
| 467 // BELOW the parent button. Our left is the button left; our top | 466 // BELOW the parent button. Our left is the button left; our top |
| 468 // is bottom of button's parent view. | 467 // is bottom of button's parent view. |
| 469 NSPoint buttonBottomLeftInScreen = | 468 NSPoint buttonBottomLeftInScreen = |
| 470 [[parentButton_ window] | 469 [[parentButton_ window] |
| 471 convertBaseToScreen:[parentButton_ | 470 convertBaseToScreen:[parentButton_ |
| 472 convertPoint:NSZeroPoint toView:nil]]; | 471 convertPoint:NSZeroPoint toView:nil]]; |
| 473 NSPoint bookmarkBarBottomLeftInScreen = | 472 NSPoint bookmarkBarBottomLeftInScreen = |
| 474 [[parentButton_ window] | 473 [[parentButton_ window] |
| 475 convertBaseToScreen:[[parentButton_ superview] | 474 convertBaseToScreen:[[parentButton_ superview] |
| 476 convertPoint:NSZeroPoint toView:nil]]; | 475 convertPoint:NSZeroPoint toView:nil]]; |
| 477 newWindowTopLeft = NSMakePoint( | 476 newWindowTopLeft = NSMakePoint( |
| 478 buttonBottomLeftInScreen.x + bookmarks::kBookmarkBarButtonOffset, | 477 buttonBottomLeftInScreen.x + bookmarks::kBookmarkBarButtonOffset, |
| 479 bookmarkBarBottomLeftInScreen.y + bookmarks::kBookmarkBarMenuOffset); | 478 bookmarkBarBottomLeftInScreen.y + bookmarks::kBookmarkBarMenuOffset); |
| 480 // Make sure the window is on-screen; if not, push left. It is | 479 // Make sure the window is on-screen; if not, push left. It is |
| 481 // intentional that top level folders "push left" slightly | 480 // intentional that top level folders "push left" slightly |
| 482 // different than subfolders. | 481 // different than subfolders. |
| 483 NSRect screenFrame = [[[parentButton_ window] screen] frame]; | 482 NSRect screenFrame = [[[parentButton_ window] screen] frame]; |
| 484 CGFloat spillOff = (newWindowTopLeft.x + windowWidth) - NSMaxX(screenFrame); | 483 CGFloat spillOff = (newWindowTopLeft.x + windowWidth) - NSMaxX(screenFrame); |
| 485 if (spillOff > 0.0) { | 484 if (spillOff > 0.0) { |
| 486 newWindowTopLeft.x = std::max(newWindowTopLeft.x - spillOff, | 485 newWindowTopLeft.x = std::max(newWindowTopLeft.x - spillOff, |
| 487 NSMinX(screenFrame)); | 486 NSMinX(screenFrame)); |
| 488 } | 487 } |
| 489 // The menu looks bad when it is squeezed up against the bottom of the | |
| 490 // screen and ends up being only a few pixels tall. If it meets the | |
| 491 // threshold for this case, instead show the menu above the button. | |
| 492 NSRect visFrame = [[[parentButton_ window] screen] visibleFrame]; | |
| 493 CGFloat availableVerticalSpace = newWindowTopLeft.y - | |
| 494 (NSMinY(visFrame) + bookmarks::kScrollWindowVerticalMargin); | |
| 495 if ((availableVerticalSpace < kMinSqueezedMenuHeight) && | |
| 496 (windowHeight > availableVerticalSpace)) { | |
| 497 newWindowTopLeft.y = std::min( | |
| 498 newWindowTopLeft.y + windowHeight + NSHeight([parentButton_ frame]), | |
| 499 NSMaxY(visFrame)); | |
| 500 } | |
| 501 } else { | 488 } else { |
| 502 // Parent is a folder: expose as much as we can vertically; grow right/left. | 489 // Parent is a folder: expose as much as we can vertically; grow right/left. |
| 503 newWindowTopLeft.x = [self childFolderWindowLeftForWidth:windowWidth]; | 490 newWindowTopLeft.x = [self childFolderWindowLeftForWidth:windowWidth]; |
| 504 NSPoint topOfWindow = NSMakePoint(0, | 491 NSPoint topOfWindow = NSMakePoint(0, |
| 505 NSMaxY([parentButton_ frame]) - | 492 NSMaxY([parentButton_ frame]) - |
| 506 bookmarks::kBookmarkVerticalPadding); | 493 bookmarks::kBookmarkVerticalPadding); |
| 507 topOfWindow = [[parentButton_ window] | 494 topOfWindow = [[parentButton_ window] |
| 508 convertBaseToScreen:[[parentButton_ superview] | 495 convertBaseToScreen:[[parentButton_ superview] |
| 509 convertPoint:topOfWindow toView:nil]]; | 496 convertPoint:topOfWindow toView:nil]]; |
| 510 newWindowTopLeft.y = topOfWindow.y; | 497 newWindowTopLeft.y = topOfWindow.y; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 // If the height has changed then also change the origin, and adjust the | 695 // If the height has changed then also change the origin, and adjust the |
| 709 // scroll (if scrolling). | 696 // scroll (if scrolling). |
| 710 if ([self canScrollUp]) { | 697 if ([self canScrollUp]) { |
| 711 NSPoint scrollPoint = [scrollView_ documentVisibleRect].origin; | 698 NSPoint scrollPoint = [scrollView_ documentVisibleRect].origin; |
| 712 scrollPoint.y += deltaMenuHeight; | 699 scrollPoint.y += deltaMenuHeight; |
| 713 [[scrollView_ documentView] scrollPoint:scrollPoint]; | 700 [[scrollView_ documentView] scrollPoint:scrollPoint]; |
| 714 } | 701 } |
| 715 folderFrame.size.height += deltaMenuHeight; | 702 folderFrame.size.height += deltaMenuHeight; |
| 716 [folderView_ setFrameSize:folderFrame.size]; | 703 [folderView_ setFrameSize:folderFrame.size]; |
| 717 CGFloat windowWidth = [self adjustButtonWidths] + padding_; | 704 CGFloat windowWidth = [self adjustButtonWidths] + padding_; |
| 718 NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth | 705 NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth]; |
| 719 height:deltaMenuHeight]; | |
| 720 CGFloat left = newWindowTopLeft.x; | 706 CGFloat left = newWindowTopLeft.x; |
| 721 NSSize newSize = NSMakeSize(windowWidth, deltaMenuHeight); | 707 NSSize newSize = NSMakeSize(windowWidth, deltaMenuHeight); |
| 722 [self adjustWindowLeft:left size:newSize scrollingBy:0.0]; | 708 [self adjustWindowLeft:left size:newSize scrollingBy:0.0]; |
| 723 } | 709 } |
| 724 | 710 |
| 725 // Determine window size and position. | 711 // Determine window size and position. |
| 726 // Create buttons for all our nodes. | 712 // Create buttons for all our nodes. |
| 727 // TODO(jrg): break up into more and smaller routines for easier unit testing. | 713 // TODO(jrg): break up into more and smaller routines for easier unit testing. |
| 728 - (void)configureWindow { | 714 - (void)configureWindow { |
| 729 const BookmarkNode* node = [parentButton_ bookmarkNode]; | 715 const BookmarkNode* node = [parentButton_ bookmarkNode]; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 } | 755 } |
| 770 } | 756 } |
| 771 [self layOutWindowWithHeight:height]; | 757 [self layOutWindowWithHeight:height]; |
| 772 } | 758 } |
| 773 | 759 |
| 774 - (void)layOutWindowWithHeight:(CGFloat)height { | 760 - (void)layOutWindowWithHeight:(CGFloat)height { |
| 775 // Lay out the window by adjusting all button widths to be consistent, then | 761 // Lay out the window by adjusting all button widths to be consistent, then |
| 776 // base the window width on this ideal button width. | 762 // base the window width on this ideal button width. |
| 777 CGFloat buttonWidth = [self adjustButtonWidths]; | 763 CGFloat buttonWidth = [self adjustButtonWidths]; |
| 778 CGFloat windowWidth = buttonWidth + padding_; | 764 CGFloat windowWidth = buttonWidth + padding_; |
| 779 NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth | 765 NSPoint newWindowTopLeft = [self windowTopLeftForWidth:windowWidth]; |
| 780 height:height]; | |
| 781 // Make sure as much of a submenu is exposed (which otherwise would be a | 766 // Make sure as much of a submenu is exposed (which otherwise would be a |
| 782 // problem if the parent button is close to the bottom of the screen). | 767 // problem if the parent button is close to the bottom of the screen). |
| 783 if ([parentController_ isKindOfClass:[self class]]) { | 768 if ([parentController_ isKindOfClass:[self class]]) { |
| 784 CGFloat minimumY = NSMinY([[[self window] screen] visibleFrame]) + | 769 CGFloat minimumY = NSMinY([[[self window] screen] visibleFrame]) + |
| 785 bookmarks::kScrollWindowVerticalMargin + | 770 bookmarks::kScrollWindowVerticalMargin + |
| 786 height; | 771 height; |
| 787 newWindowTopLeft.y = MAX(newWindowTopLeft.y, minimumY); | 772 newWindowTopLeft.y = MAX(newWindowTopLeft.y, minimumY); |
| 788 } | 773 } |
| 789 NSWindow* window = [self window]; | 774 NSWindow* window = [self window]; |
| 790 NSRect windowFrame = NSMakeRect(newWindowTopLeft.x, | 775 NSRect windowFrame = NSMakeRect(newWindowTopLeft.x, |
| (...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1680 | 1665 |
| 1681 - (void)setIgnoreAnimations:(BOOL)ignore { | 1666 - (void)setIgnoreAnimations:(BOOL)ignore { |
| 1682 ignoreAnimations_ = ignore; | 1667 ignoreAnimations_ = ignore; |
| 1683 } | 1668 } |
| 1684 | 1669 |
| 1685 - (BookmarkButton*)buttonThatMouseIsIn { | 1670 - (BookmarkButton*)buttonThatMouseIsIn { |
| 1686 return buttonThatMouseIsIn_; | 1671 return buttonThatMouseIsIn_; |
| 1687 } | 1672 } |
| 1688 | 1673 |
| 1689 @end // BookmarkBarFolderController | 1674 @end // BookmarkBarFolderController |
| OLD | NEW |