summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-10 01:01:59 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-10 01:01:59 +0000
commit461ce4745fc15a6f434699d5a7dcc0591ce952cd (patch)
tree11207e01427c17ea81f8b4de7c0245360b5d2028 /chrome
parent5c6a17efce0c075f59b7d9b601952f9dcae31483 (diff)
downloadchromium_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.cc102
-rw-r--r--chrome/browser/gtk/options/general_page_gtk.h27
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_;