summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-22 18:02:51 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-22 18:02:51 +0000
commit91636e03ae0bc7c2d71e36a63b5441da6071c818 (patch)
tree1d4302a02d006f6bf74c1b4a91dfb64e4a6b7b1c /chrome/browser/gtk
parentc6036166832b540d1a0d32fc94fbfd87f5510f88 (diff)
downloadchromium_src-91636e03ae0bc7c2d71e36a63b5441da6071c818.zip
chromium_src-91636e03ae0bc7c2d71e36a63b5441da6071c818.tar.gz
chromium_src-91636e03ae0bc7c2d71e36a63b5441da6071c818.tar.bz2
Add a (non functional) gtk KeywordEditorWindow and hook it up in the relevant places.
BUG=13326 Review URL: http://codereview.chromium.org/141026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18916 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc3
-rw-r--r--chrome/browser/gtk/keyword_editor_view.cc229
-rw-r--r--chrome/browser/gtk/keyword_editor_view.h84
-rw-r--r--chrome/browser/gtk/options/general_page_gtk.cc10
-rw-r--r--chrome/browser/gtk/options/general_page_gtk.h4
5 files changed, 328 insertions, 2 deletions
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index 32b40b4..c87377b 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -33,6 +33,7 @@
#include "chrome/browser/gtk/go_button_gtk.h"
#include "chrome/browser/gtk/import_dialog_gtk.h"
#include "chrome/browser/gtk/infobar_container_gtk.h"
+#include "chrome/browser/gtk/keyword_editor_view.h"
#include "chrome/browser/gtk/nine_box.h"
#include "chrome/browser/gtk/status_bubble_gtk.h"
#include "chrome/browser/gtk/tab_contents_container_gtk.h"
@@ -579,7 +580,7 @@ void BrowserWindowGtk::ShowImportDialog() {
}
void BrowserWindowGtk::ShowSearchEnginesDialog() {
- NOTIMPLEMENTED();
+ KeywordEditorView::Show(browser_->profile());
}
void BrowserWindowGtk::ShowPasswordManager() {
diff --git a/chrome/browser/gtk/keyword_editor_view.cc b/chrome/browser/gtk/keyword_editor_view.cc
new file mode 100644
index 0000000..45de403
--- /dev/null
+++ b/chrome/browser/gtk/keyword_editor_view.cc
@@ -0,0 +1,229 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/gtk/keyword_editor_view.h"
+
+#include "app/l10n_util.h"
+#include "chrome/browser/gtk/edit_keyword_controller.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/metrics/user_metrics.h"
+#include "chrome/browser/search_engines/template_url.h"
+#include "chrome/browser/search_engines/template_url_model.h"
+#include "chrome/common/gtk_util.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+// Initial size for dialog.
+const int kDialogDefaultWidth = 450;
+const int kDialogDefaultHeight = 450;
+
+// Column ids for |list_store_|.
+enum {
+ COL_FAVICON,
+ COL_TITLE,
+ COL_KEYWORD,
+ COL_COUNT,
+};
+
+KeywordEditorView* instance_ = NULL;
+
+}
+
+// static
+void KeywordEditorView::Show(Profile* profile) {
+ DCHECK(profile);
+ if (!profile->GetTemplateURLModel())
+ return;
+
+ // If there's already an existing editor window, activate it.
+ if (instance_) {
+ gtk_window_present(GTK_WINDOW(instance_->dialog_));
+ } else {
+ instance_ = new KeywordEditorView(profile);
+ }
+}
+
+void KeywordEditorView::OnEditedKeyword(const TemplateURL* template_url,
+ const std::wstring& title,
+ const std::wstring& keyword,
+ const std::wstring& url) {
+ NOTIMPLEMENTED();
+}
+
+KeywordEditorView::~KeywordEditorView() {
+ url_model_->RemoveObserver(this);
+}
+
+KeywordEditorView::KeywordEditorView(Profile* profile)
+ : profile_(profile),
+ url_model_(profile->GetTemplateURLModel()) {
+ Init();
+}
+
+void KeywordEditorView::Init() {
+ DCHECK(url_model_);
+ url_model_->Load();
+ url_model_->AddObserver(this);
+
+ dialog_ = gtk_dialog_new_with_buttons(
+ l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_WINDOW_TITLE).c_str(),
+ NULL,
+ // Non-modal.
+ GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_CLOSE,
+ GTK_RESPONSE_CLOSE,
+ NULL);
+
+ gtk_window_set_default_size(GTK_WINDOW(dialog_), kDialogDefaultWidth,
+ kDialogDefaultHeight);
+ gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox),
+ gtk_util::kContentAreaSpacing);
+
+ GtkWidget* hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing);
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog_)->vbox), hbox);
+
+ GtkWidget* scroll_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window),
+ GTK_SHADOW_ETCHED_IN);
+ gtk_box_pack_start(GTK_BOX(hbox), scroll_window, TRUE, TRUE, 0);
+
+ list_store_ = gtk_list_store_new(COL_COUNT,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+ tree_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store_));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_), TRUE);
+ gtk_container_add(GTK_CONTAINER(scroll_window), tree_);
+
+ GtkTreeViewColumn* title_column = gtk_tree_view_column_new();
+ GtkCellRenderer* pixbuf_renderer = gtk_cell_renderer_pixbuf_new();
+ gtk_tree_view_column_pack_start(title_column, pixbuf_renderer, FALSE);
+ gtk_tree_view_column_add_attribute(title_column, pixbuf_renderer, "pixbuf",
+ COL_FAVICON);
+ GtkCellRenderer* title_renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE);
+ gtk_tree_view_column_add_attribute(title_column, title_renderer, "text",
+ COL_TITLE);
+ gtk_tree_view_column_set_title(
+ title_column, l10n_util::GetStringUTF8(
+ IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_COLUMN).c_str());
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_), title_column);
+
+ GtkTreeViewColumn* keyword_column = gtk_tree_view_column_new_with_attributes(
+ l10n_util::GetStringUTF8(
+ IDS_SEARCH_ENGINES_EDITOR_KEYWORD_COLUMN).c_str(),
+ gtk_cell_renderer_text_new(),
+ "text", COL_KEYWORD,
+ NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_), keyword_column);
+
+ selection_ = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_));
+ gtk_tree_selection_set_mode(selection_, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(selection_), "changed",
+ G_CALLBACK(OnSelectionChanged), this);
+
+ GtkWidget* button_box = gtk_vbox_new(FALSE, gtk_util::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(hbox), button_box, FALSE, FALSE, 0);
+
+ add_button_ = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_NEW_BUTTON).c_str());
+ g_signal_connect(G_OBJECT(add_button_), "clicked",
+ G_CALLBACK(OnAddButtonClicked), this);
+ gtk_box_pack_start(GTK_BOX(button_box), add_button_, FALSE, FALSE, 0);
+
+ edit_button_ = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_EDIT_BUTTON).c_str());
+ g_signal_connect(G_OBJECT(edit_button_), "clicked",
+ G_CALLBACK(OnEditButtonClicked), this);
+ gtk_box_pack_start(GTK_BOX(button_box), edit_button_, FALSE, FALSE, 0);
+
+ remove_button_ = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(
+ IDS_SEARCH_ENGINES_EDITOR_REMOVE_BUTTON).c_str());
+ g_signal_connect(G_OBJECT(remove_button_), "clicked",
+ G_CALLBACK(OnRemoveButtonClicked), this);
+ gtk_box_pack_start(GTK_BOX(button_box), remove_button_, FALSE, FALSE, 0);
+
+ make_default_button_ = gtk_button_new_with_label(
+ l10n_util::GetStringUTF8(
+ IDS_SEARCH_ENGINES_EDITOR_MAKE_DEFAULT_BUTTON).c_str());
+ g_signal_connect(G_OBJECT(make_default_button_), "clicked",
+ G_CALLBACK(OnMakeDefaultButtonClicked), this);
+ gtk_box_pack_start(GTK_BOX(button_box), make_default_button_, FALSE, FALSE,
+ 0);
+
+ EnableControls();
+
+ gtk_widget_show_all(dialog_);
+
+ g_signal_connect(dialog_, "response", G_CALLBACK(OnResponse), this);
+ g_signal_connect(dialog_, "destroy", G_CALLBACK(OnWindowDestroy), this);
+}
+
+void KeywordEditorView::EnableControls() {
+ bool enable = gtk_tree_selection_count_selected_rows(selection_) == 1;
+ bool can_make_default = false;
+ bool can_remove = false;
+ // TODO(mattm)
+ gtk_widget_set_sensitive(add_button_, url_model_->loaded());
+ gtk_widget_set_sensitive(edit_button_, enable);
+ gtk_widget_set_sensitive(remove_button_, can_make_default);
+ gtk_widget_set_sensitive(make_default_button_, can_remove);
+}
+
+void KeywordEditorView::OnTemplateURLModelChanged() {
+ // TODO(mattm): repopulate table
+ EnableControls();
+}
+
+// static
+void KeywordEditorView::OnWindowDestroy(GtkWidget* widget,
+ KeywordEditorView* window) {
+ instance_ = NULL;
+ MessageLoop::current()->DeleteSoon(FROM_HERE, window);
+}
+
+// static
+void KeywordEditorView::OnResponse(GtkDialog* dialog, int response_id,
+ KeywordEditorView* window) {
+ gtk_widget_destroy(window->dialog_);
+}
+
+// static
+void KeywordEditorView::OnSelectionChanged(
+ GtkTreeSelection *selection, KeywordEditorView* editor) {
+ editor->EnableControls();
+}
+
+// static
+void KeywordEditorView::OnAddButtonClicked(GtkButton* button,
+ KeywordEditorView* editor) {
+ EditKeywordControllerBase::Create(
+ GTK_WINDOW(gtk_widget_get_toplevel(editor->dialog_)),
+ NULL,
+ editor,
+ editor->profile_);
+}
+
+// static
+void KeywordEditorView::OnEditButtonClicked(GtkButton* button,
+ KeywordEditorView* editor) {
+ // TODO(mattm)
+}
+
+// static
+void KeywordEditorView::OnRemoveButtonClicked(GtkButton* button,
+ KeywordEditorView* editor) {
+ // TODO(mattm)
+}
+
+// static
+void KeywordEditorView::OnMakeDefaultButtonClicked(GtkButton* button,
+ KeywordEditorView* editor) {
+ // TODO(mattm)
+}
diff --git a/chrome/browser/gtk/keyword_editor_view.h b/chrome/browser/gtk/keyword_editor_view.h
new file mode 100644
index 0000000..6705948
--- /dev/null
+++ b/chrome/browser/gtk/keyword_editor_view.h
@@ -0,0 +1,84 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GTK_KEYWORD_EDITOR_VIEW_H_
+#define CHROME_BROWSER_GTK_KEYWORD_EDITOR_VIEW_H_
+
+#include <gtk/gtk.h>
+
+#include "base/basictypes.h"
+#include "chrome/browser/search_engines/edit_keyword_controller_base.h"
+#include "chrome/browser/search_engines/template_url_model.h"
+
+class Profile;
+
+class KeywordEditorView : public TemplateURLModelObserver,
+ public EditKeywordControllerBase::Delegate {
+ public:
+ virtual ~KeywordEditorView();
+
+ // Create (if necessary) and show the keyword editor window.
+ static void Show(Profile* profile);
+
+ // Overriden from EditKeywordControllerBase::Delegate.
+ virtual void OnEditedKeyword(const TemplateURL* template_url,
+ const std::wstring& title,
+ const std::wstring& keyword,
+ const std::wstring& url);
+ private:
+ explicit KeywordEditorView(Profile* profile);
+ void Init();
+
+ // Enable buttons based on selection state.
+ void EnableControls();
+
+ // TemplateURLModelObserver notification.
+ virtual void OnTemplateURLModelChanged();
+
+ // Callback for window destruction.
+ static void OnWindowDestroy(GtkWidget* widget, KeywordEditorView* window);
+
+ // Callback for dialog buttons.
+ static void OnResponse(GtkDialog* dialog, int response_id,
+ KeywordEditorView* window);
+
+ // Callback for when user selects something.
+ static void OnSelectionChanged(GtkTreeSelection *selection,
+ KeywordEditorView* editor);
+
+ // Callbacks for buttons modifying the table.
+ static void OnAddButtonClicked(GtkButton* button,
+ KeywordEditorView* editor);
+ static void OnEditButtonClicked(GtkButton* button,
+ KeywordEditorView* editor);
+ static void OnRemoveButtonClicked(GtkButton* button,
+ KeywordEditorView* editor);
+ static void OnMakeDefaultButtonClicked(GtkButton* button,
+ KeywordEditorView* editor);
+
+ // The table listing the search engines.
+ GtkWidget* tree_;
+ GtkListStore* list_store_;
+ GtkTreeSelection* selection_;
+
+ // Buttons for acting on the table.
+ GtkWidget* add_button_;
+ GtkWidget* edit_button_;
+ GtkWidget* remove_button_;
+ GtkWidget* make_default_button_;
+
+ // The containing dialog.
+ GtkWidget* dialog_;
+
+ // The profile.
+ Profile* profile_;
+
+ // Model containing TemplateURLs. We listen for changes on this and propagate
+ // them to the table model.
+ TemplateURLModel* url_model_;
+
+ DISALLOW_COPY_AND_ASSIGN(KeywordEditorView);
+};
+
+#endif // CHROME_BROWSER_GTK_KEYWORD_EDITOR_VIEW_H_
diff --git a/chrome/browser/gtk/options/general_page_gtk.cc b/chrome/browser/gtk/options/general_page_gtk.cc
index 395adca..589f8ea 100644
--- a/chrome/browser/gtk/options/general_page_gtk.cc
+++ b/chrome/browser/gtk/options/general_page_gtk.cc
@@ -10,6 +10,7 @@
#include "base/gfx/png_decoder.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
+#include "chrome/browser/gtk/keyword_editor_view.h"
#include "chrome/browser/gtk/options/options_layout_gtk.h"
#include "chrome/browser/gtk/options/url_picker_dialog_gtk.h"
#include "chrome/browser/net/url_fixer_upper.h"
@@ -325,10 +326,11 @@ GtkWidget* GeneralPageGtk::InitDefaultSearchGroup() {
}
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());
+ g_signal_connect(G_OBJECT(default_search_manage_engines_button_), "clicked",
+ G_CALLBACK(OnDefaultSearchManageEnginesClicked), this);
gtk_box_pack_end(GTK_BOX(hbox), default_search_manage_engines_button_,
FALSE, FALSE, 0);
@@ -468,6 +470,12 @@ void GeneralPageGtk::OnDefaultSearchEngineChanged(
}
// static
+void GeneralPageGtk::OnDefaultSearchManageEnginesClicked(
+ GtkButton* button, GeneralPageGtk* general_page) {
+ KeywordEditorView::Show(general_page->profile());
+}
+
+// static
void GeneralPageGtk::OnBrowserUseAsDefaultClicked(
GtkButton* button,
GeneralPageGtk* general_page) {
diff --git a/chrome/browser/gtk/options/general_page_gtk.h b/chrome/browser/gtk/options/general_page_gtk.h
index 606948e..f9c48d7 100644
--- a/chrome/browser/gtk/options/general_page_gtk.h
+++ b/chrome/browser/gtk/options/general_page_gtk.h
@@ -123,6 +123,10 @@ class GeneralPageGtk : public OptionsPageBase,
static void OnDefaultSearchEngineChanged(GtkComboBox* combo_box,
GeneralPageGtk* general_page);
+ // Callback for manage search engines button
+ static void OnDefaultSearchManageEnginesClicked(GtkButton* button,
+ GeneralPageGtk* general_page);
+
// Callback for use as default browser button
static void OnBrowserUseAsDefaultClicked(GtkButton* button,
GeneralPageGtk* general_page);