Index: chrome/browser/ui/cocoa/static_text_view.mm |
diff --git a/chrome/browser/ui/cocoa/static_text_view.mm b/chrome/browser/ui/cocoa/static_text_view.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..338d5e92d027ff0816ee5a2cf305dbabe15ceee6 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/static_text_view.mm |
@@ -0,0 +1,106 @@ |
+// 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/static_text_view.h" |
+ |
+#include "base/memory/scoped_nsobject.h" |
+ |
+namespace { |
+// The baseline shift for text in the NSTextView. |
+const float kTextBaselineShift = -1.0; |
Nico
2011/08/31 22:35:19
"const" has implicit internal linkage, no need for
msw
2011/09/01 03:30:49
Done.
|
+} // namespace |
+ |
+@implementation StaticTextView |
+ |
+// 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)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 |