diff options
author | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-10 01:01:59 +0000 |
---|---|---|
committer | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-10 01:01:59 +0000 |
commit | 461ce4745fc15a6f434699d5a7dcc0591ce952cd (patch) | |
tree | 11207e01427c17ea81f8b4de7c0245360b5d2028 /chrome | |
parent | 5c6a17efce0c075f59b7d9b601952f9dcae31483 (diff) | |
download | chromium_src-461ce4745fc15a6f434699d5a7dcc0591ce952cd.zip chromium_src-461ce4745fc15a6f434699d5a7dcc0591ce952cd.tar.gz chromium_src-461ce4745fc15a6f434699d5a7dcc0591ce952cd.tar.bz2 |
Implement default search engine combobox.
BUG=11507
Review URL: http://codereview.chromium.org/118421
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18012 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.cc | 102 | ||||
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.h | 27 |
2 files changed, 124 insertions, 5 deletions
diff --git a/chrome/browser/gtk/options/general_page_gtk.cc b/chrome/browser/gtk/options/general_page_gtk.cc index a291667..a9ebcd7 100644 --- a/chrome/browser/gtk/options/general_page_gtk.cc +++ b/chrome/browser/gtk/options/general_page_gtk.cc @@ -12,6 +12,7 @@ #include "chrome/browser/browser_list.h" #include "chrome/browser/gtk/options/options_layout_gtk.h" #include "chrome/browser/net/url_fixer_upper.h" +#include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/session_startup_pref.h" #include "chrome/browser/shell_integration.h" #include "chrome/common/gtk_util.h" @@ -41,6 +42,13 @@ enum { COL_COUNT, }; +// Column ids for |default_search_engines_model_|. +enum { + SEARCH_ENGINES_COL_INDEX, + SEARCH_ENGINES_COL_TITLE, + SEARCH_ENGINES_COL_COUNT, +}; + } /////////////////////////////////////////////////////////////////////////////// @@ -48,6 +56,8 @@ enum { GeneralPageGtk::GeneralPageGtk(Profile* profile) : OptionsPageBase(profile), + template_url_model_(NULL), + default_search_initializing_(true), initializing_(true) { OptionsLayoutBuilderGtk options_builder(4); options_builder.AddOptionGroup( @@ -80,6 +90,9 @@ GeneralPageGtk::~GeneralPageGtk() { profile()->GetPrefs()->RemovePrefObserver(prefs::kRestoreOnStartup, this); profile()->GetPrefs()->RemovePrefObserver( prefs::kURLsToRestoreOnStartup, this); + + if (template_url_model_) + template_url_model_->RemoveObserver(this); } /////////////////////////////////////////////////////////////////////////////// @@ -286,10 +299,31 @@ GtkWidget* GeneralPageGtk::InitHomepageGroup() { GtkWidget* GeneralPageGtk::InitDefaultSearchGroup() { GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); - // TODO(mattm): hook these up - default_search_engine_combobox_ = gtk_combo_box_new(); + default_search_engines_model_ = gtk_list_store_new(SEARCH_ENGINES_COL_COUNT, + G_TYPE_UINT, + G_TYPE_STRING); + default_search_engine_combobox_ = gtk_combo_box_new_with_model( + GTK_TREE_MODEL(default_search_engines_model_)); + g_signal_connect(G_OBJECT(default_search_engine_combobox_), "changed", + G_CALLBACK(OnDefaultSearchEngineChanged), this); gtk_container_add(GTK_CONTAINER(hbox), default_search_engine_combobox_); + GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(default_search_engine_combobox_), + renderer, TRUE); + gtk_cell_layout_set_attributes( + GTK_CELL_LAYOUT(default_search_engine_combobox_), renderer, + "text", SEARCH_ENGINES_COL_TITLE, + NULL); + + template_url_model_ = profile()->GetTemplateURLModel(); + if (template_url_model_) { + template_url_model_->Load(); + template_url_model_->AddObserver(this); + } + OnTemplateURLModelChanged(); + + // TODO(mattm): hook this up default_search_manage_engines_button_ = gtk_button_new_with_label( l10n_util::GetStringUTF8( IDS_OPTIONS_DEFAULTSEARCH_MANAGE_ENGINES_LINK).c_str()); @@ -423,6 +457,15 @@ void GeneralPageGtk::OnShowHomeButtonToggled(GtkToggleButton* toggle_button, } // static +void GeneralPageGtk::OnDefaultSearchEngineChanged( + GtkComboBox* combo_box, + GeneralPageGtk* general_page) { + if (general_page->default_search_initializing_) + return; + general_page->SetDefaultSearchEngineFromComboBox(); +} + +// static void GeneralPageGtk::OnBrowserUseAsDefaultClicked( GtkButton* button, GeneralPageGtk* general_page) { @@ -609,6 +652,61 @@ std::vector<GURL> GeneralPageGtk::GetCustomUrlList() const { return urls; } +void GeneralPageGtk::OnTemplateURLModelChanged() { + if (!template_url_model_ || !template_url_model_->loaded()) { + EnableDefaultSearchEngineComboBox(false); + return; + } + default_search_initializing_ = true; + gtk_list_store_clear(default_search_engines_model_); + const TemplateURL* default_search_provider = + template_url_model_->GetDefaultSearchProvider(); + std::vector<const TemplateURL*> model_urls = + template_url_model_->GetTemplateURLs(); + bool populated = false; + for (size_t i = 0; i < model_urls.size(); ++i) { + if (!model_urls[i]->ShowInDefaultList()) + continue; + populated = true; + GtkTreeIter iter; + gtk_list_store_append(default_search_engines_model_, &iter); + gtk_list_store_set( + default_search_engines_model_, &iter, + SEARCH_ENGINES_COL_INDEX, i, + SEARCH_ENGINES_COL_TITLE, + WideToUTF8(model_urls[i]->short_name()).c_str(), + -1); + if (model_urls[i] == default_search_provider) { + gtk_combo_box_set_active_iter( + GTK_COMBO_BOX(default_search_engine_combobox_), &iter); + } + } + EnableDefaultSearchEngineComboBox(populated); + default_search_initializing_ = false; +} + +void GeneralPageGtk::SetDefaultSearchEngineFromComboBox() { + GtkTreeIter iter; + if (!gtk_combo_box_get_active_iter( + GTK_COMBO_BOX(default_search_engine_combobox_), &iter)) { + return; + } + guint index; + gtk_tree_model_get(GTK_TREE_MODEL(default_search_engines_model_), &iter, + SEARCH_ENGINES_COL_INDEX, &index, + -1); + std::vector<const TemplateURL*> model_urls = + template_url_model_->GetTemplateURLs(); + if (index < model_urls.size()) + template_url_model_->SetDefaultSearchProvider(model_urls[index]); + else + NOTREACHED(); +} + +void GeneralPageGtk::EnableDefaultSearchEngineComboBox(bool enable) { + gtk_widget_set_sensitive(default_search_engine_combobox_, enable); +} + void GeneralPageGtk::SetHomepage(const GURL& homepage) { if (!homepage.is_valid() || homepage.spec() == chrome::kChromeUINewTabURL) { new_tab_page_is_home_page_.SetValue(true); diff --git a/chrome/browser/gtk/options/general_page_gtk.h b/chrome/browser/gtk/options/general_page_gtk.h index d9fe9bc..e8e8e15 100644 --- a/chrome/browser/gtk/options/general_page_gtk.h +++ b/chrome/browser/gtk/options/general_page_gtk.h @@ -8,14 +8,16 @@ #include <gtk/gtk.h> #include <vector> +#include "chrome/browser/gtk/options/url_picker_dialog_gtk.h" #include "chrome/browser/history/history.h" #include "chrome/browser/options_page_base.h" #include "chrome/browser/profile.h" -#include "chrome/browser/gtk/options/url_picker_dialog_gtk.h" +#include "chrome/browser/search_engines/template_url_model.h" #include "chrome/common/pref_member.h" #include "googleurl/src/gurl.h" -class GeneralPageGtk : public OptionsPageBase { +class GeneralPageGtk : public OptionsPageBase, + public TemplateURLModelObserver { public: explicit GeneralPageGtk(Profile* profile); ~GeneralPageGtk(); @@ -68,6 +70,16 @@ class GeneralPageGtk : public OptionsPageBase { // Retrieve entries from the startup_custom_pages_model_ std::vector<GURL> GetCustomUrlList() const; + // Overridden from TemplateURLModelObserver. + // Populates the default search engine combobox from the model. + virtual void OnTemplateURLModelChanged(); + + // Set the default search engine pref to the combo box active item. + void SetDefaultSearchEngineFromComboBox(); + + // Set the default search engine combo box state. + void EnableDefaultSearchEngineComboBox(bool enable); + // Sets the home page preferences for kNewTabPageIsHomePage and kHomePage. // If a blank string is passed in we revert to using NewTab page as the Home // page. When setting the Home Page to NewTab page, we preserve the old value @@ -105,6 +117,10 @@ class GeneralPageGtk : public OptionsPageBase { static void OnShowHomeButtonToggled(GtkToggleButton* toggle_button, GeneralPageGtk* general_page); + // Callback for default search engine selection + static void OnDefaultSearchEngineChanged(GtkComboBox* combo_box, + GeneralPageGtk* general_page); + // Callback for use as default browser button static void OnBrowserUseAsDefaultClicked(GtkButton* button, GeneralPageGtk* general_page); @@ -136,9 +152,11 @@ class GeneralPageGtk : public OptionsPageBase { StringPrefMember homepage_; BooleanPrefMember show_home_button_; - // Widgets of the default search group + // Widgets and data of the default search group GtkWidget* default_search_engine_combobox_; + GtkListStore* default_search_engines_model_; GtkWidget* default_search_manage_engines_button_; + TemplateURLModel* template_url_model_; // Widgets of the default browser group GtkWidget* default_browser_status_label_; @@ -147,6 +165,9 @@ class GeneralPageGtk : public OptionsPageBase { // The parent GtkTable widget GtkWidget* page_; + // Flag to ignore gtk callbacks while we are populating default search urls. + bool default_search_initializing_; + // Flag to ignore gtk callbacks while we are loading prefs, to avoid // then turning around and saving them again. bool initializing_; |