| Index: chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm b/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
|
| deleted file mode 100644
|
| index 444356edf7157dac53b07d4dea09e7c3361ebab5..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
|
| +++ /dev/null
|
| @@ -1,231 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#import "chrome/browser/ui/cocoa/browser/avatar_button_controller.h"
|
| -
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "chrome/browser/profiles/profiles_state.h"
|
| -#include "chrome/browser/themes/theme_service.h"
|
| -#include "chrome/browser/themes/theme_service_factory.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#import "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/theme_resources.h"
|
| -#import "ui/base/cocoa/appkit_utils.h"
|
| -#import "ui/base/cocoa/hover_image_button.h"
|
| -#include "ui/base/l10n/l10n_util_mac.h"
|
| -#include "ui/base/nine_image_painter_factory.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/text_elider.h"
|
| -
|
| -namespace {
|
| -
|
| -const CGFloat kButtonPadding = 12;
|
| -const CGFloat kButtonDefaultPadding = 5;
|
| -const CGFloat kButtonHeight = 27;
|
| -const CGFloat kButtonTitleImageSpacing = 10;
|
| -const CGFloat kMaxButtonWidth = 120;
|
| -
|
| -const ui::NinePartImageIds kNormalBorderImageIds =
|
| - IMAGE_GRID(IDR_AVATAR_MAC_BUTTON_NORMAL);
|
| -const ui::NinePartImageIds kHoverBorderImageIds =
|
| - IMAGE_GRID(IDR_AVATAR_MAC_BUTTON_HOVER);
|
| -const ui::NinePartImageIds kPressedBorderImageIds =
|
| - IMAGE_GRID(IDR_AVATAR_MAC_BUTTON_PRESSED);
|
| -const ui::NinePartImageIds kThemedBorderImageIds =
|
| - IMAGE_GRID(IDR_AVATAR_THEMED_MAC_BUTTON_NORMAL);
|
| -
|
| -NSImage* GetImageFromResourceID(int resourceId) {
|
| - return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
|
| - resourceId).ToNSImage();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Button cell with a custom border given by a set of nine-patch image grids.
|
| -@interface CustomThemeButtonCell : NSButtonCell {
|
| - @private
|
| - BOOL isThemedWindow_;
|
| -}
|
| -- (void)setIsThemedWindow:(BOOL)isThemedWindow;
|
| -@end
|
| -
|
| -@implementation CustomThemeButtonCell
|
| -- (id)initWithThemedWindow:(BOOL)isThemedWindow {
|
| - if ((self = [super init])) {
|
| - isThemedWindow_ = isThemedWindow;
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (NSSize)cellSize {
|
| - NSSize buttonSize = [super cellSize];
|
| - buttonSize.width += 2 * kButtonPadding - 2 * kButtonDefaultPadding;
|
| - buttonSize.height = kButtonHeight;
|
| - return buttonSize;
|
| -}
|
| -
|
| -- (NSRect)drawTitle:(NSAttributedString*)title
|
| - withFrame:(NSRect)frame
|
| - inView:(NSView*)controlView {
|
| - frame.origin.x = kButtonPadding;
|
| - // Ensure there's always a padding between the text and the image.
|
| - frame.size.width -= kButtonTitleImageSpacing;
|
| - return [super drawTitle:title withFrame:frame inView:controlView];
|
| -}
|
| -
|
| -- (void)drawImage:(NSImage*)image
|
| - withFrame:(NSRect)frame
|
| - inView:(NSView*)controlView {
|
| - // For the x-offset, we need to undo the default padding and apply the
|
| - // new one. For the y-offset, increasing the button height means we need
|
| - // to move the image a little down to align it nicely with the text; this
|
| - // was chosen by visual inspection.
|
| - frame = NSOffsetRect(frame, kButtonDefaultPadding - kButtonPadding, 2);
|
| - [super drawImage:image withFrame:frame inView:controlView];
|
| -}
|
| -
|
| -- (void)drawBezelWithFrame:(NSRect)frame
|
| - inView:(NSView*)controlView {
|
| - HoverState hoverState =
|
| - [base::mac::ObjCCastStrict<HoverImageButton>(controlView) hoverState];
|
| - ui::NinePartImageIds imageIds = kNormalBorderImageIds;
|
| - if (isThemedWindow_)
|
| - imageIds = kThemedBorderImageIds;
|
| -
|
| - if (hoverState == kHoverStateMouseDown)
|
| - imageIds = kPressedBorderImageIds;
|
| - else if (hoverState == kHoverStateMouseOver)
|
| - imageIds = kHoverBorderImageIds;
|
| - ui::DrawNinePartImage(frame, imageIds, NSCompositeSourceOver, 1.0, true);
|
| -}
|
| -
|
| -- (void)setIsThemedWindow:(BOOL)isThemedWindow {
|
| - isThemedWindow_ = isThemedWindow;
|
| -}
|
| -@end
|
| -
|
| -@interface AvatarButtonController (Private)
|
| -- (void)updateAvatarButtonAndLayoutParent:(BOOL)layoutParent;
|
| -- (void)dealloc;
|
| -- (void)themeDidChangeNotification:(NSNotification*)aNotification;
|
| -@end
|
| -
|
| -@implementation AvatarButtonController
|
| -
|
| -- (id)initWithBrowser:(Browser*)browser {
|
| - if ((self = [super initWithBrowser:browser])) {
|
| - ThemeService* themeService =
|
| - ThemeServiceFactory::GetForProfile(browser->profile());
|
| - isThemedWindow_ = !themeService->UsingNativeTheme();
|
| -
|
| - HoverImageButton* hoverButton =
|
| - [[HoverImageButton alloc] initWithFrame:NSZeroRect];
|
| - [hoverButton setDefaultImage:GetImageFromResourceID(
|
| - IDR_AVATAR_MAC_BUTTON_DROPARROW)];
|
| - [hoverButton setHoverImage:GetImageFromResourceID(
|
| - IDR_AVATAR_MAC_BUTTON_DROPARROW_HOVER)];
|
| - [hoverButton setPressedImage:GetImageFromResourceID(
|
| - IDR_AVATAR_MAC_BUTTON_DROPARROW_PRESSED)];
|
| -
|
| - button_.reset(hoverButton);
|
| - base::scoped_nsobject<CustomThemeButtonCell> cell(
|
| - [[CustomThemeButtonCell alloc] initWithThemedWindow:isThemedWindow_]);
|
| - [button_ setCell:cell.get()];
|
| - [self setView:button_];
|
| -
|
| - [button_ setBezelStyle:NSShadowlessSquareBezelStyle];
|
| - [button_ setButtonType:NSMomentaryChangeButton];
|
| - [button_ setBordered:YES];
|
| - // This is a workaround for an issue in the HoverImageButton where the
|
| - // button is initially sized incorrectly unless a default image is provided.
|
| - [button_ setImage:GetImageFromResourceID(IDR_AVATAR_MAC_BUTTON_DROPARROW)];
|
| - [button_ setImagePosition:NSImageRight];
|
| - [button_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
|
| - [button_ setTarget:self];
|
| - [button_ setAction:@selector(buttonClicked:)];
|
| -
|
| - [self updateAvatarButtonAndLayoutParent:NO];
|
| -
|
| - NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
|
| - [center addObserver:self
|
| - selector:@selector(themeDidChangeNotification:)
|
| - name:kBrowserThemeDidChangeNotification
|
| - object:nil];
|
| -
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)dealloc {
|
| - [[NSNotificationCenter defaultCenter] removeObserver:self];
|
| - [super dealloc];
|
| -}
|
| -
|
| -- (void)themeDidChangeNotification:(NSNotification*)aNotification {
|
| - // Redraw the button if the window has switched between themed and native.
|
| - ThemeService* themeService =
|
| - ThemeServiceFactory::GetForProfile(browser_->profile());
|
| - BOOL updatedIsThemedWindow = !themeService->UsingNativeTheme();
|
| - if (isThemedWindow_ != updatedIsThemedWindow) {
|
| - isThemedWindow_ = updatedIsThemedWindow;
|
| - [[button_ cell] setIsThemedWindow:isThemedWindow_];
|
| - [self updateAvatarButtonAndLayoutParent:YES];
|
| - }
|
| -}
|
| -
|
| -- (void)updateAvatarButtonAndLayoutParent:(BOOL)layoutParent {
|
| - // The button text has a black foreground and a white drop shadow for regular
|
| - // windows, and a light text with a dark drop shadow for guest windows
|
| - // which are themed with a dark background.
|
| - // TODO(noms): Figure out something similar for themed windows, if possible.
|
| - base::scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]);
|
| - [shadow setShadowOffset:NSMakeSize(0, -1)];
|
| - [shadow setShadowBlurRadius:0];
|
| -
|
| - NSColor* foregroundColor;
|
| - if (browser_->profile()->IsGuestSession()) {
|
| - foregroundColor = [NSColor colorWithCalibratedWhite:1.0 alpha:0.9];
|
| - [shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.4]];
|
| - } else if (!isThemedWindow_) {
|
| - foregroundColor = [NSColor blackColor];
|
| - [shadow setShadowColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.7]];
|
| - } else {
|
| - foregroundColor = [NSColor blackColor];
|
| - [shadow setShadowColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.4]];
|
| - }
|
| -
|
| - base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle(
|
| - [[NSMutableParagraphStyle alloc] init]);
|
| - [paragraphStyle setLineBreakMode:NSLineBreakByTruncatingTail];
|
| - [paragraphStyle setAlignment:NSLeftTextAlignment];
|
| -
|
| - NSString* buttonTitle = base::SysUTF16ToNSString(
|
| - profiles::GetAvatarNameForProfile(browser_->profile()));
|
| -
|
| - base::scoped_nsobject<NSAttributedString> attributedTitle(
|
| - [[NSAttributedString alloc]
|
| - initWithString:buttonTitle
|
| - attributes:@{ NSShadowAttributeName : shadow.get(),
|
| - NSForegroundColorAttributeName : foregroundColor,
|
| - NSParagraphStyleAttributeName : paragraphStyle }]);
|
| - [button_ setAttributedTitle:attributedTitle];
|
| - [button_ sizeToFit];
|
| -
|
| - // Truncate the title if needed.
|
| - if (NSWidth([button_ bounds]) > kMaxButtonWidth)
|
| - [button_ setFrameSize:NSMakeSize(kMaxButtonWidth, kButtonHeight)];
|
| -
|
| - if (layoutParent) {
|
| - // Because the width of the button might have changed, the parent browser
|
| - // frame needs to recalculate the button bounds and redraw it.
|
| - [[BrowserWindowController
|
| - browserWindowControllerForWindow:browser_->window()->GetNativeWindow()]
|
| - layoutSubviews];
|
| - }
|
| -}
|
| -
|
| -@end
|
|
|