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 |