Index: chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
index 777e1f11c73011be2163a161ef55a7a6c3576292..7a6fa7c9a701859096cf96a4aba8824bd5314fb9 100644 |
--- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
+++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm |
@@ -93,7 +93,6 @@ namespace { |
// Constants taken from the Windows/Views implementation at: |
// chrome/browser/ui/views/profile_chooser_view.cc |
-const int kLargeImageSide = 88; |
const int kMdImageSide = 40; |
const CGFloat kFixedMenuWidth = 240.0; |
@@ -105,7 +104,6 @@ const CGFloat kHorizontalSpacing = 16.0; |
const CGFloat kTitleFontSize = 15.0; |
const CGFloat kTextFontSize = 12.0; |
const CGFloat kProfileButtonHeight = 30; |
-const int kBezelThickness = 3; // Width of the bezel on an NSButton. |
const int kBlueButtonHeight = 30; |
const CGFloat kFocusRingLineWidth = 2; |
@@ -533,122 +531,6 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
} |
@end |
-// A custom image control that shows a "Change" button when moused over. |
-@interface EditableProfilePhoto : HoverImageButton { |
- @private |
- AvatarMenu* avatarMenu_; // Weak; Owned by ProfileChooserController. |
- base::scoped_nsobject<TransparentBackgroundImageView> changePhotoImage_; |
- ProfileChooserController* controller_; |
-} |
- |
-- (id)initWithFrame:(NSRect)frameRect |
- avatarMenu:(AvatarMenu*)avatarMenu |
- profileIcon:(const gfx::Image&)profileIcon |
- editingAllowed:(BOOL)editingAllowed |
- withController:(ProfileChooserController*)controller; |
- |
-// Called when the "Change" button is clicked. |
-- (void)editPhoto:(id)sender; |
- |
-@end |
- |
-@implementation EditableProfilePhoto |
-- (id)initWithFrame:(NSRect)frameRect |
- avatarMenu:(AvatarMenu*)avatarMenu |
- profileIcon:(const gfx::Image&)profileIcon |
- editingAllowed:(BOOL)editingAllowed |
- withController:(ProfileChooserController*)controller { |
- if ((self = [super initWithFrame:frameRect])) { |
- avatarMenu_ = avatarMenu; |
- controller_ = controller; |
- |
- [self setBordered:NO]; |
- |
- base::scoped_nsobject<CustomCircleImageCell> cell( |
- [[CustomCircleImageCell alloc] init]); |
- [self setCell:cell.get()]; |
- |
- [self setDefaultImage:CreateProfileImage(profileIcon, kLargeImageSide, |
- profiles::SHAPE_SQUARE)]; |
- [self setImagePosition:NSImageOnly]; |
- |
- if (editingAllowed) { |
- NSRect bounds = NSMakeRect(0, 0, kLargeImageSide, kLargeImageSide); |
- [self setTarget:self]; |
- [self setAction:@selector(editPhoto:)]; |
- changePhotoImage_.reset([[TransparentBackgroundImageView alloc] |
- initWithFrame:bounds]); |
- [changePhotoImage_ setImage:ui::ResourceBundle::GetSharedInstance(). |
- GetNativeImageNamed(IDR_ICON_PROFILES_EDIT_CAMERA).AsNSImage()]; |
- [self addSubview:changePhotoImage_]; |
- |
- // Hide the image until the button is hovered over. |
- [changePhotoImage_ setHidden:YES]; |
- } |
- |
- // Set the image cell's accessibility strings to be the same as the |
- // button's strings. |
- [[self cell] accessibilitySetOverrideValue:l10n_util::GetNSString( |
- editingAllowed ? |
- IDS_PROFILES_NEW_AVATAR_MENU_CHANGE_PHOTO_ACCESSIBLE_NAME : |
- IDS_PROFILES_NEW_AVATAR_MENU_PHOTO_ACCESSIBLE_NAME) |
- forAttribute:NSAccessibilityTitleAttribute]; |
- [[self cell] accessibilitySetOverrideValue: |
- editingAllowed ? NSAccessibilityButtonRole : NSAccessibilityImageRole |
- forAttribute:NSAccessibilityRoleAttribute]; |
- [[self cell] accessibilitySetOverrideValue: |
- NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil) |
- forAttribute:NSAccessibilityRoleDescriptionAttribute]; |
- |
- // The button and the cell should read the same thing. |
- [self accessibilitySetOverrideValue:l10n_util::GetNSString( |
- editingAllowed ? |
- IDS_PROFILES_NEW_AVATAR_MENU_CHANGE_PHOTO_ACCESSIBLE_NAME : |
- IDS_PROFILES_NEW_AVATAR_MENU_PHOTO_ACCESSIBLE_NAME) |
- forAttribute:NSAccessibilityTitleAttribute]; |
- [self accessibilitySetOverrideValue:NSAccessibilityButtonRole |
- forAttribute:NSAccessibilityRoleAttribute]; |
- [self accessibilitySetOverrideValue: |
- NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil) |
- forAttribute:NSAccessibilityRoleDescriptionAttribute]; |
- } |
- return self; |
-} |
- |
-- (void)editPhoto:(id)sender { |
- avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); |
- [controller_ |
- postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_IMAGE]; |
-} |
- |
-- (void)setHoverState:(HoverState)state { |
- [super setHoverState:state]; |
- [changePhotoImage_ setHidden:([self hoverState] == kHoverStateNone)]; |
-} |
- |
-- (BOOL)canBecomeKeyView { |
- return false; |
-} |
- |
-- (BOOL)accessibilityIsIgnored { |
- return NO; |
-} |
- |
-- (NSArray*)accessibilityActionNames { |
- NSArray* parentActions = [super accessibilityActionNames]; |
- return [parentActions arrayByAddingObject:NSAccessibilityPressAction]; |
-} |
- |
-- (void)accessibilityPerformAction:(NSString*)action { |
- if ([action isEqualToString:NSAccessibilityPressAction]) { |
- avatarMenu_->EditProfile(avatarMenu_->GetActiveProfileIndex()); |
- } |
- |
- [super accessibilityPerformAction:action]; |
-} |
- |
-@end |
- |
// A custom view with a filled circular background. |
@interface BackgroundCircleView : NSView { |
@private |
@@ -673,158 +555,6 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, |
} |
@end |
-// A custom text control that turns into a textfield for editing when clicked. |
-@interface EditableProfileNameButton : HoverImageButton<NSTextFieldDelegate> { |
- @private |
- base::scoped_nsobject<NSTextField> profileNameTextField_; |
- Profile* profile_; // Weak. |
- ProfileChooserController* controller_; |
-} |
- |
-- (id)initWithFrame:(NSRect)frameRect |
- profile:(Profile*)profile |
- profileName:(NSString*)profileName |
- editingAllowed:(BOOL)editingAllowed |
- withController:(ProfileChooserController*)controller; |
- |
-// Called when the button is clicked. |
-- (void)showEditableView:(id)sender; |
- |
-// Called when enter is pressed in the text field. |
-- (void)saveProfileName; |
- |
-@end |
- |
-@implementation EditableProfileNameButton |
-- (id)initWithFrame:(NSRect)frameRect |
- profile:(Profile*)profile |
- profileName:(NSString*)profileName |
- editingAllowed:(BOOL)editingAllowed |
- withController:(ProfileChooserController*)controller { |
- if ((self = [super initWithFrame:frameRect])) { |
- profile_ = profile; |
- controller_ = controller; |
- |
- CGFloat availableWidth = frameRect.size.width; |
- NSSize textSize = [profileName sizeWithAttributes:@{ |
- NSFontAttributeName : [self font] |
- }]; |
- |
- if (editingAllowed) { |
- // Show an "edit" pencil icon when hovering over. In the default state, |
- // we need to create an empty placeholder of the correct size, so that |
- // the text doesn't jump around when the hovered icon appears. |
- ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
- NSImage* hoverImage = rb->GetNativeImageNamed( |
- IDR_ICON_PROFILES_EDIT_HOVER).AsNSImage(); |
- |
- // In order to center the button title, we need to add a left padding of |
- // the same width as the pencil icon. |
- base::scoped_nsobject<CustomPaddingImageButtonCell> cell( |
- [[CustomPaddingImageButtonCell alloc] |
- initWithLeftMarginSpacing:[hoverImage size].width |
- imageTitleSpacing:0]); |
- [self setCell:cell.get()]; |
- |
- NSImage* placeholder = [[NSImage alloc] initWithSize:[hoverImage size]]; |
- [self setDefaultImage:placeholder]; |
- [self setHoverImage:hoverImage]; |
- [self setAlternateImage: |
- rb->GetNativeImageNamed(IDR_ICON_PROFILES_EDIT_PRESSED).AsNSImage()]; |
- [self setImagePosition:NSImageRight]; |
- [self setTarget:self]; |
- [self setAction:@selector(showEditableView:)]; |
- |
- // We need to subtract the width of the bezel from the frame rect, so that |
- // the textfield can take the exact same space as the button. |
- frameRect.size.height -= 2 * kBezelThickness; |
- frameRect.origin = NSMakePoint(0, kBezelThickness); |
- profileNameTextField_.reset( |
- [[NSTextField alloc] initWithFrame:frameRect]); |
- [profileNameTextField_ setStringValue:profileName]; |
- [profileNameTextField_ setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
- [profileNameTextField_ setEditable:YES]; |
- [profileNameTextField_ setDrawsBackground:YES]; |
- [profileNameTextField_ setBezeled:YES]; |
- [profileNameTextField_ setAlignment:NSCenterTextAlignment]; |
- [[profileNameTextField_ cell] setWraps:NO]; |
- [[profileNameTextField_ cell] setLineBreakMode: |
- NSLineBreakByTruncatingTail]; |
- [[profileNameTextField_ cell] setUsesSingleLineMode:YES]; |
- [self addSubview:profileNameTextField_]; |
- [profileNameTextField_ setDelegate:self]; |
- |
- // Hide the textfield until the user clicks on the button. |
- [profileNameTextField_ setHidden:YES]; |
- |
- [[self cell] accessibilitySetOverrideValue:l10n_util::GetNSStringF( |
- IDS_PROFILES_NEW_AVATAR_MENU_EDIT_NAME_ACCESSIBLE_NAME, |
- base::SysNSStringToUTF16(profileName)) |
- forAttribute:NSAccessibilityTitleAttribute]; |
- |
- // Recompute the available width for the name since the icon takes space. |
- availableWidth -= [hoverImage size].width * 2; |
- // The profileNameTextField_ might size the text differently. |
- textSize = [profileName sizeWithAttributes:@{ |
- NSFontAttributeName : [profileNameTextField_ font] |
- }]; |
- } |
- |
- if (textSize.width > availableWidth) |
- [self setToolTip:profileName]; |
- |
- [[self cell] accessibilitySetOverrideValue:NSAccessibilityButtonRole |
- forAttribute:NSAccessibilityRoleAttribute]; |
- [[self cell] |
- accessibilitySetOverrideValue:NSAccessibilityRoleDescription( |
- NSAccessibilityButtonRole, nil) |
- forAttribute:NSAccessibilityRoleDescriptionAttribute]; |
- |
- [self setBordered:NO]; |
- [self setFont:[NSFont labelFontOfSize:kTitleFontSize]]; |
- [self setAlignment:NSCenterTextAlignment]; |
- [[self cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
- [self setTitle:profileName]; |
- } |
- return self; |
-} |
- |
-- (void)saveProfileName { |
- base::string16 newProfileName = |
- base::SysNSStringToUTF16([profileNameTextField_ stringValue]); |
- |
- // Empty profile names are not allowed, and do nothing. |
- base::TrimWhitespace(newProfileName, base::TRIM_ALL, &newProfileName); |
- if (!newProfileName.empty()) { |
- profiles::UpdateProfileName(profile_, newProfileName); |
- [controller_ |
- postActionPerformed:ProfileMetrics::PROFILE_DESKTOP_MENU_EDIT_NAME]; |
- [profileNameTextField_ setHidden:YES]; |
- } |
-} |
- |
-- (void)showEditableView:(id)sender { |
- [profileNameTextField_ setHidden:NO]; |
- [[self window] makeFirstResponder:profileNameTextField_]; |
-} |
- |
-- (BOOL)canBecomeKeyView { |
- return false; |
-} |
- |
-- (BOOL)control:(NSControl*)control |
- textView:(NSTextView*)textView |
- doCommandBySelector:(SEL)commandSelector { |
- if (commandSelector == @selector(insertTab:) || |
- commandSelector == @selector(insertNewline:)) { |
- [self saveProfileName]; |
- return YES; |
- } |
- return NO; |
-} |
- |
-@end |
- |
// A custom button that allows for setting a background color when hovered over. |
@interface BackgroundColorHoverButton : HoverImageButton { |
@private |