| Index: chrome/browser/gtk/edit_search_engine_dialog.cc
|
| ===================================================================
|
| --- chrome/browser/gtk/edit_search_engine_dialog.cc (revision 71352)
|
| +++ chrome/browser/gtk/edit_search_engine_dialog.cc (working copy)
|
| @@ -1,291 +0,0 @@
|
| -// Copyright (c) 2010 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/edit_search_engine_dialog.h"
|
| -
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include "app/l10n_util.h"
|
| -#include "app/resource_bundle.h"
|
| -#include "base/i18n/rtl.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "chrome/browser/gtk/accessible_widget_helper_gtk.h"
|
| -#include "chrome/browser/gtk/gtk_util.h"
|
| -#include "chrome/browser/net/url_fixer_upper.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/search_engines/edit_search_engine_controller.h"
|
| -#include "chrome/browser/search_engines/template_url.h"
|
| -#include "chrome/browser/search_engines/template_url_model.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "grit/app_resources.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/theme_resources.h"
|
| -
|
| -namespace {
|
| -
|
| -std::string GetDisplayURL(const TemplateURL& turl) {
|
| - return turl.url() ? WideToUTF8(turl.url()->DisplayURL()) : std::string();
|
| -}
|
| -
|
| -// Forces text to lowercase when connected to an editable's "insert-text"
|
| -// signal. (Like views Textfield::STYLE_LOWERCASE.)
|
| -void LowercaseInsertTextHandler(GtkEditable *editable, const gchar *text,
|
| - gint length, gint *position, gpointer data) {
|
| - string16 original_text = UTF8ToUTF16(text);
|
| - string16 lower_text = l10n_util::ToLower(original_text);
|
| - if (lower_text != original_text) {
|
| - std::string result = UTF16ToUTF8(lower_text);
|
| - // Prevent ourselves getting called recursively about our own edit.
|
| - g_signal_handlers_block_by_func(G_OBJECT(editable),
|
| - reinterpret_cast<gpointer>(LowercaseInsertTextHandler), data);
|
| - gtk_editable_insert_text(editable, result.c_str(), result.size(), position);
|
| - g_signal_handlers_unblock_by_func(G_OBJECT(editable),
|
| - reinterpret_cast<gpointer>(LowercaseInsertTextHandler), data);
|
| - // We've inserted our modified version, stop the defalut handler from
|
| - // inserting the original.
|
| - g_signal_stop_emission_by_name(G_OBJECT(editable), "insert_text");
|
| - }
|
| -}
|
| -
|
| -void SetWidgetStyle(GtkWidget* entry, GtkStyle* label_style,
|
| - GtkStyle* dialog_style) {
|
| - gtk_widget_modify_fg(entry, GTK_STATE_NORMAL,
|
| - &label_style->fg[GTK_STATE_NORMAL]);
|
| - gtk_widget_modify_fg(entry, GTK_STATE_INSENSITIVE,
|
| - &label_style->fg[GTK_STATE_INSENSITIVE]);
|
| - // GTK_NO_WINDOW widgets like GtkLabel don't draw their own background, so we
|
| - // combine the normal or insensitive foreground of the label style with the
|
| - // normal background of the window style to achieve the "normal label" and
|
| - // "insensitive label" colors.
|
| - gtk_widget_modify_base(entry, GTK_STATE_NORMAL,
|
| - &dialog_style->bg[GTK_STATE_NORMAL]);
|
| - gtk_widget_modify_base(entry, GTK_STATE_INSENSITIVE,
|
| - &dialog_style->bg[GTK_STATE_NORMAL]);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -EditSearchEngineDialog::EditSearchEngineDialog(
|
| - GtkWindow* parent_window,
|
| - const TemplateURL* template_url,
|
| - EditSearchEngineControllerDelegate* delegate,
|
| - Profile* profile)
|
| - : controller_(new EditSearchEngineController(template_url, delegate,
|
| - profile)) {
|
| - Init(parent_window, profile);
|
| -}
|
| -
|
| -EditSearchEngineDialog::~EditSearchEngineDialog() {}
|
| -
|
| -void EditSearchEngineDialog::Init(GtkWindow* parent_window, Profile* profile) {
|
| - std::string dialog_name = l10n_util::GetStringUTF8(
|
| - controller_->template_url() ?
|
| - IDS_SEARCH_ENGINES_EDITOR_EDIT_WINDOW_TITLE :
|
| - IDS_SEARCH_ENGINES_EDITOR_NEW_WINDOW_TITLE);
|
| -
|
| - dialog_ = gtk_dialog_new_with_buttons(
|
| - dialog_name.c_str(),
|
| - parent_window,
|
| - static_cast<GtkDialogFlags>(GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR),
|
| - GTK_STOCK_CANCEL,
|
| - GTK_RESPONSE_CANCEL,
|
| - NULL);
|
| -
|
| - accessible_widget_helper_.reset(new AccessibleWidgetHelper(
|
| - dialog_, profile));
|
| - accessible_widget_helper_->SendOpenWindowNotification(dialog_name);
|
| -
|
| - ok_button_ = gtk_dialog_add_button(GTK_DIALOG(dialog_),
|
| - controller_->template_url() ?
|
| - GTK_STOCK_SAVE :
|
| - GTK_STOCK_ADD,
|
| - GTK_RESPONSE_OK);
|
| - gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_OK);
|
| -
|
| - // The dialog layout hierarchy looks like this:
|
| - //
|
| - // \ GtkVBox |dialog_->vbox|
|
| - // +-\ GtkTable |controls|
|
| - // | +-\ row 0
|
| - // | | +- GtkLabel
|
| - // | | +-\ GtkHBox
|
| - // | | +- GtkEntry |title_entry_|
|
| - // | | +- GtkImage |title_image_|
|
| - // | +-\ row 1
|
| - // | | +- GtkLabel
|
| - // | | +-\ GtkHBox
|
| - // | | +- GtkEntry |keyword_entry_|
|
| - // | | +- GtkImage |keyword_image_|
|
| - // | +-\ row 2
|
| - // | +- GtkLabel
|
| - // | +-\ GtkHBox
|
| - // | +- GtkEntry |url_entry_|
|
| - // | +- GtkImage |url_image_|
|
| - // +- GtkLabel |description_label|
|
| -
|
| - title_entry_ = gtk_entry_new();
|
| - gtk_entry_set_activates_default(GTK_ENTRY(title_entry_), TRUE);
|
| - g_signal_connect(title_entry_, "changed",
|
| - G_CALLBACK(OnEntryChangedThunk), this);
|
| - accessible_widget_helper_->SetWidgetName(
|
| - title_entry_,
|
| - IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_LABEL);
|
| -
|
| - keyword_entry_ = gtk_entry_new();
|
| - gtk_entry_set_activates_default(GTK_ENTRY(keyword_entry_), TRUE);
|
| - g_signal_connect(keyword_entry_, "changed",
|
| - G_CALLBACK(OnEntryChangedThunk), this);
|
| - g_signal_connect(keyword_entry_, "insert-text",
|
| - G_CALLBACK(LowercaseInsertTextHandler), NULL);
|
| - accessible_widget_helper_->SetWidgetName(
|
| - keyword_entry_,
|
| - IDS_SEARCH_ENGINES_EDITOR_KEYWORD_LABEL);
|
| -
|
| - url_entry_ = gtk_entry_new();
|
| - gtk_entry_set_activates_default(GTK_ENTRY(url_entry_), TRUE);
|
| - g_signal_connect(url_entry_, "changed",
|
| - G_CALLBACK(OnEntryChangedThunk), this);
|
| - accessible_widget_helper_->SetWidgetName(
|
| - url_entry_,
|
| - IDS_SEARCH_ENGINES_EDITOR_URL_LABEL);
|
| -
|
| - title_image_ = gtk_image_new_from_pixbuf(NULL);
|
| - keyword_image_ = gtk_image_new_from_pixbuf(NULL);
|
| - url_image_ = gtk_image_new_from_pixbuf(NULL);
|
| -
|
| - if (controller_->template_url()) {
|
| - gtk_entry_set_text(
|
| - GTK_ENTRY(title_entry_),
|
| - WideToUTF8(controller_->template_url()->short_name()).c_str());
|
| - gtk_entry_set_text(
|
| - GTK_ENTRY(keyword_entry_),
|
| - WideToUTF8(controller_->template_url()->keyword()).c_str());
|
| - gtk_entry_set_text(
|
| - GTK_ENTRY(url_entry_),
|
| - GetDisplayURL(*controller_->template_url()).c_str());
|
| - // We don't allow users to edit prepopulated URLs.
|
| - gtk_editable_set_editable(
|
| - GTK_EDITABLE(url_entry_),
|
| - controller_->template_url()->prepopulate_id() == 0);
|
| -
|
| - if (controller_->template_url()->prepopulate_id() != 0) {
|
| - GtkWidget* fake_label = gtk_label_new("Fake label");
|
| - gtk_widget_set_sensitive(fake_label,
|
| - controller_->template_url()->prepopulate_id() == 0);
|
| - GtkStyle* label_style = gtk_widget_get_style(fake_label);
|
| - GtkStyle* dialog_style = gtk_widget_get_style(dialog_);
|
| - SetWidgetStyle(url_entry_, label_style, dialog_style);
|
| - gtk_widget_destroy(fake_label);
|
| - }
|
| - }
|
| -
|
| - GtkWidget* controls = gtk_util::CreateLabeledControlsGroup(NULL,
|
| - l10n_util::GetStringUTF8(
|
| - IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_LABEL).c_str(),
|
| - gtk_util::CreateEntryImageHBox(title_entry_, title_image_),
|
| - l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_KEYWORD_LABEL).c_str(),
|
| - gtk_util::CreateEntryImageHBox(keyword_entry_, keyword_image_),
|
| - l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_URL_LABEL).c_str(),
|
| - gtk_util::CreateEntryImageHBox(url_entry_, url_image_),
|
| - NULL);
|
| - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), controls,
|
| - FALSE, FALSE, 0);
|
| -
|
| - // On RTL UIs (such as Arabic and Hebrew) the description text is not
|
| - // displayed correctly since it contains the substring "%s". This substring
|
| - // is not interpreted by the Unicode BiDi algorithm as an LTR string and
|
| - // therefore the end result is that the following right to left text is
|
| - // displayed: ".three two s% one" (where 'one', 'two', etc. are words in
|
| - // Hebrew).
|
| - //
|
| - // In order to fix this problem we transform the substring "%s" so that it
|
| - // is displayed correctly when rendered in an RTL context.
|
| - std::string description =
|
| - l10n_util::GetStringUTF8(IDS_SEARCH_ENGINES_EDITOR_URL_DESCRIPTION_LABEL);
|
| - if (base::i18n::IsRTL()) {
|
| - const std::string reversed_percent("s%");
|
| - std::string::size_type percent_index = description.find("%s");
|
| - if (percent_index != std::string::npos) {
|
| - description.replace(percent_index,
|
| - reversed_percent.length(),
|
| - reversed_percent);
|
| - }
|
| - }
|
| -
|
| - GtkWidget* description_label = gtk_label_new(description.c_str());
|
| - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), description_label,
|
| - FALSE, FALSE, 0);
|
| -
|
| - gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox),
|
| - gtk_util::kContentAreaSpacing);
|
| -
|
| - EnableControls();
|
| -
|
| - gtk_util::ShowDialog(dialog_);
|
| -
|
| - g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this);
|
| - g_signal_connect(dialog_, "destroy", G_CALLBACK(OnWindowDestroyThunk), this);
|
| -}
|
| -
|
| -string16 EditSearchEngineDialog::GetTitleInput() const {
|
| - return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(title_entry_)));
|
| -}
|
| -
|
| -string16 EditSearchEngineDialog::GetKeywordInput() const {
|
| - return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(keyword_entry_)));
|
| -}
|
| -
|
| -std::string EditSearchEngineDialog::GetURLInput() const {
|
| - return gtk_entry_get_text(GTK_ENTRY(url_entry_));
|
| -}
|
| -
|
| -void EditSearchEngineDialog::EnableControls() {
|
| - gtk_widget_set_sensitive(ok_button_,
|
| - controller_->IsKeywordValid(GetKeywordInput()) &&
|
| - controller_->IsTitleValid(GetTitleInput()) &&
|
| - controller_->IsURLValid(GetURLInput()));
|
| - UpdateImage(keyword_image_, controller_->IsKeywordValid(GetKeywordInput()),
|
| - IDS_SEARCH_ENGINES_INVALID_KEYWORD_TT);
|
| - UpdateImage(url_image_, controller_->IsURLValid(GetURLInput()),
|
| - IDS_SEARCH_ENGINES_INVALID_URL_TT);
|
| - UpdateImage(title_image_, controller_->IsTitleValid(GetTitleInput()),
|
| - IDS_SEARCH_ENGINES_INVALID_TITLE_TT);
|
| -}
|
| -
|
| -void EditSearchEngineDialog::UpdateImage(GtkWidget* image,
|
| - bool is_valid,
|
| - int invalid_message_id) {
|
| - if (is_valid) {
|
| - gtk_widget_set_has_tooltip(image, FALSE);
|
| - gtk_image_set_from_pixbuf(GTK_IMAGE(image),
|
| - ResourceBundle::GetSharedInstance().GetPixbufNamed(
|
| - IDR_INPUT_GOOD));
|
| - } else {
|
| - gtk_widget_set_tooltip_text(
|
| - image, l10n_util::GetStringUTF8(invalid_message_id).c_str());
|
| - gtk_image_set_from_pixbuf(GTK_IMAGE(image),
|
| - ResourceBundle::GetSharedInstance().GetPixbufNamed(
|
| - IDR_INPUT_ALERT));
|
| - }
|
| -}
|
| -
|
| -void EditSearchEngineDialog::OnEntryChanged(GtkEditable* editable) {
|
| - EnableControls();
|
| -}
|
| -
|
| -void EditSearchEngineDialog::OnResponse(GtkDialog* dialog, int response_id) {
|
| - if (response_id == GTK_RESPONSE_OK) {
|
| - controller_->AcceptAddOrEdit(GetTitleInput(),
|
| - GetKeywordInput(),
|
| - GetURLInput());
|
| - } else {
|
| - controller_->CleanUpCancelledAdd();
|
| - }
|
| - gtk_widget_destroy(dialog_);
|
| -}
|
| -
|
| -void EditSearchEngineDialog::OnWindowDestroy(GtkWidget* widget) {
|
| - MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| -}
|
|
|