Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/gtk/bookmark_bar_gtk.h" | 5 #include "chrome/browser/gtk/bookmark_bar_gtk.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "app/gfx/gtk_util.h" | 9 #include "app/gfx/gtk_util.h" |
| 10 #include "app/gfx/canvas_paint.h" | 10 #include "app/gfx/canvas_paint.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 #if defined(BROWSER_SYNC) | 121 #if defined(BROWSER_SYNC) |
| 122 sync_error_button_(NULL), | 122 sync_error_button_(NULL), |
| 123 sync_service_(NULL), | 123 sync_service_(NULL), |
| 124 #endif | 124 #endif |
| 125 dragged_node_(NULL), | 125 dragged_node_(NULL), |
| 126 toolbar_drop_item_(NULL), | 126 toolbar_drop_item_(NULL), |
| 127 theme_provider_(GtkThemeProvider::GetFrom(profile)), | 127 theme_provider_(GtkThemeProvider::GetFrom(profile)), |
| 128 show_instructions_(true), | 128 show_instructions_(true), |
| 129 menu_bar_helper_(this), | 129 menu_bar_helper_(this), |
| 130 floating_(false), | 130 floating_(false), |
| 131 last_allocation_width_(-1) { | 131 last_allocation_width_(-1), |
| 132 event_box_paint_factory_(this) { | |
| 132 #if defined(BROWSER_SYNC) | 133 #if defined(BROWSER_SYNC) |
| 133 if (profile->GetProfileSyncService()) { | 134 if (profile->GetProfileSyncService()) { |
| 134 // Obtain a pointer to the profile sync service and add our instance as an | 135 // Obtain a pointer to the profile sync service and add our instance as an |
| 135 // observer. | 136 // observer. |
| 136 sync_service_ = profile->GetProfileSyncService(); | 137 sync_service_ = profile->GetProfileSyncService(); |
| 137 sync_service_->AddObserver(this); | 138 sync_service_->AddObserver(this); |
| 138 } | 139 } |
| 139 #endif | 140 #endif |
| 140 | 141 |
| 141 Init(profile); | 142 Init(profile); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), instructions_, | 221 gtk_box_pack_start(GTK_BOX(bookmark_hbox_), instructions_, |
| 221 FALSE, FALSE, 0); | 222 FALSE, FALSE, 0); |
| 222 | 223 |
| 223 gtk_drag_dest_set(instructions_, | 224 gtk_drag_dest_set(instructions_, |
| 224 GtkDestDefaults(GTK_DEST_DEFAULT_DROP | GTK_DEST_DEFAULT_MOTION), | 225 GtkDestDefaults(GTK_DEST_DEFAULT_DROP | GTK_DEST_DEFAULT_MOTION), |
| 225 NULL, 0, kDragAction); | 226 NULL, 0, kDragAction); |
| 226 GtkDndUtil::SetDestTargetList(instructions_, kDestTargetList); | 227 GtkDndUtil::SetDestTargetList(instructions_, kDestTargetList); |
| 227 g_signal_connect(instructions_, "drag-data-received", | 228 g_signal_connect(instructions_, "drag-data-received", |
| 228 G_CALLBACK(&OnDragReceived), this); | 229 G_CALLBACK(&OnDragReceived), this); |
| 229 | 230 |
| 230 g_signal_connect(G_OBJECT(event_box_.get()), "expose-event", | 231 g_signal_connect(event_box_.get(), "expose-event", |
| 231 G_CALLBACK(&OnEventBoxExpose), this); | 232 G_CALLBACK(&OnEventBoxExpose), this); |
| 232 UpdateEventBoxPaintability(); | 233 UpdateEventBoxPaintability(); |
| 233 | 234 |
| 234 bookmark_toolbar_.Own(gtk_toolbar_new()); | 235 bookmark_toolbar_.Own(gtk_toolbar_new()); |
| 235 SetToolBarStyle(); | 236 SetToolBarStyle(); |
| 236 gtk_widget_set_name(bookmark_toolbar_.get(), "chrome-bookmark-toolbar"); | 237 gtk_widget_set_name(bookmark_toolbar_.get(), "chrome-bookmark-toolbar"); |
| 237 gtk_widget_set_app_paintable(bookmark_toolbar_.get(), TRUE); | 238 gtk_widget_set_app_paintable(bookmark_toolbar_.get(), TRUE); |
| 238 g_signal_connect(bookmark_toolbar_.get(), "expose-event", | 239 g_signal_connect(bookmark_toolbar_.get(), "expose-event", |
| 239 G_CALLBACK(&OnToolbarExpose), this); | 240 G_CALLBACK(&OnToolbarExpose), this); |
| 240 g_signal_connect(bookmark_toolbar_.get(), "size-allocate", | 241 g_signal_connect(bookmark_toolbar_.get(), "size-allocate", |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 608 gtk_container_set_border_width(GTK_CONTAINER(bookmark_hbox_), kNTPPadding); | 609 gtk_container_set_border_width(GTK_CONTAINER(bookmark_hbox_), kNTPPadding); |
| 609 } else { | 610 } else { |
| 610 gtk_util::StopActingAsRoundedWindow(paint_box_); | 611 gtk_util::StopActingAsRoundedWindow(paint_box_); |
| 611 gtk_event_box_set_visible_window(GTK_EVENT_BOX(paint_box_), FALSE); | 612 gtk_event_box_set_visible_window(GTK_EVENT_BOX(paint_box_), FALSE); |
| 612 gtk_alignment_set_padding(GTK_ALIGNMENT(ntp_padding_box_), 0, 0, 0, 0); | 613 gtk_alignment_set_padding(GTK_ALIGNMENT(ntp_padding_box_), 0, 0, 0, 0); |
| 613 gtk_container_set_border_width(GTK_CONTAINER(bookmark_hbox_), 0); | 614 gtk_container_set_border_width(GTK_CONTAINER(bookmark_hbox_), 0); |
| 614 } | 615 } |
| 615 | 616 |
| 616 UpdateEventBoxPaintability(); | 617 UpdateEventBoxPaintability(); |
| 617 // |window_| can be NULL during testing. | 618 // |window_| can be NULL during testing. |
| 618 if (window_) | 619 if (window_) { |
| 619 window_->BookmarkBarIsFloating(floating_); | 620 window_->BookmarkBarIsFloating(floating_); |
| 621 // Listen for parent size allocations. | |
| 622 if (floating_ && widget()->parent) { | |
| 623 // Only connect once. | |
| 624 if (g_signal_handler_find(widget()->parent, G_SIGNAL_MATCH_FUNC, | |
| 625 0, NULL, NULL, reinterpret_cast<gpointer>(OnParentSizeAllocate), | |
| 626 NULL) == 0) { | |
| 627 g_signal_connect(widget()->parent, "size-allocate", | |
|
tony
2009/10/26 23:55:30
What happens if you drag a tab from one window to
Evan Stade
2009/10/27 00:11:12
the bookmark bar and the tab contents container sh
tony
2009/10/27 00:34:19
I see, it's the container. The g_signal_handler_f
Evan Stade
2009/10/27 00:37:48
it's because we don't want to connect mroe than on
| |
| 628 G_CALLBACK(OnParentSizeAllocate), this); | |
| 629 } | |
| 630 } | |
| 631 } | |
| 620 } | 632 } |
| 621 | 633 |
| 622 void BookmarkBarGtk::UpdateEventBoxPaintability() { | 634 void BookmarkBarGtk::UpdateEventBoxPaintability() { |
| 623 gtk_widget_set_app_paintable(event_box_.get(), | 635 gtk_widget_set_app_paintable(event_box_.get(), |
| 624 !theme_provider_->UseGtkTheme() || floating_); | 636 !theme_provider_->UseGtkTheme() || floating_); |
| 625 // When using the GTK+ theme, we need to have the event box be visible so | 637 // When using the GTK+ theme, we need to have the event box be visible so |
| 626 // buttons don't get a halo color from the background. When using Chromium | 638 // buttons don't get a halo color from the background. When using Chromium |
| 627 // themes, we want to let the background show through the toolbar. | 639 // themes, we want to let the background show through the toolbar. |
| 628 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), | 640 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), |
| 629 theme_provider_->UseGtkTheme()); | 641 theme_provider_->UseGtkTheme()); |
| 630 } | 642 } |
| 631 | 643 |
| 644 void BookmarkBarGtk::PaintEventBox() { | |
| 645 gfx::Size tab_contents_size; | |
| 646 if (GetTabContentsSize(&tab_contents_size) && | |
| 647 tab_contents_size != last_tab_contents_size_) { | |
| 648 last_tab_contents_size_ = tab_contents_size; | |
| 649 gtk_widget_queue_draw(event_box_.get()); | |
| 650 } | |
| 651 } | |
| 652 | |
| 653 bool BookmarkBarGtk::GetTabContentsSize(gfx::Size* size) { | |
| 654 Browser* browser = browser_; | |
| 655 if (!browser) { | |
| 656 NOTREACHED(); | |
| 657 return false; | |
| 658 } | |
| 659 TabContents* tab_contents = browser->GetSelectedTabContents(); | |
| 660 if (!tab_contents) { | |
| 661 NOTREACHED(); | |
| 662 return false; | |
| 663 } | |
| 664 if (!tab_contents->view()) { | |
| 665 NOTREACHED(); | |
| 666 return false; | |
| 667 } | |
| 668 *size = tab_contents->view()->GetContainerSize(); | |
| 669 return true; | |
| 670 } | |
| 671 | |
| 632 bool BookmarkBarGtk::IsAlwaysShown() { | 672 bool BookmarkBarGtk::IsAlwaysShown() { |
| 633 return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); | 673 return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
| 634 } | 674 } |
| 635 | 675 |
| 636 void BookmarkBarGtk::AnimationProgressed(const Animation* animation) { | 676 void BookmarkBarGtk::AnimationProgressed(const Animation* animation) { |
| 637 DCHECK_EQ(animation, slide_animation_.get()); | 677 DCHECK_EQ(animation, slide_animation_.get()); |
| 638 | 678 |
| 639 int max_height = ShouldBeFloating() ? | 679 int max_height = ShouldBeFloating() ? |
| 640 kBookmarkBarNTPHeight : kBookmarkBarHeight; | 680 kBookmarkBarNTPHeight : kBookmarkBarHeight; |
| 641 gint height = | 681 gint height = |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1093 cairo_rectangle(cr, | 1133 cairo_rectangle(cr, |
| 1094 tabstrip_origin.x(), | 1134 tabstrip_origin.x(), |
| 1095 tabstrip_origin.y(), | 1135 tabstrip_origin.y(), |
| 1096 event->area.x + event->area.width - tabstrip_origin.x(), | 1136 event->area.x + event->area.width - tabstrip_origin.x(), |
| 1097 event->area.y + event->area.height - tabstrip_origin.y()); | 1137 event->area.y + event->area.height - tabstrip_origin.y()); |
| 1098 cairo_fill(cr); | 1138 cairo_fill(cr); |
| 1099 | 1139 |
| 1100 cairo_destroy(cr); | 1140 cairo_destroy(cr); |
| 1101 } else { | 1141 } else { |
| 1102 gfx::Size tab_contents_size; | 1142 gfx::Size tab_contents_size; |
| 1103 Browser* browser = bar->browser_; | 1143 if (!bar->GetTabContentsSize(&tab_contents_size)) |
| 1104 if (!browser) { | |
| 1105 NOTREACHED(); | |
| 1106 return FALSE; | 1144 return FALSE; |
| 1107 } | |
| 1108 TabContents* tab_contents = browser->GetSelectedTabContents(); | |
| 1109 if (!tab_contents) { | |
| 1110 NOTREACHED(); | |
| 1111 return FALSE; | |
| 1112 } | |
| 1113 if (!tab_contents->view()) { | |
| 1114 NOTREACHED(); | |
| 1115 return FALSE; | |
| 1116 } | |
| 1117 tab_contents_size = tab_contents->view()->GetContainerSize(); | |
| 1118 gfx::CanvasPaint canvas(event, true); | 1145 gfx::CanvasPaint canvas(event, true); |
| 1119 NtpBackgroundUtil::PaintBackgroundDetachedMode(theme_provider, &canvas, | 1146 NtpBackgroundUtil::PaintBackgroundDetachedMode(theme_provider, &canvas, |
| 1120 gfx::Rect(widget->allocation), tab_contents_size.height()); | 1147 gfx::Rect(widget->allocation), tab_contents_size.height()); |
| 1121 } | 1148 } |
| 1122 | 1149 |
| 1123 return FALSE; // Propagate expose to children. | 1150 return FALSE; // Propagate expose to children. |
| 1124 } | 1151 } |
| 1125 | 1152 |
| 1126 // static | 1153 // static |
| 1154 void BookmarkBarGtk::OnParentSizeAllocate(GtkWidget* widget, | |
| 1155 GtkAllocation* allocation, | |
| 1156 BookmarkBarGtk* bar) { | |
| 1157 // In floating mode, our layout depends on the size of the tab contents. | |
| 1158 // We get the size-allocate signal before the tab contents does, hence we | |
| 1159 // need to post a delayed task so we will paint correctly. Note that | |
| 1160 // gtk_widget_queue_draw by itself does not work, despite that it claims to | |
| 1161 // be asynchronous. | |
| 1162 if (bar->floating_) { | |
| 1163 MessageLoop::current()->PostTask(FROM_HERE, | |
|
tony
2009/10/26 23:55:30
Is this still necessary since we're getting the si
Evan Stade
2009/10/27 00:11:12
we are getting it from the tab contents container,
| |
| 1164 bar->event_box_paint_factory_.NewRunnableMethod( | |
| 1165 &BookmarkBarGtk::PaintEventBox)); | |
| 1166 } | |
| 1167 } | |
| 1168 | |
| 1169 // static | |
| 1127 gboolean BookmarkBarGtk::OnSeparatorExpose(GtkWidget* widget, | 1170 gboolean BookmarkBarGtk::OnSeparatorExpose(GtkWidget* widget, |
| 1128 GdkEventExpose* event, | 1171 GdkEventExpose* event, |
| 1129 BookmarkBarGtk* bar) { | 1172 BookmarkBarGtk* bar) { |
| 1130 if (bar->theme_provider_->UseGtkTheme()) | 1173 if (bar->theme_provider_->UseGtkTheme()) |
| 1131 return FALSE; | 1174 return FALSE; |
| 1132 | 1175 |
| 1133 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); | 1176 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
| 1134 cairo_rectangle(cr, event->area.x, event->area.y, | 1177 cairo_rectangle(cr, event->area.x, event->area.y, |
| 1135 event->area.width, event->area.height); | 1178 event->area.width, event->area.height); |
| 1136 cairo_clip(cr); | 1179 cairo_clip(cr); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1224 break; | 1267 break; |
| 1225 } | 1268 } |
| 1226 } | 1269 } |
| 1227 DCHECK_NE(button_idx, -1); | 1270 DCHECK_NE(button_idx, -1); |
| 1228 | 1271 |
| 1229 // Find the GtkWidget* for the actual target button. | 1272 // Find the GtkWidget* for the actual target button. |
| 1230 int shift = dir == GTK_MENU_DIR_PARENT ? -1 : 1; | 1273 int shift = dir == GTK_MENU_DIR_PARENT ? -1 : 1; |
| 1231 button_idx = (button_idx + shift + folder_list.size()) % folder_list.size(); | 1274 button_idx = (button_idx + shift + folder_list.size()) % folder_list.size(); |
| 1232 PopupForButton(folder_list[button_idx]); | 1275 PopupForButton(folder_list[button_idx]); |
| 1233 } | 1276 } |
| OLD | NEW |