Index: chrome/browser/ui/cocoa/web_intent_bubble_controller.mm |
diff --git a/chrome/browser/ui/cocoa/web_intent_bubble_controller.mm b/chrome/browser/ui/cocoa/web_intent_bubble_controller.mm |
deleted file mode 100644 |
index a7626f1d3acdc21ebc90e066cfe484519b91bf53..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/web_intent_bubble_controller.mm |
+++ /dev/null |
@@ -1,305 +0,0 @@ |
-// Copyright (c) 2012 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/web_intent_bubble_controller.h" |
- |
-#include "base/memory/scoped_nsobject.h" |
-#include "base/sys_string_conversions.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#import "chrome/browser/ui/cocoa/hyperlink_button_cell.h" |
-#import "chrome/browser/ui/cocoa/info_bubble_view.h" |
-#import "chrome/browser/ui/cocoa/info_bubble_window.h" |
-#include "chrome/browser/ui/cocoa/web_intent_picker_cocoa.h" |
-#include "chrome/browser/ui/intents/web_intent_picker_delegate.h" |
-#include "chrome/browser/ui/intents/web_intent_picker_model.h" |
-#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
-#include "content/public/browser/web_contents_view.h" |
-#include "content/public/browser/web_contents.h" |
-#include "grit/generated_resources.h" |
-#include "grit/locale_settings.h" |
-#include "grit/theme_resources.h" |
-#include "grit/ui_resources.h" |
-#import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/l10n/l10n_util_mac.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image/image.h" |
- |
-using content::OpenURLParams; |
-using content::Referrer; |
- |
-namespace { |
- |
-// The width of the window, in view coordinates. The height will be |
-// determined by the content. |
-const CGFloat kWindowWidth = 380; |
- |
-// The width of a service button, in view coordinates. |
-const CGFloat kServiceButtonWidth = 300; |
- |
-// Padding along on the X-axis between the window frame and content. |
-const CGFloat kFramePadding = 10; |
- |
-// Spacing in between sections. |
-const CGFloat kVerticalSpacing = 10; |
- |
-// Square size of the image. |
-const CGFloat kImageSize = 32; |
- |
-// Spacing between the image and the text. |
-const CGFloat kImageSpacing = 10; |
- |
-// Spacing between icons. |
-const CGFloat kImagePadding = 6; |
- |
-// Width of the text fields. |
-const CGFloat kTextWidth = kWindowWidth - (kImageSize + kImageSpacing + |
- kFramePadding * 2); |
- |
-} // namespace |
- |
-// 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 |
-// doing a lot of text layout because it's more natural. |
-@interface WebIntentsContentView : NSView |
-@end |
-@implementation WebIntentsContentView |
-- (BOOL)isFlipped { |
- return YES; |
-} |
-@end |
- |
-@implementation WebIntentBubbleController; |
- |
-- (id)initWithPicker:(WebIntentPickerCocoa*)picker |
- parentWindow:(NSWindow*)parent |
- anchoredAt:(NSPoint)point { |
- // Use an arbitrary height because it will reflect the size of the content. |
- NSRect contentRect = NSMakeRect(0, 0, kWindowWidth, kVerticalSpacing); |
- // Create an empty window into which content is placed. |
- scoped_nsobject<InfoBubbleWindow> window( |
- [[InfoBubbleWindow alloc] initWithContentRect:contentRect |
- styleMask:NSBorderlessWindowMask |
- backing:NSBackingStoreBuffered |
- defer:NO]); |
- if ((self = [super initWithWindow:window.get() |
- parentWindow:parent |
- anchoredAt:point])) { |
- picker_ = picker; |
- |
- [[self bubble] setArrowLocation:info_bubble::kTopLeft]; |
- [self performLayoutWithModel:NULL]; |
- [self showWindow:nil]; |
- picker_->set_controller(self); |
- } |
- |
- return self; |
-} |
- |
-- (void)setInlineDispositionTabContents:(TabContentsWrapper*)wrapper { |
- contents_ = wrapper; |
-} |
- |
-// We need to watch for window closing so we can notify up via |picker_|. |
-- (void)windowWillClose:(NSNotification*)notification { |
- if (picker_) { |
- WebIntentPickerCocoa* temp = picker_; |
- picker_ = NULL; // Abandon picker, we are done with it. |
- temp->OnCancelled(); |
- } |
- [super windowWillClose:notification]; |
-} |
- |
-// Pop up a new tab with the Chrome Web Store. |
-- (IBAction)showChromeWebStore:(id)sender { |
- GURL url(l10n_util::GetStringUTF8(IDS_WEBSTORE_URL)); |
- Browser* browser = BrowserList::GetLastActive(); |
- OpenURLParams params( |
- url, Referrer(), NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_LINK, |
- false); |
- browser->OpenURL(params); |
-} |
- |
-// A picker button has been pressed - invoke corresponding service. |
-- (IBAction)invokeService:(id)sender { |
- if (picker_) |
- picker_->OnServiceChosen([sender tag]); |
-} |
- |
-// Sets proprties on the given |field| to act as the title or description labels |
-// in the bubble. |
-- (void)configureTextFieldAsLabel:(NSTextField*)field { |
- [field setEditable:NO]; |
- [field setSelectable:YES]; |
- [field setDrawsBackground:NO]; |
- [field setBezeled:NO]; |
-} |
- |
-// Adds a link to the Chrome Web Store, to obtain further intent handlers. |
-// Returns the y position delta for the next offset. |
-- (CGFloat)addCwsButtonToSubviews:(NSMutableArray*)subviews |
- atOffset:(CGFloat)offset { |
- NSRect frame = NSMakeRect(kFramePadding, offset, 100, 10); |
- scoped_nsobject<NSButton> button([[NSButton alloc] initWithFrame:frame]); |
- NSString* string = |
- l10n_util::GetNSStringWithFixup(IDS_FIND_MORE_INTENT_HANDLER_MESSAGE); |
- scoped_nsobject<HyperlinkButtonCell> cell( |
- [[HyperlinkButtonCell alloc] initTextCell:string]); |
- [cell setControlSize:NSSmallControlSize]; |
- [button setCell:cell.get()]; |
- [button setButtonType:NSMomentaryPushInButton]; |
- [button setBezelStyle:NSRegularSquareBezelStyle]; |
- [button setTarget:self]; |
- [button setAction:@selector(showChromeWebStore:)]; |
- [subviews addObject:button.get()]; |
- |
- // Call size-to-fit to fixup for the localized string. |
- [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
- |
- return NSHeight([button frame]); |
-} |
- |
-// Adds a header (icon and explanatory text) to picker bubble. |
-// Returns the y position delta for the next offset. |
-- (CGFloat)addHeaderToSubviews:(NSMutableArray*)subviews |
- atOffset:(CGFloat)offset { |
- NSRect imageFrame = NSMakeRect(kFramePadding, offset, kImageSize, kImageSize); |
- |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- NSImage* nsImage = rb.GetNativeImageNamed(IDR_PAGEINFO_INFO); |
- |
- scoped_nsobject<NSImageView> imageView( |
- [[NSImageView alloc] initWithFrame:imageFrame]); |
- [imageView setImage:nsImage]; |
- [imageView setImageFrameStyle:NSImageFrameNone]; |
- |
- NSRect textFrame = NSMakeRect(kFramePadding + kImageSize + kImageSpacing, |
- offset, kTextWidth, 1); |
- scoped_nsobject<NSTextField> textField( |
- [[NSTextField alloc] initWithFrame:textFrame]); |
- [self configureTextFieldAsLabel:textField.get()]; |
- |
- NSString* nsString = |
- l10n_util::GetNSStringWithFixup(IDS_CHOOSE_INTENT_HANDLER_MESSAGE); |
- [textField setStringValue:nsString]; |
- textFrame.size.height += |
- [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField: |
- textField]; |
- |
- // Adjust view height to fit elements, center-align elements. |
- CGFloat maxHeight = std::max(imageFrame.size.height,textFrame.size.height); |
- if (maxHeight > textFrame.size.height) |
- textFrame.origin.y += (maxHeight - textFrame.size.height) / 2; |
- else |
- imageFrame.origin.y += maxHeight / 2; |
- [textField setFrame:textFrame]; |
- [imageView setFrame:imageFrame]; |
- |
- [subviews addObject:textField.get()]; |
- [subviews addObject:imageView.get()]; |
- return NSHeight([imageView frame]); |
-} |
- |
-- (CGFloat)addInlineHtmlToSubviews:(NSMutableArray*)subviews |
- atOffset:(CGFloat)offset { |
- if (!contents_) |
- return 0; |
- |
- // Determine a good size for the inline disposition window. |
- gfx::Size size = WebIntentPicker::GetDefaultInlineDispositionSize( |
- contents_->web_contents()); |
- NSRect frame = NSMakeRect(kFramePadding, offset, size.width(), size.height()); |
- |
- [contents_->web_contents()->GetNativeView() setFrame:frame]; |
- [subviews addObject:contents_->web_contents()->GetNativeView()]; |
- |
- return NSHeight(frame); |
-} |
- |
-// Add a single button for a specific service |
--(CGFloat)addServiceButton:(NSString*)title |
- withImage:(NSImage*)image |
- index:(NSUInteger)index |
- toSubviews:(NSMutableArray*)subviews |
- atOffset:(CGFloat)offset { |
- NSRect frame = NSMakeRect(kFramePadding, offset, kServiceButtonWidth, 45); |
- scoped_nsobject<NSButton> button([[NSButton alloc] initWithFrame:frame]); |
- |
- if (image) { |
- [button setImage:image]; |
- [button setImagePosition:NSImageLeft]; |
- } |
- [button setButtonType:NSMomentaryPushInButton]; |
- [button setBezelStyle:NSRegularSquareBezelStyle]; |
- [button setTarget:self]; |
- [button setTitle:title]; |
- [button setTag:index]; |
- [button setAction:@selector(invokeService:)]; |
- [subviews addObject:button.get()]; |
- |
- // Call size-to-fit to fixup size. |
- [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
- |
- // But make sure we're limited to a fixed size. |
- frame = [button frame]; |
- frame.size.width = kServiceButtonWidth; |
- [button setFrame:frame]; |
- |
- return NSHeight([button frame]); |
-} |
- |
-// Layout the contents of the picker bubble. |
-- (void)performLayoutWithModel:(WebIntentPickerModel*)model { |
- // |offset| is the Y position that should be drawn at next. |
- CGFloat offset = kFramePadding + info_bubble::kBubbleArrowHeight; |
- |
- // Keep the new subviews in an array that gets replaced at the end. |
- NSMutableArray* subviews = [NSMutableArray array]; |
- |
- if (contents_) { |
- offset += [self addInlineHtmlToSubviews:subviews atOffset:offset]; |
- } else { |
- offset += [self addHeaderToSubviews:subviews atOffset:offset]; |
- if (model) { |
- for (NSUInteger i = 0; i < model->GetInstalledServiceCount(); ++i) { |
- const WebIntentPickerModel::InstalledService& service = |
- model->GetInstalledServiceAt(i); |
- offset += [self addServiceButton:base::SysUTF16ToNSString(service.title) |
- withImage:service.favicon.ToNSImage() |
- index:i |
- toSubviews:subviews |
- atOffset:offset]; |
- } |
- } |
- offset += [self addCwsButtonToSubviews:subviews atOffset:offset]; |
- } |
- |
- // Add the bottom padding. |
- offset += kVerticalSpacing; |
- |
- // Create the dummy view that uses flipped coordinates. |
- NSRect contentFrame = NSMakeRect(0, 0, kWindowWidth, offset); |
- scoped_nsobject<WebIntentsContentView> contentView( |
- [[WebIntentsContentView alloc] initWithFrame:contentFrame]); |
- [contentView setSubviews:subviews]; |
- [contentView setAutoresizingMask:NSViewMinYMargin]; |
- |
- // Adjust frame to fit all elements. |
- NSRect windowFrame = NSMakeRect(0, 0, kWindowWidth, offset); |
- windowFrame.size = [[[self window] contentView] convertSize:windowFrame.size |
- toView:nil]; |
- // Adjust the origin by the difference in height. |
- windowFrame.origin = [[self window] frame].origin; |
- windowFrame.origin.y -= NSHeight(windowFrame) - |
- NSHeight([[self window] frame]); |
- |
- [[self window] setFrame:windowFrame display:YES animate:YES]; |
- |
- // Replace the window's content. |
- [[[self window] contentView] setSubviews: |
- [NSArray arrayWithObject:contentView]]; |
-} |
- |
-@end // WebIntentBubbleController |