summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-02 20:16:32 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-02 20:16:32 +0000
commit6ea309f8db3cadf7abcb2a11ea45c91320b6255b (patch)
tree9f978a49183d7cfa00ea08007363b85068bdee73 /chrome/browser/gtk/browser_actions_toolbar_gtk.cc
parentf0c2a66e82c2aa1f4d756150e525df7623e38c18 (diff)
downloadchromium_src-6ea309f8db3cadf7abcb2a11ea45c91320b6255b.zip
chromium_src-6ea309f8db3cadf7abcb2a11ea45c91320b6255b.tar.gz
chromium_src-6ea309f8db3cadf7abcb2a11ea45c91320b6255b.tar.bz2
GTK browser actions toolbar fiddling:
- make the toolbar size restore properly when the toolbar is created before the model is loaded - allow the user to right click menu items in the overflow menu BUG=40068 (sorta) TEST=manual Review URL: http://codereview.chromium.org/1602003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43515 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/browser_actions_toolbar_gtk.cc')
-rw-r--r--chrome/browser/gtk/browser_actions_toolbar_gtk.cc84
1 files changed, 67 insertions, 17 deletions
diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
index 977bd2f..7f3ec625 100644
--- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
@@ -48,6 +48,8 @@ const int kSeparatorPadding = 2;
const char* kDragTarget = "application/x-chrome-browseraction";
+const char* kMenuItemKey = "__CHROME_OVERFLOW_MENU_ITEM_KEY__";
+
GtkTargetEntry GetDragTargetEntry() {
static std::string drag_target_string(kDragTarget);
GtkTargetEntry drag_target;
@@ -179,10 +181,30 @@ class BrowserActionButton : public NotificationObserver,
}
}
+ MenuGtk* GetContextMenu() {
+ context_menu_model_.reset(
+ new ExtensionContextMenuModel(extension_, toolbar_->browser(), this));
+ context_menu_.reset(
+ new MenuGtk(this, context_menu_model_.get()));
+ return context_menu_.get();
+ }
+
private:
// MenuGtk::Delegate implementation.
virtual void StoppedShowing() {
gtk_chrome_button_unset_paint_state(GTK_CHROME_BUTTON(button_.get()));
+
+ // If the context menu was showing for the overflow menu, re-assert the
+ // grab that was shadowed.
+ if (toolbar_->overflow_menu_.get())
+ gtk_util::GrabAllInput(toolbar_->overflow_menu_->widget());
+ }
+
+ virtual void CommandWasExecuted() {
+ // If the context menu was showing for the overflow menu, and a command
+ // is executed, then stop showing the overflow menu.
+ if (toolbar_->overflow_menu_.get())
+ toolbar_->overflow_menu_->Cancel();
}
// Returns true to prevent further processing of the event that caused us to
@@ -224,16 +246,9 @@ class BrowserActionButton : public NotificationObserver,
if (event->button.button != 3)
return FALSE;
- action->context_menu_model_.reset(
- new ExtensionContextMenuModel(
- action->extension_,
- action->toolbar_->browser(),
- action));
- action->context_menu_.reset(
- new MenuGtk(action, action->context_menu_model_.get()));
gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(action->button_.get()),
GTK_STATE_PRELIGHT);
- action->context_menu_->Popup(widget, event);
+ action->GetContextMenu()->Popup(widget, event);
return TRUE;
}
@@ -352,20 +367,17 @@ BrowserActionsToolbarGtk::BrowserActionsToolbarGtk(Browser* browser)
model_ = extension_service->toolbar_model();
model_->AddObserver(this);
SetupDrags();
- CreateAllButtons();
+
+ if (model_->extensions_initialized()) {
+ CreateAllButtons();
+ SetContainerWidth();
+ }
// We want to connect to "set-focus" on the toplevel window; we have to wait
// until we are added to a toplevel window to do so.
g_signal_connect(widget(), "hierarchy-changed",
G_CALLBACK(OnHierarchyChangedThunk), this);
- int showing_actions = model_->GetVisibleIconCount();
- if (showing_actions >= 0) {
- SetButtonHBoxWidth(WidthForIconCount(showing_actions));
- if (showing_actions < static_cast<int>(model_->size()))
- gtk_widget_show(overflow_button_.widget());
- }
-
ViewIDUtil::SetID(button_hbox_, VIEW_ID_BROWSER_ACTION_TOOLBAR);
}
@@ -415,6 +427,15 @@ void BrowserActionsToolbarGtk::CreateAllButtons() {
}
}
+void BrowserActionsToolbarGtk::SetContainerWidth() {
+ int showing_actions = model_->GetVisibleIconCount();
+ if (showing_actions >= 0) {
+ SetButtonHBoxWidth(WidthForIconCount(showing_actions));
+ if (showing_actions < static_cast<int>(model_->size()))
+ gtk_widget_show(overflow_button_.widget());
+ }
+}
+
void BrowserActionsToolbarGtk::CreateButtonForExtension(Extension* extension,
int index) {
if (!ShouldDisplayBrowserAction(extension))
@@ -488,6 +509,8 @@ void BrowserActionsToolbarGtk::AnimateToShowNIcons(int count) {
void BrowserActionsToolbarGtk::BrowserActionAdded(Extension* extension,
int index) {
+ overflow_menu_.reset();
+
CreateButtonForExtension(extension, index);
// If we are still initializing the container, don't bother animating.
@@ -502,6 +525,8 @@ void BrowserActionsToolbarGtk::BrowserActionAdded(Extension* extension,
}
void BrowserActionsToolbarGtk::BrowserActionRemoved(Extension* extension) {
+ overflow_menu_.reset();
+
if (drag_button_ != NULL) {
// Break the current drag.
gtk_grab_remove(button_hbox_);
@@ -536,6 +561,10 @@ void BrowserActionsToolbarGtk::BrowserActionMoved(Extension* extension,
gtk_box_reorder_child(GTK_BOX(button_hbox_), button->widget(), index);
}
+void BrowserActionsToolbarGtk::ModelLoaded() {
+ SetContainerWidth();
+}
+
void BrowserActionsToolbarGtk::AnimationProgressed(const Animation* animation) {
int width = start_width_ + (desired_width_ - start_width_) *
animation->GetCurrentValue();
@@ -761,17 +790,38 @@ gboolean BrowserActionsToolbarGtk::OnOverflowButtonPress(
Extension* extension = model_->GetExtensionByIndex(i);
BrowserActionButton* button = extension_button_map_[extension->id()].get();
- overflow_menu_->AppendMenuItemWithIcon(
+ GtkWidget* menu_item = overflow_menu_->AppendMenuItemWithIcon(
i,
extension->name(),
button->GetIcon());
+ g_object_set_data(G_OBJECT(menu_item), kMenuItemKey, button);
+
// TODO(estade): set the menu item's tooltip.
}
+ g_signal_connect(overflow_menu_->widget(), "button-press-event",
+ G_CALLBACK(OnOverflowMenuButtonPressThunk), this);
+
gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(overflow),
GTK_STATE_ACTIVE);
overflow_menu_->PopupAsFromKeyEvent(overflow);
return FALSE;
}
+
+gboolean BrowserActionsToolbarGtk::OnOverflowMenuButtonPress(
+ GtkWidget* overflow, GdkEventButton* event) {
+ if (event->button != 3)
+ return FALSE;
+
+ GtkWidget* menu_item = GTK_MENU_SHELL(overflow)->active_menu_item;
+ if (!menu_item)
+ return FALSE;
+
+ void* data = g_object_get_data(G_OBJECT(menu_item), kMenuItemKey);
+ DCHECK(data);
+ BrowserActionButton* button = static_cast<BrowserActionButton*>(data);
+ button->GetContextMenu()->PopupAsContext(event->time);
+ return TRUE;
+}