Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Unified Diff: chrome/browser/cocoa/browser_window_controller.mm

Issue 495010: Mac: fix/implement app windows (not app mode), popups, drawing; refactor code. (Closed)
Patch Set: Updated per pink's review. Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/cocoa/browser_window_controller.mm
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm
index 3af08161f59e54ffcd90be1da7e5cbd7c61549ec..0d13ce158d6aa7789715c7b1bc406f6d06c86276 100644
--- a/chrome/browser/cocoa/browser_window_controller.mm
+++ b/chrome/browser/cocoa/browser_window_controller.mm
@@ -53,6 +53,25 @@
#include "grit/theme_resources.h"
#import "third_party/GTM/AppKit/GTMTheme.h"
+// ORGANIZATION: This is a big file. It is (in principle) organized as follows
+// (in order):
+// 1. Interfaces, including for our private methods. Very short, one-time-use
+// classes may include an implementation immediately after their interface.
+// 2. The general implementation section, ordered as follows:
+// i. Public methods and overrides.
+// ii. Overrides/implementations of undocumented methods.
+// iii. Delegate methods for various protocols, formal and informal, to which
+// |BrowserWindowController| conforms.
+// 3. The private implementation section (|BrowserWindowController (Private)|).
+// 4. Implementation for |GTMTheme (BrowserThemeProviderInitialization)|.
+//
+// Not all of the above guidelines are followed and more (re-)organization is
+// needed. BUT PLEASE TRY TO KEEP THIS FILE ORGANIZED. I'd rather re-organize as
+// little as possible, since doing so messes up the file's history.
+//
+// TODO(viettrungluu): (re-)organize some more, possibly split into separate
+// files?
+
// Notes on self-inflicted (not user-inflicted) window resizing and moving:
//
// When the bookmark bar goes from hidden to shown (on a non-NTP) page, or when
@@ -127,9 +146,42 @@ willPositionSheet:(NSWindow*)sheet
// Assign a theme to the window.
- (void)setTheme;
-// Repositions the windows subviews.
+// Repositions the window's subviews. From the top down: toolbar, normal
+// bookmark bar (if shown), infobar, NTP detached bookmark bar (if shown),
+// content area, download shelf (if any).
- (void)layoutSubviews;
+// Lays out the toolbar (or just location bar for popups) at the given maximum
+// y-coordinate, with the given width; returns the new maximum y (below the
+// toolbar).
+- (CGFloat)layoutToolbarAtMaxY:(CGFloat)maxY width:(CGFloat)width;
+
+// Lays out the bookmark bar at the given maximum y-coordinate, with the given
+// width; returns the new maximum y (below the bookmark bar). Note that one must
+// call it with the appropriate |maxY| which depends on whether or not the
+// bookmark bar is shown as the NTP bubble or not (use
+// |-placeBookmarkBarBelowInfoBar|).
+- (CGFloat)layoutBookmarkBarAtMaxY:(CGFloat)maxY width:(CGFloat)width;
+
+// Lays out the infobar at the given maximum y-coordinate, with the given width;
+// returns the new maximum y (below the infobar).
+- (CGFloat)layoutInfoBarAtMaxY:(CGFloat)maxY width:(CGFloat)width;
+
+// Returns YES if the bookmark bar should be placed below the infobar, NO
+// otherwise.
+- (BOOL)placeBookmarkBarBelowInfoBar;
+
+// Lays out the download shelf, if there is one, at the given minimum
+// y-coordinate, with the given width; returns the new minimum y (above the
+// download shelf). This is safe to call even if there is no download shelf.
+- (CGFloat)layoutDownloadShelfAtMinY:(CGFloat)minY width:(CGFloat)width;
+
+// Lays out the tab content area between the given minimum and maximum
+// y-coordinates, with the given width.
+- (void)layoutTabContentAreaAtMinY:(CGFloat)minY
+ maxY:(CGFloat)maxY
+ width:(CGFloat)width;
+
// Should we show the normal bookmark bar?
- (BOOL)shouldShowBookmarkBar;
@@ -233,11 +285,8 @@ willPositionSheet:(NSWindow*)sheet
profile:browser->profile()
browser:browser
resizeDelegate:self]);
- // If we are a pop-up, we have a titlebar and no toolbar.
- if (!browser_->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) &&
- browser_->SupportsWindowFeature(Browser::FEATURE_TITLEBAR)) {
- [toolbarController_ setHasToolbar:NO];
- }
+ [toolbarController_ setHasToolbar:[self hasToolbar]
+ hasLocationBar:[self hasLocationBar]];
[[[self window] contentView] addSubview:[toolbarController_ view]];
// Create a sub-controller for the bookmark bar.
@@ -248,18 +297,14 @@ willPositionSheet:(NSWindow*)sheet
delegate:self
resizeDelegate:self]);
- // Add bookmark bar to the view hierarchy. This also triggers the
- // nib load. The bookmark bar is defined (in the nib) to be
- // bottom-aligned to it's parent view (among other things), so
- // position and resize properties don't need to be set.
+ // Add bookmark bar to the view hierarchy, which also triggers the nib load.
+ // The bookmark bar is defined (in the nib) to be bottom-aligned to its
+ // parent view (among other things), so position and resize properties don't
+ // need to be set.
[[[self window] contentView] addSubview:[bookmarkBarController_ view]
positioned:NSWindowBelow
relativeTo:[toolbarController_ view]];
-
- // Disable the bookmark bar if this window doesn't support them.
- if (!browser_->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) {
- [bookmarkBarController_ setBookmarkBarEnabled:NO];
- }
+ [bookmarkBarController_ setBookmarkBarEnabled:[self supportsBookmarkBar]];
// We don't want to try and show the bar before it gets placed in its parent
// view, so this step shoudn't be inside the bookmark bar controller's
@@ -752,7 +797,7 @@ willPositionSheet:(NSWindow*)sheet
NSInteger tag = [item tag];
if (browser_->command_updater()->SupportsCommand(tag)) {
// Generate return value (enabled state)
- enable = browser_->command_updater()->IsCommandEnabled(tag) ? YES : NO;
+ enable = browser_->command_updater()->IsCommandEnabled(tag);
switch (tag) {
case IDC_CLOSE_TAB:
// Disable "close tab" if we're not the key window or if there's only
@@ -809,7 +854,7 @@ willPositionSheet:(NSWindow*)sheet
// for Windows (ToolbarView::ButtonPressed()), this function handles
// both reload button press event and Command+r press event. Thus the
// 'isKindofClass' check is necessary.
- [self locationBar]->Revert();
+ [self locationBarBridge]->Revert();
}
break;
}
@@ -841,8 +886,8 @@ willPositionSheet:(NSWindow*)sheet
return [tabStripController_ sheetController];
}
-- (LocationBar*)locationBar {
- return [toolbarController_ locationBar];
+- (LocationBar*)locationBarBridge {
+ return [toolbarController_ locationBarBridge];
}
- (StatusBubbleMac*)statusBubble {
@@ -1116,9 +1161,7 @@ willPositionSheet:(NSWindow*)sheet
} else {
mac_util::ReleaseFullScreen();
[[[self window] contentView] addSubview:[toolbarController_ view]];
- if (browser_->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) {
- [bookmarkBarController_ setBookmarkBarEnabled:YES];
- }
+ [bookmarkBarController_ setBookmarkBarEnabled:[self supportsBookmarkBar]];
}
// Force a relayout.
@@ -1187,11 +1230,34 @@ willPositionSheet:(NSWindow*)sheet
return base::SysUTF16ToNSString(contents->GetTitle());
}
-// TYPE_POPUP is not normal (e.g. no tab strip)
+- (BOOL)supportsWindowFeature:(int)feature {
+ return browser_->SupportsWindowFeature(
+ static_cast<Browser::WindowFeature>(feature));
+}
+
+// (Override of |TabWindowController| method.)
+- (BOOL)hasTabStrip {
+ return [self supportsWindowFeature:Browser::FEATURE_TABSTRIP];
+}
+
+- (BOOL)hasTitleBar {
+ return [self supportsWindowFeature:Browser::FEATURE_TITLEBAR];
+}
+
+- (BOOL)hasToolbar {
+ return [self supportsWindowFeature:Browser::FEATURE_TOOLBAR];
+}
+
+- (BOOL)hasLocationBar {
+ return [self supportsWindowFeature:Browser::FEATURE_LOCATIONBAR];
+}
+
+- (BOOL)supportsBookmarkBar {
+ return [self supportsWindowFeature:Browser::FEATURE_BOOKMARKBAR];
+}
+
- (BOOL)isNormalWindow {
- if (browser_->type() == Browser::TYPE_NORMAL)
- return YES;
- return NO;
+ return browser_->type() == Browser::TYPE_NORMAL;
}
- (void)selectTabWithContents:(TabContents*)newContents
@@ -1330,6 +1396,68 @@ willPositionSheet:(NSWindow*)sheet
}
}
+// If the browser is in incognito mode, install the image view to decorate
+// the window at the upper right. Use the same base y coordinate as the
+// tab strip.
+- (void)installIncognitoBadge {
+ if (!browser_->profile()->IsOffTheRecord())
+ return;
+ // Don't install if we're not a normal browser (ie, a popup).
+ if (![self isNormalWindow])
+ return;
+
+ static const float kOffset = 4;
+ NSString* incognitoPath = [mac_util::MainAppBundle()
+ pathForResource:@"otr_icon"
+ ofType:@"pdf"];
+ scoped_nsobject<NSImage> incognitoImage(
+ [[NSImage alloc] initWithContentsOfFile:incognitoPath]);
+ const NSSize imageSize = [incognitoImage size];
+ NSRect tabFrame = [[self tabStripView] frame];
+ NSRect incognitoFrame = tabFrame;
+ incognitoFrame.origin.x = NSMaxX(incognitoFrame) - imageSize.width -
+ kOffset;
+ incognitoFrame.size = imageSize;
+ scoped_nsobject<IncognitoImageView> incognitoView(
+ [[IncognitoImageView alloc] initWithFrame:incognitoFrame]);
+ [incognitoView setImage:incognitoImage.get()];
+ [incognitoView setWantsLayer:YES];
+ [incognitoView setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
+ scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]);
+ [shadow.get() setShadowColor:[NSColor colorWithCalibratedWhite:0.0
+ alpha:0.5]];
+ [shadow.get() setShadowOffset:NSMakeSize(0, -1)];
+ [shadow setShadowBlurRadius:2.0];
+ [incognitoView setShadow:shadow];
+
+ // Shrink the tab strip's width so there's no overlap and install the
+ // view.
+ tabFrame.size.width -= incognitoFrame.size.width + kOffset;
+ [[self tabStripView] setFrame:tabFrame];
+ [[[[self window] contentView] superview] addSubview:incognitoView.get()];
+}
+
+// Undocumented method for multi-touch gestures in 10.5. Future OS's will
+// likely add a public API, but the worst that will happen is that this will
+// turn into dead code and just won't get called.
+- (void)swipeWithEvent:(NSEvent*)event {
+ // Map forwards and backwards to history; left is positive, right is negative.
+ unsigned int command = 0;
+ if ([event deltaX] > 0.5)
+ command = IDC_BACK;
+ else if ([event deltaX] < -0.5)
+ command = IDC_FORWARD;
+ else if ([event deltaY] > 0.5)
+ ; // TODO(pinkerton): figure out page-up
+ else if ([event deltaY] < -0.5)
+ ; // TODO(pinkerton): figure out page-down
+
+ // Ensure the command is valid first (ExecuteCommand() won't do that) and
+ // then make it so.
+ if (browser_->command_updater()->IsCommandEnabled(command))
+ browser_->ExecuteCommand(command);
+}
+
// Delegate method called when window is resized.
- (void)windowDidResize:(NSNotification*)notification {
// Resize (and possibly move) the status bubble. Note that we may get called
@@ -1383,6 +1511,13 @@ willPositionSheet:(NSWindow*)sheet
return frameSize;
}
+// Delegate method: see |NSWindowDelegate| protocol.
+- (id)windowWillReturnFieldEditor:(NSWindow*)sender toObject:(id)obj {
+ // Ask the toolbar controller if it wants to return a custom field editor
+ // for the specific object.
+ return [toolbarController_ customFieldEditorForObject:obj];
+}
+
// (Needed for |BookmarkBarControllerDelegate| protocol.)
- (void)bookmarkBar:(BookmarkBarController*)controller
didChangeFromState:(bookmarks::VisualState)oldState
@@ -1428,47 +1563,6 @@ willAnimateFromState:(bookmarks::VisualState)oldState
@implementation BrowserWindowController (Private)
-// If the browser is in incognito mode, install the image view to decorate
-// the window at the upper right. Use the same base y coordinate as the
-// tab strip.
-- (void)installIncognitoBadge {
- if (!browser_->profile()->IsOffTheRecord())
- return;
- // Don't install if we're not a normal browser (ie, a popup).
- if (![self isNormalWindow])
- return;
-
- static const float kOffset = 4;
- NSString* incognitoPath = [mac_util::MainAppBundle()
- pathForResource:@"otr_icon"
- ofType:@"pdf"];
- scoped_nsobject<NSImage> incognitoImage(
- [[NSImage alloc] initWithContentsOfFile:incognitoPath]);
- const NSSize imageSize = [incognitoImage size];
- NSRect tabFrame = [[self tabStripView] frame];
- NSRect incognitoFrame = tabFrame;
- incognitoFrame.origin.x = NSMaxX(incognitoFrame) - imageSize.width -
- kOffset;
- incognitoFrame.size = imageSize;
- scoped_nsobject<IncognitoImageView> incognitoView(
- [[IncognitoImageView alloc] initWithFrame:incognitoFrame]);
- [incognitoView setImage:incognitoImage.get()];
- [incognitoView setWantsLayer:YES];
- [incognitoView setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
- scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]);
- [shadow.get() setShadowColor:[NSColor colorWithCalibratedWhite:0.0
- alpha:0.5]];
- [shadow.get() setShadowOffset:NSMakeSize(0, -1)];
- [shadow setShadowBlurRadius:2.0];
- [incognitoView setShadow:shadow];
-
- // Shrink the tab strip's width so there's no overlap and install the
- // view.
- tabFrame.size.width -= incognitoFrame.size.width + kOffset;
- [[self tabStripView] setFrame:tabFrame];
- [[[[self window] contentView] superview] addSubview:incognitoView.get()];
-}
-
- (void)saveWindowPositionIfNeeded {
if (browser_ != BrowserList::GetLastActive())
return;
@@ -1537,33 +1631,6 @@ willPositionSheet:(NSWindow*)sheet
return defaultSheetRect;
}
-// Undocumented method for multi-touch gestures in 10.5. Future OS's will
-// likely add a public API, but the worst that will happen is that this will
-// turn into dead code and just won't get called.
-- (void)swipeWithEvent:(NSEvent*)event {
- // Map forwards and backwards to history; left is positive, right is negative.
- unsigned int command = 0;
- if ([event deltaX] > 0.5)
- command = IDC_BACK;
- else if ([event deltaX] < -0.5)
- command = IDC_FORWARD;
- else if ([event deltaY] > 0.5)
- ; // TODO(pinkerton): figure out page-up
- else if ([event deltaY] < -0.5)
- ; // TODO(pinkerton): figure out page-down
-
- // Ensure the command is valid first (ExecuteCommand() won't do that) and
- // then make it so.
- if (browser_->command_updater()->IsCommandEnabled(command))
- browser_->ExecuteCommand(command);
-}
-
-- (id)windowWillReturnFieldEditor:(NSWindow*)sender toObject:(id)obj {
- // Ask the toolbar controller if it wants to return a custom field editor
- // for the specific object.
- return [toolbarController_ customFieldEditorForObject:obj];
-}
-
- (void)setTheme {
ThemeProvider* theme_provider = browser_->profile()->GetThemeProvider();
BrowserThemeProvider* browser_theme_provider =
@@ -1577,113 +1644,147 @@ willPositionSheet:(NSWindow*)sheet
}
}
-// Private method to layout browser window subviews. Positions the toolbar and
-// the infobar above the tab content area. Positions the download shelf below
-// the tab content area. If the toolbar is not a child of the contentview, this
-// method will not leave room for it. If we are currently running in fullscreen
-// mode, or if the tabstrip is not a descendant of the window, this method fills
-// the entire content area. Otherwise, this method places the topmost view
-// directly beneath the tabstrip.
- (void)layoutSubviews {
NSWindow* window = [self window];
NSView* contentView = [window contentView];
NSRect contentFrame = [contentView frame];
- int maxY = NSMaxY(contentFrame);
- int minY = NSMinY(contentFrame);
- if (![self isFullscreen] && [self isNormalWindow]) {
+ CGFloat maxY = NSMaxY(contentFrame);
+ CGFloat minY = NSMinY(contentFrame);
+ CGFloat width = NSWidth(contentFrame);
+ if ([self hasTabStrip])
maxY = NSMinY([[self tabStripView] frame]);
- }
DCHECK_GE(maxY, minY);
- // Suppress title drawing for normal windows (popups use normal
- // window title bars).
- if ([window respondsToSelector:@selector(setShouldHideTitle:)]) {
- [(id)window setShouldHideTitle:[self isNormalWindow]];
- }
+ // Suppress title drawing if necessary.
+ if ([window respondsToSelector:@selector(setShouldHideTitle:)])
+ [(id)window setShouldHideTitle:![self hasTitleBar]];
+
+ // Place the toolbar at the top of the reserved area.
+ maxY = [self layoutToolbarAtMaxY:maxY width:width];
+
+ // If we're not displaying the bookmark bar below the infobar, then it goes
+ // immediately below the toolbar.
+ BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar];
+ if (!placeBookmarkBarBelowInfoBar)
+ maxY = [self layoutBookmarkBarAtMaxY:maxY width:width];
+
+ // Place the infobar container in place below the toolbar.
+ maxY = [self layoutInfoBarAtMaxY:maxY width:width];
+
+ // If the bookmark bar is detached, place it at the bottom of the stack.
+ if (placeBookmarkBarBelowInfoBar)
+ maxY = [self layoutBookmarkBarAtMaxY:maxY width:width];
+
+ // Place the download shelf, if any, at the bottom of the view.
+ minY = [self layoutDownloadShelfAtMinY:minY width:width];
- // Place the toolbar at the top of the reserved area, but only if we're not in
- // fullscreen mode.
+ // Finally, the content area takes up all of the remaining space.
+ [self layoutTabContentAreaAtMinY:minY maxY:maxY width:width];
+
+ // Position the find bar relative to the infobar container.
+ [findBarCocoaController_
+ positionFindBarView:[infoBarContainerController_ view]];
+
+ // Place the status bubble at the bottom of the content area.
+ verticalOffsetForStatusBubble_ = minY;
+
+ // Normally, we don't need to tell the toolbar whether or not to show the
+ // divider, but things break down during animation.
+ [toolbarController_
+ setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]];
+}
+
+- (CGFloat)layoutToolbarAtMaxY:(CGFloat)maxY width:(CGFloat)width {
NSView* toolbarView = [toolbarController_ view];
NSRect toolbarFrame = [toolbarView frame];
- if (![self isFullscreen]) {
+ if ([self hasToolbar]) {
// The toolbar is present in the window, so we make room for it.
+ DCHECK(![toolbarView isHidden]);
toolbarFrame.origin.x = 0;
toolbarFrame.origin.y = maxY - NSHeight(toolbarFrame);
- toolbarFrame.size.width = NSWidth(contentFrame);
+ toolbarFrame.size.width = width;
maxY -= NSHeight(toolbarFrame);
+ } else {
+ if ([self hasLocationBar]) {
+ // Location bar is present with no toolbar. Put a border of
+ // |kLocBar...Inset| pixels around the location bar.
+ // TODO(viettrungluu): This is moderately ridiculous. The toolbar should
+ // really be aware of what its height should be (the way the toolbar
+ // compression stuff is currently set up messes things up).
+ DCHECK(![toolbarView isHidden]);
+ // TODO(viettrungluu): We can argue about the "correct" insetting; I like
+ // the following best, though arguably 0 inset is better/more correct.
+ const CGFloat kLocBarLeftRightInset = 1;
+ const CGFloat kLocBarTopInset = 0;
+ const CGFloat kLocBarBottomInset = 1;
+ toolbarFrame.origin.x = kLocBarLeftRightInset;
+ toolbarFrame.origin.y = maxY - NSHeight(toolbarFrame) - kLocBarTopInset;
+ toolbarFrame.size.width = width - 2 * kLocBarLeftRightInset;
+ maxY -= kLocBarTopInset + NSHeight(toolbarFrame) + kLocBarBottomInset;
+ } else {
+ DCHECK([toolbarView isHidden]);
+ }
}
[toolbarView setFrame:toolbarFrame];
+ return maxY;
+}
- // If we are currently displaying the NTP detached bookmark bar or animating
- // to/from it (from/to anything else), we display the bookmark bar below the
- // infobar.
- BOOL placeBookmarkBarBelowInfobar =
- [bookmarkBarController_ isInState:bookmarks::kDetachedState] ||
- [bookmarkBarController_ isAnimatingToState:bookmarks::kDetachedState] ||
- [bookmarkBarController_ isAnimatingFromState:bookmarks::kDetachedState];
+- (CGFloat)layoutBookmarkBarAtMaxY:(CGFloat)maxY width:(CGFloat)width {
+ NSView* bookmarkBarView = [bookmarkBarController_ view];
+ [bookmarkBarView setHidden:NO];
+ NSRect bookmarkBarFrame = [bookmarkBarView frame];
+ bookmarkBarFrame.origin.y = maxY - NSHeight(bookmarkBarFrame);
+ bookmarkBarFrame.size.width = width;
+ [bookmarkBarView setFrame:bookmarkBarFrame];
+ maxY -= NSHeight(bookmarkBarFrame);
- // If we're not displaying the bookmark bar below the infobar, then it goes
- // immediately below the toolbar.
- if (!placeBookmarkBarBelowInfobar) {
- NSView* bookmarkBarView = [bookmarkBarController_ view];
- [bookmarkBarView setHidden:NO];
- NSRect bookmarkBarFrame = [bookmarkBarView frame];
- bookmarkBarFrame.origin.y = maxY - NSHeight(bookmarkBarFrame);
- bookmarkBarFrame.size.width = NSWidth(contentFrame);
- [bookmarkBarView setFrame:bookmarkBarFrame];
- maxY -= NSHeight(bookmarkBarFrame);
- }
+ // TODO(viettrungluu): Does this really belong here? Calling it shouldn't be
+ // necessary in the non-NTP case.
+ [bookmarkBarController_ layoutSubviews];
- // Place the infobar container in place below the toolbar.
+ return maxY;
+}
+
+- (CGFloat)layoutInfoBarAtMaxY:(CGFloat)maxY width:(CGFloat)width {
NSView* infoBarView = [infoBarContainerController_ view];
NSRect infoBarFrame = [infoBarView frame];
infoBarFrame.origin.y = maxY - NSHeight(infoBarFrame);
- infoBarFrame.size.width = NSWidth(contentFrame);
+ infoBarFrame.size.width = width;
[infoBarView setFrame:infoBarFrame];
maxY -= NSHeight(infoBarFrame);
+ return maxY;
+}
- // If the bookmark bar is detached, place it at the bottom of the stack.
- if (placeBookmarkBarBelowInfobar) {
- NSView* bookmarkBarView = [bookmarkBarController_ view];
- [bookmarkBarView setHidden:NO];
- NSRect bookmarkBarFrame = [bookmarkBarView frame];
- bookmarkBarFrame.origin.y = maxY - NSHeight(bookmarkBarFrame);
- bookmarkBarFrame.size.width = NSWidth(contentFrame);
- [bookmarkBarView setFrame:bookmarkBarFrame];
- maxY -= NSHeight(bookmarkBarFrame);
-
- // TODO(viettrungluu): this really doesn't belong here.
- [bookmarkBarController_ layoutSubviews];
- }
+- (BOOL)placeBookmarkBarBelowInfoBar {
+ // If we are currently displaying the NTP detached bookmark bar or animating
+ // to/from it (from/to anything else), we display the bookmark bar below the
+ // infobar.
+ return [bookmarkBarController_ isInState:bookmarks::kDetachedState] ||
+ [bookmarkBarController_ isAnimatingToState:bookmarks::kDetachedState] ||
+ [bookmarkBarController_ isAnimatingFromState:bookmarks::kDetachedState];
+}
- // If there's a download shelf, place it at the bottom of the view.
+- (CGFloat)layoutDownloadShelfAtMinY:(CGFloat)minY width:(CGFloat)width {
if (downloadShelfController_.get()) {
NSView* downloadView = [downloadShelfController_ view];
NSRect downloadFrame = [downloadView frame];
downloadFrame.origin.y = minY;
- downloadFrame.size.width = NSWidth(contentFrame);
+ downloadFrame.size.width = width;
[downloadView setFrame:downloadFrame];
minY += NSHeight(downloadFrame);
}
+ return minY;
+}
- // Finally, the tabContentArea takes up all of the remaining space.
+- (void)layoutTabContentAreaAtMinY:(CGFloat)minY
+ maxY:(CGFloat)maxY
+ width:(CGFloat)width {
NSView* tabContentView = [self tabContentArea];
NSRect tabContentFrame = [tabContentView frame];
tabContentFrame.origin.y = minY;
tabContentFrame.size.height = maxY - minY;
- tabContentFrame.size.width = NSWidth(contentFrame);
+ tabContentFrame.size.width = width;
[tabContentView setFrame:tabContentFrame];
-
- // Position the find bar relative to the infobar container.
- [findBarCocoaController_
- positionFindBarView:[infoBarContainerController_ view]];
-
- verticalOffsetForStatusBubble_ = minY;
-
- // Normally, we don't need to tell the toolbar whether or not to show the
- // divider, but things break down during animation.
- [toolbarController_
- setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]];
}
- (BOOL)shouldShowBookmarkBar {
« no previous file with comments | « chrome/browser/cocoa/browser_window_controller.h ('k') | chrome/browser/cocoa/browser_window_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698