Index: chrome/browser/ui/cocoa/web_intent_sheet_controller.mm |
diff --git a/chrome/browser/ui/cocoa/web_intent_sheet_controller.mm b/chrome/browser/ui/cocoa/web_intent_sheet_controller.mm |
index 0b473f9b9b9844364255f6d9b20e137cef0f0609..223ca150b58e07d708748ec3166eb838884f9a2f 100644 |
--- a/chrome/browser/ui/cocoa/web_intent_sheet_controller.mm |
+++ b/chrome/browser/ui/cocoa/web_intent_sheet_controller.mm |
@@ -37,6 +37,13 @@ |
using content::OpenURLParams; |
using content::Referrer; |
+@interface HyperlinkButtonCell (Private) |
+- (void)customizeButtonCell; |
+@end |
+ |
+@interface CustomLinkButtonCell : HyperlinkButtonCell |
+@end |
+ |
namespace { |
// The width of a service button, in view coordinates. |
@@ -48,9 +55,6 @@ const CGFloat kVerticalSpacing = 18; |
// Square size of the close button. |
const CGFloat kCloseButtonSize = 16; |
-// Font size for picker header. |
-const CGFloat kHeaderFontSize = 14.5; |
- |
// Width of the text fields. |
const CGFloat kTextWidth = WebIntentPicker::kWindowWidth - |
(WebIntentPicker::kContentAreaBorder * 2.0 + kCloseButtonSize); |
@@ -68,8 +72,8 @@ void ConfigureTextFieldAsLabel(NSTextField* field) { |
NSButton* CreateHyperlinkButton(NSString* title, const NSRect& frame) { |
NSButton* button = [[NSButton alloc] initWithFrame:frame]; |
- scoped_nsobject<HyperlinkButtonCell> cell( |
- [[HyperlinkButtonCell alloc] initTextCell:title]); |
+ scoped_nsobject<CustomLinkButtonCell> cell( |
+ [[CustomLinkButtonCell alloc] initTextCell:title]); |
[cell setControlSize:NSSmallControlSize]; |
[button setCell:cell.get()]; |
[button setButtonType:NSMomentaryPushInButton]; |
@@ -80,6 +84,32 @@ NSButton* CreateHyperlinkButton(NSString* title, const NSRect& frame) { |
} // namespace |
+ |
+// Provide custom link format for intent picker. Removes underline attribute, |
+// since UX direction is "look like WebUI". |
+@implementation CustomLinkButtonCell |
+- (void)customizeButtonCell { |
+ [super customizeButtonCell]; |
+ [self setTextColor:[NSColor colorWithDeviceRed:0xff/255.0 |
+ green:0x11/255.0 |
+ blue:0x55/255.0 |
+ alpha:0xcc/255.0]]; |
+} |
+ |
+- (NSDictionary*)linkAttributes { |
+ scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( |
+ [[NSParagraphStyle defaultParagraphStyle] mutableCopy]); |
+ [paragraphStyle setAlignment:[self alignment]]; |
+ |
+ return @{ |
+ NSForegroundColorAttributeName: [self textColor], |
+ NSFontAttributeName: [self font], |
+ NSCursorAttributeName: [NSCursor pointingHandCursor], |
+ NSParagraphStyleAttributeName: paragraphStyle.get() |
+ }; |
+} |
+@end |
+ |
// This simple NSView subclass is used as the single subview of the page info |
// bubble's window's contentView. Drawing is flipped so that layout of the |
// sections is easier. Apple recommends flipping the coordinate origin when |
@@ -253,6 +283,7 @@ NSButton* CreateHyperlinkButton(NSString* title, const NSRect& frame) { |
spacer_.reset([[NSBox alloc] initWithFrame:frame]); |
[spacer_ setBoxType:NSBoxSeparator]; |
[spacer_ setBorderColor:[NSColor blackColor]]; |
+ [spacer_ setAlphaValue:0.2]; |
NSArray* subviews = @[titleField_, subtitleField_, spacer_]; |
[self setSubviews:subviews]; |
@@ -504,7 +535,9 @@ const CGFloat kAddButtonWidth = 128.0; |
frame.origin.y = (kMaxHeight - NSHeight(frame)) / 2.0; |
[label_ setFrame:frame]; |
- [self setActionButton:@"Select" |
+ string = l10n_util::GetNSStringWithFixup( |
+ IDS_INTENT_PICKER_SELECT_INTENT); |
+ [self setActionButton:string |
withSelector:@selector(invokeService:) |
forController:controller]; |
[installButton_ setTag:index]; |
@@ -694,7 +727,8 @@ const CGFloat kAddButtonWidth = 128.0; |
inlineDispositionTitleField_.reset([[NSTextField alloc] init]); |
ConfigureTextFieldAsLabel(inlineDispositionTitleField_); |
- |
+ [inlineDispositionTitleField_ setFont: |
+ [NSFont boldSystemFontOfSize:[NSFont systemFontSize]]]; |
flipView_.reset([[WebIntentsContentView alloc] init]); |
[flipView_ setAutoresizingMask:NSViewMinYMargin]; |
[[[self window] contentView] setSubviews:@[flipView_]]; |
@@ -744,13 +778,6 @@ const CGFloat kAddButtonWidth = 128.0; |
// Resize web contents. |
[webContentView setFrameSize:inlineContentSize]; |
- |
- // Position close button. |
- NSRect buttonFrame = [closeButton_ frame]; |
- buttonFrame.origin.x = containerSize.width - |
- WebIntentPicker::kContentAreaBorder - kCloseButtonSize; |
- [closeButton_ setFrame:buttonFrame]; |
- |
[self setContainerSize:containerSize]; |
} |
@@ -843,13 +870,17 @@ const CGFloat kAddButtonWidth = 128.0; |
} |
- (void)addCloseButtonToSubviews:(NSMutableArray*)subviews { |
+ const CGFloat kButtonPadding = 4.0; // whitespace inside button frame. |
if (!closeButton_.get()) { |
NSRect buttonFrame = NSMakeRect( |
- WebIntentPicker::kContentAreaBorder + kTextWidth, |
- WebIntentPicker::kContentAreaBorder, |
+ WebIntentPicker::kContentAreaBorder + kTextWidth + kButtonPadding, |
+ WebIntentPicker::kContentAreaBorder - kButtonPadding, |
kCloseButtonSize, kCloseButtonSize); |
closeButton_.reset( |
[[HoverCloseButton alloc] initWithFrame:buttonFrame]); |
+ // Anchor close button to upper right. |
+ // (NSViewMaxYMargin since parent view is flipped.) |
+ [closeButton_ setAutoresizingMask:NSViewMaxYMargin|NSViewMinXMargin]; |
[closeButton_ setTarget:self]; |
[closeButton_ setAction:@selector(cancelOperation:)]; |
[[closeButton_ cell] setKeyEquivalent:@"\e"]; |
@@ -905,9 +936,35 @@ const CGFloat kAddButtonWidth = 128.0; |
- (CGFloat)addAnotherServiceLinkToSubviews:(NSMutableArray*)subviews |
atOffset:(CGFloat)offset { |
+ DCHECK(model_); |
+ DCHECK(model_->IsInlineDisposition()); |
+ GURL url = model_->inline_disposition_url(); |
+ |
+ const WebIntentPickerModel::InstalledService* service = |
+ model_->GetInstalledServiceWithURL(url); |
+ DCHECK(service); |
+ CGFloat originalOffset = offset; |
+ |
+ // Icon for current service. |
+ scoped_nsobject<NSImageView> icon; |
+ NSRect imageFrame = NSMakeRect(WebIntentPicker::kContentAreaBorder, offset, |
+ 0, 0); |
+ icon.reset([[NSImageView alloc] initWithFrame:imageFrame]); |
+ [icon setImage:service->favicon.ToNSImage()]; |
+ [icon setImageFrameStyle:NSImageFrameNone]; |
+ [icon setEnabled:YES]; |
+ |
+ imageFrame.size = [service->favicon.ToNSImage() size]; |
+ [icon setFrame:imageFrame]; |
+ |
+ [subviews addObject:icon]; |
+ |
+ // Resize control to fit text |
NSRect textFrame = |
- NSMakeRect(WebIntentPicker::kContentAreaBorder, offset, kTextWidth, 1); |
+ NSMakeRect(NSMaxX(imageFrame) + 4, |
+ offset, |
+ WebIntentPicker::kTitleLinkMaxWidth, 1); |
[inlineDispositionTitleField_ setFrame:textFrame]; |
[subviews addObject:inlineDispositionTitleField_]; |
[GTMUILocalizerAndLayoutTweaker sizeToFitView:inlineDispositionTitleField_]; |
@@ -919,11 +976,13 @@ const CGFloat kAddButtonWidth = 128.0; |
model_->GetSuggestedExtensionCount()) { |
NSRect frame = NSMakeRect( |
NSMaxX(textFrame) + WebIntentPicker::kContentAreaBorder, offset, |
- WebIntentPicker::kTitleLinkMaxWidth, 1); |
+ 1, 1); |
NSString* string = l10n_util::GetNSStringWithFixup( |
IDS_INTENT_PICKER_USE_ALTERNATE_SERVICE); |
scoped_nsobject<NSButton> button(CreateHyperlinkButton(string, frame)); |
[[button cell] setControlSize:NSRegularControlSize]; |
+ [[button cell] setFont: |
+ [NSFont controlContentFontOfSize:[NSFont systemFontSize]]]; |
[button setTarget:self]; |
[button setAction:@selector(chooseAnotherService:)]; |
[subviews addObject:button]; |
@@ -931,6 +990,13 @@ const CGFloat kAddButtonWidth = 128.0; |
// Call size-to-fit to fixup for the localized string. |
[GTMUILocalizerAndLayoutTweaker sizeToFitView:button]; |
+ // Right-align the "use another service" button. |
+ frame = [button frame]; |
+ frame.origin.x = WebIntentPicker::kWindowWidth - NSWidth(frame) - |
+ 2 * WebIntentPicker::kContentAreaBorder - kCloseButtonSize; |
+ [button setFrame:frame]; |
+ [button setAutoresizingMask:NSViewMinXMargin]; |
+ |
// And finally, make sure the link and the title are horizontally centered. |
frame = [button frame]; |
CGFloat height = std::max(NSHeight(textFrame), NSHeight(frame)); |
@@ -942,7 +1008,18 @@ const CGFloat kAddButtonWidth = 128.0; |
[inlineDispositionTitleField_ setFrame:textFrame]; |
} |
- return NSHeight(textFrame); |
+ offset += NSHeight(textFrame) + kVerticalSpacing; |
+ |
+ scoped_nsobject<NSBox> spacer; |
+ |
+ NSRect frame = NSMakeRect(0, offset, WebIntentPicker::kWindowWidth, 1.0); |
+ spacer.reset([[NSBox alloc] initWithFrame:frame]); |
+ [spacer setBoxType:NSBoxSeparator]; |
+ [spacer setAlphaValue:0.2]; |
+ [spacer setAutoresizingMask:NSViewWidthSizable]; |
+ [subviews addObject: spacer]; |
+ |
+ return offset + kVerticalSpacing - originalOffset; |
} |
- (NSView*)createEmptyView { |
@@ -1019,7 +1096,6 @@ const CGFloat kAddButtonWidth = 128.0; |
} else if (contents_) { |
offset += [self addAnotherServiceLinkToSubviews:subviews |
atOffset:offset]; |
- offset += WebIntentPicker::kContentAreaBorder; |
offset += [self addInlineHtmlToSubviews:subviews atOffset:offset]; |
} else { |
offset += [self addHeaderToSubviews:subviews atOffset:offset]; |
@@ -1033,16 +1109,17 @@ const CGFloat kAddButtonWidth = 128.0; |
} |
offset += [self addCwsButtonToSubviews:subviews atOffset:offset]; |
} |
- [self addCloseButtonToSubviews:subviews]; |
// Add the bottom padding. |
offset += WebIntentPicker::kContentAreaBorder; |
+ // Resize to fit. |
+ [self setContainerSize:NSMakeSize(WebIntentPicker::kWindowWidth, offset)]; |
+ |
+ [self addCloseButtonToSubviews:subviews]; |
+ |
// Replace the window's content. |
[flipView_ setSubviews:subviews]; |
- |
- // And resize to fit. |
- [self setContainerSize:NSMakeSize(WebIntentPicker::kWindowWidth, offset)]; |
} |
- (void)setActionString:(NSString*)actionString { |