Chromium Code Reviews| 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/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 12 #include "chrome/browser/bookmarks/bookmark_model.h" | 12 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 13 #include "chrome/browser/bookmarks/bookmark_node_data.h" | 13 #include "chrome/browser/bookmarks/bookmark_node_data.h" |
| 14 #include "chrome/browser/bookmarks/bookmark_utils.h" | 14 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 15 #include "chrome/browser/browser_shutdown.h" | 15 #include "chrome/browser/browser_shutdown.h" |
| 16 #include "chrome/browser/extensions/extension_service.h" | 16 #include "chrome/browser/extensions/extension_service.h" |
| 17 #include "chrome/browser/ntp_background_util.h" | 17 #include "chrome/browser/ntp_background_util.h" |
| 18 #include "chrome/browser/prefs/pref_service.h" | 18 #include "chrome/browser/prefs/pref_service.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/sync/sync_ui_util.h" | |
| 21 #include "chrome/browser/ui/browser.h" | 20 #include "chrome/browser/ui/browser.h" |
| 22 #include "chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.h" | 21 #include "chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.h" |
| 23 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h" | 22 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h" |
| 24 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | 23 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
| 25 #include "chrome/browser/ui/gtk/cairo_cached_surface.h" | 24 #include "chrome/browser/ui/gtk/cairo_cached_surface.h" |
| 26 #include "chrome/browser/ui/gtk/custom_button.h" | 25 #include "chrome/browser/ui/gtk/custom_button.h" |
| 27 #include "chrome/browser/ui/gtk/gtk_chrome_button.h" | 26 #include "chrome/browser/ui/gtk/gtk_chrome_button.h" |
| 28 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | 27 #include "chrome/browser/ui/gtk/gtk_theme_service.h" |
| 29 #include "chrome/browser/ui/gtk/gtk_util.h" | 28 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 30 #include "chrome/browser/ui/gtk/hover_controller_gtk.h" | 29 #include "chrome/browser/ui/gtk/hover_controller_gtk.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 | 123 |
| 125 BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window, | 124 BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window, |
| 126 Browser* browser, | 125 Browser* browser, |
| 127 TabstripOriginProvider* tabstrip_origin_provider) | 126 TabstripOriginProvider* tabstrip_origin_provider) |
| 128 : page_navigator_(NULL), | 127 : page_navigator_(NULL), |
| 129 browser_(browser), | 128 browser_(browser), |
| 130 window_(window), | 129 window_(window), |
| 131 tabstrip_origin_provider_(tabstrip_origin_provider), | 130 tabstrip_origin_provider_(tabstrip_origin_provider), |
| 132 model_(NULL), | 131 model_(NULL), |
| 133 instructions_(NULL), | 132 instructions_(NULL), |
| 134 sync_service_(NULL), | |
| 135 dragged_node_(NULL), | 133 dragged_node_(NULL), |
| 136 drag_icon_(NULL), | 134 drag_icon_(NULL), |
| 137 toolbar_drop_item_(NULL), | 135 toolbar_drop_item_(NULL), |
| 138 theme_service_(GtkThemeService::GetFrom(browser->profile())), | 136 theme_service_(GtkThemeService::GetFrom(browser->profile())), |
| 139 show_instructions_(true), | 137 show_instructions_(true), |
| 140 menu_bar_helper_(this), | 138 menu_bar_helper_(this), |
| 141 slide_animation_(this), | 139 slide_animation_(this), |
| 142 last_allocation_width_(-1), | 140 last_allocation_width_(-1), |
| 143 throbbing_widget_(NULL), | 141 throbbing_widget_(NULL), |
| 144 weak_factory_(this), | 142 weak_factory_(this), |
| 145 bookmark_bar_state_(BookmarkBar::DETACHED), | 143 bookmark_bar_state_(BookmarkBar::DETACHED), |
| 146 max_height_(0) { | 144 max_height_(0) { |
| 147 Profile* profile = browser->profile(); | |
| 148 if (profile->GetProfileSyncService()) { | |
| 149 // Obtain a pointer to the profile sync service and add our instance as an | |
| 150 // observer. | |
| 151 sync_service_ = profile->GetProfileSyncService(); | |
| 152 sync_service_->AddObserver(this); | |
| 153 } | |
| 154 | |
| 155 Init(); | 145 Init(); |
| 156 // Force an update by simulating being in the wrong state. | 146 // Force an update by simulating being in the wrong state. |
| 157 // BrowserWindowGtk sets our true state after we're created. | 147 // BrowserWindowGtk sets our true state after we're created. |
| 158 SetBookmarkBarState(BookmarkBar::SHOW, | 148 SetBookmarkBarState(BookmarkBar::SHOW, |
| 159 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); | 149 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); |
| 160 | 150 |
| 161 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 151 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
| 162 content::Source<ThemeService>(theme_service_)); | 152 content::Source<ThemeService>(theme_service_)); |
| 163 | 153 |
| 164 edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled, | 154 edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled, |
| 165 profile->GetPrefs(), this); | 155 browser->profile()->GetPrefs(), this); |
|
Peter Kasting
2011/10/26 18:12:01
Nit: Personal preference, but I'd use |browser_| i
| |
| 166 OnEditBookmarksEnabledChanged(); | 156 OnEditBookmarksEnabledChanged(); |
| 167 } | 157 } |
| 168 | 158 |
| 169 BookmarkBarGtk::~BookmarkBarGtk() { | 159 BookmarkBarGtk::~BookmarkBarGtk() { |
| 170 RemoveAllButtons(); | 160 RemoveAllButtons(); |
| 171 bookmark_toolbar_.Destroy(); | 161 bookmark_toolbar_.Destroy(); |
| 172 event_box_.Destroy(); | 162 event_box_.Destroy(); |
| 173 } | 163 } |
| 174 | 164 |
| 175 void BookmarkBarGtk::SetPageNavigator(PageNavigator* navigator) { | 165 void BookmarkBarGtk::SetPageNavigator(PageNavigator* navigator) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 gtk_alignment_set_padding(GTK_ALIGNMENT(other_padding_), | 252 gtk_alignment_set_padding(GTK_ALIGNMENT(other_padding_), |
| 263 kOtherBookmarksPaddingVertical, | 253 kOtherBookmarksPaddingVertical, |
| 264 kOtherBookmarksPaddingVertical, | 254 kOtherBookmarksPaddingVertical, |
| 265 kOtherBookmarksPaddingHorizontal, | 255 kOtherBookmarksPaddingHorizontal, |
| 266 kOtherBookmarksPaddingHorizontal); | 256 kOtherBookmarksPaddingHorizontal); |
| 267 gtk_container_add(GTK_CONTAINER(other_padding_), other_bookmarks_button_); | 257 gtk_container_add(GTK_CONTAINER(other_padding_), other_bookmarks_button_); |
| 268 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), other_padding_, | 258 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), other_padding_, |
| 269 FALSE, FALSE, 0); | 259 FALSE, FALSE, 0); |
| 270 gtk_widget_set_no_show_all(other_padding_, TRUE); | 260 gtk_widget_set_no_show_all(other_padding_, TRUE); |
| 271 | 261 |
| 272 sync_error_button_ = theme_service_->BuildChromeButton(); | |
| 273 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 274 gtk_widget_set_tooltip_text( | |
| 275 sync_error_button_, | |
| 276 l10n_util::GetStringUTF8(IDS_SYNC_BOOKMARK_BAR_ERROR_DESC).c_str()); | |
| 277 gtk_button_set_label( | |
| 278 GTK_BUTTON(sync_error_button_), | |
| 279 l10n_util::GetStringUTF8(IDS_SYNC_BOOKMARK_BAR_ERROR).c_str()); | |
| 280 gtk_button_set_image( | |
| 281 GTK_BUTTON(sync_error_button_), | |
| 282 gtk_image_new_from_pixbuf(rb.GetNativeImageNamed(IDR_WARNING))); | |
| 283 g_signal_connect(sync_error_button_, "button-press-event", | |
| 284 G_CALLBACK(OnSyncErrorButtonPressedThunk), this); | |
| 285 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), sync_error_button_, | |
| 286 FALSE, FALSE, 0); | |
| 287 | |
| 288 gtk_widget_set_size_request(event_box_.get(), -1, kBookmarkBarMinimumHeight); | 262 gtk_widget_set_size_request(event_box_.get(), -1, kBookmarkBarMinimumHeight); |
| 289 | 263 |
| 290 ViewIDUtil::SetID(other_bookmarks_button_, VIEW_ID_OTHER_BOOKMARKS); | 264 ViewIDUtil::SetID(other_bookmarks_button_, VIEW_ID_OTHER_BOOKMARKS); |
| 291 ViewIDUtil::SetID(widget(), VIEW_ID_BOOKMARK_BAR); | 265 ViewIDUtil::SetID(widget(), VIEW_ID_BOOKMARK_BAR); |
| 292 | 266 |
| 293 gtk_widget_show_all(widget()); | 267 gtk_widget_show_all(widget()); |
| 294 gtk_widget_hide(widget()); | 268 gtk_widget_hide(widget()); |
| 295 | 269 |
| 296 AddCoreButtons(); | 270 AddCoreButtons(); |
| 297 // TODO(erg): Handle extensions | 271 // TODO(erg): Handle extensions |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 462 // The event box won't stay below its children's GdkWindows unless we | 436 // The event box won't stay below its children's GdkWindows unless we |
| 463 // toggle the above-child property here. If the event box doesn't stay | 437 // toggle the above-child property here. If the event box doesn't stay |
| 464 // below its children then events will be routed to it rather than the | 438 // below its children then events will be routed to it rather than the |
| 465 // children. | 439 // children. |
| 466 gtk_event_box_set_above_child(GTK_EVENT_BOX(event_box_.get()), TRUE); | 440 gtk_event_box_set_above_child(GTK_EVENT_BOX(event_box_.get()), TRUE); |
| 467 gtk_event_box_set_above_child(GTK_EVENT_BOX(event_box_.get()), FALSE); | 441 gtk_event_box_set_above_child(GTK_EVENT_BOX(event_box_.get()), FALSE); |
| 468 } | 442 } |
| 469 } | 443 } |
| 470 } | 444 } |
| 471 | 445 |
| 472 gtk_widget_set_visible( | |
| 473 sync_error_button_, | |
| 474 sync_ui_util::ShouldShowSyncErrorButton(sync_service_)); | |
| 475 | |
| 476 // Maybe show the instructions | 446 // Maybe show the instructions |
| 477 gtk_widget_set_visible(bookmark_toolbar_.get(), !show_instructions_); | 447 gtk_widget_set_visible(bookmark_toolbar_.get(), !show_instructions_); |
| 478 gtk_widget_set_visible(instructions_, show_instructions_); | 448 gtk_widget_set_visible(instructions_, show_instructions_); |
| 479 | 449 |
| 480 SetChevronState(); | 450 SetChevronState(); |
| 481 } | 451 } |
| 482 | 452 |
| 483 void BookmarkBarGtk::Hide(BookmarkBar::State old_state, | 453 void BookmarkBarGtk::Hide(BookmarkBar::State old_state, |
| 484 BookmarkBar::AnimateChangeType animate_type) { | 454 BookmarkBar::AnimateChangeType animate_type) { |
| 485 UpdateDetachedState(old_state); | 455 UpdateDetachedState(old_state); |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1135 if (event->button == 3 && gtk_widget_get_visible(bookmark_hbox_)) { | 1105 if (event->button == 3 && gtk_widget_get_visible(bookmark_hbox_)) { |
| 1136 const BookmarkNode* node = GetNodeForToolButton(sender); | 1106 const BookmarkNode* node = GetNodeForToolButton(sender); |
| 1137 DCHECK(node); | 1107 DCHECK(node); |
| 1138 DCHECK(page_navigator_); | 1108 DCHECK(page_navigator_); |
| 1139 PopupMenuForNode(sender, node, event); | 1109 PopupMenuForNode(sender, node, event); |
| 1140 } | 1110 } |
| 1141 | 1111 |
| 1142 return FALSE; | 1112 return FALSE; |
| 1143 } | 1113 } |
| 1144 | 1114 |
| 1145 gboolean BookmarkBarGtk::OnSyncErrorButtonPressed(GtkWidget* sender, | |
| 1146 GdkEventButton* event) { | |
| 1147 if (sender == sync_error_button_) { | |
| 1148 DCHECK(sync_service_ && !sync_service_->IsManaged()); | |
| 1149 sync_service_->ShowErrorUI(); | |
| 1150 } | |
| 1151 | |
| 1152 return FALSE; | |
| 1153 } | |
| 1154 | |
| 1155 void BookmarkBarGtk::OnClicked(GtkWidget* sender) { | 1115 void BookmarkBarGtk::OnClicked(GtkWidget* sender) { |
| 1156 const BookmarkNode* node = GetNodeForToolButton(sender); | 1116 const BookmarkNode* node = GetNodeForToolButton(sender); |
| 1157 DCHECK(node); | 1117 DCHECK(node); |
| 1158 DCHECK(node->is_url()); | 1118 DCHECK(node->is_url()); |
| 1159 DCHECK(page_navigator_); | 1119 DCHECK(page_navigator_); |
| 1160 | 1120 |
| 1161 Profile* profile = browser_->profile(); | 1121 Profile* profile = browser_->profile(); |
| 1162 RecordAppLaunch(profile, node->url()); | 1122 RecordAppLaunch(profile, node->url()); |
| 1163 bookmark_utils::OpenAll(window_->GetNativeHandle(), profile, page_navigator_, | 1123 bookmark_utils::OpenAll(window_->GetNativeHandle(), profile, page_navigator_, |
| 1164 node, gtk_util::DispositionForCurrentButtonPressEvent()); | 1124 node, gtk_util::DispositionForCurrentButtonPressEvent()); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1430 NtpBackgroundUtil::PaintBackgroundDetachedMode(theme_provider, &canvas, | 1390 NtpBackgroundUtil::PaintBackgroundDetachedMode(theme_provider, &canvas, |
| 1431 area, tab_contents_size.height()); | 1391 area, tab_contents_size.height()); |
| 1432 } | 1392 } |
| 1433 | 1393 |
| 1434 return FALSE; // Propagate expose to children. | 1394 return FALSE; // Propagate expose to children. |
| 1435 } | 1395 } |
| 1436 | 1396 |
| 1437 void BookmarkBarGtk::OnEventBoxDestroy(GtkWidget* widget) { | 1397 void BookmarkBarGtk::OnEventBoxDestroy(GtkWidget* widget) { |
| 1438 if (model_) | 1398 if (model_) |
| 1439 model_->RemoveObserver(this); | 1399 model_->RemoveObserver(this); |
| 1440 | |
| 1441 if (sync_service_) | |
| 1442 sync_service_->RemoveObserver(this); | |
| 1443 } | 1400 } |
| 1444 | 1401 |
| 1445 void BookmarkBarGtk::OnParentSizeAllocate(GtkWidget* widget, | 1402 void BookmarkBarGtk::OnParentSizeAllocate(GtkWidget* widget, |
| 1446 GtkAllocation* allocation) { | 1403 GtkAllocation* allocation) { |
| 1447 // In detached mode, our layout depends on the size of the tab contents. | 1404 // In detached mode, our layout depends on the size of the tab contents. |
| 1448 // We get the size-allocate signal before the tab contents does, hence we | 1405 // We get the size-allocate signal before the tab contents does, hence we |
| 1449 // need to post a delayed task so we will paint correctly. Note that | 1406 // need to post a delayed task so we will paint correctly. Note that |
| 1450 // gtk_widget_queue_draw by itself does not work, despite that it claims to | 1407 // gtk_widget_queue_draw by itself does not work, despite that it claims to |
| 1451 // be asynchronous. | 1408 // be asynchronous. |
| 1452 if (bookmark_bar_state_ == BookmarkBar::DETACHED) { | 1409 if (bookmark_bar_state_ == BookmarkBar::DETACHED) { |
| 1453 MessageLoop::current()->PostTask( | 1410 MessageLoop::current()->PostTask( |
| 1454 FROM_HERE, | 1411 FROM_HERE, |
| 1455 base::Bind(&BookmarkBarGtk::PaintEventBox, weak_factory_.GetWeakPtr())); | 1412 base::Bind(&BookmarkBarGtk::PaintEventBox, weak_factory_.GetWeakPtr())); |
| 1456 } | 1413 } |
| 1457 } | 1414 } |
| 1458 | 1415 |
| 1459 void BookmarkBarGtk::OnThrobbingWidgetDestroy(GtkWidget* widget) { | 1416 void BookmarkBarGtk::OnThrobbingWidgetDestroy(GtkWidget* widget) { |
| 1460 SetThrobbingWidget(NULL); | 1417 SetThrobbingWidget(NULL); |
| 1461 } | 1418 } |
| 1462 | 1419 |
| 1463 void BookmarkBarGtk::OnStateChanged() { | |
| 1464 gtk_widget_set_visible( | |
| 1465 sync_error_button_, | |
| 1466 sync_ui_util::ShouldShowSyncErrorButton(sync_service_)); | |
| 1467 } | |
| 1468 | |
| 1469 void BookmarkBarGtk::ShowImportDialog() { | 1420 void BookmarkBarGtk::ShowImportDialog() { |
| 1470 browser_->OpenImportSettingsDialog(); | 1421 browser_->OpenImportSettingsDialog(); |
| 1471 } | 1422 } |
| 1472 | 1423 |
| 1473 void BookmarkBarGtk::OnEditBookmarksEnabledChanged() { | 1424 void BookmarkBarGtk::OnEditBookmarksEnabledChanged() { |
| 1474 GtkDestDefaults dest_defaults = | 1425 GtkDestDefaults dest_defaults = |
| 1475 *edit_bookmarks_enabled_ ? GTK_DEST_DEFAULT_ALL : | 1426 *edit_bookmarks_enabled_ ? GTK_DEST_DEFAULT_ALL : |
| 1476 GTK_DEST_DEFAULT_DROP; | 1427 GTK_DEST_DEFAULT_DROP; |
| 1477 gtk_drag_dest_set(overflow_button_, dest_defaults, NULL, 0, kDragAction); | 1428 gtk_drag_dest_set(overflow_button_, dest_defaults, NULL, 0, kDragAction); |
| 1478 gtk_drag_dest_set(other_bookmarks_button_, dest_defaults, | 1429 gtk_drag_dest_set(other_bookmarks_button_, dest_defaults, |
| 1479 NULL, 0, kDragAction); | 1430 NULL, 0, kDragAction); |
| 1480 ui::SetDestTargetList(overflow_button_, kDestTargetList); | 1431 ui::SetDestTargetList(overflow_button_, kDestTargetList); |
| 1481 ui::SetDestTargetList(other_bookmarks_button_, kDestTargetList); | 1432 ui::SetDestTargetList(other_bookmarks_button_, kDestTargetList); |
| 1482 } | 1433 } |
| OLD | NEW |