diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-08 23:11:03 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-08 23:11:03 +0000 |
commit | af4282a5e55c5c14413654f498a0117413ab0565 (patch) | |
tree | 35e45ce4b35ffacd25939dae68f99c1dd2679850 /chrome/browser/gtk/bookmark_bar_gtk.cc | |
parent | 53b31efebbd3ceffdde84bb62f78986620179040 (diff) | |
download | chromium_src-af4282a5e55c5c14413654f498a0117413ab0565.zip chromium_src-af4282a5e55c5c14413654f498a0117413ab0565.tar.gz chromium_src-af4282a5e55c5c14413654f498a0117413ab0565.tar.bz2 |
Make the bookmark toolbar folders act like a menu bar.
I didn't convert the page/app menu to use the new helper class in an effort to keep this patch small and reviewable.
BUG=19675
BUG=15889
TEST=fiddled with it for while, and ran it under valgrind
Review URL: http://codereview.chromium.org/200029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25677 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/bookmark_bar_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/bookmark_bar_gtk.cc | 97 |
1 files changed, 74 insertions, 23 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc index eb16e2e..0504349 100644 --- a/chrome/browser/gtk/bookmark_bar_gtk.cc +++ b/chrome/browser/gtk/bookmark_bar_gtk.cc @@ -101,7 +101,8 @@ BookmarkBarGtk::BookmarkBarGtk(Profile* profile, Browser* browser, dragged_node_(NULL), toolbar_drop_item_(NULL), theme_provider_(GtkThemeProvider::GetFrom(profile)), - show_instructions_(true) { + show_instructions_(true), + menu_bar_helper_(this) { Init(profile); SetProfile(profile); @@ -310,9 +311,12 @@ void BookmarkBarGtk::BookmarkNodeAdded(BookmarkModel* model, } DCHECK(index >= 0 && index <= GetBookmarkButtonCount()); - GtkToolItem* item = CreateBookmarkToolItem(parent->GetChild(index)); + const BookmarkNode* node = parent->GetChild(index); + GtkToolItem* item = CreateBookmarkToolItem(node); gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, index); + if (node->is_folder()) + menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item))); SetInstructionState(); SetChevronState(); @@ -330,6 +334,7 @@ void BookmarkBarGtk::BookmarkNodeRemoved(BookmarkModel* model, GtkWidget* to_remove = GTK_WIDGET(gtk_toolbar_get_nth_item( GTK_TOOLBAR(bookmark_toolbar_.get()), old_index)); + menu_bar_helper_.Remove(gtk_bin_get_child(GTK_BIN(to_remove))); gtk_container_remove(GTK_CONTAINER(bookmark_toolbar_.get()), to_remove); @@ -376,6 +381,8 @@ void BookmarkBarGtk::CreateAllBookmarkButtons() { for (int i = 0; i < node->GetChildCount(); ++i) { GtkToolItem* item = CreateBookmarkToolItem(node->GetChild(i)); gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1); + if (node->is_folder()) + menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item))); } bookmark_utils::ConfigureButtonForNode(model_->other_node(), @@ -400,7 +407,7 @@ void BookmarkBarGtk::SetChevronState() { if (GTK_WIDGET_VISIBLE(overflow_button_)) extra_space = overflow_button_->allocation.width; - int overflow_idx = GetFirstHiddenBookmark(extra_space); + int overflow_idx = GetFirstHiddenBookmark(extra_space, NULL); if (overflow_idx == -1) gtk_widget_hide(overflow_button_); else @@ -409,6 +416,9 @@ void BookmarkBarGtk::SetChevronState() { void BookmarkBarGtk::RemoveAllBookmarkButtons() { gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); + menu_bar_helper_.Clear(); + menu_bar_helper_.Add(other_bookmarks_button_); + menu_bar_helper_.Add(overflow_button_); } int BookmarkBarGtk::GetBookmarkButtonCount() { @@ -433,7 +443,8 @@ void BookmarkBarGtk::SetOverflowButtonAppearance() { SetChevronState(); } -int BookmarkBarGtk::GetFirstHiddenBookmark(int extra_space) { +int BookmarkBarGtk::GetFirstHiddenBookmark( + int extra_space, std::vector<GtkWidget*>* showing_folders) { int rv = 0; bool overflow = false; GList* toolbar_items = @@ -445,6 +456,10 @@ int BookmarkBarGtk::GetFirstHiddenBookmark(int extra_space) { overflow = true; break; } + if (showing_folders && + model_->GetBookmarkBarNode()->GetChild(rv)->is_folder()) { + showing_folders->push_back(gtk_bin_get_child(GTK_BIN(tool_item))); + } rv++; } @@ -534,7 +549,6 @@ GtkWidget* BookmarkBarGtk::CreateBookmarkButton(const BookmarkNode* node) { G_CALLBACK(OnClicked), this); gtk_util::SetButtonTriggersNavigation(button); } else { - // TODO(erg): This button can also be a drop target. ConnectFolderButtonEvents(button); } @@ -717,24 +731,7 @@ void BookmarkBarGtk::OnButtonDragGet(GtkWidget* widget, GdkDragContext* context, // static void BookmarkBarGtk::OnFolderClicked(GtkWidget* sender, BookmarkBarGtk* bar) { - const BookmarkNode* node = bar->GetNodeForToolButton(sender); - DCHECK(node); - DCHECK(bar->page_navigator_); - - int start_child_idx = 0; - if (sender == bar->overflow_button_) - start_child_idx = bar->GetFirstHiddenBookmark(0); - - bar->current_menu_.reset( - new BookmarkMenuController(bar->browser_, bar->profile_, - bar->page_navigator_, - GTK_WINDOW(gtk_widget_get_toplevel(sender)), - node, - start_child_idx, - false)); - GdkEventButton* event = - reinterpret_cast<GdkEventButton*>(gtk_get_current_event()); - bar->current_menu_->Popup(sender, event->button, event->time); + bar->PopupForButton(sender); } // static @@ -972,3 +969,57 @@ gboolean BookmarkBarGtk::OnSeparatorExpose(GtkWidget* widget, return TRUE; } + +// MenuBarHelper::Delegate implementation -------------------------------------- +void BookmarkBarGtk::PopupForButton(GtkWidget* button) { + const BookmarkNode* node = GetNodeForToolButton(button); + DCHECK(node); + DCHECK(page_navigator_); + + int first_hidden = GetFirstHiddenBookmark(0, NULL); + if (button != overflow_button_ && button != other_bookmarks_button_ && + node->GetParent()->IndexOfChild(node) >= first_hidden) { + return; + } + + current_menu_.reset( + new BookmarkMenuController(browser_, profile_, + page_navigator_, + GTK_WINDOW(gtk_widget_get_toplevel(button)), + node, + button == overflow_button_ ? + first_hidden : 0, + false)); + menu_bar_helper_.MenuStartedShowing(button, current_menu_->widget()); + GdkEventButton* event = + reinterpret_cast<GdkEventButton*>(gtk_get_current_event()); + current_menu_->Popup(button, event->button, event->time); +} + +void BookmarkBarGtk::PopupForButtonNextTo(GtkWidget* button, + GtkMenuDirectionType dir) { + const BookmarkNode* relative_node = GetNodeForToolButton(button); + DCHECK(relative_node); + + // Find out the order of the buttons. + std::vector<GtkWidget*> folder_list; + const int first_hidden = GetFirstHiddenBookmark(0, &folder_list); + if (first_hidden != -1) + folder_list.push_back(overflow_button_); + folder_list.push_back(other_bookmarks_button_); + + // Find the position of |button|. + int button_idx = -1; + for (size_t i = 0; i < folder_list.size(); ++i) { + if (folder_list[i] == button) { + button_idx = i; + break; + } + } + DCHECK_NE(button_idx, -1); + + // Find the GtkWidget* for the actual target button. + int shift = dir == GTK_MENU_DIR_PARENT ? -1 : 1; + button_idx = (button_idx + shift + folder_list.size()) % folder_list.size(); + PopupForButton(folder_list[button_idx]); +} |