Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: chrome/browser/ui/cocoa/infobars/infobar_controller.mm

Issue 7610011: Update Sad Tab help text and link. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and merge. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/infobars/infobar_controller.mm
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_controller.mm b/chrome/browser/ui/cocoa/infobars/infobar_controller.mm
index f8640f8aa2042b73f16691505406da9035dc5104..eabf4a9b88999512d904033c96bcb3a1c1ea5928 100644
--- a/chrome/browser/ui/cocoa/infobars/infobar_controller.mm
+++ b/chrome/browser/ui/cocoa/infobars/infobar_controller.mm
@@ -10,15 +10,16 @@
#include "chrome/browser/infobars/infobar_tab_helper.h"
#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
#include "chrome/browser/tab_contents/link_infobar_delegate.h"
-#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#import "chrome/browser/ui/cocoa/animatable_view.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#include "chrome/browser/ui/cocoa/event_utils.h"
+#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
#include "chrome/browser/ui/cocoa/infobars/infobar.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_controller.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_gradient_view.h"
#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
#include "ui/gfx/image/image.h"
#include "webkit/glue/window_open_disposition.h"
@@ -27,61 +28,8 @@ namespace {
// Durations set to match the default SlideAnimation duration.
const float kAnimateOpenDuration = 0.12;
const float kAnimateCloseDuration = 0.12;
-
-// The baseline shift for text in the NSTextView.
-const float kTextBaselineShift = -1.0;
-}
-
-// This simple subclass of |NSTextView| just doesn't show the (text) cursor
-// (|NSTextView| displays the cursor with full keyboard accessibility enabled).
-@interface InfoBarTextView : NSTextView
-- (void)fixupCursor;
-@end
-
-@implementation InfoBarTextView
-
-// 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];
}
-@end
-
@interface InfoBarController (PrivateMethods)
// Sets |label_| based on |labelPlaceholder_|, sets |labelPlaceholder_| to nil.
- (void)initializeLabel;
@@ -95,12 +43,6 @@ const float kTextBaselineShift = -1.0;
// infobar from its container, if necessary.
- (void)cleanUpAfterAnimation:(BOOL)finished;
-// Sets the info bar message to the specified |message|, with a hypertext
-// style link. |link| will be inserted into message at |linkOffset|.
-- (void)setLabelToMessage:(NSString*)message
- withLink:(NSString*)link
- atOffset:(NSUInteger)linkOffset;
-
// Returns the point, in gradient view coordinates, at which the apex of the
// infobar tip should be drawn.
- (NSPoint)pointForTipApex;
@@ -229,22 +171,6 @@ const float kTextBaselineShift = -1.0;
// Default implementation does nothing.
}
-- (void)setLabelToMessage:(NSString*)message {
- NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
- NSFont* font = [NSFont labelFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
- [attributes setObject:font
- forKey:NSFontAttributeName];
- [attributes setObject:[NSCursor arrowCursor]
- forKey:NSCursorAttributeName];
- [attributes setObject:[NSNumber numberWithFloat:kTextBaselineShift]
- forKey:NSBaselineOffsetAttributeName];
- scoped_nsobject<NSAttributedString> attributedString(
- [[NSAttributedString alloc] initWithString:message
- attributes:attributes]);
- [[label_.get() textStorage] setAttributedString:attributedString];
-}
-
- (void)removeButtons {
// Extend the label all the way across.
NSRect labelFrame = [label_.get() frame];
@@ -263,17 +189,13 @@ const float kTextBaselineShift = -1.0;
// The former doesn't show links in a nice way, but the latter can't be added
// in IB without a containing scroll view, so create the NSTextView
// programmatically.
- label_.reset([[InfoBarTextView alloc]
+ label_.reset([[HyperlinkTextView alloc]
initWithFrame:[labelPlaceholder_ frame]]);
[label_.get() setAutoresizingMask:[labelPlaceholder_ autoresizingMask]];
[[labelPlaceholder_ superview]
replaceSubview:labelPlaceholder_ with:label_.get()];
labelPlaceholder_ = nil; // Now released.
[label_.get() setDelegate:self];
- [label_.get() setEditable:NO];
- [label_.get() setDrawsBackground:NO];
- [label_.get() setHorizontallyResizable:NO];
- [label_.get() setVerticallyResizable:NO];
}
- (void)removeSelf {
@@ -314,62 +236,6 @@ const float kTextBaselineShift = -1.0;
[self cleanUpAfterAnimation:YES];
}
-// TODO(joth): This method factors out some common functionality between the
-// various derived infobar classes, however the class hierarchy itself could
-// use refactoring to reduce this duplication. http://crbug.com/38924
-- (void)setLabelToMessage:(NSString*)message
- withLink:(NSString*)link
- atOffset:(NSUInteger)linkOffset {
- if (linkOffset == std::wstring::npos) {
- // linkOffset == std::wstring::npos means the link should be right-aligned,
- // which is not supported on Mac (http://crbug.com/47728).
- NOTIMPLEMENTED();
- linkOffset = [message length];
- }
- // Create an attributes dictionary for the entire message. We have
- // to explicitly set the control's font. We also override the cursor to give
- // us the normal cursor rather than the text insertion cursor.
- NSMutableDictionary* linkAttributes = [NSMutableDictionary dictionary];
- [linkAttributes setObject:[NSCursor arrowCursor]
- forKey:NSCursorAttributeName];
- NSFont* font = [NSFont labelFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
- [linkAttributes setObject:font
- forKey:NSFontAttributeName];
-
- // Create the attributed string for the main message text.
- scoped_nsobject<NSMutableAttributedString> infoText(
- [[NSMutableAttributedString alloc] initWithString:message]);
- [infoText.get() addAttributes:linkAttributes
- range:NSMakeRange(0, [infoText.get() length])];
- // Add additional attributes to style the link text appropriately as
- // well as linkify it.
- [linkAttributes setObject:[NSColor blueColor]
- forKey:NSForegroundColorAttributeName];
- [linkAttributes setObject:[NSNumber numberWithBool:YES]
- forKey:NSUnderlineStyleAttributeName];
- [linkAttributes setObject:[NSCursor pointingHandCursor]
- forKey:NSCursorAttributeName];
- [linkAttributes setObject:[NSNumber numberWithInt:NSSingleUnderlineStyle]
- forKey:NSUnderlineStyleAttributeName];
- [linkAttributes setObject:[NSString string] // dummy value
- forKey:NSLinkAttributeName];
-
- // Insert the link text into the string at the appropriate offset.
- scoped_nsobject<NSAttributedString> attributedString(
- [[NSAttributedString alloc] initWithString:link
- attributes:linkAttributes]);
- [infoText.get() insertAttributedString:attributedString.get()
- atIndex:linkOffset];
- // The entire text needs a baseline shift.
- [infoText addAttribute:NSBaselineOffsetAttributeName
- value:[NSNumber numberWithDouble:kTextBaselineShift]
- range:NSMakeRange(0, [infoText length])];
-
- // Update the label view with the new text.
- [[label_.get() textStorage] setAttributedString:infoText];
-}
-
- (NSPoint)pointForTipApex {
BrowserWindowController* windowController =
[containerController_ browserWindowController];
@@ -406,9 +272,16 @@ const float kTextBaselineShift = -1.0;
DCHECK(delegate);
size_t offset = std::wstring::npos;
string16 message = delegate->GetMessageTextWithOffset(&offset);
- [self setLabelToMessage:base::SysUTF16ToNSString(message)
- withLink:base::SysUTF16ToNSString(delegate->GetLinkText())
- atOffset:offset];
+ string16 link = delegate->GetLinkText();
+ NSFont* font = [NSFont labelFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
+ HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
+ [view setMessageAndLink:base::SysUTF16ToNSString(message)
+ withLink:base::SysUTF16ToNSString(link)
+ atOffset:offset
+ font:font
+ messageColor:[NSColor blackColor]
+ linkColor:[NSColor blueColor]];
}
// Called when someone clicks on the link in the infobar. This method
@@ -525,20 +398,19 @@ const float kTextBaselineShift = -1.0;
// Set the text and link.
NSString* message = base::SysUTF16ToNSString(delegate->GetMessageText());
string16 link = delegate->GetLinkText();
- if (link.empty()) {
- // Simple case: no link, so just set the message directly.
- [self setLabelToMessage:message];
- } else {
- // Inserting the link unintentionally causes the text to have a slightly
- // different result to the simple case above: text is truncated on word
- // boundaries (if needed) rather than elided with ellipses.
-
+ if (!link.empty()) {
// Add spacing between the label and the link.
message = [message stringByAppendingString:@" "];
- [self setLabelToMessage:message
- withLink:base::SysUTF16ToNSString(link)
- atOffset:[message length]];
}
+ NSFont* font = [NSFont labelFontOfSize:
+ [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
+ HyperlinkTextView* view = (HyperlinkTextView*)label_.get();
+ [view setMessageAndLink:message
+ withLink:base::SysUTF16ToNSString(link)
+ atOffset:[message length]
+ font:font
+ messageColor:[NSColor blackColor]
+ linkColor:[NSColor blueColor]];
}
// Called when someone clicks on the link in the infobar. This method
« no previous file with comments | « chrome/browser/ui/cocoa/infobars/infobar_controller.h ('k') | chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698