Index: chrome/browser/gtk/bookmark_bar_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/bookmark_bar_gtk.cc (revision 25076) |
+++ chrome/browser/gtk/bookmark_bar_gtk.cc (working copy) |
@@ -184,11 +184,21 @@ |
SetToolBarStyle(); |
gtk_widget_set_name(bookmark_toolbar_.get(), "chrome-bookmark-toolbar"); |
gtk_widget_set_app_paintable(bookmark_toolbar_.get(), TRUE); |
- g_signal_connect(G_OBJECT(bookmark_toolbar_.get()), "expose-event", |
+ g_signal_connect(bookmark_toolbar_.get(), "expose-event", |
G_CALLBACK(&OnToolbarExpose), this); |
+ g_signal_connect(bookmark_toolbar_.get(), "size-allocate", |
+ G_CALLBACK(&OnToolbarSizeAllocate), this); |
gtk_box_pack_start(GTK_BOX(bookmark_hbox_), bookmark_toolbar_.get(), |
TRUE, TRUE, 0); |
+ overflow_button_ = theme_provider_->BuildChromeButton(); |
+ g_object_set_data(G_OBJECT(overflow_button_), "left-align-popup", |
+ reinterpret_cast<void*>(true)); |
+ SetOverflowButtonAppearance(); |
+ ConnectFolderButtonEvents(overflow_button_); |
+ gtk_box_pack_start(GTK_BOX(bookmark_hbox_), overflow_button_, |
+ FALSE, FALSE, 0); |
+ |
gtk_drag_dest_set(bookmark_toolbar_.get(), GTK_DEST_DEFAULT_DROP, |
NULL, 0, kDragAction); |
GtkDndUtil::SetDestTargetList(bookmark_toolbar_.get(), kDestTargetList); |
@@ -304,6 +314,7 @@ |
item, index); |
SetInstructionState(); |
+ SetChevronState(); |
} |
void BookmarkBarGtk::BookmarkNodeRemoved(BookmarkModel* model, |
@@ -322,6 +333,7 @@ |
to_remove); |
SetInstructionState(); |
+ SetChevronState(); |
} |
void BookmarkBarGtk::BookmarkNodeChanged(BookmarkModel* model, |
@@ -337,6 +349,7 @@ |
GTK_TOOLBAR(bookmark_toolbar_.get()), index); |
GtkWidget* button = gtk_bin_get_child(GTK_BIN(item)); |
bookmark_utils::ConfigureButtonForNode(node, model, button, theme_provider_); |
+ SetChevronState(); |
} |
void BookmarkBarGtk::BookmarkNodeFavIconLoaded(BookmarkModel* model, |
@@ -368,6 +381,7 @@ |
model_, other_bookmarks_button_, theme_provider_); |
SetInstructionState(); |
+ SetChevronState(); |
} |
void BookmarkBarGtk::SetInstructionState() { |
@@ -379,6 +393,19 @@ |
} |
} |
+void BookmarkBarGtk::SetChevronState() { |
+ int extra_space = 0; |
+ |
+ if (GTK_WIDGET_VISIBLE(overflow_button_)) |
+ extra_space = overflow_button_->allocation.width; |
+ |
+ int overflow_idx = GetFirstHiddenBookmark(extra_space); |
+ if (overflow_idx == -1) |
+ gtk_widget_hide(overflow_button_); |
+ else |
+ gtk_widget_show_all(overflow_button_); |
+} |
+ |
void BookmarkBarGtk::RemoveAllBookmarkButtons() { |
gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); |
} |
@@ -391,6 +418,43 @@ |
return count; |
} |
+void BookmarkBarGtk::SetOverflowButtonAppearance() { |
+ GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(overflow_button_)); |
+ if (former_child) |
+ gtk_widget_destroy(former_child); |
+ |
+ GtkWidget* new_child = theme_provider_->UseGtkTheme() ? |
+ gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE) : |
Elliot Glaysher
2009/09/02 01:19:39
This arrow, by default, is pretty big, no? You may
|
+ gtk_image_new_from_pixbuf(ResourceBundle::GetSharedInstance(). |
+ GetRTLEnabledPixbufNamed(IDR_BOOKMARK_BAR_CHEVRONS)); |
+ |
+ gtk_container_add(GTK_CONTAINER(overflow_button_), new_child); |
+ SetChevronState(); |
+} |
+ |
+int BookmarkBarGtk::GetFirstHiddenBookmark(int extra_space) { |
+ int rv = 0; |
+ bool overflow = false; |
+ GList* toolbar_items = |
+ gtk_container_get_children(GTK_CONTAINER(bookmark_toolbar_.get())); |
+ for (GList* iter = toolbar_items; iter; iter = g_list_next(iter)) { |
+ GtkWidget* tool_item = reinterpret_cast<GtkWidget*>(iter->data); |
+ if (tool_item->allocation.x + tool_item->allocation.width > |
+ bookmark_toolbar_.get()->allocation.width + extra_space) { |
+ overflow = true; |
+ break; |
+ } |
+ rv++; |
+ } |
+ |
+ g_list_free(toolbar_items); |
+ |
+ if (!overflow) |
+ return -1; |
+ |
+ return rv; |
+} |
+ |
bool BookmarkBarGtk::IsAlwaysShown() { |
return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
} |
@@ -430,6 +494,8 @@ |
// themes, we want to let the background show through the toolbar. |
gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), |
theme_provider_->UseGtkTheme()); |
+ |
+ SetOverflowButtonAppearance(); |
} |
} |
@@ -504,7 +570,7 @@ |
// First check to see if |button| is special cased. |
if (widget == other_bookmarks_button_) |
return model_->other_node(); |
- else if (widget == event_box_.get()) |
+ else if (widget == event_box_.get() || widget == overflow_button_) |
return model_->GetBookmarkBarNode(); |
// Search the contents of |bookmark_toolbar_| for the corresponding widget |
@@ -651,12 +717,16 @@ |
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, |
- 0, |
+ start_child_idx, |
false)); |
GdkEventButton* event = |
reinterpret_cast<GdkEventButton*>(gtk_get_current_event()); |
@@ -740,6 +810,13 @@ |
} |
// static |
+void BookmarkBarGtk::OnToolbarSizeAllocate(GtkWidget* widget, |
+ GtkAllocation* allocation, |
+ BookmarkBarGtk* bar) { |
+ bar->SetChevronState(); |
+} |
+ |
+// static |
void BookmarkBarGtk::OnDragReceived(GtkWidget* widget, |
GdkDragContext* context, |
gint x, gint y, |