Index: chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm |
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm |
index 73ce5ce87c0c62be5763220118adefc2bda2eb73..0d52daf13853b8fb2777991323f0be51a72a77ca 100644 |
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm |
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm |
@@ -36,6 +36,7 @@ |
#import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" |
#import "chrome/browser/ui/cocoa/gradient_button_cell.h" |
#import "chrome/browser/ui/cocoa/image_button_cell.h" |
+#import "chrome/browser/ui/cocoa/l10n_util.h" |
#import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.h" |
#import "chrome/browser/ui/cocoa/location_bar/location_bar_decoration.h" |
#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
@@ -145,8 +146,9 @@ CGFloat BrowserActionsContainerDelegate::GetMaxAllowedWidth() { |
// Height of the location bar. Used for animating the toolbar in and out when |
// the location bar is displayed stand-alone for bookmark apps. |
+ (CGFloat)locationBarHeight; |
-// Return the amount of left padding that the app menu should have. |
-+ (CGFloat)appMenuLeftPadding; |
+// Return the amount of horizontal padding that the app menu should have on |
+// each side. |
++ (CGFloat)appMenuPadding; |
- (void)cleanUp; |
- (void)addAccessibilityDescriptions; |
- (void)initCommandStatus:(CommandUpdater*)commands; |
@@ -156,7 +158,7 @@ CGFloat BrowserActionsContainerDelegate::GetMaxAllowedWidth() { |
- (CGFloat)baseToolbarHeight; |
- (void)toolbarFrameChanged; |
- (void)showLocationBarOnly; |
-- (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate; |
+- (void)pinLocationBarBeforeBrowserActionsContainerAndAnimate:(BOOL)animate; |
- (void)maintainMinimumLocationBarWidth; |
- (void)adjustBrowserActionsContainerForNewWindow:(NSNotification*)notification; |
- (void)browserActionsContainerDragged:(NSNotification*)notification; |
@@ -236,7 +238,7 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
return kLocationBarHeight; |
} |
-+ (CGFloat)appMenuLeftPadding { |
++ (CGFloat)appMenuPadding { |
return kElementPadding; |
} |
@@ -297,6 +299,14 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
return; |
} |
+ BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout(); |
+ NSAutoresizingMaskOptions leadingButtonMask = |
+ isRTL ? NSViewMinXMargin | NSViewMinYMargin |
+ : NSViewMaxXMargin | NSViewMinYMargin; |
+ NSAutoresizingMaskOptions trailingButtonMask = |
+ isRTL ? NSViewMaxXMargin | NSViewMinYMargin |
+ : NSViewMinXMargin | NSViewMinYMargin; |
+ |
// Make Material Design layout adjustments to the NIB items. |
ToolbarView* toolbarView = [self toolbarView]; |
NSRect toolbarBounds = [toolbarView bounds]; |
@@ -307,30 +317,24 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
frame.size.height = [self baseToolbarHeight]; |
[toolbarView setFrame:frame]; |
- NSRect backButtonFrame = [backButton_ frame]; |
- backButtonFrame.origin.x = kElementPadding + kButtonInset; |
- backButtonFrame.origin.y = |
+ NSArray* leadingButtons = |
+ @[ backButton_, forwardButton_, reloadButton_, homeButton_ ]; |
+ const CGFloat xStart = kElementPadding + kButtonInset; |
+ const CGFloat xOffset = toolbarButtonSize.width + kButtonInset * 2; |
+ const CGFloat yPosition = |
NSMaxY(toolbarBounds) - kElementPadding - toolbarButtonSize.height; |
- backButtonFrame.size = toolbarButtonSize; |
- [backButton_ setFrame:backButtonFrame]; |
- |
- NSRect forwardButtonFrame = [forwardButton_ frame]; |
- forwardButtonFrame.origin.x = NSMaxX(backButtonFrame) + 2 * kButtonInset; |
- forwardButtonFrame.origin.y = backButtonFrame.origin.y; |
- forwardButtonFrame.size = toolbarButtonSize; |
- [forwardButton_ setFrame:forwardButtonFrame]; |
- |
- NSRect reloadButtonFrame = [reloadButton_ frame]; |
- reloadButtonFrame.origin.x = NSMaxX(forwardButtonFrame) + 2 * kButtonInset; |
- reloadButtonFrame.origin.y = forwardButtonFrame.origin.y; |
- reloadButtonFrame.size = toolbarButtonSize; |
- [reloadButton_ setFrame:reloadButtonFrame]; |
- |
- NSRect homeButtonFrame = [homeButton_ frame]; |
- homeButtonFrame.origin.x = NSMaxX(reloadButtonFrame) + 2 * kButtonInset; |
- homeButtonFrame.origin.y = reloadButtonFrame.origin.y; |
- homeButtonFrame.size = toolbarButtonSize; |
- [homeButton_ setFrame:homeButtonFrame]; |
+ for (NSUInteger i = 0; i < [leadingButtons count]; i++) { |
+ NSButton* button = leadingButtons[i]; |
+ NSRect buttonFrame = [button frame]; |
+ buttonFrame.size = toolbarButtonSize; |
+ buttonFrame.origin.y = yPosition; |
+ const CGFloat xPosition = xStart + i * xOffset; |
+ buttonFrame.origin.x = |
+ isRTL ? NSWidth(frame) - toolbarButtonSize.width - xPosition |
+ : xPosition; |
+ [button setFrame:buttonFrame]; |
+ [button setAutoresizingMask:leadingButtonMask]; |
+ } |
// Replace the app button from the nib with an AppToolbarButton instance for |
// Material Design. |
@@ -344,27 +348,41 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
// Adjust the menu button's position. |
NSRect menuButtonFrame = [appMenuButton_ frame]; |
- CGFloat menuButtonFrameMaxX = |
- NSMaxX(toolbarBounds) - [ToolbarController appMenuLeftPadding]; |
- menuButtonFrame.origin.x = |
- menuButtonFrameMaxX - kButtonInset - toolbarButtonSize.width; |
- menuButtonFrame.origin.y = homeButtonFrame.origin.y; |
+ if (isRTL) { |
+ menuButtonFrame.origin.x = [ToolbarController appMenuPadding]; |
+ } else { |
+ CGFloat menuButtonFrameMaxX = |
+ NSMaxX(toolbarBounds) - [ToolbarController appMenuPadding]; |
+ menuButtonFrame.origin.x = |
+ menuButtonFrameMaxX - kButtonInset - toolbarButtonSize.width; |
+ } |
+ menuButtonFrame.origin.y = yPosition; |
menuButtonFrame.size = toolbarButtonSize; |
[appMenuButton_ setFrame:menuButtonFrame]; |
+ [appMenuButton_ setAutoresizingMask:trailingButtonMask]; |
// Adjust the size and location on the location bar to take up the |
// space between the reload and menu buttons. |
NSRect locationBarFrame = [locationBar_ frame]; |
- locationBarFrame.origin.x = NSMaxX(homeButtonFrame) + kButtonInset; |
- if (![homeButton_ isHidden]) { |
- // Ensure proper spacing between the home button and the location bar. |
+ locationBarFrame.origin.x = isRTL |
+ ? NSMaxX(menuButtonFrame) + kButtonInset |
+ : NSMaxX([homeButton_ frame]) + kButtonInset; |
+ if (![homeButton_ isHidden] && !isRTL) { |
+ // Ensure proper spacing between the home button and location bar |
locationBarFrame.origin.x += kElementPadding; |
} |
locationBarFrame.origin.y = |
NSMaxY(toolbarBounds) - kLocationBarPadding - kLocationBarHeight; |
- locationBarFrame.size.width = |
- menuButtonFrame.origin.x - |
- locationBarFrame.origin.x; |
+ CGFloat rightEdge = 0; |
+ if (isRTL) { |
+ rightEdge = NSMinX([homeButton_ frame]) - kButtonInset; |
+ if (![homeButton_ isHidden]) |
+ rightEdge -= kElementPadding; |
+ } else { |
+ rightEdge = NSMinX(menuButtonFrame); |
+ } |
+ locationBarFrame.size.width = rightEdge - NSMinX(locationBarFrame); |
+ |
locationBarFrame.size.height = kLocationBarHeight; |
[locationBar_ setFrame:locationBarFrame]; |
@@ -373,7 +391,10 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
containerFrame.size.width += kButtonInset; |
containerFrame.origin.y = locationBarFrame.origin.y + kContainerYOffset; |
containerFrame.size.height = toolbarButtonSize.height; |
+ if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) |
+ containerFrame.origin.x = NSMinX(locationBarFrame); |
[browserActionsContainerView_ setFrame:containerFrame]; |
+ [browserActionsContainerView_ setAutoresizingMask:trailingButtonMask]; |
notificationBridge_.reset( |
new ToolbarControllerInternal::NotificationBridge(self)); |
@@ -420,7 +441,7 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
[self showOptionalHomeButton]; |
[self installAppMenu]; |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
// Create the controllers for the back/forward menus. |
backMenuController_.reset([[BackForwardMenuController alloc] |
@@ -688,7 +709,7 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
- (id)customFieldEditorForObject:(id)obj { |
if (obj == locationBar_) { |
- // Lazilly construct Field editor, Cocoa UI code always runs on the |
+ // Lazily construct Field editor, Cocoa UI code always runs on the |
// same thread, so there shoudn't be a race condition here. |
if (autocompleteTextFieldEditor_.get() == nil) { |
autocompleteTextFieldEditor_.reset( |
@@ -704,20 +725,12 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
return nil; |
} |
-// Returns an array of views in the order of the outlets above. |
+// Returns an array of views, ordered leading to trailing. |
- (NSArray*)toolbarViews { |
- return [NSArray arrayWithObjects:backButton_, forwardButton_, reloadButton_, |
- homeButton_, appMenuButton_, locationBar_, |
- browserActionsContainerView_, nil]; |
-} |
- |
-// Moves |rect| to the right by |delta|, keeping the right side fixed by |
-// shrinking the width to compensate. Passing a negative value for |deltaX| |
-// moves to the left and increases the width. |
-- (NSRect)adjustRect:(NSRect)rect byAmount:(CGFloat)deltaX { |
- NSRect frame = NSOffsetRect(rect, deltaX, 0); |
- frame.size.width -= deltaX; |
- return frame; |
+ return @[ |
+ backButton_, forwardButton_, reloadButton_, homeButton_, locationBar_, |
+ browserActionsContainerView_, appMenuButton_ |
+ ]; |
} |
// Show or hide the home button based on the pref. |
@@ -737,9 +750,11 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
moveX += kElementPadding; |
if (hide) |
moveX *= -1; // Reverse the direction of the move. |
- |
- [locationBar_ setFrame:[self adjustRect:[locationBar_ frame] |
- byAmount:moveX]]; |
+ CGRect locationBarFrame = [locationBar_ frame]; |
+ locationBarFrame.size.width -= moveX; |
+ if (!cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) |
+ locationBarFrame.origin.x += moveX; |
+ [locationBar_ setFrame:locationBarFrame]; |
[homeButton_ setHidden:hide]; |
} |
@@ -800,7 +815,7 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
object:[[self view] window]]; |
} |
if (![browserActionsContainerView_ isHidden]) |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
} |
- (void)updateVisibility:(BOOL)visible withAnimation:(BOOL)animate { |
@@ -826,34 +841,41 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
} |
- (void)browserActionsContainerDragged:(NSNotification*)notification { |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
} |
- (void)browserActionsVisibilityChanged:(NSNotification*)notification { |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
} |
- (void)browserActionsContainerWillAnimate:(NSNotification*)notification { |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:YES]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:YES]; |
} |
-- (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate { |
- CGFloat locationBarXPos = NSMaxX([locationBar_ frame]); |
- CGFloat leftDistance = 0.0; |
- |
- if ([browserActionsContainerView_ isHidden]) { |
- CGFloat edgeXPos = [appMenuButton_ frame].origin.x; |
- leftDistance = edgeXPos - locationBarXPos - |
- [ToolbarController appMenuLeftPadding] - kButtonInset; |
+- (void)pinLocationBarBeforeBrowserActionsContainerAndAnimate:(BOOL)animate { |
+ CGFloat delta = 0.0; |
+ if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) { |
+ CGFloat leftEdge = NSMinX([locationBar_ frame]); |
+ if ([browserActionsContainerView_ isHidden]) { |
+ delta = leftEdge - NSMaxX([appMenuButton_ frame]) + |
+ [ToolbarController appMenuPadding] + kButtonInset; |
+ } else { |
+ delta = leftEdge - NSMaxX([browserActionsContainerView_ frame]) + |
+ kButtonInset; |
+ } |
} else { |
- leftDistance = NSMinX([browserActionsContainerView_ animationEndFrame]) - |
- locationBarXPos; |
- // Equalize the distance between the location bar and the first extension |
- // button, and the distance between the location bar and home/reload button. |
- leftDistance -= kButtonInset; |
+ CGFloat rightEdge = NSMaxX([locationBar_ frame]); |
+ if ([browserActionsContainerView_ isHidden]) { |
+ delta = NSMinX([appMenuButton_ frame]) - |
+ [ToolbarController appMenuPadding] - kButtonInset - rightEdge; |
+ } else { |
+ delta = NSMinX([browserActionsContainerView_ frame]) - kButtonInset - |
+ rightEdge; |
+ } |
} |
- if (leftDistance != 0.0) |
- [self adjustLocationSizeBy:leftDistance animate:animate]; |
+ |
+ if (delta != 0.0) |
+ [self adjustLocationSizeBy:delta animate:animate]; |
else |
[locationBar_ stopAnimation]; |
} |
@@ -883,7 +905,7 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
NSRect containerFrame = [browserActionsContainerView_ frame]; |
containerFrame.origin.y = [locationBar_ frame].origin.y + kContainerYOffset; |
[browserActionsContainerView_ setFrame:containerFrame]; |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
} |
[self maintainMinimumLocationBarWidth]; |
@@ -894,9 +916,13 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
NSRect containerFrame = [browserActionsContainerView_ frame]; |
// Determine how much the container needs to move in case it's overlapping |
// with the location bar. |
- CGFloat dX = NSMaxX([locationBar_ frame]) - containerFrame.origin.x; |
- containerFrame = NSOffsetRect(containerFrame, dX, 0); |
- containerFrame.size.width -= dX; |
+ if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) { |
+ CGFloat dX = NSMaxX(containerFrame) - NSMinX([locationBar_ frame]); |
+ containerFrame.size.width -= dX; |
+ } else { |
+ CGFloat dX = NSMaxX([locationBar_ frame]) - containerFrame.origin.x; |
+ containerFrame = NSOffsetRect(containerFrame, dX, 0); |
+ } |
[browserActionsContainerView_ setFrame:containerFrame]; |
} else if (!locationBarAtMinSize_ && |
[browserActionsContainerView_ grippyPinned]) { |
@@ -906,18 +932,21 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
CGFloat dX = NSWidth([locationBar_ frame]) - |
(kMinimumLocationBarWidth + 0.1); |
NSRect containerFrame = [browserActionsContainerView_ frame]; |
- containerFrame = NSOffsetRect(containerFrame, -dX, 0); |
+ if (!cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) |
+ containerFrame = NSOffsetRect(containerFrame, -dX, 0); |
containerFrame.size.width += dX; |
CGFloat savedContainerWidth = |
[browserActionsController_ preferredSize].width(); |
if (NSWidth(containerFrame) >= savedContainerWidth) { |
- containerFrame = NSOffsetRect(containerFrame, |
- NSWidth(containerFrame) - savedContainerWidth, 0); |
+ if (!cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) { |
+ containerFrame = NSOffsetRect( |
+ containerFrame, NSWidth(containerFrame) - savedContainerWidth, 0); |
+ } |
containerFrame.size.width = savedContainerWidth; |
[browserActionsContainerView_ setGrippyPinned:NO]; |
} |
[browserActionsContainerView_ setFrame:containerFrame]; |
- [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO]; |
+ [self pinLocationBarBeforeBrowserActionsContainerAndAnimate:NO]; |
} |
} |
@@ -945,15 +974,17 @@ class NotificationBridge : public AppMenuIconController::Delegate { |
[reloadButton_ setHidden:YES]; |
[appMenuButton_ setHidden:YES]; |
[homeButton_ setHidden:YES]; |
+ [browserActionsContainerView_ setHidden:YES]; |
} |
- (void)adjustLocationSizeBy:(CGFloat)dX animate:(BOOL)animate { |
// Ensure that the location bar is in its proper place. |
NSRect locationFrame = [locationBar_ frame]; |
locationFrame.size.width += dX; |
+ if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) |
+ locationFrame.origin.x -= dX; |
[locationBar_ stopAnimation]; |
- |
if (animate) |
[locationBar_ animateToFrame:locationFrame]; |
else |