| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-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/options/general_page_gtk.h" | 5 #include "chrome/browser/gtk/options/general_page_gtk.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/resource_bundle.h" | |
| 9 #include "base/gfx/gtk_util.h" | |
| 10 #include "base/gfx/png_decoder.h" | |
| 11 #include "chrome/browser/browser.h" | 8 #include "chrome/browser/browser.h" |
| 12 #include "chrome/browser/browser_list.h" | 9 #include "chrome/browser/browser_list.h" |
| 13 #include "chrome/browser/gtk/keyword_editor_view.h" | 10 #include "chrome/browser/gtk/keyword_editor_view.h" |
| 11 #include "chrome/browser/gtk/list_store_favicon_loader.h" |
| 14 #include "chrome/browser/gtk/options/options_layout_gtk.h" | 12 #include "chrome/browser/gtk/options/options_layout_gtk.h" |
| 15 #include "chrome/browser/gtk/options/url_picker_dialog_gtk.h" | 13 #include "chrome/browser/gtk/options/url_picker_dialog_gtk.h" |
| 16 #include "chrome/browser/net/url_fixer_upper.h" | 14 #include "chrome/browser/net/url_fixer_upper.h" |
| 17 #include "chrome/browser/search_engines/template_url.h" | 15 #include "chrome/browser/search_engines/template_url.h" |
| 18 #include "chrome/browser/session_startup_pref.h" | 16 #include "chrome/browser/session_startup_pref.h" |
| 19 #include "chrome/browser/shell_integration.h" | 17 #include "chrome/browser/shell_integration.h" |
| 20 #include "chrome/browser/tab_contents/tab_contents.h" | 18 #include "chrome/browser/tab_contents/tab_contents.h" |
| 21 #include "chrome/common/gtk_util.h" | 19 #include "chrome/common/gtk_util.h" |
| 22 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
| 23 #include "chrome/common/pref_service.h" | 21 #include "chrome/common/pref_service.h" |
| 24 #include "chrome/common/url_constants.h" | 22 #include "chrome/common/url_constants.h" |
| 25 #include "grit/app_resources.h" | |
| 26 #include "grit/chromium_strings.h" | 23 #include "grit/chromium_strings.h" |
| 27 #include "grit/generated_resources.h" | 24 #include "grit/generated_resources.h" |
| 28 | 25 |
| 29 namespace { | 26 namespace { |
| 30 | 27 |
| 31 // Markup for the text showing the current state of the default browser | 28 // Markup for the text showing the current state of the default browser |
| 32 const char kDefaultBrowserLabelMarkup[] = "<span color='#%s'>%s</span>"; | 29 const char kDefaultBrowserLabelMarkup[] = "<span color='#%s'>%s</span>"; |
| 33 | 30 |
| 34 // Color of the default browser text when Chromium is the default browser | 31 // Color of the default browser text when Chromium is the default browser |
| 35 const char kDefaultBrowserLabelColor[] = "008700"; | 32 const char kDefaultBrowserLabelColor[] = "008700"; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 GTK_RADIO_BUTTON(startup_homepage_radio_), | 189 GTK_RADIO_BUTTON(startup_homepage_radio_), |
| 193 l10n_util::GetStringUTF8(IDS_OPTIONS_STARTUP_SHOW_PAGES).c_str()); | 190 l10n_util::GetStringUTF8(IDS_OPTIONS_STARTUP_SHOW_PAGES).c_str()); |
| 194 g_signal_connect(G_OBJECT(startup_custom_radio_), "toggled", | 191 g_signal_connect(G_OBJECT(startup_custom_radio_), "toggled", |
| 195 G_CALLBACK(OnStartupRadioToggled), this); | 192 G_CALLBACK(OnStartupRadioToggled), this); |
| 196 gtk_box_pack_start(GTK_BOX(vbox), startup_custom_radio_, FALSE, FALSE, 0); | 193 gtk_box_pack_start(GTK_BOX(vbox), startup_custom_radio_, FALSE, FALSE, 0); |
| 197 | 194 |
| 198 GtkWidget* url_list_container = gtk_hbox_new(FALSE, | 195 GtkWidget* url_list_container = gtk_hbox_new(FALSE, |
| 199 gtk_util::kControlSpacing); | 196 gtk_util::kControlSpacing); |
| 200 gtk_box_pack_start(GTK_BOX(vbox), url_list_container, TRUE, TRUE, 0); | 197 gtk_box_pack_start(GTK_BOX(vbox), url_list_container, TRUE, TRUE, 0); |
| 201 | 198 |
| 202 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 203 default_favicon_ = rb.GetPixbufNamed(IDR_DEFAULT_FAVICON); | |
| 204 | |
| 205 GtkWidget* scroll_window = gtk_scrolled_window_new(NULL, NULL); | 199 GtkWidget* scroll_window = gtk_scrolled_window_new(NULL, NULL); |
| 206 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), | 200 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), |
| 207 GTK_POLICY_AUTOMATIC, | 201 GTK_POLICY_AUTOMATIC, |
| 208 GTK_POLICY_AUTOMATIC); | 202 GTK_POLICY_AUTOMATIC); |
| 209 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window), | 203 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window), |
| 210 GTK_SHADOW_ETCHED_IN); | 204 GTK_SHADOW_ETCHED_IN); |
| 211 gtk_container_add(GTK_CONTAINER(url_list_container), | 205 gtk_container_add(GTK_CONTAINER(url_list_container), |
| 212 scroll_window); | 206 scroll_window); |
| 213 startup_custom_pages_model_ = gtk_list_store_new(COL_COUNT, | 207 startup_custom_pages_model_ = gtk_list_store_new(COL_COUNT, |
| 214 G_TYPE_INT, | 208 G_TYPE_INT, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 228 gtk_tree_view_column_pack_start(column, renderer, TRUE); | 222 gtk_tree_view_column_pack_start(column, renderer, TRUE); |
| 229 gtk_tree_view_column_add_attribute(column, renderer, "text", COL_URL); | 223 gtk_tree_view_column_add_attribute(column, renderer, "text", COL_URL); |
| 230 gtk_tree_view_append_column(GTK_TREE_VIEW(startup_custom_pages_tree_), | 224 gtk_tree_view_append_column(GTK_TREE_VIEW(startup_custom_pages_tree_), |
| 231 column); | 225 column); |
| 232 startup_custom_pages_selection_ = gtk_tree_view_get_selection( | 226 startup_custom_pages_selection_ = gtk_tree_view_get_selection( |
| 233 GTK_TREE_VIEW(startup_custom_pages_tree_)); | 227 GTK_TREE_VIEW(startup_custom_pages_tree_)); |
| 234 gtk_tree_selection_set_mode(startup_custom_pages_selection_, | 228 gtk_tree_selection_set_mode(startup_custom_pages_selection_, |
| 235 GTK_SELECTION_MULTIPLE); | 229 GTK_SELECTION_MULTIPLE); |
| 236 g_signal_connect(G_OBJECT(startup_custom_pages_selection_), "changed", | 230 g_signal_connect(G_OBJECT(startup_custom_pages_selection_), "changed", |
| 237 G_CALLBACK(OnStartupPagesSelectionChanged), this); | 231 G_CALLBACK(OnStartupPagesSelectionChanged), this); |
| 232 favicon_loader_.reset(new ListStoreFavIconLoader(startup_custom_pages_model_, |
| 233 COL_FAVICON, |
| 234 COL_FAVICON_HANDLE, |
| 235 profile(), |
| 236 &fav_icon_consumer_)); |
| 238 | 237 |
| 239 GtkWidget* url_list_buttons = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); | 238 GtkWidget* url_list_buttons = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
| 240 gtk_box_pack_end(GTK_BOX(url_list_container), url_list_buttons, | 239 gtk_box_pack_end(GTK_BOX(url_list_container), url_list_buttons, |
| 241 FALSE, FALSE, 0); | 240 FALSE, FALSE, 0); |
| 242 | 241 |
| 243 startup_add_custom_page_button_ = gtk_button_new_with_mnemonic( | 242 startup_add_custom_page_button_ = gtk_button_new_with_mnemonic( |
| 244 gtk_util::ConvertAcceleratorsFromWindowsStyle( | 243 gtk_util::ConvertAcceleratorsFromWindowsStyle( |
| 245 l10n_util::GetStringUTF8(IDS_OPTIONS_STARTUP_ADD_BUTTON)).c_str()); | 244 l10n_util::GetStringUTF8(IDS_OPTIONS_STARTUP_ADD_BUTTON)).c_str()); |
| 246 g_signal_connect(G_OBJECT(startup_add_custom_page_button_), "clicked", | 245 g_signal_connect(G_OBJECT(startup_add_custom_page_button_), "clicked", |
| 247 G_CALLBACK(OnStartupAddCustomPageClicked), this); | 246 G_CALLBACK(OnStartupAddCustomPageClicked), this); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 void GeneralPageGtk::PopulateCustomUrlList(const std::vector<GURL>& urls) { | 507 void GeneralPageGtk::PopulateCustomUrlList(const std::vector<GURL>& urls) { |
| 509 gtk_list_store_clear(startup_custom_pages_model_); | 508 gtk_list_store_clear(startup_custom_pages_model_); |
| 510 for (size_t i = 0; i < urls.size(); ++i) { | 509 for (size_t i = 0; i < urls.size(); ++i) { |
| 511 GtkTreeIter iter; | 510 GtkTreeIter iter; |
| 512 gtk_list_store_append(startup_custom_pages_model_, &iter); | 511 gtk_list_store_append(startup_custom_pages_model_, &iter); |
| 513 PopulateCustomUrlRow(urls[i], &iter); | 512 PopulateCustomUrlRow(urls[i], &iter); |
| 514 } | 513 } |
| 515 } | 514 } |
| 516 | 515 |
| 517 void GeneralPageGtk::PopulateCustomUrlRow(const GURL& url, GtkTreeIter* iter) { | 516 void GeneralPageGtk::PopulateCustomUrlRow(const GURL& url, GtkTreeIter* iter) { |
| 518 HistoryService* history = | 517 favicon_loader_->LoadFaviconForRow(url, iter); |
| 519 profile()->GetHistoryService(Profile::EXPLICIT_ACCESS); | |
| 520 HistoryService::Handle handle(0); | |
| 521 if (history) { | |
| 522 handle = history->GetFavIconForURL( | |
| 523 url, &fav_icon_consumer_, | |
| 524 NewCallback(this, &GeneralPageGtk::OnGotFavIcon)); | |
| 525 } | |
| 526 gtk_list_store_set(startup_custom_pages_model_, iter, | 518 gtk_list_store_set(startup_custom_pages_model_, iter, |
| 527 COL_FAVICON_HANDLE, handle, | |
| 528 COL_FAVICON, default_favicon_, | |
| 529 COL_URL, url.spec().c_str(), | 519 COL_URL, url.spec().c_str(), |
| 530 -1); | 520 -1); |
| 531 } | 521 } |
| 532 | 522 |
| 533 bool GeneralPageGtk::GetRowByFavIconHandle(HistoryService::Handle handle, | |
| 534 GtkTreeIter* result_iter) { | |
| 535 GtkTreeIter iter; | |
| 536 gboolean valid = gtk_tree_model_get_iter_first( | |
| 537 GTK_TREE_MODEL(startup_custom_pages_model_), &iter); | |
| 538 while (valid) { | |
| 539 gint row_handle; | |
| 540 gtk_tree_model_get(GTK_TREE_MODEL(startup_custom_pages_model_), &iter, | |
| 541 COL_FAVICON_HANDLE, &row_handle, | |
| 542 -1); | |
| 543 if (row_handle == handle) { | |
| 544 *result_iter = iter; | |
| 545 return true; | |
| 546 } | |
| 547 valid = gtk_tree_model_iter_next( | |
| 548 GTK_TREE_MODEL(startup_custom_pages_model_), &iter); | |
| 549 } | |
| 550 return false; | |
| 551 } | |
| 552 | |
| 553 void GeneralPageGtk::OnGotFavIcon(HistoryService::Handle handle, | |
| 554 bool know_fav_icon, | |
| 555 scoped_refptr<RefCountedBytes> image_data, | |
| 556 bool is_expired, | |
| 557 GURL icon_url) { | |
| 558 GtkTreeIter iter; | |
| 559 if (!GetRowByFavIconHandle(handle, &iter)) | |
| 560 return; | |
| 561 gtk_list_store_set(startup_custom_pages_model_, &iter, | |
| 562 COL_FAVICON_HANDLE, 0, | |
| 563 -1); | |
| 564 if (know_fav_icon && image_data.get() && !image_data->data.empty()) { | |
| 565 int width, height; | |
| 566 std::vector<unsigned char> decoded_data; | |
| 567 if (PNGDecoder::Decode(&image_data->data.front(), image_data->data.size(), | |
| 568 PNGDecoder::FORMAT_BGRA, &decoded_data, &width, | |
| 569 &height)) { | |
| 570 SkBitmap icon; | |
| 571 icon.setConfig(SkBitmap::kARGB_8888_Config, width, height); | |
| 572 icon.allocPixels(); | |
| 573 memcpy(icon.getPixels(), &decoded_data.front(), | |
| 574 width * height * 4); | |
| 575 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | |
| 576 gtk_list_store_set(startup_custom_pages_model_, &iter, | |
| 577 COL_FAVICON, pixbuf, | |
| 578 -1); | |
| 579 g_object_unref(pixbuf); | |
| 580 } | |
| 581 } | |
| 582 } | |
| 583 | |
| 584 void GeneralPageGtk::SetCustomUrlListFromCurrentPages() { | 523 void GeneralPageGtk::SetCustomUrlListFromCurrentPages() { |
| 585 std::vector<GURL> urls; | 524 std::vector<GURL> urls; |
| 586 for (BrowserList::const_iterator browser_i = BrowserList::begin(); | 525 for (BrowserList::const_iterator browser_i = BrowserList::begin(); |
| 587 browser_i != BrowserList::end(); ++browser_i) { | 526 browser_i != BrowserList::end(); ++browser_i) { |
| 588 Browser* browser = *browser_i; | 527 Browser* browser = *browser_i; |
| 589 if (browser->profile() != profile()) | 528 if (browser->profile() != profile()) |
| 590 continue; // Only want entries for open profile. | 529 continue; // Only want entries for open profile. |
| 591 | 530 |
| 592 for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) { | 531 for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) { |
| 593 TabContents* tab = browser->GetTabContentsAt(tab_index); | 532 TabContents* tab = browser->GetTabContentsAt(tab_index); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 text = l10n_util::GetStringFUTF8(IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT, | 692 text = l10n_util::GetStringFUTF8(IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT, |
| 754 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); | 693 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); |
| 755 } | 694 } |
| 756 char* markup = g_markup_printf_escaped(kDefaultBrowserLabelMarkup, | 695 char* markup = g_markup_printf_escaped(kDefaultBrowserLabelMarkup, |
| 757 color, text.c_str()); | 696 color, text.c_str()); |
| 758 gtk_label_set_markup(GTK_LABEL(default_browser_status_label_), markup); | 697 gtk_label_set_markup(GTK_LABEL(default_browser_status_label_), markup); |
| 759 g_free(markup); | 698 g_free(markup); |
| 760 | 699 |
| 761 gtk_widget_set_sensitive(default_browser_use_as_default_button_, !is_default); | 700 gtk_widget_set_sensitive(default_browser_use_as_default_button_, !is_default); |
| 762 } | 701 } |
| OLD | NEW |