| 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/text_elider.h" | 9 #include "app/gfx/text_elider.h" |
| 10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
| 11 #include "app/resource_bundle.h" | 11 #include "app/resource_bundle.h" |
| 12 #include "base/gfx/gtk_util.h" | 12 #include "base/gfx/gtk_util.h" |
| 13 #include "base/pickle.h" | 13 #include "base/pickle.h" |
| 14 #include "chrome/browser/bookmarks/bookmark_drag_data.h" | 14 #include "chrome/browser/bookmarks/bookmark_drag_data.h" |
| 15 #include "chrome/browser/bookmarks/bookmark_utils.h" | 15 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 16 #include "chrome/browser/browser.h" | 16 #include "chrome/browser/browser.h" |
| 17 #include "chrome/browser/gtk/bookmark_context_menu.h" | 17 #include "chrome/browser/gtk/bookmark_context_menu.h" |
| 18 #include "chrome/browser/gtk/bookmark_menu_controller_gtk.h" | 18 #include "chrome/browser/gtk/bookmark_menu_controller_gtk.h" |
| 19 #include "chrome/browser/gtk/bookmark_tree_model.h" | 19 #include "chrome/browser/gtk/bookmark_tree_model.h" |
| 20 #include "chrome/browser/gtk/bookmark_utils_gtk.h" | 20 #include "chrome/browser/gtk/bookmark_utils_gtk.h" |
| 21 #include "chrome/browser/gtk/browser_window_gtk.h" | 21 #include "chrome/browser/gtk/browser_window_gtk.h" |
| 22 #include "chrome/browser/gtk/custom_button.h" | 22 #include "chrome/browser/gtk/custom_button.h" |
| 23 #include "chrome/browser/gtk/gtk_chrome_button.h" | 23 #include "chrome/browser/gtk/gtk_chrome_button.h" |
| 24 #include "chrome/browser/gtk/gtk_dnd_util.h" | 24 #include "chrome/browser/gtk/gtk_dnd_util.h" |
| 25 #include "chrome/browser/gtk/gtk_theme_provider.h" |
| 25 #include "chrome/browser/gtk/nine_box.h" | 26 #include "chrome/browser/gtk/nine_box.h" |
| 26 #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" | 27 #include "chrome/browser/gtk/tabs/tab_strip_gtk.h" |
| 27 #include "chrome/browser/metrics/user_metrics.h" | 28 #include "chrome/browser/metrics/user_metrics.h" |
| 28 #include "chrome/browser/profile.h" | 29 #include "chrome/browser/profile.h" |
| 29 #include "chrome/browser/tab_contents/tab_contents.h" | 30 #include "chrome/browser/tab_contents/tab_contents.h" |
| 30 #include "chrome/common/gtk_util.h" | 31 #include "chrome/common/gtk_util.h" |
| 31 #include "chrome/common/pref_names.h" | 32 #include "chrome/common/pref_names.h" |
| 32 #include "chrome/common/pref_service.h" | 33 #include "chrome/common/pref_service.h" |
| 33 #include "grit/app_resources.h" | 34 #include "grit/app_resources.h" |
| 34 #include "grit/generated_resources.h" | 35 #include "grit/generated_resources.h" |
| 35 #include "grit/theme_resources.h" | 36 #include "grit/theme_resources.h" |
| 36 | 37 |
| 37 namespace { | 38 namespace { |
| 38 | 39 |
| 39 // The height of the bar. | 40 // The height of the bar. |
| 40 const int kBookmarkBarHeight = 33; | 41 const int kBookmarkBarHeight = 33; |
| 41 | 42 |
| 42 // Left-padding for the instructional text. | 43 // Left-padding for the instructional text. |
| 43 const int kInstructionsPadding = 6; | 44 const int kInstructionsPadding = 6; |
| 44 | 45 |
| 45 // Color of the instructional text. | 46 // Color of the instructional text. |
| 46 const GdkColor kInstructionsColor = GDK_COLOR_RGB(128, 128, 142); | 47 const GdkColor kInstructionsColor = GDK_COLOR_RGB(128, 128, 142); |
| 47 | 48 |
| 49 void SetUseSystemThemeGraphicsOnToolbarItems(GtkToolItem* item, bool use_gtk) { |
| 50 GtkWidget* child = gtk_bin_get_child(GTK_BIN(item)); |
| 51 if (GTK_IS_CHROME_BUTTON(child)) { |
| 52 gtk_chrome_button_set_use_gtk_rendering(GTK_CHROME_BUTTON(child), use_gtk); |
| 53 } |
| 54 } |
| 55 |
| 48 } // namespace | 56 } // namespace |
| 49 | 57 |
| 50 BookmarkBarGtk::BookmarkBarGtk(Profile* profile, Browser* browser, | 58 BookmarkBarGtk::BookmarkBarGtk(Profile* profile, Browser* browser, |
| 51 BrowserWindowGtk* window) | 59 BrowserWindowGtk* window) |
| 52 : profile_(NULL), | 60 : profile_(NULL), |
| 53 page_navigator_(NULL), | 61 page_navigator_(NULL), |
| 54 browser_(browser), | 62 browser_(browser), |
| 55 window_(window), | 63 window_(window), |
| 56 model_(NULL), | 64 model_(NULL), |
| 57 instructions_(NULL), | 65 instructions_(NULL), |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 gtk_button_set_label( | 163 gtk_button_set_label( |
| 156 GTK_BUTTON(other_bookmarks_button_), | 164 GTK_BUTTON(other_bookmarks_button_), |
| 157 l10n_util::GetStringUTF8(IDS_BOOMARK_BAR_OTHER_BOOKMARKED).c_str()); | 165 l10n_util::GetStringUTF8(IDS_BOOMARK_BAR_OTHER_BOOKMARKED).c_str()); |
| 158 gtk_button_set_image(GTK_BUTTON(other_bookmarks_button_), | 166 gtk_button_set_image(GTK_BUTTON(other_bookmarks_button_), |
| 159 gtk_image_new_from_pixbuf(folder_icon)); | 167 gtk_image_new_from_pixbuf(folder_icon)); |
| 160 // Set the proper text colors. | 168 // Set the proper text colors. |
| 161 bookmark_utils::SetButtonTextColors(other_bookmarks_button_); | 169 bookmark_utils::SetButtonTextColors(other_bookmarks_button_); |
| 162 | 170 |
| 163 gtk_box_pack_start(GTK_BOX(bookmark_hbox_.get()), other_bookmarks_button_, | 171 gtk_box_pack_start(GTK_BOX(bookmark_hbox_.get()), other_bookmarks_button_, |
| 164 FALSE, FALSE, 0); | 172 FALSE, FALSE, 0); |
| 173 |
| 174 // Set the current theme state for all the buttons. |
| 175 UserChangedTheme(profile); |
| 165 gtk_widget_set_size_request(bookmark_hbox_.get(), -1, 0); | 176 gtk_widget_set_size_request(bookmark_hbox_.get(), -1, 0); |
| 166 | 177 |
| 167 slide_animation_.reset(new SlideAnimation(this)); | 178 slide_animation_.reset(new SlideAnimation(this)); |
| 168 } | 179 } |
| 169 | 180 |
| 170 void BookmarkBarGtk::AddBookmarkbarToBox(GtkWidget* box) { | 181 void BookmarkBarGtk::AddBookmarkbarToBox(GtkWidget* box) { |
| 171 gtk_box_pack_start(GTK_BOX(box), bookmark_hbox_.get(), FALSE, FALSE, 0); | 182 gtk_box_pack_start(GTK_BOX(box), bookmark_hbox_.get(), FALSE, FALSE, 0); |
| 172 } | 183 } |
| 173 | 184 |
| 174 void BookmarkBarGtk::Show(bool animate) { | 185 void BookmarkBarGtk::Show(bool animate) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 | 259 |
| 249 void BookmarkBarGtk::BookmarkNodeAdded(BookmarkModel* model, | 260 void BookmarkBarGtk::BookmarkNodeAdded(BookmarkModel* model, |
| 250 const BookmarkNode* parent, | 261 const BookmarkNode* parent, |
| 251 int index) { | 262 int index) { |
| 252 if (parent != model_->GetBookmarkBarNode()) { | 263 if (parent != model_->GetBookmarkBarNode()) { |
| 253 // We only care about nodes on the bookmark bar. | 264 // We only care about nodes on the bookmark bar. |
| 254 return; | 265 return; |
| 255 } | 266 } |
| 256 DCHECK(index >= 0 && index <= GetBookmarkButtonCount()); | 267 DCHECK(index >= 0 && index <= GetBookmarkButtonCount()); |
| 257 | 268 |
| 269 GtkToolItem* item = CreateBookmarkToolItem(parent->GetChild(index)); |
| 258 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), | 270 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), |
| 259 CreateBookmarkToolItem(parent->GetChild(index)), | 271 item, index); |
| 260 index); | 272 bool use_gtk = GtkThemeProvider::UseSystemThemeGraphics(profile_); |
| 273 SetUseSystemThemeGraphicsOnToolbarItems(item, use_gtk); |
| 261 | 274 |
| 262 SetInstructionState(parent); | 275 SetInstructionState(parent); |
| 263 } | 276 } |
| 264 | 277 |
| 265 void BookmarkBarGtk::BookmarkNodeRemoved(BookmarkModel* model, | 278 void BookmarkBarGtk::BookmarkNodeRemoved(BookmarkModel* model, |
| 266 const BookmarkNode* parent, | 279 const BookmarkNode* parent, |
| 267 int index) { | 280 int index) { |
| 268 if (parent != model_->GetBookmarkBarNode()) { | 281 if (parent != model_->GetBookmarkBarNode()) { |
| 269 // We only care about nodes on the bookmark bar. | 282 // We only care about nodes on the bookmark bar. |
| 270 return; | 283 return; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 CreateAllBookmarkButtons(node); | 322 CreateAllBookmarkButtons(node); |
| 310 } | 323 } |
| 311 | 324 |
| 312 void BookmarkBarGtk::CreateAllBookmarkButtons(const BookmarkNode* node) { | 325 void BookmarkBarGtk::CreateAllBookmarkButtons(const BookmarkNode* node) { |
| 313 // Create a button for each of the children on the bookmark bar. | 326 // Create a button for each of the children on the bookmark bar. |
| 314 for (int i = 0; i < node->GetChildCount(); ++i) { | 327 for (int i = 0; i < node->GetChildCount(); ++i) { |
| 315 GtkToolItem* item = CreateBookmarkToolItem(node->GetChild(i)); | 328 GtkToolItem* item = CreateBookmarkToolItem(node->GetChild(i)); |
| 316 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1); | 329 gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1); |
| 317 } | 330 } |
| 318 | 331 |
| 332 // Now that we've made a bunch of toolbar items, we need to make sure they |
| 333 // have the correct theme state. |
| 334 UserChangedTheme(profile_); |
| 335 |
| 319 SetInstructionState(node); | 336 SetInstructionState(node); |
| 320 } | 337 } |
| 321 | 338 |
| 322 void BookmarkBarGtk::SetInstructionState( | 339 void BookmarkBarGtk::SetInstructionState( |
| 323 const BookmarkNode* boomarks_bar_node) { | 340 const BookmarkNode* boomarks_bar_node) { |
| 324 show_instructions_ = (boomarks_bar_node->GetChildCount() == 0); | 341 show_instructions_ = (boomarks_bar_node->GetChildCount() == 0); |
| 325 if (show_instructions_) { | 342 if (show_instructions_) { |
| 326 gtk_widget_show_all(instructions_); | 343 gtk_widget_show_all(instructions_); |
| 327 } else { | 344 } else { |
| 328 gtk_widget_hide(instructions_); | 345 gtk_widget_hide(instructions_); |
| 329 } | 346 } |
| 330 } | 347 } |
| 331 | 348 |
| 332 void BookmarkBarGtk::RemoveAllBookmarkButtons() { | 349 void BookmarkBarGtk::RemoveAllBookmarkButtons() { |
| 333 gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); | 350 gtk_util::RemoveAllChildren(bookmark_toolbar_.get()); |
| 334 } | 351 } |
| 335 | 352 |
| 336 int BookmarkBarGtk::GetBookmarkButtonCount() { | 353 int BookmarkBarGtk::GetBookmarkButtonCount() { |
| 337 GList* children = gtk_container_get_children( | 354 GList* children = gtk_container_get_children( |
| 338 GTK_CONTAINER(bookmark_toolbar_.get())); | 355 GTK_CONTAINER(bookmark_toolbar_.get())); |
| 339 int count = g_list_length(children); | 356 int count = g_list_length(children); |
| 340 g_list_free(children); | 357 g_list_free(children); |
| 341 return count; | 358 return count; |
| 342 } | 359 } |
| 343 | 360 |
| 344 bool BookmarkBarGtk::IsAlwaysShown() { | 361 bool BookmarkBarGtk::IsAlwaysShown() { |
| 345 return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); | 362 return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
| 346 } | 363 } |
| 347 | 364 |
| 365 void BookmarkBarGtk::UserChangedTheme(Profile* profile) { |
| 366 bool use_gtk = GtkThemeProvider::UseSystemThemeGraphics(profile); |
| 367 |
| 368 gtk_chrome_button_set_use_gtk_rendering( |
| 369 GTK_CHROME_BUTTON(other_bookmarks_button_), use_gtk); |
| 370 |
| 371 gtk_container_foreach( |
| 372 GTK_CONTAINER(bookmark_toolbar_.get()), |
| 373 reinterpret_cast<void (*)(GtkWidget*, void*)>( |
| 374 SetUseSystemThemeGraphicsOnToolbarItems), |
| 375 reinterpret_cast<void*>(use_gtk)); |
| 376 } |
| 377 |
| 348 void BookmarkBarGtk::AnimationProgressed(const Animation* animation) { | 378 void BookmarkBarGtk::AnimationProgressed(const Animation* animation) { |
| 349 DCHECK_EQ(animation, slide_animation_.get()); | 379 DCHECK_EQ(animation, slide_animation_.get()); |
| 350 | 380 |
| 351 gtk_widget_set_size_request(bookmark_hbox_.get(), -1, | 381 gtk_widget_set_size_request(bookmark_hbox_.get(), -1, |
| 352 animation->GetCurrentValue() * | 382 animation->GetCurrentValue() * |
| 353 kBookmarkBarHeight); | 383 kBookmarkBarHeight); |
| 354 } | 384 } |
| 355 | 385 |
| 356 void BookmarkBarGtk::AnimationEnded(const Animation* animation) { | 386 void BookmarkBarGtk::AnimationEnded(const Animation* animation) { |
| 357 DCHECK_EQ(animation, slide_animation_.get()); | 387 DCHECK_EQ(animation, slide_animation_.get()); |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 bar->InitBackground(); | 771 bar->InitBackground(); |
| 742 gfx::Point tabstrip_origin = | 772 gfx::Point tabstrip_origin = |
| 743 bar->window_->tabstrip()->GetTabStripOriginForWidget(widget); | 773 bar->window_->tabstrip()->GetTabStripOriginForWidget(widget); |
| 744 bar->background_ninebox_->RenderTopCenterStrip( | 774 bar->background_ninebox_->RenderTopCenterStrip( |
| 745 cr, tabstrip_origin.x(), tabstrip_origin.y(), | 775 cr, tabstrip_origin.x(), tabstrip_origin.y(), |
| 746 event->area.x + event->area.width - tabstrip_origin.x()); | 776 event->area.x + event->area.width - tabstrip_origin.x()); |
| 747 cairo_destroy(cr); | 777 cairo_destroy(cr); |
| 748 | 778 |
| 749 return FALSE; // Propagate expose to children. | 779 return FALSE; // Propagate expose to children. |
| 750 } | 780 } |
| OLD | NEW |