| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "app/l10n_util_mac.h" | 5 #include "app/l10n_util_mac.h" |
| 6 #include "base/mac_util.h" | 6 #include "base/mac_util.h" |
| 7 #import "chrome/browser/themes/browser_theme_provider.h" | 7 #import "chrome/browser/themes/browser_theme_provider.h" |
| 8 #import "chrome/browser/ui/cocoa/menu_controller.h" | 8 #import "chrome/browser/ui/cocoa/menu_controller.h" |
| 9 #import "chrome/browser/ui/cocoa/tab_controller.h" | 9 #import "chrome/browser/ui/cocoa/tab_controller.h" |
| 10 #import "chrome/browser/ui/cocoa/tab_controller_target.h" | 10 #import "chrome/browser/ui/cocoa/tab_controller_target.h" |
| 11 #import "chrome/browser/ui/cocoa/tab_view.h" | 11 #import "chrome/browser/ui/cocoa/tab_view.h" |
| 12 #import "chrome/browser/ui/cocoa/themed_window.h" | 12 #import "chrome/browser/ui/cocoa/themed_window.h" |
| 13 #import "chrome/common/extensions/extension.h" | 13 #import "chrome/common/extensions/extension.h" |
| 14 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
| 15 | 15 |
| 16 @implementation TabController | 16 @implementation TabController |
| 17 | 17 |
| 18 @synthesize action = action_; | 18 @synthesize action = action_; |
| 19 @synthesize app = app_; | 19 @synthesize app = app_; |
| 20 @synthesize loadingState = loadingState_; | 20 @synthesize loadingState = loadingState_; |
| 21 @synthesize mini = mini_; | 21 @synthesize mini = mini_; |
| 22 @synthesize pinned = pinned_; | 22 @synthesize pinned = pinned_; |
| 23 @synthesize target = target_; | 23 @synthesize target = target_; |
| 24 @synthesize iconView = iconView_; |
| 25 @synthesize titleView = titleView_; |
| 26 @synthesize closeButton = closeButton_; |
| 24 | 27 |
| 25 namespace TabControllerInternal { | 28 namespace TabControllerInternal { |
| 26 | 29 |
| 27 // A C++ delegate that handles enabling/disabling menu items and handling when | 30 // A C++ delegate that handles enabling/disabling menu items and handling when |
| 28 // a menu command is chosen. Also fixes up the menu item label for "pin/unpin | 31 // a menu command is chosen. Also fixes up the menu item label for "pin/unpin |
| 29 // tab". | 32 // tab". |
| 30 class MenuDelegate : public menus::SimpleMenuModel::Delegate { | 33 class MenuDelegate : public menus::SimpleMenuModel::Delegate { |
| 31 public: | 34 public: |
| 32 explicit MenuDelegate(id<TabControllerTarget> target, TabController* owner) | 35 explicit MenuDelegate(id<TabControllerTarget> target, TabController* owner) |
| 33 : target_(target), | 36 : target_(target), |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 | 110 |
| 108 // Called when the tab's nib is done loading and all outlets are hooked up. | 111 // Called when the tab's nib is done loading and all outlets are hooked up. |
| 109 - (void)awakeFromNib { | 112 - (void)awakeFromNib { |
| 110 // Remember the icon's frame, so that if the icon is ever removed, a new | 113 // Remember the icon's frame, so that if the icon is ever removed, a new |
| 111 // one can later replace it in the proper location. | 114 // one can later replace it in the proper location. |
| 112 originalIconFrame_ = [iconView_ frame]; | 115 originalIconFrame_ = [iconView_ frame]; |
| 113 | 116 |
| 114 // When the icon is removed, the title expands to the left to fill the space | 117 // When the icon is removed, the title expands to the left to fill the space |
| 115 // left by the icon. When the close button is removed, the title expands to | 118 // left by the icon. When the close button is removed, the title expands to |
| 116 // the right to fill its space. These are the amounts to expand and contract | 119 // the right to fill its space. These are the amounts to expand and contract |
| 117 // titleView_ under those conditions. | 120 // titleView_ under those conditions. We don't have to explicilty save the |
| 121 // offset between the title and the close button since we can just get that |
| 122 // value for the close button's frame. |
| 118 NSRect titleFrame = [titleView_ frame]; | 123 NSRect titleFrame = [titleView_ frame]; |
| 119 iconTitleXOffset_ = NSMinX(titleFrame) - NSMinX(originalIconFrame_); | 124 iconTitleXOffset_ = NSMinX(titleFrame) - NSMinX(originalIconFrame_); |
| 120 titleCloseWidthOffset_ = NSMaxX([closeButton_ frame]) - NSMaxX(titleFrame); | |
| 121 | 125 |
| 122 [self internalSetSelected:selected_]; | 126 [self internalSetSelected:selected_]; |
| 123 } | 127 } |
| 124 | 128 |
| 125 // Called when Cocoa wants to display the context menu. Lazily instantiate | 129 // Called when Cocoa wants to display the context menu. Lazily instantiate |
| 126 // the menu based off of the cross-platform model. Re-create the menu and | 130 // the menu based off of the cross-platform model. Re-create the menu and |
| 127 // model every time to get the correct labels and enabling. | 131 // model every time to get the correct labels and enabling. |
| 128 - (NSMenu*)menu { | 132 - (NSMenu*)menu { |
| 129 contextMenuDelegate_.reset( | 133 contextMenuDelegate_.reset( |
| 130 new TabControllerInternal::MenuDelegate(target_, self)); | 134 new TabControllerInternal::MenuDelegate(target_, self)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 [iconView_ setFrame:originalIconFrame_]; | 180 [iconView_ setFrame:originalIconFrame_]; |
| 177 } | 181 } |
| 178 // Ensure that the icon is suppressed if no icon is set or if the tab is too | 182 // Ensure that the icon is suppressed if no icon is set or if the tab is too |
| 179 // narrow to display one. | 183 // narrow to display one. |
| 180 [self updateVisibility]; | 184 [self updateVisibility]; |
| 181 | 185 |
| 182 if (iconView_) | 186 if (iconView_) |
| 183 [[self view] addSubview:iconView_]; | 187 [[self view] addSubview:iconView_]; |
| 184 } | 188 } |
| 185 | 189 |
| 186 - (NSView*)iconView { | |
| 187 return iconView_; | |
| 188 } | |
| 189 | |
| 190 - (NSString*)toolTip { | 190 - (NSString*)toolTip { |
| 191 return [[self view] toolTip]; | 191 return [[self view] toolTip]; |
| 192 } | 192 } |
| 193 | 193 |
| 194 // Return a rough approximation of the number of icons we could fit in the | 194 // Return a rough approximation of the number of icons we could fit in the |
| 195 // tab. We never actually do this, but it's a helpful guide for determining | 195 // tab. We never actually do this, but it's a helpful guide for determining |
| 196 // how much space we have available. | 196 // how much space we have available. |
| 197 - (int)iconCapacity { | 197 - (int)iconCapacity { |
| 198 CGFloat width = NSMaxX([closeButton_ frame]) - NSMinX(originalIconFrame_); | 198 CGFloat width = NSMaxX([closeButton_ frame]) - NSMinX(originalIconFrame_); |
| 199 CGFloat iconWidth = NSWidth(originalIconFrame_); | 199 CGFloat iconWidth = NSWidth(originalIconFrame_); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 223 - (BOOL)shouldShowCloseButton { | 223 - (BOOL)shouldShowCloseButton { |
| 224 if ([self mini]) | 224 if ([self mini]) |
| 225 return NO; | 225 return NO; |
| 226 return ([self selected] || [self iconCapacity] >= 3); | 226 return ([self selected] || [self iconCapacity] >= 3); |
| 227 } | 227 } |
| 228 | 228 |
| 229 - (void)updateVisibility { | 229 - (void)updateVisibility { |
| 230 // iconView_ may have been replaced or it may be nil, so [iconView_ isHidden] | 230 // iconView_ may have been replaced or it may be nil, so [iconView_ isHidden] |
| 231 // won't work. Instead, the state of the icon is tracked separately in | 231 // won't work. Instead, the state of the icon is tracked separately in |
| 232 // isIconShowing_. | 232 // isIconShowing_. |
| 233 BOOL oldShowIcon = isIconShowing_ ? YES : NO; | 233 BOOL newShowIcon = [self shouldShowIcon]; |
| 234 BOOL newShowIcon = [self shouldShowIcon] ? YES : NO; | |
| 235 | 234 |
| 236 [iconView_ setHidden:newShowIcon ? NO : YES]; | 235 [iconView_ setHidden:!newShowIcon]; |
| 237 isIconShowing_ = newShowIcon; | 236 isIconShowing_ = newShowIcon; |
| 238 | 237 |
| 239 // If the tab is a mini-tab, hide the title. | 238 // If the tab is a mini-tab, hide the title. |
| 240 [titleView_ setHidden:[self mini]]; | 239 [titleView_ setHidden:[self mini]]; |
| 241 | 240 |
| 242 BOOL oldShowCloseButton = [closeButton_ isHidden] ? NO : YES; | 241 BOOL newShowCloseButton = [self shouldShowCloseButton]; |
| 243 BOOL newShowCloseButton = [self shouldShowCloseButton] ? YES : NO; | |
| 244 | 242 |
| 245 [closeButton_ setHidden:newShowCloseButton ? NO : YES]; | 243 [closeButton_ setHidden:!newShowCloseButton]; |
| 246 | 244 |
| 247 // Adjust the title view based on changes to the icon's and close button's | 245 // Adjust the title view based on changes to the icon's and close button's |
| 248 // visibility. | 246 // visibility. |
| 249 NSRect titleFrame = [titleView_ frame]; | 247 NSRect oldTitleFrame = [titleView_ frame]; |
| 248 NSRect newTitleFrame; |
| 249 newTitleFrame.size.height = oldTitleFrame.size.height; |
| 250 newTitleFrame.origin.y = oldTitleFrame.origin.y; |
| 250 | 251 |
| 251 if (oldShowIcon != newShowIcon) { | 252 if (newShowIcon) { |
| 252 // Adjust the left edge of the title view according to the presence or | 253 newTitleFrame.origin.x = originalIconFrame_.origin.x + iconTitleXOffset_; |
| 253 // absence of the icon view. | 254 } else { |
| 254 | 255 newTitleFrame.origin.x = originalIconFrame_.origin.x; |
| 255 if (newShowIcon) { | |
| 256 titleFrame.origin.x += iconTitleXOffset_; | |
| 257 titleFrame.size.width -= iconTitleXOffset_; | |
| 258 } else { | |
| 259 titleFrame.origin.x -= iconTitleXOffset_; | |
| 260 titleFrame.size.width += iconTitleXOffset_; | |
| 261 } | |
| 262 } | 256 } |
| 263 | 257 |
| 264 if (oldShowCloseButton != newShowCloseButton) { | 258 if (newShowCloseButton) { |
| 265 // Adjust the right edge of the title view according to the presence or | 259 newTitleFrame.size.width = NSMinX([closeButton_ frame]) - |
| 266 // absence of the close button. | 260 newTitleFrame.origin.x; |
| 267 if (newShowCloseButton) | 261 } else { |
| 268 titleFrame.size.width -= titleCloseWidthOffset_; | 262 newTitleFrame.size.width = NSMaxX([closeButton_ frame]) - |
| 269 else | 263 newTitleFrame.origin.x; |
| 270 titleFrame.size.width += titleCloseWidthOffset_; | |
| 271 } | 264 } |
| 272 | 265 |
| 273 [titleView_ setFrame:titleFrame]; | 266 [titleView_ setFrame:newTitleFrame]; |
| 274 } | 267 } |
| 275 | 268 |
| 276 - (void)updateTitleColor { | 269 - (void)updateTitleColor { |
| 277 NSColor* titleColor = nil; | 270 NSColor* titleColor = nil; |
| 278 ThemeProvider* theme = [[[self view] window] themeProvider]; | 271 ThemeProvider* theme = [[[self view] window] themeProvider]; |
| 279 if (theme && ![self selected]) { | 272 if (theme && ![self selected]) { |
| 280 titleColor = | 273 titleColor = |
| 281 theme->GetNSColor(BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT, | 274 theme->GetNSColor(BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT, |
| 282 true); | 275 true); |
| 283 } | 276 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 304 // Called by the tabs to determine whether we are in rapid (tab) closure mode. | 297 // Called by the tabs to determine whether we are in rapid (tab) closure mode. |
| 305 - (BOOL)inRapidClosureMode { | 298 - (BOOL)inRapidClosureMode { |
| 306 if ([[self target] respondsToSelector:@selector(inRapidClosureMode)]) { | 299 if ([[self target] respondsToSelector:@selector(inRapidClosureMode)]) { |
| 307 return [[self target] performSelector:@selector(inRapidClosureMode)] ? | 300 return [[self target] performSelector:@selector(inRapidClosureMode)] ? |
| 308 YES : NO; | 301 YES : NO; |
| 309 } | 302 } |
| 310 return NO; | 303 return NO; |
| 311 } | 304 } |
| 312 | 305 |
| 313 @end | 306 @end |
| OLD | NEW |