diff options
Diffstat (limited to 'chrome/browser/ui/cocoa/hyperlink_button_cell.mm')
-rw-r--r-- | chrome/browser/ui/cocoa/hyperlink_button_cell.mm | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/hyperlink_button_cell.mm b/chrome/browser/ui/cocoa/hyperlink_button_cell.mm new file mode 100644 index 0000000..c8bb93e8 --- /dev/null +++ b/chrome/browser/ui/cocoa/hyperlink_button_cell.mm @@ -0,0 +1,116 @@ +// Copyright (c) 2009 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/hyperlink_button_cell.h" + +@interface HyperlinkButtonCell (Private) +- (NSDictionary*)linkAttributres; +- (void)customizeButtonCell; +@end + +@implementation HyperlinkButtonCell +@dynamic textColor; + ++ (NSColor*)defaultTextColor { + return [NSColor blueColor]; +} + +// Designated initializer. +- (id)init { + if ((self = [super init])) { + [self customizeButtonCell]; + } + return self; +} + +// Initializer called when the cell is loaded from the NIB. +- (id)initWithCoder:(NSCoder*)aDecoder { + if ((self = [super initWithCoder:aDecoder])) { + [self customizeButtonCell]; + } + return self; +} + +// Initializer for code-based creation. +- (id)initTextCell:(NSString*)title { + if ((self = [super initTextCell:title])) { + [self customizeButtonCell]; + } + return self; +} + +// Because an NSButtonCell has multiple initializers, this method performs the +// common cell customization code. +- (void)customizeButtonCell { + [self setBordered:NO]; + [self setTextColor:[HyperlinkButtonCell defaultTextColor]]; + + CGFloat fontSize = [NSFont systemFontSizeForControlSize:[self controlSize]]; + NSFont* font = [NSFont controlContentFontOfSize:fontSize]; + [self setFont:font]; + + // Do not change button appearance when we are pushed. + // TODO(rsesek): Change text color to red? + [self setHighlightsBy:NSNoCellMask]; + + // We need to set this so that we can override |-mouseEntered:| and + // |-mouseExited:| to change the cursor style on hover states. + [self setShowsBorderOnlyWhileMouseInside:YES]; +} + +- (void)setControlSize:(NSControlSize)size { + [super setControlSize:size]; + [self customizeButtonCell]; // recompute |font|. +} + +// Creates the NSDictionary of attributes for the attributed string. +- (NSDictionary*)linkAttributes { + NSUInteger underlineMask = NSUnderlinePatternSolid | NSUnderlineStyleSingle; + scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( + [[NSParagraphStyle defaultParagraphStyle] mutableCopy]); + [paragraphStyle setAlignment:[self alignment]]; + + return [NSDictionary dictionaryWithObjectsAndKeys: + [self textColor], NSForegroundColorAttributeName, + [NSNumber numberWithInt:underlineMask], NSUnderlineStyleAttributeName, + [self font], NSFontAttributeName, + [NSCursor pointingHandCursor], NSCursorAttributeName, + paragraphStyle.get(), NSParagraphStyleAttributeName, + nil + ]; +} + +// Override the drawing for the cell so that the custom style attributes +// can always be applied and so that ellipses will appear when appropriate. +- (NSRect)drawTitle:(NSAttributedString*)title + withFrame:(NSRect)frame + inView:(NSView*)controlView { + NSDictionary* linkAttributes = [self linkAttributes]; + NSString* plainTitle = [title string]; + [plainTitle drawWithRect:frame + options:(NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingTruncatesLastVisibleLine) + attributes:linkAttributes]; + return frame; +} + +// Override the default behavior to draw the border. Instead, change the cursor. +- (void)mouseEntered:(NSEvent*)event { + [[NSCursor pointingHandCursor] push]; +} + +- (void)mouseExited:(NSEvent*)event { + [NSCursor pop]; +} + +// Setters and getters. +- (NSColor*)textColor { + return textColor_.get(); +} + +- (void)setTextColor:(NSColor*)color { + textColor_.reset([color retain]); +} + +@end |