OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/gtk/bookmarks/bookmark_bar_gtk.h" | 5 #include "chrome/browser/ui/gtk/bookmarks/bookmark_bar_gtk.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, | 114 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, |
115 extension_misc::APP_LAUNCH_BOOKMARK_BAR, | 115 extension_misc::APP_LAUNCH_BOOKMARK_BAR, |
116 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); | 116 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); |
117 } | 117 } |
118 | 118 |
119 } // namespace | 119 } // namespace |
120 | 120 |
121 const int BookmarkBarGtk::kBookmarkBarNTPHeight = 57; | 121 const int BookmarkBarGtk::kBookmarkBarNTPHeight = 57; |
122 | 122 |
123 BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window, | 123 BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window, |
124 Profile* profile, Browser* browser, | 124 Browser* browser, |
125 TabstripOriginProvider* tabstrip_origin_provider) | 125 TabstripOriginProvider* tabstrip_origin_provider) |
126 : profile_(NULL), | 126 : page_navigator_(NULL), |
127 page_navigator_(NULL), | |
128 browser_(browser), | 127 browser_(browser), |
129 window_(window), | 128 window_(window), |
130 tabstrip_origin_provider_(tabstrip_origin_provider), | 129 tabstrip_origin_provider_(tabstrip_origin_provider), |
131 model_(NULL), | 130 model_(NULL), |
132 instructions_(NULL), | 131 instructions_(NULL), |
133 sync_service_(NULL), | 132 sync_service_(NULL), |
134 dragged_node_(NULL), | 133 dragged_node_(NULL), |
135 drag_icon_(NULL), | 134 drag_icon_(NULL), |
136 toolbar_drop_item_(NULL), | 135 toolbar_drop_item_(NULL), |
137 theme_service_(GtkThemeService::GetFrom(profile)), | 136 theme_service_(GtkThemeService::GetFrom(browser->profile())), |
138 show_instructions_(true), | 137 show_instructions_(true), |
139 menu_bar_helper_(this), | 138 menu_bar_helper_(this), |
140 slide_animation_(this), | 139 slide_animation_(this), |
141 last_allocation_width_(-1), | 140 last_allocation_width_(-1), |
142 throbbing_widget_(NULL), | 141 throbbing_widget_(NULL), |
143 method_factory_(this), | 142 method_factory_(this), |
144 bookmark_bar_state_(BookmarkBar::DETACHED) { | 143 bookmark_bar_state_(BookmarkBar::DETACHED) { |
| 144 Profile* profile = browser->profile(); |
145 if (profile->GetProfileSyncService()) { | 145 if (profile->GetProfileSyncService()) { |
146 // Obtain a pointer to the profile sync service and add our instance as an | 146 // Obtain a pointer to the profile sync service and add our instance as an |
147 // observer. | 147 // observer. |
148 sync_service_ = profile->GetProfileSyncService(); | 148 sync_service_ = profile->GetProfileSyncService(); |
149 sync_service_->AddObserver(this); | 149 sync_service_->AddObserver(this); |
150 } | 150 } |
151 | 151 |
152 Init(profile); | 152 Init(); |
153 SetProfile(profile); | |
154 // Force an update by simulating being in the wrong state. | 153 // Force an update by simulating being in the wrong state. |
155 // BrowserWindowGtk sets our true state after we're created. | 154 // BrowserWindowGtk sets our true state after we're created. |
156 SetBookmarkBarState(BookmarkBar::SHOW, | 155 SetBookmarkBarState(BookmarkBar::SHOW, |
157 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); | 156 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); |
158 | 157 |
159 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 158 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
160 Source<ThemeService>(theme_service_)); | 159 Source<ThemeService>(theme_service_)); |
161 | 160 |
162 edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled, | 161 edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled, |
163 profile_->GetPrefs(), this); | 162 profile->GetPrefs(), this); |
164 OnEditBookmarksEnabledChanged(); | 163 OnEditBookmarksEnabledChanged(); |
165 } | 164 } |
166 | 165 |
167 BookmarkBarGtk::~BookmarkBarGtk() { | 166 BookmarkBarGtk::~BookmarkBarGtk() { |
168 RemoveAllBookmarkButtons(); | 167 RemoveAllButtons(); |
169 bookmark_toolbar_.Destroy(); | 168 bookmark_toolbar_.Destroy(); |
170 event_box_.Destroy(); | 169 event_box_.Destroy(); |
171 } | 170 } |
172 | 171 |
173 void BookmarkBarGtk::SetProfile(Profile* profile) { | |
174 DCHECK(profile); | |
175 if (profile_ == profile) | |
176 return; | |
177 | |
178 RemoveAllBookmarkButtons(); | |
179 | |
180 profile_ = profile; | |
181 | |
182 if (model_) | |
183 model_->RemoveObserver(this); | |
184 | |
185 // TODO(erg): Handle extensions | |
186 | |
187 model_ = profile_->GetBookmarkModel(); | |
188 model_->AddObserver(this); | |
189 if (model_->IsLoaded()) | |
190 Loaded(model_, false); | |
191 | |
192 // else case: we'll receive notification back from the BookmarkModel when done | |
193 // loading, then we'll populate the bar. | |
194 } | |
195 | |
196 void BookmarkBarGtk::SetPageNavigator(PageNavigator* navigator) { | 172 void BookmarkBarGtk::SetPageNavigator(PageNavigator* navigator) { |
197 page_navigator_ = navigator; | 173 page_navigator_ = navigator; |
198 } | 174 } |
199 | 175 |
200 void BookmarkBarGtk::Init(Profile* profile) { | 176 void BookmarkBarGtk::Init() { |
201 event_box_.Own(gtk_event_box_new()); | 177 event_box_.Own(gtk_event_box_new()); |
202 g_signal_connect(event_box_.get(), "destroy", | 178 g_signal_connect(event_box_.get(), "destroy", |
203 G_CALLBACK(&OnEventBoxDestroyThunk), this); | 179 G_CALLBACK(&OnEventBoxDestroyThunk), this); |
204 g_signal_connect(event_box_.get(), "button-press-event", | 180 g_signal_connect(event_box_.get(), "button-press-event", |
205 G_CALLBACK(&OnButtonPressedThunk), this); | 181 G_CALLBACK(&OnButtonPressedThunk), this); |
206 | 182 |
207 ntp_padding_box_ = gtk_alignment_new(0, 0, 1, 1); | 183 ntp_padding_box_ = gtk_alignment_new(0, 0, 1, 1); |
208 gtk_container_add(GTK_CONTAINER(event_box_.get()), ntp_padding_box_); | 184 gtk_container_add(GTK_CONTAINER(event_box_.get()), ntp_padding_box_); |
209 | 185 |
210 paint_box_ = gtk_event_box_new(); | 186 paint_box_ = gtk_event_box_new(); |
211 gtk_container_add(GTK_CONTAINER(ntp_padding_box_), paint_box_); | 187 gtk_container_add(GTK_CONTAINER(ntp_padding_box_), paint_box_); |
212 GdkColor paint_box_color = | 188 GdkColor paint_box_color = |
213 theme_service_->GetGdkColor(ThemeService::COLOR_TOOLBAR); | 189 theme_service_->GetGdkColor(ThemeService::COLOR_TOOLBAR); |
214 gtk_widget_modify_bg(paint_box_, GTK_STATE_NORMAL, &paint_box_color); | 190 gtk_widget_modify_bg(paint_box_, GTK_STATE_NORMAL, &paint_box_color); |
215 gtk_widget_add_events(paint_box_, GDK_POINTER_MOTION_MASK | | 191 gtk_widget_add_events(paint_box_, GDK_POINTER_MOTION_MASK | |
216 GDK_BUTTON_PRESS_MASK); | 192 GDK_BUTTON_PRESS_MASK); |
217 | 193 |
218 bookmark_hbox_ = gtk_hbox_new(FALSE, 0); | 194 bookmark_hbox_ = gtk_hbox_new(FALSE, 0); |
219 gtk_container_add(GTK_CONTAINER(paint_box_), bookmark_hbox_); | 195 gtk_container_add(GTK_CONTAINER(paint_box_), bookmark_hbox_); |
220 | 196 |
221 instructions_ = gtk_alignment_new(0, 0, 1, 1); | 197 instructions_ = gtk_alignment_new(0, 0, 1, 1); |
222 gtk_alignment_set_padding(GTK_ALIGNMENT(instructions_), 0, 0, | 198 gtk_alignment_set_padding(GTK_ALIGNMENT(instructions_), 0, 0, |
223 kInstructionsPadding, 0); | 199 kInstructionsPadding, 0); |
| 200 Profile* profile = browser_->profile(); |
224 instructions_gtk_.reset(new BookmarkBarInstructionsGtk(this, profile)); | 201 instructions_gtk_.reset(new BookmarkBarInstructionsGtk(this, profile)); |
225 gtk_container_add(GTK_CONTAINER(instructions_), instructions_gtk_->widget()); | 202 gtk_container_add(GTK_CONTAINER(instructions_), instructions_gtk_->widget()); |
226 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), instructions_, | 203 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), instructions_, |
227 TRUE, TRUE, 0); | 204 TRUE, TRUE, 0); |
228 | 205 |
229 gtk_drag_dest_set(instructions_, | 206 gtk_drag_dest_set(instructions_, |
230 GtkDestDefaults(GTK_DEST_DEFAULT_DROP | GTK_DEST_DEFAULT_MOTION), | 207 GtkDestDefaults(GTK_DEST_DEFAULT_DROP | GTK_DEST_DEFAULT_MOTION), |
231 NULL, 0, kDragAction); | 208 NULL, 0, kDragAction); |
232 ui::SetDestTargetList(instructions_, kDestTargetList); | 209 ui::SetDestTargetList(instructions_, kDestTargetList); |
233 g_signal_connect(instructions_, "drag-data-received", | 210 g_signal_connect(instructions_, "drag-data-received", |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), sync_error_button_, | 280 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), sync_error_button_, |
304 FALSE, FALSE, 0); | 281 FALSE, FALSE, 0); |
305 | 282 |
306 gtk_widget_set_size_request(event_box_.get(), -1, kBookmarkBarMinimumHeight); | 283 gtk_widget_set_size_request(event_box_.get(), -1, kBookmarkBarMinimumHeight); |
307 | 284 |
308 ViewIDUtil::SetID(other_bookmarks_button_, VIEW_ID_OTHER_BOOKMARKS); | 285 ViewIDUtil::SetID(other_bookmarks_button_, VIEW_ID_OTHER_BOOKMARKS); |
309 ViewIDUtil::SetID(widget(), VIEW_ID_BOOKMARK_BAR); | 286 ViewIDUtil::SetID(widget(), VIEW_ID_BOOKMARK_BAR); |
310 | 287 |
311 gtk_widget_show_all(widget()); | 288 gtk_widget_show_all(widget()); |
312 gtk_widget_hide(widget()); | 289 gtk_widget_hide(widget()); |
| 290 |
| 291 AddCoreButtons(); |
| 292 // TODO(erg): Handle extensions |
| 293 model_ = profile->GetBookmarkModel(); |
| 294 model_->AddObserver(this); |
| 295 if (model_->IsLoaded()) |
| 296 Loaded(model_, false); |
| 297 // else case: we'll receive notification back from the BookmarkModel when done |
| 298 // loading, then we'll populate the bar. |
313 } | 299 } |
314 | 300 |
315 void BookmarkBarGtk::SetBookmarkBarState( | 301 void BookmarkBarGtk::SetBookmarkBarState( |
316 BookmarkBar::State state, | 302 BookmarkBar::State state, |
317 BookmarkBar::AnimateChangeType animate_type) { | 303 BookmarkBar::AnimateChangeType animate_type) { |
318 if (animate_type == BookmarkBar::ANIMATE_STATE_CHANGE && | 304 if (animate_type == BookmarkBar::ANIMATE_STATE_CHANGE && |
319 (state == BookmarkBar::DETACHED || | 305 (state == BookmarkBar::DETACHED || |
320 bookmark_bar_state_ == BookmarkBar::DETACHED)) { | 306 bookmark_bar_state_ == BookmarkBar::DETACHED)) { |
321 // TODO(estade): animate the transition between detached and non or remove | 307 // TODO(estade): animate the transition between detached and non or remove |
322 // detached entirely. | 308 // detached entirely. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 return; | 377 return; |
392 } else { | 378 } else { |
393 // Overflow exists: don't show anything for an overflowed folder button. | 379 // Overflow exists: don't show anything for an overflowed folder button. |
394 if (button != overflow_button_ && button != other_bookmarks_button_ && | 380 if (button != overflow_button_ && button != other_bookmarks_button_ && |
395 node->parent()->GetIndexOf(node) >= first_hidden) { | 381 node->parent()->GetIndexOf(node) >= first_hidden) { |
396 return; | 382 return; |
397 } | 383 } |
398 } | 384 } |
399 | 385 |
400 current_menu_.reset( | 386 current_menu_.reset( |
401 new BookmarkMenuController(browser_, profile_, page_navigator_, | 387 new BookmarkMenuController(browser_, browser_->profile(), page_navigator_, |
402 GTK_WINDOW(gtk_widget_get_toplevel(button)), | 388 GTK_WINDOW(gtk_widget_get_toplevel(button)), |
403 node, | 389 node, |
404 button == overflow_button_ ? | 390 button == overflow_button_ ? |
405 first_hidden : 0)); | 391 first_hidden : 0)); |
406 menu_bar_helper_.MenuStartedShowing(button, current_menu_->widget()); | 392 menu_bar_helper_.MenuStartedShowing(button, current_menu_->widget()); |
407 GdkEvent* event = gtk_get_current_event(); | 393 GdkEvent* event = gtk_get_current_event(); |
408 current_menu_->Popup(button, event->button.button, event->button.time); | 394 current_menu_->Popup(button, event->button.button, event->button.time); |
409 gdk_event_free(event); | 395 gdk_event_free(event); |
410 } | 396 } |
411 | 397 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 if (slide_animation_.IsShowing() && | 485 if (slide_animation_.IsShowing() && |
500 animate_type == BookmarkBar::ANIMATE_STATE_CHANGE) { | 486 animate_type == BookmarkBar::ANIMATE_STATE_CHANGE) { |
501 slide_animation_.Hide(); | 487 slide_animation_.Hide(); |
502 } else { | 488 } else { |
503 gtk_widget_hide(bookmark_hbox_); | 489 gtk_widget_hide(bookmark_hbox_); |
504 slide_animation_.Reset(0); | 490 slide_animation_.Reset(0); |
505 AnimationProgressed(&slide_animation_); | 491 AnimationProgressed(&slide_animation_); |
506 } | 492 } |
507 } | 493 } |
508 | 494 |
509 void BookmarkBarGtk::CreateAllBookmarkButtons() { | |
510 const BookmarkNode* bar = model_->bookmark_bar_node(); | |
511 DCHECK(bar && model_->other_node()); | |
512 | |
513 // Create a button for each of the children on the bookmark bar. | |
514 for (int i = 0; i < bar->child_count(); ++i) { | |
515 const BookmarkNode* node = bar->GetChild(i); | |
516 GtkToolItem* item = CreateBookmarkToolItem(node); | |
517 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1); | |
518 if (node->is_folder()) | |
519 menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item))); | |
520 } | |
521 | |
522 bookmark_utils::ConfigureButtonForNode(model_->other_node(), | |
523 model_, other_bookmarks_button_, theme_service_); | |
524 | |
525 SetInstructionState(); | |
526 SetChevronState(); | |
527 } | |
528 | |
529 void BookmarkBarGtk::SetInstructionState() { | 495 void BookmarkBarGtk::SetInstructionState() { |
530 if (model_) | 496 if (model_) |
531 show_instructions_ = model_->bookmark_bar_node()->empty(); | 497 show_instructions_ = model_->bookmark_bar_node()->empty(); |
532 | 498 |
533 gtk_widget_set_visible(bookmark_toolbar_.get(), !show_instructions_); | 499 gtk_widget_set_visible(bookmark_toolbar_.get(), !show_instructions_); |
534 gtk_widget_set_visible(instructions_, show_instructions_); | 500 gtk_widget_set_visible(instructions_, show_instructions_); |
535 } | 501 } |
536 | 502 |
537 void BookmarkBarGtk::SetChevronState() { | 503 void BookmarkBarGtk::SetChevronState() { |
538 if (!gtk_widget_get_visible(bookmark_hbox_)) | 504 if (!gtk_widget_get_visible(bookmark_hbox_)) |
(...skipping 17 matching lines...) Expand all Loading... |
556 | 522 |
557 void BookmarkBarGtk::UpdateOtherBookmarksVisibility() { | 523 void BookmarkBarGtk::UpdateOtherBookmarksVisibility() { |
558 bool has_other_children = !model_->other_node()->empty(); | 524 bool has_other_children = !model_->other_node()->empty(); |
559 if (has_other_children == gtk_widget_get_visible(other_bookmarks_button_)) | 525 if (has_other_children == gtk_widget_get_visible(other_bookmarks_button_)) |
560 return; | 526 return; |
561 | 527 |
562 gtk_widget_set_visible(other_bookmarks_button_, has_other_children); | 528 gtk_widget_set_visible(other_bookmarks_button_, has_other_children); |
563 gtk_widget_set_visible(other_bookmarks_separator_, has_other_children); | 529 gtk_widget_set_visible(other_bookmarks_separator_, has_other_children); |
564 } | 530 } |
565 | 531 |
566 void BookmarkBarGtk::RemoveAllBookmarkButtons() { | 532 void BookmarkBarGtk::RemoveAllButtons() { |
567 gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); | 533 gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); |
568 menu_bar_helper_.Clear(); | 534 menu_bar_helper_.Clear(); |
| 535 } |
| 536 |
| 537 void BookmarkBarGtk::AddCoreButtons() { |
569 menu_bar_helper_.Add(other_bookmarks_button_); | 538 menu_bar_helper_.Add(other_bookmarks_button_); |
570 menu_bar_helper_.Add(overflow_button_); | 539 menu_bar_helper_.Add(overflow_button_); |
571 } | 540 } |
572 | 541 |
| 542 void BookmarkBarGtk::ResetButtons() { |
| 543 RemoveAllButtons(); |
| 544 AddCoreButtons(); |
| 545 |
| 546 const BookmarkNode* bar = model_->bookmark_bar_node(); |
| 547 DCHECK(bar && model_->other_node()); |
| 548 |
| 549 // Create a button for each of the children on the bookmark bar. |
| 550 for (int i = 0; i < bar->child_count(); ++i) { |
| 551 const BookmarkNode* node = bar->GetChild(i); |
| 552 GtkToolItem* item = CreateBookmarkToolItem(node); |
| 553 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1); |
| 554 if (node->is_folder()) |
| 555 menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item))); |
| 556 } |
| 557 |
| 558 bookmark_utils::ConfigureButtonForNode(model_->other_node(), |
| 559 model_, other_bookmarks_button_, theme_service_); |
| 560 |
| 561 SetInstructionState(); |
| 562 SetChevronState(); |
| 563 } |
| 564 |
573 int BookmarkBarGtk::GetBookmarkButtonCount() { | 565 int BookmarkBarGtk::GetBookmarkButtonCount() { |
574 GList* children = gtk_container_get_children( | 566 GList* children = gtk_container_get_children( |
575 GTK_CONTAINER(bookmark_toolbar_.get())); | 567 GTK_CONTAINER(bookmark_toolbar_.get())); |
576 int count = g_list_length(children); | 568 int count = g_list_length(children); |
577 g_list_free(children); | 569 g_list_free(children); |
578 return count; | 570 return count; |
579 } | 571 } |
580 | 572 |
581 void BookmarkBarGtk::SetOverflowButtonAppearance() { | 573 void BookmarkBarGtk::SetOverflowButtonAppearance() { |
582 GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(overflow_button_)); | 574 GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(overflow_button_)); |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 NULL, 0); | 838 NULL, 0); |
847 } | 839 } |
848 | 840 |
849 void BookmarkBarGtk::Loaded(BookmarkModel* model, bool ids_reassigned) { | 841 void BookmarkBarGtk::Loaded(BookmarkModel* model, bool ids_reassigned) { |
850 // If |instructions_| has been nulled, we are in the middle of browser | 842 // If |instructions_| has been nulled, we are in the middle of browser |
851 // shutdown. Do nothing. | 843 // shutdown. Do nothing. |
852 if (!instructions_) | 844 if (!instructions_) |
853 return; | 845 return; |
854 | 846 |
855 UpdateOtherBookmarksVisibility(); | 847 UpdateOtherBookmarksVisibility(); |
856 RemoveAllBookmarkButtons(); | 848 ResetButtons(); |
857 CreateAllBookmarkButtons(); | |
858 } | 849 } |
859 | 850 |
860 void BookmarkBarGtk::BookmarkModelBeingDeleted(BookmarkModel* model) { | 851 void BookmarkBarGtk::BookmarkModelBeingDeleted(BookmarkModel* model) { |
861 // The bookmark model should never be deleted before us. This code exists | 852 // The bookmark model should never be deleted before us. This code exists |
862 // to check for regressions in shutdown code and not crash. | 853 // to check for regressions in shutdown code and not crash. |
863 if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers()) | 854 if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers()) |
864 NOTREACHED(); | 855 NOTREACHED(); |
865 | 856 |
866 // Do minimal cleanup, presumably we'll be deleted shortly. | 857 // Do minimal cleanup, presumably we'll be deleted shortly. |
867 model_->RemoveObserver(this); | 858 model_->RemoveObserver(this); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 void BookmarkBarGtk::BookmarkNodeFaviconChanged(BookmarkModel* model, | 933 void BookmarkBarGtk::BookmarkNodeFaviconChanged(BookmarkModel* model, |
943 const BookmarkNode* node) { | 934 const BookmarkNode* node) { |
944 BookmarkNodeChanged(model, node); | 935 BookmarkNodeChanged(model, node); |
945 } | 936 } |
946 | 937 |
947 void BookmarkBarGtk::BookmarkNodeChildrenReordered(BookmarkModel* model, | 938 void BookmarkBarGtk::BookmarkNodeChildrenReordered(BookmarkModel* model, |
948 const BookmarkNode* node) { | 939 const BookmarkNode* node) { |
949 if (node != model_->bookmark_bar_node()) | 940 if (node != model_->bookmark_bar_node()) |
950 return; // We only care about reordering of the bookmark bar node. | 941 return; // We only care about reordering of the bookmark bar node. |
951 | 942 |
952 // Purge and rebuild the bar. | 943 ResetButtons(); |
953 RemoveAllBookmarkButtons(); | |
954 CreateAllBookmarkButtons(); | |
955 } | 944 } |
956 | 945 |
957 void BookmarkBarGtk::Observe(int type, | 946 void BookmarkBarGtk::Observe(int type, |
958 const NotificationSource& source, | 947 const NotificationSource& source, |
959 const NotificationDetails& details) { | 948 const NotificationDetails& details) { |
960 if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { | 949 if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { |
961 if (model_ && model_->IsLoaded()) { | 950 if (model_ && model_->IsLoaded()) { |
962 // Regenerate the bookmark bar with all new objects with their theme | 951 // Regenerate the bookmark bar with all new objects with their theme |
963 // properties set correctly for the new theme. | 952 // properties set correctly for the new theme. |
964 RemoveAllBookmarkButtons(); | 953 ResetButtons(); |
965 CreateAllBookmarkButtons(); | |
966 } | 954 } |
967 | 955 |
968 // Resize the bookmark bar since the target height may have changed. | 956 // Resize the bookmark bar since the target height may have changed. |
969 AnimationProgressed(&slide_animation_); | 957 AnimationProgressed(&slide_animation_); |
970 | 958 |
971 UpdateEventBoxPaintability(); | 959 UpdateEventBoxPaintability(); |
972 | 960 |
973 GdkColor paint_box_color = | 961 GdkColor paint_box_color = |
974 theme_service_->GetGdkColor(ThemeService::COLOR_TOOLBAR); | 962 theme_service_->GetGdkColor(ThemeService::COLOR_TOOLBAR); |
975 gtk_widget_modify_bg(paint_box_, GTK_STATE_NORMAL, &paint_box_color); | 963 gtk_widget_modify_bg(paint_box_, GTK_STATE_NORMAL, &paint_box_color); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 nodes.push_back(node); | 1100 nodes.push_back(node); |
1113 parent = node->parent(); | 1101 parent = node->parent(); |
1114 } else { | 1102 } else { |
1115 parent = model_->bookmark_bar_node(); | 1103 parent = model_->bookmark_bar_node(); |
1116 nodes.push_back(parent); | 1104 nodes.push_back(parent); |
1117 } | 1105 } |
1118 | 1106 |
1119 GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(sender)); | 1107 GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(sender)); |
1120 current_context_menu_controller_.reset( | 1108 current_context_menu_controller_.reset( |
1121 new BookmarkContextMenuController( | 1109 new BookmarkContextMenuController( |
1122 window, this, profile_, page_navigator_, parent, nodes)); | 1110 window, this, browser_->profile(), page_navigator_, parent, nodes)); |
1123 current_context_menu_.reset( | 1111 current_context_menu_.reset( |
1124 new MenuGtk(NULL, current_context_menu_controller_->menu_model())); | 1112 new MenuGtk(NULL, current_context_menu_controller_->menu_model())); |
1125 current_context_menu_->PopupAsContext( | 1113 current_context_menu_->PopupAsContext( |
1126 gfx::Point(event->x_root, event->y_root), | 1114 gfx::Point(event->x_root, event->y_root), |
1127 event->time); | 1115 event->time); |
1128 } | 1116 } |
1129 | 1117 |
1130 gboolean BookmarkBarGtk::OnButtonPressed(GtkWidget* sender, | 1118 gboolean BookmarkBarGtk::OnButtonPressed(GtkWidget* sender, |
1131 GdkEventButton* event) { | 1119 GdkEventButton* event) { |
1132 last_pressed_coordinates_ = gfx::Point(event->x, event->y); | 1120 last_pressed_coordinates_ = gfx::Point(event->x, event->y); |
(...skipping 17 matching lines...) Expand all Loading... |
1150 | 1138 |
1151 return FALSE; | 1139 return FALSE; |
1152 } | 1140 } |
1153 | 1141 |
1154 void BookmarkBarGtk::OnClicked(GtkWidget* sender) { | 1142 void BookmarkBarGtk::OnClicked(GtkWidget* sender) { |
1155 const BookmarkNode* node = GetNodeForToolButton(sender); | 1143 const BookmarkNode* node = GetNodeForToolButton(sender); |
1156 DCHECK(node); | 1144 DCHECK(node); |
1157 DCHECK(node->is_url()); | 1145 DCHECK(node->is_url()); |
1158 DCHECK(page_navigator_); | 1146 DCHECK(page_navigator_); |
1159 | 1147 |
1160 RecordAppLaunch(profile_, node->url()); | 1148 Profile* profile = browser_->profile(); |
1161 bookmark_utils::OpenAll(window_->GetNativeHandle(), | 1149 RecordAppLaunch(profile, node->url()); |
1162 profile_, page_navigator_, node, | 1150 bookmark_utils::OpenAll(window_->GetNativeHandle(), profile, page_navigator_, |
1163 gtk_util::DispositionForCurrentButtonPressEvent()); | 1151 node, gtk_util::DispositionForCurrentButtonPressEvent()); |
1164 | 1152 |
1165 UserMetrics::RecordAction(UserMetricsAction("ClickedBookmarkBarURLButton")); | 1153 UserMetrics::RecordAction(UserMetricsAction("ClickedBookmarkBarURLButton")); |
1166 } | 1154 } |
1167 | 1155 |
1168 void BookmarkBarGtk::OnButtonDragBegin(GtkWidget* button, | 1156 void BookmarkBarGtk::OnButtonDragBegin(GtkWidget* button, |
1169 GdkDragContext* drag_context) { | 1157 GdkDragContext* drag_context) { |
1170 // The parent tool item might be removed during the drag. Ref it so |button| | 1158 // The parent tool item might be removed during the drag. Ref it so |button| |
1171 // won't get destroyed. | 1159 // won't get destroyed. |
1172 g_object_ref(button->parent); | 1160 g_object_ref(button->parent); |
1173 | 1161 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1213 DCHECK(dragged_node_); | 1201 DCHECK(dragged_node_); |
1214 dragged_node_ = NULL; | 1202 dragged_node_ = NULL; |
1215 | 1203 |
1216 DCHECK(drag_icon_); | 1204 DCHECK(drag_icon_); |
1217 gtk_widget_destroy(drag_icon_); | 1205 gtk_widget_destroy(drag_icon_); |
1218 drag_icon_ = NULL; | 1206 drag_icon_ = NULL; |
1219 | 1207 |
1220 g_object_unref(button->parent); | 1208 g_object_unref(button->parent); |
1221 } | 1209 } |
1222 | 1210 |
1223 void BookmarkBarGtk::OnButtonDragGet(GtkWidget* widget, GdkDragContext* context, | 1211 void BookmarkBarGtk::OnButtonDragGet(GtkWidget* widget, |
| 1212 GdkDragContext* context, |
1224 GtkSelectionData* selection_data, | 1213 GtkSelectionData* selection_data, |
1225 guint target_type, guint time) { | 1214 guint target_type, |
| 1215 guint time) { |
1226 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); | 1216 const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(widget); |
1227 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, | 1217 bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, |
1228 profile_); | 1218 browser_->profile()); |
1229 } | 1219 } |
1230 | 1220 |
1231 void BookmarkBarGtk::OnFolderClicked(GtkWidget* sender) { | 1221 void BookmarkBarGtk::OnFolderClicked(GtkWidget* sender) { |
1232 // Stop its throbbing, if any. | 1222 // Stop its throbbing, if any. |
1233 HoverControllerGtk* hover_controller = | 1223 HoverControllerGtk* hover_controller = |
1234 HoverControllerGtk::GetHoverControllerGtk(sender); | 1224 HoverControllerGtk::GetHoverControllerGtk(sender); |
1235 if (hover_controller) | 1225 if (hover_controller) |
1236 hover_controller->StartThrobbing(0); | 1226 hover_controller->StartThrobbing(0); |
1237 | 1227 |
1238 GdkEvent* event = gtk_get_current_event(); | 1228 GdkEvent* event = gtk_get_current_event(); |
1239 if (event->button.button == 1) { | 1229 if (event->button.button == 1) { |
1240 PopupForButton(sender); | 1230 PopupForButton(sender); |
1241 } else if (event->button.button == 2) { | 1231 } else if (event->button.button == 2) { |
1242 const BookmarkNode* node = GetNodeForToolButton(sender); | 1232 const BookmarkNode* node = GetNodeForToolButton(sender); |
1243 bookmark_utils::OpenAll(window_->GetNativeHandle(), | 1233 bookmark_utils::OpenAll(window_->GetNativeHandle(), browser_->profile(), |
1244 profile_, page_navigator_, | 1234 page_navigator_, node, NEW_BACKGROUND_TAB); |
1245 node, NEW_BACKGROUND_TAB); | |
1246 } | 1235 } |
1247 } | 1236 } |
1248 | 1237 |
1249 gboolean BookmarkBarGtk::OnToolbarDragMotion(GtkWidget* toolbar, | 1238 gboolean BookmarkBarGtk::OnToolbarDragMotion(GtkWidget* toolbar, |
1250 GdkDragContext* context, | 1239 GdkDragContext* context, |
1251 gint x, | 1240 gint x, |
1252 gint y, | 1241 gint y, |
1253 guint time) { | 1242 guint time) { |
1254 gint index = gtk_toolbar_get_drop_index(GTK_TOOLBAR(toolbar), x, y); | 1243 gint index = gtk_toolbar_get_drop_index(GTK_TOOLBAR(toolbar), x, y); |
1255 return ItemDraggedOverToolbar(context, index, time); | 1244 return ItemDraggedOverToolbar(context, index, time); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 dest_node = GetNodeForToolButton(widget); | 1286 dest_node = GetNodeForToolButton(widget); |
1298 index = dest_node->child_count(); | 1287 index = dest_node->child_count(); |
1299 } | 1288 } |
1300 } | 1289 } |
1301 | 1290 |
1302 switch (target_type) { | 1291 switch (target_type) { |
1303 case ui::CHROME_BOOKMARK_ITEM: { | 1292 case ui::CHROME_BOOKMARK_ITEM: { |
1304 std::vector<const BookmarkNode*> nodes = | 1293 std::vector<const BookmarkNode*> nodes = |
1305 bookmark_utils::GetNodesFromSelection(context, selection_data, | 1294 bookmark_utils::GetNodesFromSelection(context, selection_data, |
1306 target_type, | 1295 target_type, |
1307 profile_, | 1296 browser_->profile(), |
1308 &delete_selection_data, | 1297 &delete_selection_data, |
1309 &dnd_success); | 1298 &dnd_success); |
1310 DCHECK(!nodes.empty()); | 1299 DCHECK(!nodes.empty()); |
1311 for (std::vector<const BookmarkNode*>::iterator it = nodes.begin(); | 1300 for (std::vector<const BookmarkNode*>::iterator it = nodes.begin(); |
1312 it != nodes.end(); ++it) { | 1301 it != nodes.end(); ++it) { |
1313 model_->Move(*it, dest_node, index); | 1302 model_->Move(*it, dest_node, index); |
1314 index = dest_node->GetIndexOf(*it) + 1; | 1303 index = dest_node->GetIndexOf(*it) + 1; |
1315 } | 1304 } |
1316 break; | 1305 break; |
1317 } | 1306 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1471 void BookmarkBarGtk::OnEditBookmarksEnabledChanged() { | 1460 void BookmarkBarGtk::OnEditBookmarksEnabledChanged() { |
1472 GtkDestDefaults dest_defaults = | 1461 GtkDestDefaults dest_defaults = |
1473 *edit_bookmarks_enabled_ ? GTK_DEST_DEFAULT_ALL : | 1462 *edit_bookmarks_enabled_ ? GTK_DEST_DEFAULT_ALL : |
1474 GTK_DEST_DEFAULT_DROP; | 1463 GTK_DEST_DEFAULT_DROP; |
1475 gtk_drag_dest_set(overflow_button_, dest_defaults, NULL, 0, kDragAction); | 1464 gtk_drag_dest_set(overflow_button_, dest_defaults, NULL, 0, kDragAction); |
1476 gtk_drag_dest_set(other_bookmarks_button_, dest_defaults, | 1465 gtk_drag_dest_set(other_bookmarks_button_, dest_defaults, |
1477 NULL, 0, kDragAction); | 1466 NULL, 0, kDragAction); |
1478 ui::SetDestTargetList(overflow_button_, kDestTargetList); | 1467 ui::SetDestTargetList(overflow_button_, kDestTargetList); |
1479 ui::SetDestTargetList(other_bookmarks_button_, kDestTargetList); | 1468 ui::SetDestTargetList(other_bookmarks_button_, kDestTargetList); |
1480 } | 1469 } |
OLD | NEW |