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

Side by Side Diff: ios/chrome/browser/ui/toolbar/toolbar_controller.mm

Issue 2852713002: Revert of [ObjC ARC] Converts ios/chrome/browser/ui/toolbar:toolbar to ARC. (Closed)
Patch Set: Created 3 years, 7 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "ios/chrome/browser/ui/toolbar/toolbar_controller.h" 5 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
6 6
7 #include <QuartzCore/QuartzCore.h> 7 #include <QuartzCore/QuartzCore.h>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/i18n/rtl.h" 10 #include "base/i18n/rtl.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 69
70 // Macros for creating CGRects of height H, origin (0,0), with the portrait 70 // Macros for creating CGRects of height H, origin (0,0), with the portrait
71 // width of phone/pad devices. 71 // width of phone/pad devices.
72 // clang-format off 72 // clang-format off
73 #define IPHONE_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPHONE_IDIOM], H } } 73 #define IPHONE_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPHONE_IDIOM], H } }
74 #define IPAD_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPAD_IDIOM], H } } 74 #define IPAD_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPAD_IDIOM], H } }
75 75
76 // Makes a two-element C array of CGRects as described above, one for each 76 // Makes a two-element C array of CGRects as described above, one for each
77 // device idiom. 77 // device idiom.
78 #define FRAME_PAIR(H) { IPHONE_FRAME(H), IPAD_FRAME(H) } 78 #define FRAME_PAIR(H) { IPHONE_FRAME(H), IPAD_FRAME(H) }
79
80 #if !defined(__has_feature) || !__has_feature(objc_arc)
81 #error "This file requires ARC support."
82 #endif
83 // clang-format on 79 // clang-format on
84 80
85 const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT] = FRAME_PAIR(56); 81 const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT] = FRAME_PAIR(56);
86 82
87 namespace { 83 namespace {
88 84
89 // Color constants for the stack button text, normal and pressed states. These 85 // Color constants for the stack button text, normal and pressed states. These
90 // arrays are indexed by ToolbarControllerStyle enum values. 86 // arrays are indexed by ToolbarControllerStyle enum values.
91 const CGFloat kStackButtonNormalColors[] = { 87 const CGFloat kStackButtonNormalColors[] = {
92 85.0 / 255.0, // ToolbarControllerStyleLightMode 88 85.0 / 255.0, // ToolbarControllerStyleLightMode
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 // Don't allow UIView block-based animations if we're already performing 193 // Don't allow UIView block-based animations if we're already performing
198 // explicit transition animations. 194 // explicit transition animations.
199 if (self.animatingTransition) 195 if (self.animatingTransition)
200 return (id<CAAction>)[NSNull null]; 196 return (id<CAAction>)[NSNull null];
201 return [super actionForLayer:layer forKey:event]; 197 return [super actionForLayer:layer forKey:event];
202 } 198 }
203 199
204 @end 200 @end
205 201
206 @interface ToolbarController () { 202 @interface ToolbarController () {
207 // The shadow view. Only used on iPhone. 203 // The top-level toolbar view.
208 UIImageView* fullBleedShadowView_; 204 base::scoped_nsobject<ToolbarView> view_;
205 // The view for the toolbar background image.
206 base::scoped_nsobject<UIImageView> backgroundView_;
207 base::scoped_nsobject<UIImageView> shadowView_;
208 base::scoped_nsobject<UIImageView> fullBleedShadowView_;
209 209
210 // The backing object for |self.transitionLayers|. 210 // The backing object for |self.transitionLayers|.
211 NSMutableArray* transitionLayers_; 211 base::scoped_nsobject<NSMutableArray> transitionLayers_;
212 212
213 ToolbarToolsMenuButton* toolsMenuButton_; 213 base::scoped_nsobject<ToolbarToolsMenuButton> toolsMenuButton_;
214 UIButton* stackButton_; 214 base::scoped_nsobject<UIButton> stackButton_;
215 UIButton* shareButton_; 215 base::scoped_nsobject<UIButton> shareButton_;
216 NSArray* standardButtons_; 216 base::scoped_nsobject<NSArray> standardButtons_;
217 ToolsMenuButtonObserverBridge* toolsMenuButtonObserverBridge_; 217 base::scoped_nsobject<ToolsMenuButtonObserverBridge>
218 toolsMenuButtonObserverBridge_;
218 ToolbarControllerStyle style_; 219 ToolbarControllerStyle style_;
219 220
220 // The following is nil if not visible. 221 // The following is nil if not visible.
221 ToolsPopupController* toolsPopupController_; 222 base::scoped_nsobject<ToolsPopupController> toolsPopupController_;
222 } 223 }
223 224
224 // Returns the background image that should be used for |style|. 225 // Returns the background image that should be used for |style|.
225 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style; 226 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style;
226 227
227 // Whether the share button should be visible in the toolbar. 228 // Whether the share button should be visible in the toolbar.
228 - (BOOL)shareButtonShouldBeVisible; 229 - (BOOL)shareButtonShouldBeVisible;
229 230
230 // Update share button visibility and |standardButtons_| array. 231 // Update share button visibility and |standardButtons_| array.
231 - (void)updateStandardButtons; 232 - (void)updateStandardButtons;
232 233
233 // Returns an animation for |button| for a toolbar transition animation with 234 // Returns an animation for |button| for a toolbar transition animation with
234 // |style|. |button|'s frame will be interpolated between its layout in the 235 // |style|. |button|'s frame will be interpolated between its layout in the
235 // screen toolbar to the card's tab frame, and will be faded in for 236 // screen toolbar to the card's tab frame, and will be faded in for
236 // ToolbarTransitionStyleToStackView and faded out for 237 // ToolbarTransitionStyleToStackView and faded out for
237 // ToolbarTransitionStyleToBVC. 238 // ToolbarTransitionStyleToBVC.
238 - (CAAnimation*)transitionAnimationForButton:(UIButton*)button 239 - (CAAnimation*)transitionAnimationForButton:(UIButton*)button
239 containerBeginBounds:(CGRect)containerBeginBounds 240 containerBeginBounds:(CGRect)containerBeginBounds
240 containerEndBounds:(CGRect)containerEndBounds 241 containerEndBounds:(CGRect)containerEndBounds
241 withStyle:(ToolbarTransitionStyle)style; 242 withStyle:(ToolbarTransitionStyle)style;
242 @end 243 @end
243 244
244 @implementation ToolbarController 245 @implementation ToolbarController
245 246
246 @synthesize readingListModel = readingListModel_; 247 @synthesize readingListModel = readingListModel_;
247 @synthesize view = view_; 248
248 @synthesize backgroundView = backgroundView_;
249 @synthesize shadowView = shadowView_;
250 @synthesize toolsPopupController = toolsPopupController_;
251 @synthesize style = style_; 249 @synthesize style = style_;
252 250
253 - (void)setReadingListModel:(ReadingListModel*)readingListModel { 251 - (void)setReadingListModel:(ReadingListModel*)readingListModel {
254 readingListModel_ = readingListModel; 252 readingListModel_ = readingListModel;
255 if (readingListModel_) { 253 if (readingListModel_) {
256 toolsMenuButtonObserverBridge_ = 254 toolsMenuButtonObserverBridge_.reset([[ToolsMenuButtonObserverBridge alloc]
257 [[ToolsMenuButtonObserverBridge alloc] initWithModel:readingListModel_ 255 initWithModel:readingListModel_
258 toolbarButton:toolsMenuButton_]; 256 toolbarButton:toolsMenuButton_]);
259 } 257 }
260 } 258 }
261 259
262 - (instancetype)initWithStyle:(ToolbarControllerStyle)style { 260 - (instancetype)initWithStyle:(ToolbarControllerStyle)style {
263 self = [super init]; 261 self = [super init];
264 if (self) { 262 if (self) {
265 style_ = style; 263 style_ = style;
266 DCHECK_LT(style_, ToolbarControllerStyleMaxStyles); 264 DCHECK_LT(style_, ToolbarControllerStyleMaxStyles);
267 265
268 InterfaceIdiom idiom = IsIPadIdiom() ? IPAD_IDIOM : IPHONE_IDIOM; 266 InterfaceIdiom idiom = IsIPadIdiom() ? IPAD_IDIOM : IPHONE_IDIOM;
269 CGRect viewFrame = kToolbarFrame[idiom]; 267 CGRect viewFrame = kToolbarFrame[idiom];
270 CGRect backgroundFrame = kBackgroundViewFrame[idiom]; 268 CGRect backgroundFrame = kBackgroundViewFrame[idiom];
271 CGRect stackButtonFrame = LayoutRectGetRect(kStackButtonFrame); 269 CGRect stackButtonFrame = LayoutRectGetRect(kStackButtonFrame);
272 CGRect toolsMenuButtonFrame = 270 CGRect toolsMenuButtonFrame =
273 LayoutRectGetRect(kToolsMenuButtonFrame[idiom]); 271 LayoutRectGetRect(kToolsMenuButtonFrame[idiom]);
274 272
275 if (idiom == IPHONE_IDIOM) { 273 if (idiom == IPHONE_IDIOM) {
276 CGFloat statusBarOffset = [self statusBarOffset]; 274 CGFloat statusBarOffset = [self statusBarOffset];
277 viewFrame.size.height += statusBarOffset; 275 viewFrame.size.height += statusBarOffset;
278 backgroundFrame.size.height += statusBarOffset; 276 backgroundFrame.size.height += statusBarOffset;
279 stackButtonFrame.origin.y += statusBarOffset; 277 stackButtonFrame.origin.y += statusBarOffset;
280 toolsMenuButtonFrame.origin.y += statusBarOffset; 278 toolsMenuButtonFrame.origin.y += statusBarOffset;
281 } 279 }
282 280
283 view_ = [[ToolbarView alloc] initWithFrame:viewFrame]; 281 view_.reset([[ToolbarView alloc] initWithFrame:viewFrame]);
284 backgroundView_ = [[UIImageView alloc] initWithFrame:backgroundFrame]; 282 backgroundView_.reset([[UIImageView alloc] initWithFrame:backgroundFrame]);
285 toolsMenuButton_ = 283 toolsMenuButton_.reset([[ToolbarToolsMenuButton alloc]
286 [[ToolbarToolsMenuButton alloc] initWithFrame:toolsMenuButtonFrame 284 initWithFrame:toolsMenuButtonFrame
287 style:style_]; 285 style:style_]);
288 [toolsMenuButton_ setTag:IDC_SHOW_TOOLS_MENU]; 286 [toolsMenuButton_ setTag:IDC_SHOW_TOOLS_MENU];
289 [toolsMenuButton_ 287 [toolsMenuButton_
290 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | 288 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() |
291 UIViewAutoresizingFlexibleBottomMargin]; 289 UIViewAutoresizingFlexibleBottomMargin];
292 290
293 [view_ addSubview:backgroundView_]; 291 [view_ addSubview:backgroundView_];
294 [view_ addSubview:toolsMenuButton_]; 292 [view_ addSubview:toolsMenuButton_];
295 [view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 293 [view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
296 [backgroundView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 294 [backgroundView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
297 UIViewAutoresizingFlexibleHeight]; 295 UIViewAutoresizingFlexibleHeight];
298 296
299 if (idiom == IPAD_IDIOM) { 297 if (idiom == IPAD_IDIOM) {
300 CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame); 298 CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame);
301 shareButton_ = [[UIButton alloc] initWithFrame:shareButtonFrame]; 299 shareButton_.reset([[UIButton alloc] initWithFrame:shareButtonFrame]);
302 [shareButton_ setTag:IDC_SHARE_PAGE]; 300 [shareButton_ setTag:IDC_SHARE_PAGE];
303 [shareButton_ 301 [shareButton_
304 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | 302 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() |
305 UIViewAutoresizingFlexibleBottomMargin]; 303 UIViewAutoresizingFlexibleBottomMargin];
306 [self setUpButton:shareButton_ 304 [self setUpButton:shareButton_
307 withImageEnum:ToolbarButtonNameShare 305 withImageEnum:ToolbarButtonNameShare
308 forInitialState:UIControlStateNormal 306 forInitialState:UIControlStateNormal
309 hasDisabledImage:YES 307 hasDisabledImage:YES
310 synchronously:NO]; 308 synchronously:NO];
311 SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE, 309 SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE,
312 kToolbarShareButtonIdentifier); 310 kToolbarShareButtonIdentifier);
313 [view_ addSubview:shareButton_]; 311 [view_ addSubview:shareButton_];
314 } 312 }
315 313
316 CGRect shadowFrame = kShadowViewFrame[idiom]; 314 CGRect shadowFrame = kShadowViewFrame[idiom];
317 shadowFrame.origin.y = CGRectGetMaxY(backgroundFrame); 315 shadowFrame.origin.y = CGRectGetMaxY(backgroundFrame);
318 shadowView_ = [[UIImageView alloc] initWithFrame:shadowFrame]; 316 shadowView_.reset([[UIImageView alloc] initWithFrame:shadowFrame]);
319 [shadowView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 317 [shadowView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
320 [shadowView_ setUserInteractionEnabled:NO]; 318 [shadowView_ setUserInteractionEnabled:NO];
321 [view_ addSubview:shadowView_]; 319 [view_ addSubview:shadowView_];
322 [shadowView_ setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)]; 320 [shadowView_ setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)];
323 321
324 if (idiom == IPHONE_IDIOM) { 322 if (idiom == IPHONE_IDIOM) {
325 // iPad omnibox does not expand to full bleed. 323 // iPad omnibox does not expand to full bleed.
326 CGRect fullBleedShadowFrame = kFullBleedShadowViewFrame; 324 CGRect fullBleedShadowFrame = kFullBleedShadowViewFrame;
327 fullBleedShadowFrame.origin.y = shadowFrame.origin.y; 325 fullBleedShadowFrame.origin.y = shadowFrame.origin.y;
328 fullBleedShadowView_ = 326 fullBleedShadowView_.reset(
329 [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]; 327 [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]);
330 [fullBleedShadowView_ 328 [fullBleedShadowView_
331 setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 329 setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
332 [fullBleedShadowView_ setUserInteractionEnabled:NO]; 330 [fullBleedShadowView_ setUserInteractionEnabled:NO];
333 [fullBleedShadowView_ setAlpha:0]; 331 [fullBleedShadowView_ setAlpha:0];
334 [view_ addSubview:fullBleedShadowView_]; 332 [view_ addSubview:fullBleedShadowView_];
335 [fullBleedShadowView_ 333 [fullBleedShadowView_
336 setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]; 334 setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)];
337 } 335 }
338 336
339 transitionLayers_ = 337 transitionLayers_.reset(
340 [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]; 338 [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]);
341 339
342 // UIImageViews do not default to userInteractionEnabled:YES. 340 // UIImageViews do not default to userInteractionEnabled:YES.
343 [view_ setUserInteractionEnabled:YES]; 341 [view_ setUserInteractionEnabled:YES];
344 [backgroundView_ setUserInteractionEnabled:YES]; 342 [backgroundView_ setUserInteractionEnabled:YES];
345 343
346 UIImage* tile = [self getBackgroundImageForStyle:style]; 344 UIImage* tile = [self getBackgroundImageForStyle:style];
347 [[self backgroundView] 345 [[self backgroundView]
348 setImage:StretchableImageFromUIImage(tile, 0.0, 3.0)]; 346 setImage:StretchableImageFromUIImage(tile, 0.0, 3.0)];
349 347
350 if (idiom == IPHONE_IDIOM) { 348 if (idiom == IPHONE_IDIOM) {
351 stackButton_ = 349 stackButton_.reset(
352 [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]; 350 [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]);
353 [stackButton_ setTag:IDC_TOGGLE_TAB_SWITCHER]; 351 [stackButton_ setTag:IDC_TOGGLE_TAB_SWITCHER];
354 [[stackButton_ titleLabel] 352 [[stackButton_ titleLabel]
355 setFont:[self fontForSize:kFontSizeFewerThanTenTabs]]; 353 setFont:[self fontForSize:kFontSizeFewerThanTenTabs]];
356 [stackButton_ 354 [stackButton_
357 setTitleColor:[UIColor colorWithWhite:kStackButtonNormalColors[style_] 355 setTitleColor:[UIColor colorWithWhite:kStackButtonNormalColors[style_]
358 alpha:1.0] 356 alpha:1.0]
359 forState:UIControlStateNormal]; 357 forState:UIControlStateNormal];
360 UIColor* highlightColor = 358 UIColor* highlightColor =
361 UIColorFromRGB(kStackButtonHighlightedColors[style_], 1.0); 359 UIColorFromRGB(kStackButtonHighlightedColors[style_], 1.0);
362 [stackButton_ setTitleColor:highlightColor 360 [stackButton_ setTitleColor:highlightColor
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 return nil; 400 return nil;
403 } 401 }
404 402
405 - (UIFont*)fontForSize:(NSInteger)size { 403 - (UIFont*)fontForSize:(NSInteger)size {
406 return [[MDFRobotoFontLoader sharedInstance] boldFontOfSize:size]; 404 return [[MDFRobotoFontLoader sharedInstance] boldFontOfSize:size];
407 } 405 }
408 406
409 - (void)dealloc { 407 - (void)dealloc {
410 [[NSNotificationCenter defaultCenter] removeObserver:self]; 408 [[NSNotificationCenter defaultCenter] removeObserver:self];
411 [toolsPopupController_ setDelegate:nil]; 409 [toolsPopupController_ setDelegate:nil];
410 [super dealloc];
411 }
412
413 - (UIImageView*)view {
414 return view_.get();
415 }
416
417 - (UIImageView*)backgroundView {
418 return backgroundView_.get();
412 } 419 }
413 420
414 - (CGFloat)statusBarOffset { 421 - (CGFloat)statusBarOffset {
415 return StatusBarHeight(); 422 return StatusBarHeight();
416 } 423 }
417 424
425 - (UIImageView*)shadowView {
426 return shadowView_.get();
427 }
428
418 - (NSMutableArray*)transitionLayers { 429 - (NSMutableArray*)transitionLayers {
419 return transitionLayers_; 430 return transitionLayers_.get();
420 } 431 }
421 432
422 - (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum { 433 - (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum {
423 // None of the images this class knows about should flip. 434 // None of the images this class knows about should flip.
424 return NO; 435 return NO;
425 } 436 }
426 437
427 - (void)updateStandardButtons { 438 - (void)updateStandardButtons {
428 BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible]; 439 BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible];
429 [shareButton_ setHidden:!shareButtonShouldBeVisible]; 440 [shareButton_ setHidden:!shareButtonShouldBeVisible];
430 NSMutableArray* standardButtons = [NSMutableArray array]; 441 NSMutableArray* standardButtons = [NSMutableArray array];
431 [standardButtons addObject:toolsMenuButton_]; 442 [standardButtons addObject:toolsMenuButton_];
432 if (stackButton_) 443 if (stackButton_)
433 [standardButtons addObject:stackButton_]; 444 [standardButtons addObject:stackButton_];
434 if (shareButtonShouldBeVisible) 445 if (shareButtonShouldBeVisible)
435 [standardButtons addObject:shareButton_]; 446 [standardButtons addObject:shareButton_];
436 standardButtons_ = standardButtons; 447 standardButtons_.reset([standardButtons retain]);
437 } 448 }
438 449
439 - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { 450 - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
440 [self updateStandardButtons]; 451 [self updateStandardButtons];
441 } 452 }
442 453
454 - (ToolsPopupController*)toolsPopupController {
455 return toolsPopupController_.get();
456 }
457
443 - (void)applicationDidEnterBackground:(NSNotification*)notify { 458 - (void)applicationDidEnterBackground:(NSNotification*)notify {
444 if (toolsPopupController_) { 459 if (toolsPopupController_.get()) {
445 // Dismiss the tools popup menu without animation. 460 // Dismiss the tools popup menu without animation.
446 [toolsMenuButton_ setToolsMenuIsVisible:NO]; 461 [toolsMenuButton_ setToolsMenuIsVisible:NO];
447 toolsPopupController_ = nil; 462 toolsPopupController_.reset(nil);
448 [[NSNotificationCenter defaultCenter] 463 [[NSNotificationCenter defaultCenter]
449 postNotificationName:kMenuWillHideNotification 464 postNotificationName:kMenuWillHideNotification
450 object:nil]; 465 object:nil];
451 } 466 }
452 } 467 }
453 468
454 - (BOOL)shareButtonShouldBeVisible { 469 - (BOOL)shareButtonShouldBeVisible {
455 // The share button only exists on iPad, and when some tabs are visible 470 // The share button only exists on iPad, and when some tabs are visible
456 // (i.e. when not in DarkMode), and when the width is greater than 471 // (i.e. when not in DarkMode), and when the width is greater than
457 // the tablet mini view. 472 // the tablet mini view.
(...skipping 10 matching lines...) Expand all
468 483
469 - (UIImage*)imageForImageEnum:(int)imageEnum 484 - (UIImage*)imageForImageEnum:(int)imageEnum
470 forState:(ToolbarButtonUIState)state { 485 forState:(ToolbarButtonUIState)state {
471 int imageID = 486 int imageID =
472 [self imageIdForImageEnum:imageEnum style:[self style] forState:state]; 487 [self imageIdForImageEnum:imageEnum style:[self style] forState:state];
473 return NativeReversableImage( 488 return NativeReversableImage(
474 imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]); 489 imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]);
475 } 490 }
476 491
477 - (int)imageEnumForButton:(UIButton*)button { 492 - (int)imageEnumForButton:(UIButton*)button {
478 if (button == stackButton_) 493 if (button == stackButton_.get())
479 return ToolbarButtonNameStack; 494 return ToolbarButtonNameStack;
480 return NumberOfToolbarButtonNames; 495 return NumberOfToolbarButtonNames;
481 } 496 }
482 497
483 - (int)imageIdForImageEnum:(int)index 498 - (int)imageIdForImageEnum:(int)index
484 style:(ToolbarControllerStyle)style 499 style:(ToolbarControllerStyle)style
485 forState:(ToolbarButtonUIState)state { 500 forState:(ToolbarButtonUIState)state {
486 DCHECK(index < NumberOfToolbarButtonNames); 501 DCHECK(index < NumberOfToolbarButtonNames);
487 DCHECK(style < ToolbarControllerStyleMaxStyles); 502 DCHECK(style < ToolbarControllerStyleMaxStyles);
488 DCHECK(state < NumberOfToolbarButtonUIStates); 503 DCHECK(state < NumberOfToolbarButtonUIStates);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 if (synchronously || initialState == UIControlStateDisabled) { 556 if (synchronously || initialState == UIControlStateDisabled) {
542 disabledImageBlock(); 557 disabledImageBlock();
543 } else { 558 } else {
544 dispatch_after(addImageDelay, dispatch_get_main_queue(), 559 dispatch_after(addImageDelay, dispatch_get_main_queue(),
545 disabledImageBlock); 560 disabledImageBlock);
546 } 561 }
547 } 562 }
548 } 563 }
549 564
550 - (void)registerEventsForButton:(UIButton*)button { 565 - (void)registerEventsForButton:(UIButton*)button {
551 if (button != toolsMenuButton_) { 566 if (button != toolsMenuButton_.get()) {
552 // |target| must be |self| (as opposed to |nil|) because |self| isn't in the 567 // |target| must be |self| (as opposed to |nil|) because |self| isn't in the
553 // responder chain. 568 // responder chain.
554 [button addTarget:self 569 [button addTarget:self
555 action:@selector(standardButtonPressed:) 570 action:@selector(standardButtonPressed:)
556 forControlEvents:UIControlEventTouchUpInside]; 571 forControlEvents:UIControlEventTouchUpInside];
557 } 572 }
558 [button addTarget:self 573 [button addTarget:self
559 action:@selector(recordUserMetrics:) 574 action:@selector(recordUserMetrics:)
560 forControlEvents:UIControlEventTouchUpInside]; 575 forControlEvents:UIControlEventTouchUpInside];
561 [button addTarget:button 576 [button addTarget:button
562 action:@selector(chromeExecuteCommand:) 577 action:@selector(chromeExecuteCommand:)
563 forControlEvents:UIControlEventTouchUpInside]; 578 forControlEvents:UIControlEventTouchUpInside];
564 } 579 }
565 580
566 - (CGRect)shareButtonAnchorRect { 581 - (CGRect)shareButtonAnchorRect {
567 // Shrink the padding around the shareButton so the popovers are anchored 582 // Shrink the padding around the shareButton so the popovers are anchored
568 // correctly. 583 // correctly.
569 return CGRectInset([shareButton_ bounds], 10, 0); 584 return CGRectInset([shareButton_ bounds], 10, 0);
570 } 585 }
571 586
572 - (UIView*)shareButtonView { 587 - (UIView*)shareButtonView {
573 return shareButton_; 588 return shareButton_.get();
574 } 589 }
575 590
576 - (void)showToolsMenuPopupWithConfiguration: 591 - (void)showToolsMenuPopupWithConfiguration:
577 (ToolsMenuConfiguration*)configuration { 592 (ToolsMenuConfiguration*)configuration {
578 // Because an animation hides and shows the tools popup menu it is possible to 593 // Because an animation hides and shows the tools popup menu it is possible to
579 // tap the tools button multiple times before the tools menu is shown. Ignore 594 // tap the tools button multiple times before the tools menu is shown. Ignore
580 // repeated taps between animations. 595 // repeated taps between animations.
581 if (toolsPopupController_) 596 if (toolsPopupController_)
582 return; 597 return;
583 598
584 base::RecordAction(UserMetricsAction("ShowAppMenu")); 599 base::RecordAction(UserMetricsAction("ShowAppMenu"));
585 600
586 // Keep the button pressed. 601 // Keep the button pressed.
587 [toolsMenuButton_ setToolsMenuIsVisible:YES]; 602 [toolsMenuButton_ setToolsMenuIsVisible:YES];
588 603
589 [configuration setToolsMenuButton:toolsMenuButton_]; 604 [configuration setToolsMenuButton:toolsMenuButton_];
590 toolsPopupController_ = 605 toolsPopupController_.reset(
591 [[ToolsPopupController alloc] initWithConfiguration:configuration]; 606 [[ToolsPopupController alloc] initWithConfiguration:configuration]);
592 607
593 [toolsPopupController_ setDelegate:self]; 608 [toolsPopupController_ setDelegate:self];
594 609
595 [[NSNotificationCenter defaultCenter] 610 [[NSNotificationCenter defaultCenter]
596 postNotificationName:kMenuWillShowNotification 611 postNotificationName:kMenuWillShowNotification
597 object:nil]; 612 object:nil];
598 } 613 }
599 614
600 - (void)dismissToolsMenuPopup { 615 - (void)dismissToolsMenuPopup {
601 if (!toolsPopupController_) 616 if (!toolsPopupController_.get())
602 return; 617 return;
603 ToolsPopupController* tempTPC = toolsPopupController_; 618 ToolsPopupController* tempTPC = toolsPopupController_.get();
604 [tempTPC containerView].userInteractionEnabled = NO; 619 [tempTPC containerView].userInteractionEnabled = NO;
605 [tempTPC dismissAnimatedWithCompletion:^{ 620 [tempTPC dismissAnimatedWithCompletion:^{
606 // Unpress the tools menu button by restoring the normal and 621 // Unpress the tools menu button by restoring the normal and
607 // highlighted images to their usual state. 622 // highlighted images to their usual state.
608 [toolsMenuButton_ setToolsMenuIsVisible:NO]; 623 [toolsMenuButton_ setToolsMenuIsVisible:NO];
609 // Reference tempTPC so the block retains it. 624 // Reference tempTPC so the block retains it.
610 [tempTPC self]; 625 [tempTPC self];
611 }]; 626 }];
612 // reset tabHistoryPopupController_ to prevent -applicationDidEnterBackground 627 // reset tabHistoryPopupController_ to prevent -applicationDidEnterBackground
613 // from posting another kMenuWillHideNotification. 628 // from posting another kMenuWillHideNotification.
614 toolsPopupController_ = nil; 629 toolsPopupController_.reset();
615 630
616 [[NSNotificationCenter defaultCenter] 631 [[NSNotificationCenter defaultCenter]
617 postNotificationName:kMenuWillHideNotification 632 postNotificationName:kMenuWillHideNotification
618 object:nil]; 633 object:nil];
619 } 634 }
620 635
621 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style { 636 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style {
622 int backgroundImageID; 637 int backgroundImageID;
623 if (style == ToolbarControllerStyleLightMode) 638 if (style == ToolbarControllerStyleLightMode)
624 backgroundImageID = IDR_IOS_TOOLBAR_LIGHT_BACKGROUND; 639 backgroundImageID = IDR_IOS_TOOLBAR_LIGHT_BACKGROUND;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 // Animate the opacity of the buttons to 0. 678 // Animate the opacity of the buttons to 0.
664 [CATransaction begin]; 679 [CATransaction begin];
665 [CATransaction setAnimationDuration:ios::material::kDuration2]; 680 [CATransaction setAnimationDuration:ios::material::kDuration2];
666 [CATransaction 681 [CATransaction
667 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; 682 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)];
668 CABasicAnimation* fadeButtons = 683 CABasicAnimation* fadeButtons =
669 [CABasicAnimation animationWithKeyPath:@"opacity"]; 684 [CABasicAnimation animationWithKeyPath:@"opacity"];
670 fadeButtons.fromValue = @1; 685 fadeButtons.fromValue = @1;
671 fadeButtons.toValue = @0; 686 fadeButtons.toValue = @0;
672 687
673 for (UIButton* button in standardButtons_) { 688 for (UIButton* button in standardButtons_.get()) {
674 if (![button isHidden]) { 689 if (![button isHidden]) {
675 [button layer].opacity = 0; 690 [button layer].opacity = 0;
676 [[button layer] addAnimation:fadeButtons forKey:@"fade"]; 691 [[button layer] addAnimation:fadeButtons forKey:@"fade"];
677 } 692 }
678 } 693 }
679 [CATransaction commit]; 694 [CATransaction commit];
680 695
681 // Animate the buttons 10 pixels in the leading-to-trailing direction 696 // Animate the buttons 10 pixels in the leading-to-trailing direction
682 [CATransaction begin]; 697 [CATransaction begin];
683 [CATransaction setAnimationDuration:ios::material::kDuration1]; 698 [CATransaction setAnimationDuration:ios::material::kDuration1];
684 [CATransaction 699 [CATransaction
685 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; 700 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)];
686 701
687 for (UIButton* button in standardButtons_) { 702 for (UIButton* button in standardButtons_.get()) {
688 CABasicAnimation* shiftButton = 703 CABasicAnimation* shiftButton =
689 [CABasicAnimation animationWithKeyPath:@"position"]; 704 [CABasicAnimation animationWithKeyPath:@"position"];
690 CGPoint startPosition = [button layer].position; 705 CGPoint startPosition = [button layer].position;
691 CGPoint endPosition = 706 CGPoint endPosition =
692 CGPointLayoutOffset(startPosition, kButtonFadeOutXOffset); 707 CGPointLayoutOffset(startPosition, kButtonFadeOutXOffset);
693 shiftButton.fromValue = [NSValue valueWithCGPoint:startPosition]; 708 shiftButton.fromValue = [NSValue valueWithCGPoint:startPosition];
694 shiftButton.toValue = [NSValue valueWithCGPoint:endPosition]; 709 shiftButton.toValue = [NSValue valueWithCGPoint:endPosition];
695 [[button layer] addAnimation:shiftButton forKey:@"shiftButton"]; 710 [[button layer] addAnimation:shiftButton forKey:@"shiftButton"];
696 } 711 }
697 712
698 [CATransaction commit]; 713 [CATransaction commit];
699 714
700 // Fade to the full bleed shadow. 715 // Fade to the full bleed shadow.
701 [UIView animateWithDuration:ios::material::kDuration1 716 [UIView animateWithDuration:ios::material::kDuration1
702 animations:^{ 717 animations:^{
703 [shadowView_ setAlpha:0]; 718 [shadowView_ setAlpha:0];
704 [fullBleedShadowView_ setAlpha:1]; 719 [fullBleedShadowView_ setAlpha:1];
705 }]; 720 }];
706 } 721 }
707 722
708 - (void)fadeInStandardControls { 723 - (void)fadeInStandardControls {
709 for (UIButton* button in standardButtons_) { 724 for (UIButton* button in standardButtons_.get()) {
710 [self fadeInView:button 725 [self fadeInView:button
711 fromLeadingOffset:10 726 fromLeadingOffset:10
712 withDuration:ios::material::kDuration2 727 withDuration:ios::material::kDuration2
713 afterDelay:ios::material::kDuration1]; 728 afterDelay:ios::material::kDuration1];
714 } 729 }
715 730
716 // Fade to the normal shadow. 731 // Fade to the normal shadow.
717 [UIView animateWithDuration:ios::material::kDuration1 732 [UIView animateWithDuration:ios::material::kDuration1
718 animations:^{ 733 animations:^{
719 [shadowView_ setAlpha:self.backgroundView.alpha]; 734 [shadowView_ setAlpha:self.backgroundView.alpha];
720 [fullBleedShadowView_ setAlpha:0]; 735 [fullBleedShadowView_ setAlpha:0];
721 }]; 736 }];
722 } 737 }
723 738
724 - (void)animationDidStart:(CAAnimation*)anim { 739 - (void)animationDidStart:(CAAnimation*)anim {
725 // Once the buttons start fading in, set their opacity to 1 so there's no 740 // Once the buttons start fading in, set their opacity to 1 so there's no
726 // flicker at the end of the animation. 741 // flicker at the end of the animation.
727 for (UIButton* button in standardButtons_) { 742 for (UIButton* button in standardButtons_.get()) {
728 if (anim == [[button layer] animationForKey:@"fadeIn"]) { 743 if (anim == [[button layer] animationForKey:@"fadeIn"]) {
729 [button layer].opacity = 1; 744 [button layer].opacity = 1;
730 return; 745 return;
731 } 746 }
732 } 747 }
733 } 748 }
734 749
735 - (void)fadeInView:(UIView*)view 750 - (void)fadeInView:(UIView*)view
736 fromLeadingOffset:(LayoutOffset)leadingOffset 751 fromLeadingOffset:(LayoutOffset)leadingOffset
737 withDuration:(NSTimeInterval)duration 752 withDuration:(NSTimeInterval)duration
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 transitionStyle:style]; 926 transitionStyle:style];
912 } 927 }
913 928
914 - (void)hideViewsForNewTabPage:(BOOL)hide { 929 - (void)hideViewsForNewTabPage:(BOOL)hide {
915 DCHECK(!IsIPadIdiom()); 930 DCHECK(!IsIPadIdiom());
916 [shadowView_ setHidden:hide]; 931 [shadowView_ setHidden:hide];
917 } 932 }
918 933
919 - (void)setStandardControlsVisible:(BOOL)visible { 934 - (void)setStandardControlsVisible:(BOOL)visible {
920 if (visible) { 935 if (visible) {
921 for (UIButton* button in standardButtons_) { 936 for (UIButton* button in standardButtons_.get()) {
922 [button setAlpha:1.0]; 937 [button setAlpha:1.0];
923 } 938 }
924 } else { 939 } else {
925 for (UIButton* button in standardButtons_) { 940 for (UIButton* button in standardButtons_.get()) {
926 [button setAlpha:0.0]; 941 [button setAlpha:0.0];
927 } 942 }
928 } 943 }
929 } 944 }
930 945
931 - (void)setStandardControlsAlpha:(CGFloat)alpha { 946 - (void)setStandardControlsAlpha:(CGFloat)alpha {
932 for (UIButton* button in standardButtons_) { 947 for (UIButton* button in standardButtons_.get()) {
933 if (![button isHidden]) 948 if (![button isHidden])
934 [button setAlpha:alpha]; 949 [button setAlpha:alpha];
935 } 950 }
936 } 951 }
937 952
938 - (void)setBackgroundAlpha:(CGFloat)alpha { 953 - (void)setBackgroundAlpha:(CGFloat)alpha {
939 [backgroundView_ setAlpha:alpha]; 954 [backgroundView_ setAlpha:alpha];
940 [shadowView_ setAlpha:alpha]; 955 [shadowView_ setAlpha:alpha];
941 } 956 }
942 957
943 - (void)setStandardControlsTransform:(CGAffineTransform)transform { 958 - (void)setStandardControlsTransform:(CGAffineTransform)transform {
944 for (UIButton* button in standardButtons_) { 959 for (UIButton* button in standardButtons_.get()) {
945 [button setTransform:transform]; 960 [button setTransform:transform];
946 } 961 }
947 } 962 }
948 963
949 - (void)standardButtonPressed:(UIButton*)sender { 964 - (void)standardButtonPressed:(UIButton*)sender {
950 // This check for valid button images assumes that the buttons all have a 965 // This check for valid button images assumes that the buttons all have a
951 // different image for the highlighted state as for the normal state. 966 // different image for the highlighted state as for the normal state.
952 // Currently, that assumption is true. 967 // Currently, that assumption is true.
953 if ([sender imageForState:UIControlStateHighlighted] == 968 if ([sender imageForState:UIControlStateHighlighted] ==
954 [sender imageForState:UIControlStateNormal]) { 969 [sender imageForState:UIControlStateNormal]) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
992 [[stackButton_ titleLabel] 1007 [[stackButton_ titleLabel]
993 setFont:[self fontForSize:kFontSizeTenTabsOrMore]]; 1008 setFont:[self fontForSize:kFontSizeTenTabsOrMore]];
994 } 1009 }
995 } 1010 }
996 1011
997 [stackButton_ setTitle:stackButtonTitle forState:UIControlStateNormal]; 1012 [stackButton_ setTitle:stackButtonTitle forState:UIControlStateNormal];
998 [stackButton_ setAccessibilityValue:stackButtonValue]; 1013 [stackButton_ setAccessibilityValue:stackButtonValue];
999 } 1014 }
1000 1015
1001 - (IBAction)recordUserMetrics:(id)sender { 1016 - (IBAction)recordUserMetrics:(id)sender {
1002 if (sender == toolsMenuButton_) 1017 if (sender == toolsMenuButton_.get())
1003 base::RecordAction(UserMetricsAction("MobileToolbarShowMenu")); 1018 base::RecordAction(UserMetricsAction("MobileToolbarShowMenu"));
1004 else if (sender == stackButton_) 1019 else if (sender == stackButton_.get())
1005 base::RecordAction(UserMetricsAction("MobileToolbarShowStackView")); 1020 base::RecordAction(UserMetricsAction("MobileToolbarShowStackView"));
1006 else if (sender == shareButton_) 1021 else if (sender == shareButton_.get())
1007 base::RecordAction(UserMetricsAction("MobileToolbarShareMenu")); 1022 base::RecordAction(UserMetricsAction("MobileToolbarShareMenu"));
1008 else 1023 else
1009 NOTREACHED(); 1024 NOTREACHED();
1010 } 1025 }
1011 1026
1012 - (IBAction)stackButtonTouchDown:(id)sender { 1027 - (IBAction)stackButtonTouchDown:(id)sender {
1013 // Exists only for override by subclasses. 1028 // Exists only for override by subclasses.
1014 } 1029 }
1015 1030
1016 + (CGFloat)toolbarDropShadowHeight { 1031 + (CGFloat)toolbarDropShadowHeight {
(...skipping 16 matching lines...) Expand all
1033 #pragma mark - 1048 #pragma mark -
1034 #pragma mark PopupMenuDelegate methods. 1049 #pragma mark PopupMenuDelegate methods.
1035 1050
1036 - (void)dismissPopupMenu:(PopupMenuController*)controller { 1051 - (void)dismissPopupMenu:(PopupMenuController*)controller {
1037 if ([controller isKindOfClass:[ToolsPopupController class]] && 1052 if ([controller isKindOfClass:[ToolsPopupController class]] &&
1038 (ToolsPopupController*)controller == toolsPopupController_) 1053 (ToolsPopupController*)controller == toolsPopupController_)
1039 [self dismissToolsMenuPopup]; 1054 [self dismissToolsMenuPopup];
1040 } 1055 }
1041 1056
1042 @end 1057 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/ui/toolbar/toolbar_controller.h ('k') | ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698