summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/browser_actions_container.h
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-20 05:16:54 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-20 05:16:54 +0000
commitbf28f5f87c717257ef566e4f7a22d116d088f59e (patch)
treeb6a1cb91e83a23973187116c3aaec3041af27538 /chrome/browser/views/browser_actions_container.h
parentdd3e02abd586bcb898a557713b2636e0f4999990 (diff)
downloadchromium_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.h116
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();