OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
6 | 6 |
7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" | 7 #import "chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h" |
8 | 8 |
9 #include "base/mac/bundle_locations.h" | 9 #include "base/mac/bundle_locations.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
325 // The observer can be removed both when closing the browser, and by just | 325 // The observer can be removed both when closing the browser, and by just |
326 // closing the avatar bubble. However, in the case of closing the browser, | 326 // closing the avatar bubble. However, in the case of closing the browser, |
327 // the avatar bubble will also be closed afterwards, resulting in a second | 327 // the avatar bubble will also be closed afterwards, resulting in a second |
328 // attempt to remove the observer. This ensures the observer is only | 328 // attempt to remove the observer. This ensures the observer is only |
329 // removed once. | 329 // removed once. |
330 bool token_observer_registered_; | 330 bool token_observer_registered_; |
331 | 331 |
332 DISALLOW_COPY_AND_ASSIGN(ActiveProfileObserverBridge); | 332 DISALLOW_COPY_AND_ASSIGN(ActiveProfileObserverBridge); |
333 }; | 333 }; |
334 | 334 |
335 // Custom button cell that adds a left padding before the button image, and | |
336 // a custom spacing between the button image and title. | |
337 @interface CustomPaddingImageButtonCell : NSButtonCell { | |
338 @private | |
339 // Padding added to the left margin of the button. | |
340 int leftMarginSpacing_; | |
341 // Spacing between the cell image and title. | |
342 int imageTitleSpacing_; | |
343 } | |
344 | |
345 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing | |
346 imageTitleSpacing:(int)imageTitleSpacing; | |
347 @end | |
348 | |
349 @implementation CustomPaddingImageButtonCell | |
350 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing | |
351 imageTitleSpacing:(int)imageTitleSpacing { | |
352 if ((self = [super init])) { | |
353 leftMarginSpacing_ = leftMarginSpacing; | |
354 imageTitleSpacing_ = imageTitleSpacing; | |
355 } | |
356 return self; | |
357 } | |
358 | |
359 - (NSRect)drawTitle:(NSAttributedString*)title | |
360 withFrame:(NSRect)frame | |
361 inView:(NSView*)controlView { | |
362 frame.origin.x += leftMarginSpacing_; | |
groby-ooo-7-16
2014/06/16 20:49:38
nit: Might want to use NSDivideRect for simplicity
noms (inactive)
2014/06/17 14:11:19
NSDivideRect is magical!!! <3
Done.
On 2014/06/16
| |
363 frame.size.width -= leftMarginSpacing_; | |
364 | |
365 // The title frame origin isn't aware of the left margin spacing added | |
366 // in -drawImage, so it must be added when drawing the title as well. | |
367 if ([self imagePosition] == NSImageLeft) { | |
368 frame.origin.x += imageTitleSpacing_; | |
groby-ooo-7-16
2014/06/16 20:49:38
ditto
noms (inactive)
2014/06/17 14:11:19
Done.
| |
369 frame.size.width -= imageTitleSpacing_; | |
370 } | |
371 return [super drawTitle:title withFrame:frame inView:controlView]; | |
372 } | |
373 | |
374 - (void)drawImage:(NSImage*)image | |
375 withFrame:(NSRect)frame | |
376 inView:(NSView*)controlView { | |
377 if ([self imagePosition] == NSImageLeft) | |
378 frame.origin.x = leftMarginSpacing_; | |
379 [super drawImage:image withFrame:frame inView:controlView]; | |
380 } | |
381 | |
382 - (NSSize)cellSize { | |
383 NSSize buttonSize = [super cellSize]; | |
384 buttonSize.width += leftMarginSpacing_; | |
385 if ([self imagePosition] == NSImageLeft) | |
386 buttonSize.width += imageTitleSpacing_; | |
387 return buttonSize; | |
388 } | |
389 | |
390 @end | |
391 | |
335 // A custom button that has a transparent backround. | 392 // A custom button that has a transparent backround. |
336 @interface TransparentBackgroundButton : NSButton | 393 @interface TransparentBackgroundButton : NSButton |
337 @end | 394 @end |
338 | 395 |
339 @implementation TransparentBackgroundButton | 396 @implementation TransparentBackgroundButton |
340 - (id)initWithFrame:(NSRect)frameRect { | 397 - (id)initWithFrame:(NSRect)frameRect { |
341 if ((self = [super initWithFrame:frameRect])) { | 398 if ((self = [super initWithFrame:frameRect])) { |
342 [self setBordered:NO]; | 399 [self setBordered:NO]; |
343 [self setFont:[NSFont labelFontOfSize:kTextFontSize]]; | 400 [self setFont:[NSFont labelFontOfSize:kTextFontSize]]; |
344 [self setButtonType:NSMomentaryChangeButton]; | 401 [self setButtonType:NSMomentaryChangeButton]; |
345 } | 402 } |
346 return self; | 403 return self; |
347 } | 404 } |
348 | 405 |
349 - (void)drawRect:(NSRect)dirtyRect { | 406 - (void)drawRect:(NSRect)dirtyRect { |
350 NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.4f]; | 407 NSColor* backgroundColor = [NSColor colorWithCalibratedWhite:1 alpha:0.6f]; |
351 [backgroundColor setFill]; | 408 [backgroundColor setFill]; |
352 NSRectFillUsingOperation(dirtyRect, NSCompositeSourceAtop); | 409 NSRectFillUsingOperation(dirtyRect, NSCompositeSourceAtop); |
353 [super drawRect:dirtyRect]; | 410 [super drawRect:dirtyRect]; |
354 } | 411 } |
355 @end | 412 @end |
356 | 413 |
357 // A custom image control that shows a "Change" button when moused over. | 414 // A custom image control that shows a "Change" button when moused over. |
358 @interface EditableProfilePhoto : NSImageView { | 415 @interface EditableProfilePhoto : NSImageView { |
359 @private | 416 @private |
360 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. | 417 AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
450 [button setImage:ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | 507 [button setImage:ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
451 IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; | 508 IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; |
452 [button setImagePosition:NSImageOnly]; | 509 [button setImagePosition:NSImageOnly]; |
453 [button setTarget:self]; | 510 [button setTarget:self]; |
454 [button setAction:@selector(editPhoto:)]; | 511 [button setAction:@selector(editPhoto:)]; |
455 return button; | 512 return button; |
456 } | 513 } |
457 @end | 514 @end |
458 | 515 |
459 // A custom text control that turns into a textfield for editing when clicked. | 516 // A custom text control that turns into a textfield for editing when clicked. |
460 @interface EditableProfileNameButton : HoverImageButton<NSTextFieldDelegate> { | 517 @interface EditableProfileNameButton : HoverImageButton { |
461 @private | 518 @private |
462 base::scoped_nsobject<NSTextField> profileNameTextField_; | 519 base::scoped_nsobject<NSTextField> profileNameTextField_; |
463 Profile* profile_; // Weak. | 520 Profile* profile_; // Weak. |
464 ProfileChooserController* controller_; | 521 ProfileChooserController* controller_; |
465 } | 522 } |
466 | 523 |
467 - (id)initWithFrame:(NSRect)frameRect | 524 - (id)initWithFrame:(NSRect)frameRect |
468 profile:(Profile*)profile | 525 profile:(Profile*)profile |
469 profileName:(NSString*)profileName | 526 profileName:(NSString*)profileName |
470 editingAllowed:(BOOL)editingAllowed | 527 editingAllowed:(BOOL)editingAllowed |
471 withController:(ProfileChooserController*)controller; | 528 withController:(ProfileChooserController*)controller; |
472 | 529 |
473 // Called when the button is clicked. | 530 // Called when the button is clicked. |
474 - (void)showEditableView:(id)sender; | 531 - (void)showEditableView:(id)sender; |
475 | 532 |
476 // Called when the user presses "Enter" in the textfield. | 533 // Called when enter is pressed in the text field. |
477 - (void)controlTextDidEndEditing:(NSNotification *)obj; | 534 - (void)saveProfileName:(id)sender; |
535 | |
478 @end | 536 @end |
479 | 537 |
480 @implementation EditableProfileNameButton | 538 @implementation EditableProfileNameButton |
481 - (id)initWithFrame:(NSRect)frameRect | 539 - (id)initWithFrame:(NSRect)frameRect |
482 profile:(Profile*)profile | 540 profile:(Profile*)profile |
483 profileName:(NSString*)profileName | 541 profileName:(NSString*)profileName |
484 editingAllowed:(BOOL)editingAllowed | 542 editingAllowed:(BOOL)editingAllowed |
485 withController:(ProfileChooserController*)controller { | 543 withController:(ProfileChooserController*)controller { |
486 if ((self = [super initWithFrame:frameRect])) { | 544 if ((self = [super initWithFrame:frameRect])) { |
487 profile_ = profile; | 545 profile_ = profile; |
488 controller_ = controller; | 546 controller_ = controller; |
489 | 547 |
490 [self setBordered:NO]; | |
491 [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; | |
492 [self setAlignment:NSCenterTextAlignment]; | |
493 [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; | |
494 [self setTitle:profileName]; | |
495 | |
496 if (editingAllowed) { | 548 if (editingAllowed) { |
497 // Show an "edit" pencil icon when hovering over. In the default state, | 549 // Show an "edit" pencil icon when hovering over. In the default state, |
498 // we need to create an empty placeholder of the correct size, so that | 550 // we need to create an empty placeholder of the correct size, so that |
499 // the text doesn't jump around when the hovered icon appears. | 551 // the text doesn't jump around when the hovered icon appears. |
500 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 552 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
501 NSImage* hoverImage = rb->GetNativeImageNamed( | 553 NSImage* hoverImage = rb->GetNativeImageNamed( |
502 IDR_ICON_PROFILES_EDIT_HOVER).AsNSImage(); | 554 IDR_ICON_PROFILES_EDIT_HOVER).AsNSImage(); |
555 | |
556 // In order to center the button title, we need to add a left padding of | |
557 // the same width as the pencil icon. | |
558 base::scoped_nsobject<CustomPaddingImageButtonCell> cell( | |
559 [[CustomPaddingImageButtonCell alloc] | |
560 initWithLeftMarginSpacing:[hoverImage size].width | |
561 imageTitleSpacing:0]); | |
562 [self setCell:cell.get()]; | |
563 | |
503 NSImage* placeholder = [[NSImage alloc] initWithSize:[hoverImage size]]; | 564 NSImage* placeholder = [[NSImage alloc] initWithSize:[hoverImage size]]; |
504 [self setDefaultImage:placeholder]; | 565 [self setDefaultImage:placeholder]; |
505 [self setHoverImage:hoverImage]; | 566 [self setHoverImage:hoverImage]; |
506 [self setAlternateImage: | 567 [self setAlternateImage: |
507 rb->GetNativeImageNamed(IDR_ICON_PROFILES_EDIT_PRESSED).AsNSImage()]; | 568 rb->GetNativeImageNamed(IDR_ICON_PROFILES_EDIT_PRESSED).AsNSImage()]; |
508 [self setImagePosition:NSImageRight]; | 569 [self setImagePosition:NSImageRight]; |
509 [self setTarget:self]; | 570 [self setTarget:self]; |
510 [self setAction:@selector(showEditableView:)]; | 571 [self setAction:@selector(showEditableView:)]; |
511 | 572 |
512 // We need to subtract the width of the bezel from the frame rect, so that | 573 // We need to subtract the width of the bezel from the frame rect, so that |
513 // the textfield can take the exact same space as the button. | 574 // the textfield can take the exact same space as the button. |
514 frameRect.size.height -= 2 * kBezelThickness; | 575 frameRect.size.height -= 2 * kBezelThickness; |
515 frameRect.origin = NSMakePoint(0, kBezelThickness); | 576 frameRect.origin = NSMakePoint(0, kBezelThickness); |
516 profileNameTextField_.reset( | 577 profileNameTextField_.reset( |
517 [[NSTextField alloc] initWithFrame:frameRect]); | 578 [[NSTextField alloc] initWithFrame:frameRect]); |
518 [profileNameTextField_ setStringValue:profileName]; | 579 [profileNameTextField_ setStringValue:profileName]; |
519 [profileNameTextField_ setFont:[NSFont labelFontOfSize:kTitleFontSize]]; | 580 [profileNameTextField_ setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
520 [profileNameTextField_ setEditable:YES]; | 581 [profileNameTextField_ setEditable:YES]; |
521 [profileNameTextField_ setDrawsBackground:YES]; | 582 [profileNameTextField_ setDrawsBackground:YES]; |
522 [profileNameTextField_ setBezeled:YES]; | 583 [profileNameTextField_ setBezeled:YES]; |
523 [profileNameTextField_ setAlignment:NSCenterTextAlignment]; | 584 [profileNameTextField_ setAlignment:NSCenterTextAlignment]; |
524 [[profileNameTextField_ cell] setWraps:NO]; | 585 [[profileNameTextField_ cell] setWraps:NO]; |
525 [[profileNameTextField_ cell] setLineBreakMode: | 586 [[profileNameTextField_ cell] setLineBreakMode: |
526 NSLineBreakByTruncatingTail]; | 587 NSLineBreakByTruncatingTail]; |
527 [profileNameTextField_ setDelegate:self]; | |
528 [self addSubview:profileNameTextField_]; | 588 [self addSubview:profileNameTextField_]; |
589 [profileNameTextField_ setTarget:self]; | |
590 [profileNameTextField_ setAction:@selector(saveProfileName:)]; | |
529 | 591 |
530 // Hide the textfield until the user clicks on the button. | 592 // Hide the textfield until the user clicks on the button. |
531 [profileNameTextField_ setHidden:YES]; | 593 [profileNameTextField_ setHidden:YES]; |
532 } | 594 } |
595 | |
596 [self setBordered:NO]; | |
597 [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; | |
598 [self setAlignment:NSCenterTextAlignment]; | |
599 [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; | |
600 [self setTitle:profileName]; | |
533 } | 601 } |
534 return self; | 602 return self; |
535 } | 603 } |
536 | 604 |
537 // NSTextField objects send an NSNotification to a delegate if | 605 - (void)saveProfileName:(id)sender { |
538 // it implements this method: | |
539 - (void)controlTextDidEndEditing:(NSNotification *)obj { | |
540 NSString* text = [profileNameTextField_ stringValue]; | 606 NSString* text = [profileNameTextField_ stringValue]; |
541 // Empty profile names are not allowed, and are treated as a cancel. | 607 // Empty profile names are not allowed, and are treated as a cancel. |
542 if ([text length] > 0) { | 608 if ([text length] > 0) { |
543 profiles::UpdateProfileName(profile_, base::SysNSStringToUTF16(text)); | 609 profiles::UpdateProfileName(profile_, base::SysNSStringToUTF16(text)); |
544 [controller_ | 610 [controller_ |
545 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_NAME]; | 611 postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_NAME]; |
546 [self setTitle:text]; | 612 [self setTitle:text]; |
547 } | 613 } |
548 [profileNameTextField_ setHidden:YES]; | 614 [profileNameTextField_ setHidden:YES]; |
549 [profileNameTextField_ resignFirstResponder]; | |
550 } | 615 } |
551 | 616 |
552 - (void)showEditableView:(id)sender { | 617 - (void)showEditableView:(id)sender { |
553 [profileNameTextField_ setHidden:NO]; | 618 [profileNameTextField_ setHidden:NO]; |
554 [profileNameTextField_ becomeFirstResponder]; | 619 [[self window] makeFirstResponder:profileNameTextField_]; |
555 } | 620 } |
556 | 621 |
557 @end | 622 @end |
558 | |
559 // Custom button cell that adds a left padding before the button image, and | |
560 // a custom spacing between the button image and title. | |
561 @interface CustomPaddingImageButtonCell : NSButtonCell { | |
562 @private | |
563 // Padding between the left margin of the button and the cell image. | |
564 int leftMarginSpacing_; | |
565 // Spacing between the cell image and title. | |
566 int imageTitleSpacing_; | |
567 } | |
568 | |
569 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing | |
570 imageTitleSpacing:(int)imageTitleSpacing; | |
571 @end | |
572 | |
573 @implementation CustomPaddingImageButtonCell | |
574 - (id)initWithLeftMarginSpacing:(int)leftMarginSpacing | |
575 imageTitleSpacing:(int)imageTitleSpacing { | |
576 if ((self = [super init])) { | |
577 leftMarginSpacing_ = leftMarginSpacing; | |
578 imageTitleSpacing_ = imageTitleSpacing; | |
579 } | |
580 return self; | |
581 } | |
582 | |
583 - (NSRect)drawTitle:(NSAttributedString*)title | |
584 withFrame:(NSRect)frame | |
585 inView:(NSView*)controlView { | |
586 // The title frame origin isn't aware of the left margin spacing added | |
587 // in -drawImage, so it must be added when drawing the title as well. | |
588 frame.origin.x += leftMarginSpacing_ + imageTitleSpacing_; | |
589 frame.size.width -= (imageTitleSpacing_ + leftMarginSpacing_); | |
590 return [super drawTitle:title withFrame:frame inView:controlView]; | |
591 } | |
592 | |
593 - (void)drawImage:(NSImage*)image | |
594 withFrame:(NSRect)frame | |
595 inView:(NSView*)controlView { | |
596 frame.origin.x = leftMarginSpacing_; | |
597 [super drawImage:image withFrame:frame inView:controlView]; | |
598 } | |
599 | |
600 - (NSSize)cellSize { | |
601 NSSize buttonSize = [super cellSize]; | |
602 buttonSize.width += leftMarginSpacing_ + imageTitleSpacing_; | |
603 return buttonSize; | |
604 } | |
605 | |
606 @end | |
607 | 623 |
608 // A custom button that allows for setting a background color when hovered over. | 624 // A custom button that allows for setting a background color when hovered over. |
609 @interface BackgroundColorHoverButton : HoverImageButton { | 625 @interface BackgroundColorHoverButton : HoverImageButton { |
610 @private | 626 @private |
611 base::scoped_nsobject<NSColor> backgroundColor_; | 627 base::scoped_nsobject<NSColor> backgroundColor_; |
612 base::scoped_nsobject<NSColor> hoverColor_; | 628 base::scoped_nsobject<NSColor> hoverColor_; |
613 } | 629 } |
614 @end | 630 @end |
615 | 631 |
616 @implementation BackgroundColorHoverButton | 632 @implementation BackgroundColorHoverButton |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
978 currentProfileView = [self createCurrentProfileView:item]; | 994 currentProfileView = [self createCurrentProfileView:item]; |
979 enableLock = item.signed_in; | 995 enableLock = item.signed_in; |
980 } else { | 996 } else { |
981 [otherProfiles addObject:[self createOtherProfileView:i]]; | 997 [otherProfiles addObject:[self createOtherProfileView:i]]; |
982 } | 998 } |
983 } | 999 } |
984 if (!currentProfileView) // Guest windows don't have an active profile. | 1000 if (!currentProfileView) // Guest windows don't have an active profile. |
985 currentProfileView = [self createGuestProfileView]; | 1001 currentProfileView = [self createGuestProfileView]; |
986 | 1002 |
987 // |yOffset| is the next position at which to draw in |container| | 1003 // |yOffset| is the next position at which to draw in |container| |
988 // coordinates. | 1004 // coordinates. Add a pixel offset so that the bottom option buttons don't |
989 CGFloat yOffset = 0; | 1005 // overlap the bubble's rounded corners. |
1006 CGFloat yOffset = 1; | |
990 | 1007 |
991 // Option buttons. Only available with the new profile management flag. | 1008 // Option buttons. Only available with the new profile management flag. |
992 if (switches::IsNewProfileManagement()) { | 1009 if (switches::IsNewProfileManagement()) { |
993 NSRect rect = NSMakeRect(0, yOffset, kFixedMenuWidth, 0); | 1010 NSRect rect = NSMakeRect(0, yOffset, kFixedMenuWidth, 0); |
994 NSView* optionsView = [self createOptionsViewWithRect:rect | 1011 NSView* optionsView = [self createOptionsViewWithRect:rect |
995 enableLock:enableLock]; | 1012 enableLock:enableLock]; |
996 [container addSubview:optionsView]; | 1013 [container addSubview:optionsView]; |
997 rect.origin.y = NSMaxY([optionsView frame]); | 1014 rect.origin.y = NSMaxY([optionsView frame]); |
998 | 1015 |
999 NSBox* separator = [self separatorWithFrame:rect]; | 1016 NSBox* separator = [self horizontalSeparatorWithFrame:rect]; |
1000 [container addSubview:separator]; | 1017 [container addSubview:separator]; |
1001 yOffset = NSMaxY([separator frame]); | 1018 yOffset = NSMaxY([separator frame]); |
1002 } | 1019 } |
1003 | 1020 |
1004 if (viewMode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER && | 1021 if (viewMode_ == profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER && |
1005 switches::IsFastUserSwitching()) { | 1022 switches::IsFastUserSwitching()) { |
1006 // Other profiles switcher. The profiles have already been sorted | 1023 // Other profiles switcher. The profiles have already been sorted |
1007 // by their y-coordinate, so they can be added in the existing order. | 1024 // by their y-coordinate, so they can be added in the existing order. |
1008 for (NSView *otherProfileView in otherProfiles.get()) { | 1025 for (NSView *otherProfileView in otherProfiles.get()) { |
1009 [otherProfileView setFrameOrigin:NSMakePoint(0, yOffset)]; | 1026 [otherProfileView setFrameOrigin:NSMakePoint(0, yOffset)]; |
1010 [container addSubview:otherProfileView]; | 1027 [container addSubview:otherProfileView]; |
1011 yOffset = NSMaxY([otherProfileView frame]); | 1028 yOffset = NSMaxY([otherProfileView frame]); |
1012 | 1029 |
1013 NSBox* separator = | 1030 NSBox* separator = [self horizontalSeparatorWithFrame:NSMakeRect( |
1014 [self separatorWithFrame:NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; | 1031 0, yOffset, kFixedMenuWidth, 0)]; |
1015 [container addSubview:separator]; | 1032 [container addSubview:separator]; |
1016 yOffset = NSMaxY([separator frame]); | 1033 yOffset = NSMaxY([separator frame]); |
1017 } | 1034 } |
1018 } else if (viewMode_ == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT) { | 1035 } else if (viewMode_ == profiles::BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT) { |
1019 NSView* currentProfileAccountsView = [self createCurrentProfileAccountsView: | 1036 NSView* currentProfileAccountsView = [self createCurrentProfileAccountsView: |
1020 NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; | 1037 NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; |
1021 [container addSubview:currentProfileAccountsView]; | 1038 [container addSubview:currentProfileAccountsView]; |
1022 yOffset = NSMaxY([currentProfileAccountsView frame]); | 1039 yOffset = NSMaxY([currentProfileAccountsView frame]); |
1023 | 1040 |
1024 NSBox* accountsSeparator = [self separatorWithFrame: | 1041 NSBox* accountsSeparator = [self horizontalSeparatorWithFrame: |
1025 NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; | 1042 NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; |
1026 [container addSubview:accountsSeparator]; | 1043 [container addSubview:accountsSeparator]; |
1027 yOffset = NSMaxY([accountsSeparator frame]); | 1044 yOffset = NSMaxY([accountsSeparator frame]); |
1028 } | 1045 } |
1029 | 1046 |
1030 // For supervised users, add the disclaimer text. | 1047 // For supervised users, add the disclaimer text. |
1031 if (browser_->profile()->IsSupervised()) { | 1048 if (browser_->profile()->IsSupervised()) { |
1032 yOffset += kSmallVerticalSpacing; | 1049 yOffset += kSmallVerticalSpacing; |
1033 NSView* disclaimerContainer = [self createSupervisedUserDisclaimerView]; | 1050 NSView* disclaimerContainer = [self createSupervisedUserDisclaimerView]; |
1034 [disclaimerContainer setFrameOrigin:NSMakePoint(0, yOffset)]; | 1051 [disclaimerContainer setFrameOrigin:NSMakePoint(0, yOffset)]; |
1035 [container addSubview:disclaimerContainer]; | 1052 [container addSubview:disclaimerContainer]; |
1036 yOffset = NSMaxY([disclaimerContainer frame]); | 1053 yOffset = NSMaxY([disclaimerContainer frame]); |
1037 yOffset += kSmallVerticalSpacing; | 1054 yOffset += kSmallVerticalSpacing; |
1038 | 1055 |
1039 NSBox* separator = | 1056 NSBox* separator = [self horizontalSeparatorWithFrame:NSMakeRect( |
1040 [self separatorWithFrame:NSMakeRect(0, yOffset, kFixedMenuWidth, 0)]; | 1057 0, yOffset, kFixedMenuWidth, 0)]; |
1041 [container addSubview:separator]; | 1058 [container addSubview:separator]; |
1042 yOffset = NSMaxY([separator frame]); | 1059 yOffset = NSMaxY([separator frame]); |
1043 } | 1060 } |
1044 | 1061 |
1045 // Active profile card. | 1062 // Active profile card. |
1046 if (currentProfileView) { | 1063 if (currentProfileView) { |
1047 yOffset += kVerticalSpacing; | 1064 yOffset += kVerticalSpacing; |
1048 [currentProfileView setFrameOrigin:NSMakePoint(0, yOffset)]; | 1065 [currentProfileView setFrameOrigin:NSMakePoint(0, yOffset)]; |
1049 [container addSubview:currentProfileView]; | 1066 [container addSubview:currentProfileView]; |
1050 yOffset = NSMaxY([currentProfileView frame]) + kVerticalSpacing; | 1067 yOffset = NSMaxY([currentProfileView frame]) + kVerticalSpacing; |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1416 [profileButton setBordered:NO]; | 1433 [profileButton setBordered:NO]; |
1417 [profileButton setTag:itemIndex]; | 1434 [profileButton setTag:itemIndex]; |
1418 [profileButton setTarget:self]; | 1435 [profileButton setTarget:self]; |
1419 [profileButton setAction:@selector(switchToProfile:)]; | 1436 [profileButton setAction:@selector(switchToProfile:)]; |
1420 | 1437 |
1421 return profileButton.autorelease(); | 1438 return profileButton.autorelease(); |
1422 } | 1439 } |
1423 | 1440 |
1424 - (NSView*)createOptionsViewWithRect:(NSRect)rect | 1441 - (NSView*)createOptionsViewWithRect:(NSRect)rect |
1425 enableLock:(BOOL)enableLock { | 1442 enableLock:(BOOL)enableLock { |
1426 int widthOfLockButton = enableLock? 2 * kHorizontalSpacing + 12 : 0; | 1443 int widthOfLockButton = enableLock ? 2 * kHorizontalSpacing + 14 : 0; |
1427 NSRect viewRect = NSMakeRect(0, 0, | 1444 NSRect viewRect = NSMakeRect(0, 0, |
1428 rect.size.width - widthOfLockButton, | 1445 rect.size.width - widthOfLockButton, |
1429 kBlueButtonHeight + kVerticalSpacing); | 1446 kBlueButtonHeight + kVerticalSpacing); |
1430 NSString* text = isGuestSession_ ? | 1447 NSString* text = isGuestSession_ ? |
1431 l10n_util::GetNSString(IDS_PROFILES_EXIT_GUEST) : | 1448 l10n_util::GetNSString(IDS_PROFILES_EXIT_GUEST) : |
1432 l10n_util::GetNSStringF(IDS_PROFILES_NOT_YOU_BUTTON, | 1449 l10n_util::GetNSStringF(IDS_PROFILES_NOT_YOU_BUTTON, |
1433 profiles::GetAvatarNameForProfile(browser_->profile())); | 1450 profiles::GetAvatarNameForProfile(browser_->profile())); |
1434 NSButton* notYouButton = | 1451 NSButton* notYouButton = |
1435 [self hoverButtonWithRect:viewRect | 1452 [self hoverButtonWithRect:viewRect |
1436 text:text | 1453 text:text |
1437 imageResourceId:IDR_ICON_PROFILES_MENU_AVATAR | 1454 imageResourceId:IDR_ICON_PROFILES_MENU_AVATAR |
1438 alternateImageResourceId:IDR_ICON_PROFILES_MENU_AVATAR | 1455 alternateImageResourceId:IDR_ICON_PROFILES_MENU_AVATAR |
1439 action:isGuestSession_? @selector(exitGuest:) : | 1456 action:isGuestSession_? @selector(exitGuest:) : |
1440 @selector(showUserManager:)]; | 1457 @selector(showUserManager:)]; |
1441 | 1458 |
1442 rect.size.height = NSMaxY([notYouButton frame]); | 1459 rect.size.height = NSMaxY([notYouButton frame]); |
1443 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]); | 1460 base::scoped_nsobject<NSView> container([[NSView alloc] initWithFrame:rect]); |
1444 [container addSubview:notYouButton]; | 1461 [container addSubview:notYouButton]; |
1445 | 1462 |
1446 if (enableLock) { | 1463 if (enableLock) { |
1447 viewRect.origin.x = NSMaxX([notYouButton frame]); | 1464 viewRect.origin.x = NSMaxX([notYouButton frame]); |
1465 NSBox* separator = [self verticalSeparatorWithFrame:viewRect]; | |
1466 [container addSubview:separator]; | |
1467 | |
1468 viewRect.origin.x = NSMaxX([separator frame]); | |
1448 viewRect.size.width = widthOfLockButton; | 1469 viewRect.size.width = widthOfLockButton; |
1449 NSButton* lockButton = | 1470 NSButton* lockButton = |
1450 [self hoverButtonWithRect:viewRect | 1471 [self hoverButtonWithRect:viewRect |
1451 text:@"" | 1472 text:@"" |
1452 imageResourceId:IDR_ICON_PROFILES_MENU_LOCK | 1473 imageResourceId:IDR_ICON_PROFILES_MENU_LOCK |
1453 alternateImageResourceId:IDR_ICON_PROFILES_MENU_LOCK | 1474 alternateImageResourceId:IDR_ICON_PROFILES_MENU_LOCK |
1454 action:@selector(lockProfile:)]; | 1475 action:@selector(lockProfile:)]; |
1455 [container addSubview:lockButton]; | 1476 [container addSubview:lockButton]; |
1456 } | 1477 } |
1457 | 1478 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1545 source, false /* auto_close */, true /* is_constrained */), | 1566 source, false /* auto_close */, true /* is_constrained */), |
1546 content::Referrer(), | 1567 content::Referrer(), |
1547 content::PAGE_TRANSITION_AUTO_TOPLEVEL, | 1568 content::PAGE_TRANSITION_AUTO_TOPLEVEL, |
1548 std::string()); | 1569 std::string()); |
1549 NSView* webview = webContents_->GetNativeView(); | 1570 NSView* webview = webContents_->GetNativeView(); |
1550 [webview setFrameSize:NSMakeSize(kFixedGaiaViewWidth, kFixedGaiaViewHeight)]; | 1571 [webview setFrameSize:NSMakeSize(kFixedGaiaViewWidth, kFixedGaiaViewHeight)]; |
1551 [container addSubview:webview]; | 1572 [container addSubview:webview]; |
1552 yOffset = NSMaxY([webview frame]); | 1573 yOffset = NSMaxY([webview frame]); |
1553 | 1574 |
1554 // Adds the title card. | 1575 // Adds the title card. |
1555 NSBox* separator = [self separatorWithFrame: | 1576 NSBox* separator = [self horizontalSeparatorWithFrame: |
1556 NSMakeRect(0, yOffset, kFixedGaiaViewWidth, 0)]; | 1577 NSMakeRect(0, yOffset, kFixedGaiaViewWidth, 0)]; |
1557 [container addSubview:separator]; | 1578 [container addSubview:separator]; |
1558 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; | 1579 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |
1559 | 1580 |
1560 NSView* titleView = BuildTitleCard( | 1581 NSView* titleView = BuildTitleCard( |
1561 NSMakeRect(0, yOffset, kFixedGaiaViewWidth,0), | 1582 NSMakeRect(0, yOffset, kFixedGaiaViewWidth,0), |
1562 addSecondaryAccount ? IDS_PROFILES_GAIA_ADD_ACCOUNT_TITLE : | 1583 addSecondaryAccount ? IDS_PROFILES_GAIA_ADD_ACCOUNT_TITLE : |
1563 IDS_PROFILES_GAIA_SIGNIN_TITLE, | 1584 IDS_PROFILES_GAIA_SIGNIN_TITLE, |
1564 self /* backButtonTarget*/, | 1585 self /* backButtonTarget*/, |
1565 @selector(navigateBackFromSigninPage:) /* backButtonAction */); | 1586 @selector(navigateBackFromSigninPage:) /* backButtonAction */); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1617 NSTextField* contentLabel = BuildLabel(contentStr, contentFrameOrigin, | 1638 NSTextField* contentLabel = BuildLabel(contentStr, contentFrameOrigin, |
1618 GetDialogBackgroundColor(), nil /* text_color */); | 1639 GetDialogBackgroundColor(), nil /* text_color */); |
1619 [contentLabel setFrameSize:NSMakeSize(availableWidth, 0)]; | 1640 [contentLabel setFrameSize:NSMakeSize(availableWidth, 0)]; |
1620 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:contentLabel]; | 1641 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:contentLabel]; |
1621 contentView = contentLabel; | 1642 contentView = contentLabel; |
1622 } | 1643 } |
1623 [container addSubview:contentView]; | 1644 [container addSubview:contentView]; |
1624 yOffset = NSMaxY([contentView frame]) + kVerticalSpacing; | 1645 yOffset = NSMaxY([contentView frame]) + kVerticalSpacing; |
1625 | 1646 |
1626 // Adds the title card. | 1647 // Adds the title card. |
1627 NSBox* separator = [self separatorWithFrame: | 1648 NSBox* separator = [self horizontalSeparatorWithFrame: |
1628 NSMakeRect(0, yOffset, kFixedAccountRemovalViewWidth, 0)]; | 1649 NSMakeRect(0, yOffset, kFixedAccountRemovalViewWidth, 0)]; |
1629 [container addSubview:separator]; | 1650 [container addSubview:separator]; |
1630 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; | 1651 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |
1631 | 1652 |
1632 NSView* titleView = BuildTitleCard( | 1653 NSView* titleView = BuildTitleCard( |
1633 NSMakeRect(0, yOffset, kFixedAccountRemovalViewWidth,0), | 1654 NSMakeRect(0, yOffset, kFixedAccountRemovalViewWidth,0), |
1634 IDS_PROFILES_ACCOUNT_REMOVAL_TITLE, | 1655 IDS_PROFILES_ACCOUNT_REMOVAL_TITLE, |
1635 self /* backButtonTarget*/, | 1656 self /* backButtonTarget*/, |
1636 @selector(showAccountManagement:) /* backButtonAction */); | 1657 @selector(showAccountManagement:) /* backButtonAction */); |
1637 [container addSubview:titleView]; | 1658 [container addSubview:titleView]; |
(...skipping 30 matching lines...) Expand all Loading... | |
1668 NSString* contentStr = | 1689 NSString* contentStr = |
1669 l10n_util::GetNSString(IDS_PROFILES_END_PREVIEW_TEXT); | 1690 l10n_util::GetNSString(IDS_PROFILES_END_PREVIEW_TEXT); |
1670 NSTextField* contentLabel = BuildLabel(contentStr, contentFrameOrigin, | 1691 NSTextField* contentLabel = BuildLabel(contentStr, contentFrameOrigin, |
1671 GetDialogBackgroundColor(), nil /* text_color */); | 1692 GetDialogBackgroundColor(), nil /* text_color */); |
1672 [contentLabel setFrameSize:NSMakeSize(availableWidth, 0)]; | 1693 [contentLabel setFrameSize:NSMakeSize(availableWidth, 0)]; |
1673 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:contentLabel]; | 1694 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:contentLabel]; |
1674 [container addSubview:contentLabel]; | 1695 [container addSubview:contentLabel]; |
1675 yOffset = NSMaxY([contentLabel frame]) + kVerticalSpacing; | 1696 yOffset = NSMaxY([contentLabel frame]) + kVerticalSpacing; |
1676 | 1697 |
1677 // Adds the title card. | 1698 // Adds the title card. |
1678 NSBox* separator = [self separatorWithFrame: | 1699 NSBox* separator = [self horizontalSeparatorWithFrame: |
1679 NSMakeRect(0, yOffset, kFixedEndPreviewViewWidth, 0)]; | 1700 NSMakeRect(0, yOffset, kFixedEndPreviewViewWidth, 0)]; |
1680 [container addSubview:separator]; | 1701 [container addSubview:separator]; |
1681 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; | 1702 yOffset = NSMaxY([separator frame]) + kSmallVerticalSpacing; |
1682 | 1703 |
1683 NSView* titleView = BuildTitleCard( | 1704 NSView* titleView = BuildTitleCard( |
1684 NSMakeRect(0, yOffset, kFixedEndPreviewViewWidth, 0), | 1705 NSMakeRect(0, yOffset, kFixedEndPreviewViewWidth, 0), |
1685 IDS_PROFILES_END_PREVIEW, | 1706 IDS_PROFILES_END_PREVIEW, |
1686 self /* backButtonTarget*/, | 1707 self /* backButtonTarget*/, |
1687 @selector(showSendFeedbackTutorial:) /* backButtonAction */); | 1708 @selector(showSendFeedbackTutorial:) /* backButtonAction */); |
1688 [container addSubview:titleView]; | 1709 [container addSubview:titleView]; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1783 [button addSubview:deleteButton]; | 1804 [button addSubview:deleteButton]; |
1784 return button.autorelease(); | 1805 return button.autorelease(); |
1785 } | 1806 } |
1786 | 1807 |
1787 - (void)postActionPerformed:(ProfileMetrics::ProfileDesktopMenu)action { | 1808 - (void)postActionPerformed:(ProfileMetrics::ProfileDesktopMenu)action { |
1788 ProfileMetrics::LogProfileDesktopMenu(action, serviceType_); | 1809 ProfileMetrics::LogProfileDesktopMenu(action, serviceType_); |
1789 serviceType_ = signin::GAIA_SERVICE_TYPE_NONE; | 1810 serviceType_ = signin::GAIA_SERVICE_TYPE_NONE; |
1790 } | 1811 } |
1791 | 1812 |
1792 @end | 1813 @end |
OLD | NEW |