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.
5 #ifndef CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_
8 #import <Cocoa/Cocoa.h>
10 #include "base/mac/scoped_nsobject.h"
11 #include "base/memory/scoped_ptr.h"
12 #import "chrome/browser/ui/cocoa/base_bubble_controller.h"
13 #include "third_party/skia/include/core/SkBitmap.h"
16 class ExtensionInstalledBubble
;
17 class ExtensionInstalledBubbleBridge
;
18 @
class HyperlinkTextView
;
19 @
class HoverCloseButton
;
21 namespace extensions
{
22 class BundleInstaller
;
26 namespace extension_installed_bubble
{
28 // Maximum height or width of extension's icon (corresponds to Windows & GTK).
29 const int kIconSize
= 43;
31 // Outer vertical margin for text, icon, and closing x.
32 const int kOuterVerticalMargin
= 15;
34 // Inner vertical margin for text messages.
35 const int kInnerVerticalMargin
= 10;
37 // An offset we apply to position the point of the bubble's arrow pointing at
39 const int kAppsBubbleArrowOffset
= 4;
41 // We use a different kind of notification for each of these extension types.
51 } // namespace extension_installed_bubble
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
57 @interface ExtensionInstalledBubbleController
:
58 BaseBubbleController
<NSTextViewDelegate
> {
60 const extensions::Extension
* extension_
; // weak
61 const extensions::BundleInstaller
* bundle_
; // weak
62 Browser
* browser_
; // weak
63 base::scoped_nsobject
<NSImage
> icon_
;
65 extension_installed_bubble::ExtensionType type_
;
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_
;
72 // The bridge to the C++ object that performs shared logic across platforms,
73 // like listening for the notification that the extension is loaded. This
74 // tells us when to show the bubble.
75 scoped_ptr
<ExtensionInstalledBubbleBridge
> installedBubbleBridge_
;
76 scoped_ptr
<ExtensionInstalledBubble
> installedBubble_
;
78 // References below are weak, being obtained from the nib.
79 IBOutlet HoverCloseButton
* closeButton_
;
80 IBOutlet NSImageView
* iconImage_
;
81 IBOutlet NSTextField
* heading_
;
82 // Only shown for browser actions, page actions and omnibox keywords.
83 IBOutlet NSTextField
* howToUse_
;
84 IBOutlet NSTextField
* howToManage_
;
85 // Only shown for app installs.
86 IBOutlet NSButton
* appShortcutLink_
;
87 // Only shown for extensions with commands.
88 IBOutlet NSButton
* manageShortcutLink_
;
89 // Only shown if the sign-in promo is active.
90 IBOutlet NSTextField
* promoPlaceholder_
;
91 // Text fields don't work as well with embedded links as text views, but
92 // text views cannot conveniently be created in IB. The xib file contains
93 // a text field |promoPlaceholder_| that's replaced by this text view |promo_|
95 base::scoped_nsobject
<HyperlinkTextView
> promo_
;
96 // Only shown for bundle installs.
97 IBOutlet NSTextField
* installedHeadingMsg_
;
98 IBOutlet NSView
* installedItemsView_
;
99 IBOutlet NSTextField
* failedHeadingMsg_
;
100 IBOutlet NSView
* failedItemsView_
;
103 @
property(nonatomic
, readonly
) const extensions::BundleInstaller
* bundle
;
104 @
property(nonatomic
) BOOL pageActionPreviewShowing
;
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
114 // Action for close button.
115 - (IBAction
)closeWindow
:(id
)sender
;
117 // From NSTextViewDelegate:
118 - (BOOL
)textView
:(NSTextView
*)aTextView
119 clickedOnLink
:(id
)link
120 atIndex
:(NSUInteger
)charIndex
;
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
;
126 // Opens the shortcut configuration UI.
127 - (IBAction
)onManageShortcutClicked
:(id
)sender
;
129 // Shows the new app installed animation.
130 - (IBAction
)onAppShortcutClicked
:(id
)sender
;
134 @interface
ExtensionInstalledBubbleController (ExposedForTesting
)
136 - (void)removePageActionPreviewIfNecessary
;
137 - (NSWindow
*)initializeWindow
;
138 - (int)calculateWindowHeight
;
139 - (void)setMessageFrames
:(int)newWindowHeight
;
140 - (NSRect
)headingFrame
;
141 - (NSRect
)frameOfHowToUse
;
142 - (NSRect
)frameOfHowToManage
;
143 - (NSRect
)frameOfSigninPromo
;
144 - (BOOL
)showSyncPromo
;
145 - (NSButton
*)appInstalledShortcutLink
;
147 @end
// ExtensionInstalledBubbleController(ExposedForTesting)
149 #endif // CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_CONTROLLER_H_