Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Side by Side Diff: chrome/browser/gtk/options/general_page_gtk.cc

Issue 141035: Refactor the favicon loader out of gtk/options/general_page_gtk to gtk/list_store_favicon_loader, (Closed)
Patch Set: rebase Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/gtk/options/general_page_gtk.h ('k') | chrome/chrome.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/options/general_page_gtk.h ('k') | chrome/chrome.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698