Index: chrome/browser/ui/gtk/browser_actions_toolbar_gtk.h |
diff --git a/chrome/browser/ui/gtk/browser_actions_toolbar_gtk.h b/chrome/browser/ui/gtk/browser_actions_toolbar_gtk.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e9058c695f15fd74dc98e2cd09ea36c403bf6e11 |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/browser_actions_toolbar_gtk.h |
@@ -0,0 +1,223 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_UI_GTK_BROWSER_ACTIONS_TOOLBAR_GTK_H_ |
+#define CHROME_BROWSER_UI_GTK_BROWSER_ACTIONS_TOOLBAR_GTK_H_ |
+#pragma once |
+ |
+#include <map> |
+#include <string> |
+ |
+#include "app/gtk_signal.h" |
+#include "app/gtk_signal_registrar.h" |
+#include "app/menus/simple_menu_model.h" |
+#include "base/linked_ptr.h" |
+#include "base/task.h" |
+#include "chrome/browser/extensions/extension_toolbar_model.h" |
+#include "chrome/browser/gtk/custom_button.h" |
+#include "chrome/browser/gtk/menu_gtk.h" |
+#include "chrome/browser/gtk/overflow_button.h" |
+#include "chrome/browser/gtk/owned_widget_gtk.h" |
+#include "chrome/common/notification_observer.h" |
+#include "chrome/common/notification_registrar.h" |
+#include "ui/base/animation/animation_delegate.h" |
+#include "ui/base/animation/slide_animation.h" |
+ |
+class Browser; |
+class BrowserActionButton; |
+class Extension; |
+class GtkThemeProvider; |
+class Profile; |
+ |
+typedef struct _GdkDragContext GdkDragContext; |
+typedef struct _GtkWidget GtkWidget; |
+ |
+class BrowserActionsToolbarGtk : public ExtensionToolbarModel::Observer, |
+ public ui::AnimationDelegate, |
+ public MenuGtk::Delegate, |
+ public menus::SimpleMenuModel::Delegate, |
+ public NotificationObserver { |
+ public: |
+ explicit BrowserActionsToolbarGtk(Browser* browser); |
+ virtual ~BrowserActionsToolbarGtk(); |
+ |
+ GtkWidget* widget() { return hbox_.get(); } |
+ GtkWidget* chevron() { return overflow_button_->widget(); } |
+ |
+ // Returns the widget in use by the BrowserActionButton corresponding to |
+ // |extension|. Used in positioning the ExtensionInstalledBubble for |
+ // BrowserActions. |
+ GtkWidget* GetBrowserActionWidget(const Extension* extension); |
+ |
+ int button_count() { return extension_button_map_.size(); } |
+ |
+ Browser* browser() { return browser_; } |
+ |
+ // Returns the currently selected tab ID, or -1 if there is none. |
+ int GetCurrentTabId(); |
+ |
+ // Update the display of all buttons. |
+ void Update(); |
+ |
+ // NotificationObserver implementation. |
+ virtual void Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details); |
+ |
+ bool animating() { |
+ return resize_animation_.is_animating(); |
+ } |
+ |
+ private: |
+ friend class BrowserActionButton; |
+ |
+ // Initialize drag and drop. |
+ void SetupDrags(); |
+ |
+ // Query the extensions service for all extensions with browser actions, |
+ // and create the UI for them. |
+ void CreateAllButtons(); |
+ |
+ // Sets the width of the container and overflow state according to the model. |
+ void SetContainerWidth(); |
+ |
+ // Create the UI for a single browser action. This will stick the button |
+ // at the end of the toolbar. |
+ void CreateButtonForExtension(const Extension* extension, int index); |
+ |
+ // Delete resources associated with UI for a browser action. |
+ void RemoveButtonForExtension(const Extension* extension); |
+ |
+ // Change the visibility of widget() based on whether we have any buttons |
+ // to show. |
+ void UpdateVisibility(); |
+ |
+ // Hide the extension popup, if any. |
+ void HidePopup(); |
+ |
+ // Animate the toolbar to show the given number of icons. This assumes the |
+ // visibility of the overflow button will not change. |
+ void AnimateToShowNIcons(int count); |
+ |
+ // Returns true if this extension should be shown in this toolbar. This can |
+ // return false if we are in an incognito window and the extension is disabled |
+ // for incognito. |
+ bool ShouldDisplayBrowserAction(const Extension* extension); |
+ |
+ // ExtensionToolbarModel::Observer implementation. |
+ virtual void BrowserActionAdded(const Extension* extension, int index); |
+ virtual void BrowserActionRemoved(const Extension* extension); |
+ virtual void BrowserActionMoved(const Extension* extension, int index); |
+ virtual void ModelLoaded(); |
+ |
+ // ui::AnimationDelegate implementation. |
+ virtual void AnimationProgressed(const ui::Animation* animation); |
+ virtual void AnimationEnded(const ui::Animation* animation); |
+ |
+ // SimpleMenuModel::Delegate implementation. |
+ // In our case, |command_id| is be the index into the model's extension list. |
+ virtual bool IsCommandIdChecked(int command_id) const; |
+ virtual bool IsCommandIdEnabled(int command_id) const; |
+ virtual bool GetAcceleratorForCommandId( |
+ int command_id, |
+ menus::Accelerator* accelerator); |
+ virtual void ExecuteCommand(int command_id); |
+ |
+ // MenuGtk::Delegate implementation. |
+ virtual void StoppedShowing(); |
+ virtual bool AlwaysShowIconForCmd(int command_id) const; |
+ |
+ // Called by the BrowserActionButton in response to drag-begin. |
+ void DragStarted(BrowserActionButton* button, GdkDragContext* drag_context); |
+ |
+ // Sets the width of the button area of the toolbar to |new_width|, clamping |
+ // it to appropriate values. |
+ void SetButtonHBoxWidth(int new_width); |
+ |
+ // Shows or hides the chevron as appropriate. |
+ void UpdateChevronVisibility(); |
+ |
+ CHROMEGTK_CALLBACK_4(BrowserActionsToolbarGtk, gboolean, OnDragMotion, |
+ GdkDragContext*, gint, gint, guint); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, void, OnDragEnd, |
+ GdkDragContext*); |
+ CHROMEGTK_CALLBACK_2(BrowserActionsToolbarGtk, gboolean, OnDragFailed, |
+ GdkDragContext*, GtkDragResult); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, void, OnHierarchyChanged, |
+ GtkWidget*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, void, OnSetFocus, GtkWidget*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnGripperMotionNotify, GdkEventMotion*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, OnGripperExpose, |
+ GdkEventExpose*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnGripperEnterNotify, GdkEventCrossing*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnGripperLeaveNotify, GdkEventCrossing*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnGripperButtonRelease, GdkEventButton*); |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnGripperButtonPress, GdkEventButton*); |
+ // The overflow button is pressed. |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnOverflowButtonPress, GdkEventButton*); |
+ // The user presses a mouse button over the popped up overflow menu. |
+ CHROMEGTK_CALLBACK_1(BrowserActionsToolbarGtk, gboolean, |
+ OnOverflowMenuButtonPress, GdkEventButton*); |
+ CHROMEGTK_CALLBACK_0(BrowserActionsToolbarGtk, void, OnButtonShowOrHide); |
+ |
+ Browser* browser_; |
+ |
+ Profile* profile_; |
+ GtkThemeProvider* theme_provider_; |
+ |
+ ExtensionToolbarModel* model_; |
+ |
+ // Contains the drag gripper, browser action buttons, and overflow chevron. |
+ OwnedWidgetGtk hbox_; |
+ |
+ // Contains the browser action buttons. |
+ OwnedWidgetGtk button_hbox_; |
+ |
+ // The overflow button for chrome theme mode. |
+ scoped_ptr<CustomDrawButton> overflow_button_; |
+ // The separator just next to the overflow button. Only shown in GTK+ theme |
+ // mode. In Chrome theme mode, the overflow button has a separator built in. |
+ GtkWidget* separator_; |
+ scoped_ptr<MenuGtk> overflow_menu_; |
+ scoped_ptr<menus::SimpleMenuModel> overflow_menu_model_; |
+ GtkWidget* overflow_area_; |
+ // A widget for adding extra padding to the left of the overflow button. |
+ GtkWidget* overflow_alignment_; |
+ |
+ // The button that is currently being dragged, or NULL. |
+ BrowserActionButton* drag_button_; |
+ |
+ // The new position of the button in the drag, or -1. |
+ int drop_index_; |
+ |
+ // Map from extension ID to BrowserActionButton, which is a wrapper for |
+ // a chrome button and related functionality. There should be one entry |
+ // for every extension that has a browser action. |
+ typedef std::map<std::string, linked_ptr<BrowserActionButton> > |
+ ExtensionButtonMap; |
+ ExtensionButtonMap extension_button_map_; |
+ |
+ // We use this animation for the smart resizing of the toolbar. |
+ ui::SlideAnimation resize_animation_; |
+ // This is the final width we are animating towards. |
+ int desired_width_; |
+ // This is the width we were at when we started animating. |
+ int start_width_; |
+ |
+ GtkSignalRegistrar signals_; |
+ |
+ NotificationRegistrar registrar_; |
+ |
+ ScopedRunnableMethodFactory<BrowserActionsToolbarGtk> method_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserActionsToolbarGtk); |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_GTK_BROWSER_ACTIONS_TOOLBAR_GTK_H_ |