1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_ 7 8 #import <Cocoa/Cocoa.h> 9 10 #include "base/memory/scoped_ptr.h" 11 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 12 #import "chrome/browser/ui/cocoa/base_bubble_controller.h" 13 #include "third_party/skia/include/core/SkBitmap.h" 14 15 class Browser; 16 class ExtensionLoadedNotificationObserver; 17 @class HyperlinkTextView; 18 @class HoverCloseButton; 19 @class InfoBubbleView; 20 21 namespace extensions { 22 class BundleInstaller; 23 class Extension; 24 } 25 26 namespace extension_installed_bubble { 27 28 // Maximum height or width of extension's icon (corresponds to Windows & GTK). 29 const int kIconSize = 43; 30 31 // Outer vertical margin for text, icon, and closing x. 32 const int kOuterVerticalMargin = 15; 33 34 // Inner vertical margin for text messages. 35 const int kInnerVerticalMargin = 10; 36 37 // An offset we apply to position the point of the bubble's arrow pointing at 38 // the NewTabButton. 39 const int kAppsBubbleArrowOffset = 4; 40 41 // We use a different kind of notification for each of these extension types. 42 typedef enum { 43 kApp, 44 kBrowserAction, 45 kGeneric, 46 kOmniboxKeyword, 47 kPageAction, 48 kBundle, 49 } ExtensionType; 50 51 } // namespace extension_installed_bubble 52 53 // Controller for the extension installed bubble. This bubble pops up after 54 // an extension has been installed to inform the user that the install happened 55 // properly, and to let the user know how to manage this extension in the 56 // future. 57 @interface ExtensionInstalledBubbleController : 58 BaseBubbleController<NSTextViewDelegate> { 59 @private 60 const extensions::Extension* extension_; // weak 61 const extensions::BundleInstaller* bundle_; // weak 62 Browser* browser_; // weak 63 base::scoped_nsobject<NSImage> icon_; 64 65 extension_installed_bubble::ExtensionType type_; 66 67 // We need to remove the page action immediately when the browser window 68 // closes while this bubble is still open, so the bubble's closing animation 69 // doesn't overlap browser destruction. 70 BOOL pageActionPreviewShowing_; 71 72 // Lets us register for EXTENSION_LOADED notifications. The actual 73 // notifications are sent to the observer object, which proxies them 74 // back to the controller. 75 scoped_ptr<ExtensionLoadedNotificationObserver> extensionObserver_; 76 77 // References below are weak, being obtained from the nib. 78 IBOutlet HoverCloseButton* closeButton_; 79 IBOutlet NSImageView* iconImage_; 80 IBOutlet NSTextField* heading_; 81 // Only shown for browser actions, page actions and omnibox keywords. 82 IBOutlet NSTextField* howToUse_; 83 IBOutlet NSTextField* howToManage_; 84 // Only shown for app installs. 85 IBOutlet NSButton* appShortcutLink_; 86 // Only shown for extensions with commands. 87 IBOutlet NSButton* manageShortcutLink_; 88 // Only shown if the sign-in promo is active. 89 IBOutlet NSTextField* promoPlaceholder_; 90 // Text fields don't work as well with embedded links as text views, but 91 // text views cannot conveniently be created in IB. The xib file contains 92 // a text field |promoPlaceholder_| that's replaced by this text view |promo_| 93 // in -awakeFromNib. 94 base::scoped_nsobject<HyperlinkTextView> promo_; 95 // Only shown for bundle installs. 96 IBOutlet NSTextField* installedHeadingMsg_; 97 IBOutlet NSTextField* installedItemsMsg_; 98 IBOutlet NSTextField* failedHeadingMsg_; 99 IBOutlet NSTextField* failedItemsMsg_; 100 } 101 102 @property(nonatomic, readonly) const extensions::Extension* extension; 103 @property(nonatomic, readonly) const extensions::BundleInstaller* bundle; 104 @property(nonatomic) BOOL pageActionPreviewShowing; 105 106 // Initialize the window, and then create observers to wait for the extension 107 // to complete loading, or the browser window to close. 108 - (id)initWithParentWindow:(NSWindow*)parentWindow 109 extension:(const extensions::Extension*)extension 110 bundle:(const extensions::BundleInstaller*)bundle 111 browser:(Browser*)browser 112 icon:(SkBitmap)icon; 113 114 // Action for close button. 115 - (IBAction)closeWindow:(id)sender; 116 117 // From NSTextViewDelegate: 118 - (BOOL)textView:(NSTextView*)aTextView 119 clickedOnLink:(id)link 120 atIndex:(NSUInteger)charIndex; 121 122 // Displays the extension installed bubble. This callback is triggered by 123 // the extensionObserver when the extension has completed loading. 124 - (void)showWindow:(id)sender; 125 126 // Clears our weak pointer to the Extension. This callback is triggered by 127 // the extensionObserver when the extension is unloaded. 128 - (void)extensionUnloaded:(id)sender; 129 130 // Opens the shortcut configuration UI. 131 - (IBAction)onManageShortcutClicked:(id)sender; 132 133 // Shows the new app installed animation. 134 - (IBAction)onAppShortcutClicked:(id)sender; 135 136 @end 137 138 @interface ExtensionInstalledBubbleController (ExposedForTesting) 139 140 - (void)removePageActionPreviewIfNecessary; 141 - (NSWindow*)initializeWindow; 142 - (int)calculateWindowHeight; 143 - (void)setMessageFrames:(int)newWindowHeight; 144 - (NSRect)headingFrame; 145 - (NSRect)frameOfHowToUse; 146 - (NSRect)frameOfHowToManage; 147 - (NSRect)frameOfSigninPromo; 148 - (BOOL)showSyncPromo; 149 - (NSButton*)appInstalledShortcutLink; 150 151 @end // ExtensionInstalledBubbleController(ExposedForTesting) 152 153 #endif // CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_ 154