Chromium Code Reviews| Index: chrome/browser/ui/cocoa/hyperlink_text_view.mm |
| diff --git a/chrome/browser/ui/cocoa/hyperlink_text_view.mm b/chrome/browser/ui/cocoa/hyperlink_text_view.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b04dabb6626e1a4b718501cded54b5dbeaad6954 |
| --- /dev/null |
| +++ b/chrome/browser/ui/cocoa/hyperlink_text_view.mm |
| @@ -0,0 +1,129 @@ |
| +// 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/hyperlink_text_view.h" |
| + |
| +#include "base/memory/scoped_nsobject.h" |
| + |
| +// The baseline shift for text in the NSTextView. |
| +const float kTextBaselineShift = -1.0; |
| + |
| +@implementation HyperlinkTextView |
| + |
| +- (id)init { |
|
Nico
2011/09/01 03:36:03
Do you use this? Views normally don't have a bare
msw
2011/09/01 16:27:42
Removed, wasn't sure if it was used or not.
|
| + if ((self = [super init])) |
| + [self configureTextView]; |
| + return self; |
| +} |
| + |
| +- (id)initWithCoder:(NSCoder*)decoder { |
| + if ((self = [super initWithCoder:decoder])) |
| + [self configureTextView]; |
| + return self; |
| +} |
| + |
| +- (id)initWithFrame:(NSRect)frameRect { |
| + if ((self = [super initWithFrame:frameRect])) |
| + [self configureTextView]; |
| + return self; |
| +} |
| + |
| +// Never draw the insertion point (otherwise, it shows up without any user |
| +// action if full keyboard accessibility is enabled). |
| +- (BOOL)shouldDrawInsertionPoint { |
| + return NO; |
| +} |
| + |
| +- (NSRange)selectionRangeForProposedRange:(NSRange)proposedSelRange |
| + granularity:(NSSelectionGranularity)granularity { |
| + // Do not allow selections. |
| + return NSMakeRange(0, 0); |
| +} |
| + |
| +// Convince NSTextView to not show an I-Beam cursor when the cursor is over the |
| +// text view but not over actual text. |
| +// |
| +// http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg10791.html |
| +// "NSTextView sets the cursor over itself dynamically, based on considerations |
| +// including the text under the cursor. It does so in -mouseEntered:, |
| +// -mouseMoved:, and -cursorUpdate:, so those would be points to consider |
| +// overriding." |
| +- (void)mouseMoved:(NSEvent*)e { |
| + [super mouseMoved:e]; |
| + [self fixupCursor]; |
| +} |
| + |
| +- (void)mouseEntered:(NSEvent*)e { |
| + [super mouseEntered:e]; |
| + [self fixupCursor]; |
| +} |
| + |
| +- (void)cursorUpdate:(NSEvent*)e { |
| + [super cursorUpdate:e]; |
| + [self fixupCursor]; |
| +} |
| + |
| +- (void)configureTextView { |
| + [self setEditable:NO]; |
| + [self setDrawsBackground:NO]; |
| + [self setHorizontallyResizable:NO]; |
| + [self setVerticallyResizable:NO]; |
| +} |
| + |
| +- (void)fixupCursor { |
| + if ([[NSCursor currentCursor] isEqual:[NSCursor IBeamCursor]]) |
| + [[NSCursor arrowCursor] set]; |
| +} |
| + |
| +- (void)setMessageAndLink:(NSString*)message |
| + withLink:(NSString*)link |
| + atOffset:(NSUInteger)linkOffset |
| + font:(NSFont*)font |
| + messageColor:(NSColor*)messageColor |
| + linkColor:(NSColor*)linkColor { |
| + // Create an attributes dictionary for the message and link. |
| + NSMutableDictionary* attributes = [NSMutableDictionary dictionary]; |
| + [attributes setObject:messageColor |
| + forKey:NSForegroundColorAttributeName]; |
| + [attributes setObject:[NSCursor arrowCursor] |
| + forKey:NSCursorAttributeName]; |
| + [attributes setObject:font |
| + forKey:NSFontAttributeName]; |
| + [attributes setObject:[NSNumber numberWithFloat:kTextBaselineShift] |
| + forKey:NSBaselineOffsetAttributeName]; |
| + |
| + // Create the attributed string for the message. |
| + scoped_nsobject<NSMutableAttributedString> attributedMessage( |
| + [[NSMutableAttributedString alloc] initWithString:message |
| + attributes:attributes]); |
| + |
| + if ([link length] != 0) { |
| + // Add additional attributes to style the link text appropriately as |
| + // well as linkify it. |
| + [attributes setObject:linkColor |
| + forKey:NSForegroundColorAttributeName]; |
| + [attributes setObject:[NSNumber numberWithBool:YES] |
| + forKey:NSUnderlineStyleAttributeName]; |
| + [attributes setObject:[NSCursor pointingHandCursor] |
| + forKey:NSCursorAttributeName]; |
| + [attributes setObject:[NSNumber numberWithInt:NSSingleUnderlineStyle] |
| + forKey:NSUnderlineStyleAttributeName]; |
| + [attributes setObject:[NSString string] // dummy value |
| + forKey:NSLinkAttributeName]; |
| + |
| + // Insert the link into the message at the appropriate offset. |
| + scoped_nsobject<NSAttributedString> attributedLink( |
| + [[NSAttributedString alloc] initWithString:link |
| + attributes:attributes]); |
| + [attributedMessage.get() insertAttributedString:attributedLink.get() |
| + atIndex:linkOffset]; |
| + // Ensure the TextView doesn't override the link style. |
| + [self setLinkTextAttributes:attributes]; |
| + } |
| + |
| + // Update the text view with the new text. |
| + [[self textStorage] setAttributedString:attributedMessage]; |
| +} |
| + |
| +@end |