| Index: chrome/browser/ui/cocoa/profile_menu_button.mm
|
| diff --git a/chrome/browser/ui/cocoa/profile_menu_button.mm b/chrome/browser/ui/cocoa/profile_menu_button.mm
|
| deleted file mode 100644
|
| index 7d81117d2b239a12c0c5109d23a19385d33ee194..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/profile_menu_button.mm
|
| +++ /dev/null
|
| @@ -1,363 +0,0 @@
|
| -// Copyright (c) 2011 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/profile_menu_button.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/logging.h"
|
| -#include "chrome/browser/ui/profile_menu_model.h"
|
| -#import "third_party/GTM/AppKit/GTMFadeTruncatingTextFieldCell.h"
|
| -
|
| -namespace {
|
| -
|
| -const CGFloat kTabWidth = 24;
|
| -const CGFloat kTabHeight = 13;
|
| -const CGFloat kTabArrowWidth = 7;
|
| -const CGFloat kTabArrowHeight = 4;
|
| -const CGFloat kTabRoundRectRadius = 5;
|
| -const CGFloat kTabDisplayNameMarginY = 3;
|
| -
|
| -NSColor* GetWhiteWithAlpha(CGFloat alpha) {
|
| - return [NSColor colorWithCalibratedWhite:1.0 alpha:alpha];
|
| -}
|
| -
|
| -NSColor* GetBlackWithAlpha(CGFloat alpha) {
|
| - return [NSColor colorWithCalibratedWhite:0.0 alpha:alpha];
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -@interface ProfileMenuButton (Private)
|
| -- (void)commonInit;
|
| -- (NSPoint)popUpMenuPosition;
|
| -- (NSImage*)tabImage;
|
| -- (NSRect)textFieldRect;
|
| -- (NSBezierPath*)tabPathWithRect:(NSRect)rect
|
| - radius:(CGFloat)radius;
|
| -- (NSBezierPath*)downArrowPathWithRect:(NSRect)rect;
|
| -- (NSImage*)tabImageWithSize:(NSSize)tabSize
|
| - fillColor:(NSColor*)fillColor
|
| - isPressed:(BOOL)isPressed;
|
| -@end
|
| -
|
| -@implementation ProfileMenuButton
|
| -
|
| -@synthesize shouldShowProfileDisplayName = shouldShowProfileDisplayName_;
|
| -
|
| -- (void)commonInit {
|
| - textFieldCell_.reset(
|
| - [[GTMFadeTruncatingTextFieldCell alloc] initTextCell:@""]);
|
| - [textFieldCell_ setBackgroundStyle:NSBackgroundStyleRaised];
|
| - [textFieldCell_ setAlignment:NSRightTextAlignment];
|
| - [textFieldCell_ setFont:[NSFont systemFontOfSize:
|
| - [NSFont smallSystemFontSize]]];
|
| -
|
| - [self setOpenMenuOnClick:YES];
|
| -
|
| - profile_menu_model_.reset(new ProfileMenuModel);
|
| - menu_.reset([[MenuController alloc] initWithModel:profile_menu_model_.get()
|
| - useWithPopUpButtonCell:NO]);
|
| -}
|
| -
|
| -- (id)initWithFrame:(NSRect)frame {
|
| - if ((self = [super initWithFrame:frame]))
|
| - [self commonInit];
|
| - return self;
|
| -}
|
| -
|
| -- (id)initWithCoder:(NSCoder*)decoder {
|
| - if ((self = [super initWithCoder:decoder]))
|
| - [self commonInit];
|
| - return self;
|
| -}
|
| -
|
| -- (void)dealloc {
|
| - [[NSNotificationCenter defaultCenter] removeObserver:self];
|
| - [super dealloc];
|
| -}
|
| -
|
| -- (NSString*)profileDisplayName {
|
| - return [textFieldCell_ stringValue];
|
| -}
|
| -
|
| -- (void)setProfileDisplayName:(NSString*)name {
|
| - if (![[textFieldCell_ stringValue] isEqual:name]) {
|
| - [textFieldCell_ setStringValue:name];
|
| - [self setNeedsDisplay:YES];
|
| - }
|
| -}
|
| -
|
| -- (void)setShouldShowProfileDisplayName:(BOOL)flag {
|
| - shouldShowProfileDisplayName_ = flag;
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (BOOL)isFlipped {
|
| - return NO;
|
| -}
|
| -
|
| -- (void)viewWillMoveToWindow:(NSWindow*)newWindow {
|
| - if ([self window] == newWindow)
|
| - return;
|
| -
|
| - if ([self window]) {
|
| - [[NSNotificationCenter defaultCenter]
|
| - removeObserver:self
|
| - name:NSWindowDidBecomeMainNotification
|
| - object:[self window]];
|
| - [[NSNotificationCenter defaultCenter]
|
| - removeObserver:self
|
| - name:NSWindowDidResignMainNotification
|
| - object:[self window]];
|
| - }
|
| -
|
| - if (newWindow) {
|
| - [[NSNotificationCenter defaultCenter]
|
| - addObserver:self
|
| - selector:@selector(onWindowFocusChanged:)
|
| - name:NSWindowDidBecomeMainNotification
|
| - object:newWindow];
|
| - [[NSNotificationCenter defaultCenter]
|
| - addObserver:self
|
| - selector:@selector(onWindowFocusChanged:)
|
| - name:NSWindowDidResignMainNotification
|
| - object:newWindow];
|
| - }
|
| -}
|
| -
|
| -- (void)onWindowFocusChanged:(NSNotification*)note {
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (NSRect)tabRect {
|
| - NSRect bounds = [self bounds];
|
| - NSRect tabRect;
|
| - tabRect.size.width = kTabWidth;
|
| - tabRect.size.height = kTabHeight;
|
| - tabRect.origin.x = NSMaxX(bounds) - NSWidth(tabRect);
|
| - tabRect.origin.y = NSMaxY(bounds) - NSHeight(tabRect);
|
| - return tabRect;
|
| -}
|
| -
|
| -- (NSRect)textFieldRect {
|
| - NSRect bounds = [self bounds];
|
| - NSSize desiredSize = [textFieldCell_ cellSize];
|
| -
|
| - NSRect textRect = bounds;
|
| - textRect.size.height = std::min(desiredSize.height, NSHeight(bounds));
|
| -
|
| - // For some reason there's always a 2 pixel gap on the right side of the
|
| - // text field. Fix it by moving the text field to the right by 2 pixels.
|
| - textRect.origin.x += 2;
|
| -
|
| - return textRect;
|
| -}
|
| -
|
| -- (NSView*)hitTest:(NSPoint)aPoint {
|
| - NSView* probe = [super hitTest:aPoint];
|
| - if (probe != self)
|
| - return probe;
|
| -
|
| - NSPoint viewPoint = [self convertPoint:aPoint fromView:[self superview]];
|
| - BOOL isFlipped = [self isFlipped];
|
| - if (NSMouseInRect(viewPoint, [self tabRect], isFlipped))
|
| - return self;
|
| - else
|
| - return nil;
|
| -}
|
| -
|
| -- (NSBezierPath*)tabPathWithRect:(NSRect)rect
|
| - radius:(CGFloat)radius {
|
| - const NSRect innerRect = NSInsetRect(rect, radius, radius);
|
| - NSBezierPath* path = [NSBezierPath bezierPath];
|
| -
|
| - // Top left
|
| - [path moveToPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect))];
|
| -
|
| - // Bottom left
|
| - [path lineToPoint:NSMakePoint(NSMinX(rect), NSMinY(innerRect))];
|
| - [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(innerRect),
|
| - NSMinY(innerRect))
|
| - radius:radius
|
| - startAngle:180
|
| - endAngle:270
|
| - clockwise:NO];
|
| -
|
| - // Bottom right
|
| - [path lineToPoint:NSMakePoint(NSMaxX(innerRect), NSMinY(rect))];
|
| - [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(innerRect),
|
| - NSMinY(innerRect))
|
| - radius:radius
|
| - startAngle:270
|
| - endAngle:360
|
| - clockwise:NO];
|
| -
|
| - // Top right
|
| - [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))];
|
| -
|
| - [path closePath];
|
| - return path;
|
| -}
|
| -
|
| -- (NSBezierPath*)downArrowPathWithRect:(NSRect)rect {
|
| - NSBezierPath* path = [NSBezierPath bezierPath];
|
| -
|
| - // Top left
|
| - [path moveToPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect))];
|
| -
|
| - // Bottom middle
|
| - [path lineToPoint:NSMakePoint(NSMidX(rect), NSMinY(rect))];
|
| -
|
| - // Top right
|
| - [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))];
|
| -
|
| - [path closePath];
|
| - return path;
|
| -}
|
| -
|
| -- (NSImage*)tabImageWithSize:(NSSize)tabSize
|
| - fillColor:(NSColor*)fillColor
|
| - isPressed:(BOOL)isPressed {
|
| - NSImage* image = [[[NSImage alloc] initWithSize:tabSize] autorelease];
|
| - [image lockFocus];
|
| -
|
| - // White shadow for inset look
|
| - [[NSGraphicsContext currentContext] saveGraphicsState];
|
| - scoped_nsobject<NSShadow> tabShadow([[NSShadow alloc] init]);
|
| - [tabShadow.get() setShadowOffset:NSMakeSize(0, -1)];
|
| - [tabShadow setShadowBlurRadius:0];
|
| - [tabShadow.get() setShadowColor:GetWhiteWithAlpha(0.6)];
|
| - [tabShadow set];
|
| -
|
| - // Gray outline
|
| - NSRect tabRect = NSMakeRect(0, 1, tabSize.width, tabSize.height - 1);
|
| - NSBezierPath* outlinePath = [self tabPathWithRect:tabRect
|
| - radius:kTabRoundRectRadius];
|
| - [[NSColor colorWithCalibratedWhite:0.44 alpha:1.0] set];
|
| - [outlinePath fill];
|
| -
|
| - [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| -
|
| - // Fill
|
| - NSRect fillRect = NSInsetRect(tabRect, 1, 0);
|
| - fillRect.size.height -= 1;
|
| - fillRect.origin.y += 1;
|
| - NSBezierPath* fillPath = [self tabPathWithRect:fillRect
|
| - radius:kTabRoundRectRadius - 1];
|
| - [fillColor set];
|
| - [fillPath fill];
|
| -
|
| - // Shading for fill to make the bottom of the tab slightly darker.
|
| - scoped_nsobject<NSGradient> gradient([[NSGradient alloc]
|
| - initWithStartingColor:GetBlackWithAlpha(isPressed ? 0.2 : 0.0)
|
| - endingColor:GetBlackWithAlpha(0.2)]);
|
| - [gradient drawInBezierPath:fillPath angle:270];
|
| -
|
| - // Highlight on top
|
| - NSRect highlightRect = NSInsetRect(tabRect, 1, 0);
|
| - highlightRect.size.height = 1;
|
| - highlightRect.origin.y = NSMaxY(tabRect) - highlightRect.size.height;
|
| - [GetWhiteWithAlpha(0.5) set];
|
| - NSRectFillUsingOperation(highlightRect, NSCompositeSourceOver);
|
| -
|
| - // Arrow shadow
|
| - [[NSGraphicsContext currentContext] saveGraphicsState];
|
| - scoped_nsobject<NSShadow> arrowShadow([[NSShadow alloc] init]);
|
| - [arrowShadow.get() setShadowOffset:NSMakeSize(0, -1)];
|
| - [arrowShadow setShadowBlurRadius:0];
|
| - [arrowShadow.get() setShadowColor:GetBlackWithAlpha(0.6)];
|
| - [arrowShadow set];
|
| -
|
| - // Down arrow
|
| - NSRect arrowRect;
|
| - arrowRect.size.width = kTabArrowWidth;
|
| - arrowRect.size.height = kTabArrowHeight;
|
| - arrowRect.origin.x = NSMinX(tabRect) + roundf((NSWidth(tabRect) -
|
| - NSWidth(arrowRect)) / 2.0);
|
| - arrowRect.origin.y = NSMinY(tabRect) + roundf((tabRect.size.height -
|
| - arrowRect.size.height) / 2.0);
|
| - NSBezierPath* arrowPath = [self downArrowPathWithRect:arrowRect];
|
| - if (isPressed)
|
| - [[NSColor colorWithCalibratedWhite:0.8 alpha:1.0] set];
|
| - else
|
| - [[NSColor whiteColor] set];
|
| - [arrowPath fill];
|
| -
|
| - [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| -
|
| - [image unlockFocus];
|
| - return image;
|
| -}
|
| -
|
| -- (NSImage*)tabImage {
|
| - BOOL isPressed = [[self cell] isHighlighted];
|
| -
|
| - // Invalidate the cached image if necessary.
|
| - if (cachedTabImageIsPressed_ != isPressed) {
|
| - cachedTabImageIsPressed_ = isPressed;
|
| - cachedTabImage_.reset();
|
| - }
|
| -
|
| - if (cachedTabImage_)
|
| - return cachedTabImage_;
|
| -
|
| - // TODO: Use different colors for different profiles and tint for
|
| - // the current browser theme.
|
| - NSColor* fillColor = [NSColor colorWithCalibratedRed:122.0/255.0
|
| - green:177.0/255.0
|
| - blue:252.0/255.0
|
| - alpha:1.0];
|
| - NSRect tabRect = [self tabRect];
|
| - cachedTabImage_.reset([[self tabImageWithSize:tabRect.size
|
| - fillColor:fillColor
|
| - isPressed:isPressed] retain]);
|
| - return cachedTabImage_;
|
| -}
|
| -
|
| -- (void)drawRect:(NSRect)rect {
|
| - CGFloat alpha = [[self window] isMainWindow] ? 1.0 : 0.5;
|
| - [[self tabImage] drawInRect:[self tabRect]
|
| - fromRect:NSZeroRect
|
| - operation:NSCompositeSourceOver
|
| - fraction:alpha];
|
| -
|
| - if (shouldShowProfileDisplayName_) {
|
| - NSColor* textColor = [[self window] isMainWindow] ?
|
| - GetBlackWithAlpha(0.6) : GetBlackWithAlpha(0.4);
|
| - if (![[textFieldCell_ textColor] isEqual:textColor])
|
| - [textFieldCell_ setTextColor:textColor];
|
| - [textFieldCell_ drawWithFrame:[self textFieldRect] inView:self];
|
| - }
|
| -}
|
| -
|
| -- (NSSize)desiredControlSize {
|
| - NSSize size = [self tabRect].size;
|
| -
|
| - if (shouldShowProfileDisplayName_) {
|
| - NSSize textFieldSize = [textFieldCell_ cellSize];
|
| - size.width = std::max(size.width, textFieldSize.width);
|
| - size.height += textFieldSize.height + kTabDisplayNameMarginY;
|
| - }
|
| -
|
| - size.width = ceil(size.width);
|
| - size.height = ceil(size.height);
|
| - return size;
|
| -}
|
| -
|
| -- (NSSize)minControlSize {
|
| - return [self tabRect].size;
|
| -}
|
| -
|
| -// Overridden from MenuButton.
|
| -- (NSMenu*)attachedMenu {
|
| - return [menu_.get() menu];
|
| -}
|
| -
|
| -// Overridden from MenuButton.
|
| -- (NSRect)menuRect {
|
| - return [self tabRect];
|
| -}
|
| -
|
| -@end
|
|
|