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

Side by Side Diff: chrome/browser/ui/cocoa/tabs/tab_controller.mm

Issue 6821003: [Mac] First pass at multiple selection in the tabstrip. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase ToT Created 9 years, 8 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #include "base/mac/mac_util.h" 5 #include "base/mac/mac_util.h"
6 #import "chrome/browser/themes/theme_service.h" 6 #import "chrome/browser/themes/theme_service.h"
7 #import "chrome/browser/ui/cocoa/menu_controller.h" 7 #import "chrome/browser/ui/cocoa/menu_controller.h"
8 #import "chrome/browser/ui/cocoa/tabs/tab_controller.h" 8 #import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
9 #import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h" 9 #import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
10 #import "chrome/browser/ui/cocoa/tabs/tab_view.h" 10 #import "chrome/browser/ui/cocoa/tabs/tab_view.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 } 91 }
92 return self; 92 return self;
93 } 93 }
94 94
95 - (void)dealloc { 95 - (void)dealloc {
96 [[NSNotificationCenter defaultCenter] removeObserver:self]; 96 [[NSNotificationCenter defaultCenter] removeObserver:self];
97 [[self tabView] setController:nil]; 97 [[self tabView] setController:nil];
98 [super dealloc]; 98 [super dealloc];
99 } 99 }
100 100
101 // The internals of |-setSelected:| but doesn't check if we're already set 101 // The internals of |-setSelected:| and |-setActive:| but doesn't set the
102 // to |selected|. Pass the selection change to the subviews that need it and 102 // backing variables. This updates the drawing state and marks self as needing
103 // mark ourselves as needing a redraw. 103 // a re-draw.
104 - (void)internalSetSelected:(BOOL)selected { 104 - (void)internalSetSelected:(BOOL)selected {
105 selected_ = selected;
106 TabView* tabView = static_cast<TabView*>([self view]); 105 TabView* tabView = static_cast<TabView*>([self view]);
107 DCHECK([tabView isKindOfClass:[TabView class]]); 106 DCHECK([tabView isKindOfClass:[TabView class]]);
108 [tabView setState:selected]; 107 [tabView setState:selected];
109 [tabView cancelAlert]; 108 if ([self active])
109 [tabView cancelAlert];
110 [self updateVisibility]; 110 [self updateVisibility];
111 [self updateTitleColor]; 111 [self updateTitleColor];
112 } 112 }
113 113
114 // Called when the tab's nib is done loading and all outlets are hooked up. 114 // Called when the tab's nib is done loading and all outlets are hooked up.
115 - (void)awakeFromNib { 115 - (void)awakeFromNib {
116 // Remember the icon's frame, so that if the icon is ever removed, a new 116 // Remember the icon's frame, so that if the icon is ever removed, a new
117 // one can later replace it in the proper location. 117 // one can later replace it in the proper location.
118 originalIconFrame_ = [iconView_ frame]; 118 originalIconFrame_ = [iconView_ frame];
119 119
120 // When the icon is removed, the title expands to the left to fill the space 120 // When the icon is removed, the title expands to the left to fill the space
121 // left by the icon. When the close button is removed, the title expands to 121 // left by the icon. When the close button is removed, the title expands to
122 // the right to fill its space. These are the amounts to expand and contract 122 // the right to fill its space. These are the amounts to expand and contract
123 // titleView_ under those conditions. We don't have to explicilty save the 123 // titleView_ under those conditions. We don't have to explicilty save the
124 // offset between the title and the close button since we can just get that 124 // offset between the title and the close button since we can just get that
125 // value for the close button's frame. 125 // value for the close button's frame.
126 NSRect titleFrame = [titleView_ frame]; 126 NSRect titleFrame = [titleView_ frame];
127 iconTitleXOffset_ = NSMinX(titleFrame) - NSMinX(originalIconFrame_); 127 iconTitleXOffset_ = NSMinX(titleFrame) - NSMinX(originalIconFrame_);
128 128
129 [self internalSetSelected:selected_]; 129 [self internalSetSelected:selected_];
130 } 130 }
131 131
132 // Called when Cocoa wants to display the context menu. Lazily instantiate 132 // Called when Cocoa wants to display the context menu. Lazily instantiate
133 // the menu based off of the cross-platform model. Re-create the menu and 133 // the menu based off of the cross-platform model. Re-create the menu and
134 // model every time to get the correct labels and enabling. 134 // model every time to get the correct labels and enabling.
135 - (NSMenu*)menu { 135 - (NSMenu*)menu {
136 contextMenuDelegate_.reset( 136 contextMenuDelegate_.reset(
137 new TabControllerInternal::MenuDelegate(target_, self)); 137 new TabControllerInternal::MenuDelegate(target_, self));
138 contextMenuModel_.reset(new TabMenuModel(contextMenuDelegate_.get(), 138 contextMenuModel_.reset(
139 [self pinned])); 139 [target_ contextMenuModelForController:self
140 menuDelegate:contextMenuDelegate_.get()]);
140 contextMenuController_.reset( 141 contextMenuController_.reset(
141 [[MenuController alloc] initWithModel:contextMenuModel_.get() 142 [[MenuController alloc] initWithModel:contextMenuModel_.get()
142 useWithPopUpButtonCell:NO]); 143 useWithPopUpButtonCell:NO]);
143 return [contextMenuController_ menu]; 144 return [contextMenuController_ menu];
144 } 145 }
145 146
146 - (IBAction)closeTab:(id)sender { 147 - (IBAction)closeTab:(id)sender {
147 if ([[self target] respondsToSelector:@selector(closeTab:)]) { 148 if ([[self target] respondsToSelector:@selector(closeTab:)]) {
148 [[self target] performSelector:@selector(closeTab:) 149 [[self target] performSelector:@selector(closeTab:)
149 withObject:[self view]]; 150 withObject:[self view]];
150 } 151 }
151 } 152 }
152 153
153 - (void)setTitle:(NSString*)title { 154 - (void)setTitle:(NSString*)title {
154 [[self view] setToolTip:title]; 155 [[self view] setToolTip:title];
155 if ([self mini] && ![self selected]) { 156 if ([self mini] && ![self selected]) {
156 TabView* tabView = static_cast<TabView*>([self view]); 157 TabView* tabView = static_cast<TabView*>([self view]);
157 DCHECK([tabView isKindOfClass:[TabView class]]); 158 DCHECK([tabView isKindOfClass:[TabView class]]);
158 [tabView startAlert]; 159 [tabView startAlert];
159 } 160 }
160 [super setTitle:title]; 161 [super setTitle:title];
161 } 162 }
162 163
164 - (void)setActive:(BOOL)active {
165 if (active != active_) {
166 active_ = active;
167 [self internalSetSelected:[self selected]];
168 }
169 }
170
171 - (BOOL)active {
172 return active_;
173 }
174
163 - (void)setSelected:(BOOL)selected { 175 - (void)setSelected:(BOOL)selected {
164 if (selected_ != selected) 176 if (selected_ != selected) {
165 [self internalSetSelected:selected]; 177 selected_ = selected;
178 [self internalSetSelected:[self selected]];
179 }
166 } 180 }
167 181
168 - (BOOL)selected { 182 - (BOOL)selected {
169 return selected_; 183 return selected_ || active_;
170 } 184 }
171 185
172 - (void)setIconView:(NSView*)iconView { 186 - (void)setIconView:(NSView*)iconView {
173 [iconView_ removeFromSuperview]; 187 [iconView_ removeFromSuperview];
174 iconView_ = iconView; 188 iconView_ = iconView;
175 if ([self app]) { 189 if ([self app]) {
176 NSRect appIconFrame = [iconView frame]; 190 NSRect appIconFrame = [iconView frame];
177 appIconFrame.origin = originalIconFrame_.origin; 191 appIconFrame.origin = originalIconFrame_.origin;
178 // Center the icon. 192 // Center the icon.
179 appIconFrame.origin.x = ([TabController appTabWidth] - 193 appIconFrame.origin.x = ([TabController appTabWidth] -
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 DCHECK([[titleView_ cell] isKindOfClass: 324 DCHECK([[titleView_ cell] isKindOfClass:
311 [GTMFadeTruncatingTextFieldCell class]]); 325 [GTMFadeTruncatingTextFieldCell class]]);
312 GTMFadeTruncatingTextFieldCell* cell = [titleView_ cell]; 326 GTMFadeTruncatingTextFieldCell* cell = [titleView_ cell];
313 [cell setDesiredCharactersToTruncateFromHead:length - 327 [cell setDesiredCharactersToTruncateFromHead:length -
314 TitlePrefixMatcher::kCommonCharsToShow]; 328 TitlePrefixMatcher::kCommonCharsToShow];
315 [cell setTruncateMode:length > TitlePrefixMatcher::kMinElidingLength ? 329 [cell setTruncateMode:length > TitlePrefixMatcher::kMinElidingLength ?
316 GTMFadeTruncatingHeadAndTail : GTMFadeTruncatingTail]; 330 GTMFadeTruncatingHeadAndTail : GTMFadeTruncatingTail];
317 } 331 }
318 332
319 @end 333 @end
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/tabs/tab_controller.h ('k') | chrome/browser/ui/cocoa/tabs/tab_controller_target.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698