- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / location_bar / page_action_decoration.h
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_LOCATION_BAR_PAGE_ACTION_DECORATION_H_
6 #define CHROME_BROWSER_UI_COCOA_LOCATION_BAR_PAGE_ACTION_DECORATION_H_
7
8 #include "chrome/browser/extensions/extension_action.h"
9 #include "chrome/browser/extensions/extension_action_icon_factory.h"
10 #import "chrome/browser/ui/cocoa/location_bar/image_decoration.h"
11 #include "content/public/browser/notification_observer.h"
12 #include "content/public/browser/notification_registrar.h"
13 #include "url/gurl.h"
14
15 @class ExtensionActionContextMenuController;
16 class Browser;
17 class LocationBarViewMac;
18
19 namespace content {
20 class WebContents;
21 }
22
23 // PageActionDecoration is used to display the icon for a given Page
24 // Action and notify the extension when the icon is clicked.
25
26 class PageActionDecoration : public ImageDecoration,
27                              public ExtensionActionIconFactory::Observer,
28                              public content::NotificationObserver,
29                              public ExtensionAction::IconAnimation::Observer {
30  public:
31   PageActionDecoration(LocationBarViewMac* owner,
32                        Browser* browser,
33                        ExtensionAction* page_action);
34   virtual ~PageActionDecoration();
35
36   ExtensionAction* page_action() { return page_action_; }
37   int current_tab_id() { return current_tab_id_; }
38   void set_preview_enabled(bool enabled) { preview_enabled_ = enabled; }
39   bool preview_enabled() const { return preview_enabled_; }
40
41   // Overridden from |ExtensionActionIconFactory::Observer|.
42   virtual void OnIconUpdated() OVERRIDE;
43
44   // Called to notify the Page Action that it should determine whether
45   // to be visible or hidden. |contents| is the WebContents that is
46   // active, |url| is the current page URL.
47   void UpdateVisibility(content::WebContents* contents, const GURL& url);
48
49   // Sets the tooltip for this Page Action image.
50   void SetToolTip(NSString* tooltip);
51   void SetToolTip(std::string tooltip);
52
53   // Get the point where extension info bubbles should point within
54   // the given decoration frame.
55   NSPoint GetBubblePointInFrame(NSRect frame);
56
57   // Overridden from |LocationBarDecoration|
58   virtual CGFloat GetWidthForSpace(CGFloat width) OVERRIDE;
59   virtual void DrawWithBackgroundInFrame(NSRect background_frame,
60                                          NSRect frame,
61                                          NSView* control_view) OVERRIDE;
62   virtual bool AcceptsMousePress() OVERRIDE;
63   virtual bool OnMousePressed(NSRect frame) OVERRIDE;
64   virtual NSString* GetToolTip() OVERRIDE;
65   virtual NSMenu* GetMenu() OVERRIDE;
66
67  private:
68   // Activate the page action in the given |frame|.
69   bool ActivatePageAction(NSRect frame);
70
71   // Show the popup in the frame, with the given URL.
72   void ShowPopup(const NSRect& frame, const GURL& popup_url);
73
74   // Overridden from ExtensionAction::IconAnimation::Observer.
75   virtual void OnIconChanged() OVERRIDE;
76
77   // Overridden from NotificationObserver:
78   virtual void Observe(int type,
79                        const content::NotificationSource& source,
80                        const content::NotificationDetails& details) OVERRIDE;
81
82   // The location bar view that owns us.
83   LocationBarViewMac* owner_;
84
85   // The current browser (not owned by us).
86   Browser* browser_;
87
88   // The Page Action that this view represents. The Page Action is not
89   // owned by us, it resides in the extension of this particular
90   // profile.
91   ExtensionAction* page_action_;
92
93
94   // The object that will be used to get the page action icon for us.
95   // It may load the icon asynchronously (in which case the initial icon
96   // returned by the factory will be transparent), so we have to observe it for
97   // updates to the icon.
98   scoped_ptr<ExtensionActionIconFactory> icon_factory_;
99
100   // The tab id we are currently showing the icon for.
101   int current_tab_id_;
102
103   // The URL we are currently showing the icon for.
104   GURL current_url_;
105
106   // The string to show for a tooltip.
107   base::scoped_nsobject<NSString> tooltip_;
108
109   // The context menu controller for the Page Action.
110   base::scoped_nsobject<
111       ExtensionActionContextMenuController> contextMenuController_;
112
113   // This is used for post-install visual feedback. The page_action
114   // icon is briefly shown even if it hasn't been enabled by its
115   // extension.
116   bool preview_enabled_;
117
118   // Fade-in animation for the icon with observer scoped to this.
119   ExtensionAction::IconAnimation::ScopedObserver
120       scoped_icon_animation_observer_;
121
122   // Used to register for notifications received by
123   // NotificationObserver.
124   content::NotificationRegistrar registrar_;
125
126   DISALLOW_COPY_AND_ASSIGN(PageActionDecoration);
127 };
128
129 #endif  // CHROME_BROWSER_UI_COCOA_LOCATION_BAR_PAGE_ACTION_DECORATION_H_