diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-20 05:16:54 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-20 05:16:54 +0000 |
commit | bf28f5f87c717257ef566e4f7a22d116d088f59e (patch) | |
tree | b6a1cb91e83a23973187116c3aaec3041af27538 /chrome/browser/views/browser_actions_container.h | |
parent | dd3e02abd586bcb898a557713b2636e0f4999990 (diff) | |
download | chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.zip chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.tar.gz chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.tar.bz2 |
Implement chrome.browserAction.setIcon({path:...});
BUG=22575
Review URL: http://codereview.chromium.org/269103
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29495 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/browser_actions_container.h')
-rw-r--r-- | chrome/browser/views/browser_actions_container.h | 116 |
1 files changed, 114 insertions, 2 deletions
diff --git a/chrome/browser/views/browser_actions_container.h b/chrome/browser/views/browser_actions_container.h index c849d44..e365bcd 100644 --- a/chrome/browser/views/browser_actions_container.h +++ b/chrome/browser/views/browser_actions_container.h @@ -8,19 +8,125 @@ #include <vector> #include "base/task.h" +#include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/views/browser_bubble.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" +#include "views/controls/button/menu_button.h" #include "views/view.h" -class BrowserActionButton; -class BrowserActionView; +class BrowserActionsContainer; +class Extension; class ExtensionAction; +class ExtensionActionState; class ExtensionPopup; class Profile; class ToolbarView; //////////////////////////////////////////////////////////////////////////////// +// BrowserActionButton + +// The BrowserActionButton is a specialization of the MenuButton class. +// It acts on a ExtensionAction, in this case a BrowserAction and handles +// loading the image for the button asynchronously on the file thread to +class BrowserActionButton : public views::MenuButton, + public views::ButtonListener, + public ImageLoadingTracker::Observer, + public NotificationObserver { + public: + BrowserActionButton(ExtensionAction* browser_action, + Extension* extension, + BrowserActionsContainer* panel); + ~BrowserActionButton(); + + const ExtensionAction& browser_action() const { return *browser_action_; } + ExtensionActionState* browser_action_state() { return browser_action_state_; } + + // Overriden from views::View. Return a 0-inset so the icon can draw all the + // way to the edge of the view if it wants. + virtual gfx::Insets GetInsets() const; + + // Overridden from views::ButtonListener: + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + // Overridden from ImageLoadingTracker. + virtual void OnImageLoaded(SkBitmap* image, size_t index); + + // Overridden from NotificationObserver: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + // MenuButton behavior overrides. These methods all default to TextButton + // behavior unless this button is a popup. In that case, it uses MenuButton + // behavior. MenuButton has the notion of a child popup being shown where the + // button will stay in the pushed state until the "menu" (a popup in this + // case) is dismissed. + virtual bool Activate(); + virtual bool OnMousePressed(const views::MouseEvent& e); + virtual void OnMouseReleased(const views::MouseEvent& e, bool canceled); + virtual bool OnKeyReleased(const views::KeyEvent& e); + virtual void OnMouseExited(const views::MouseEvent& event); + + // Does this button's action have a popup? + virtual bool IsPopup(); + + // Notifications when the popup is hidden or shown by the container. + virtual void PopupDidShow(); + virtual void PopupDidHide(); + + private: + // Called to update the display to match the browser action's state. + void OnStateUpdated(); + + // The browser action this view represents. The ExtensionAction is not owned + // by this class. + ExtensionAction* browser_action_; + + // The state of our browser action. Not owned by this class. + ExtensionActionState* browser_action_state_; + + // The icons representing different states for the browser action. + std::vector<SkBitmap> browser_action_icons_; + + // The object that is waiting for the image loading to complete + // asynchronously. This object can potentially outlive the BrowserActionView, + // and takes care of deleting itself. + ImageLoadingTracker* tracker_; + + // The browser action shelf. + BrowserActionsContainer* panel_; + + NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(BrowserActionButton); +}; + + +//////////////////////////////////////////////////////////////////////////////// +// BrowserActionView +// A single section in the browser action container. This contains the actual +// BrowserActionButton, as well as the logic to paint the badge. + +class BrowserActionView : public views::View { + public: + BrowserActionView(ExtensionAction* browser_action, Extension* extension, + BrowserActionsContainer* panel); + + BrowserActionButton* button() { return button_; } + + private: + virtual void Layout(); + + // Override PaintChildren so that we can paint the badge on top of children. + virtual void PaintChildren(gfx::Canvas* canvas); + + // The button this view contains. + BrowserActionButton* button_; +}; + + +//////////////////////////////////////////////////////////////////////////////// // // The BrowserActionsContainer is a container view, responsible for drawing the // icons that represent browser actions (extensions that add icons to the @@ -34,8 +140,14 @@ class BrowserActionsContainer : public views::View, BrowserActionsContainer(Profile* profile, ToolbarView* toolbar); virtual ~BrowserActionsContainer(); + // Get the number of browser actions being displayed. int num_browser_actions() { return browser_action_views_.size(); } + // Get a particular browser action view. + BrowserActionView* GetBrowserActionViewAt(int index) { + return browser_action_views_[index]; + } + // Update the views to reflect the state of the browser action icons. void RefreshBrowserActionViews(); |