diff options
author | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-22 18:02:51 +0000 |
---|---|---|
committer | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-22 18:02:51 +0000 |
commit | 91636e03ae0bc7c2d71e36a63b5441da6071c818 (patch) | |
tree | 1d4302a02d006f6bf74c1b4a91dfb64e4a6b7b1c /chrome/browser/gtk | |
parent | c6036166832b540d1a0d32fc94fbfd87f5510f88 (diff) | |
download | chromium_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.cc | 3 | ||||
-rw-r--r-- | chrome/browser/gtk/keyword_editor_view.cc | 229 | ||||
-rw-r--r-- | chrome/browser/gtk/keyword_editor_view.h | 84 | ||||
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.cc | 10 | ||||
-rw-r--r-- | chrome/browser/gtk/options/general_page_gtk.h | 4 |
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); |