summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-22 23:17:27 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-22 23:17:27 +0000
commit18cec742ac18f7c99a357e57a659eed68397f8c6 (patch)
treeee9291f81122325d5a2e60c24b2d36e2c8e4e243
parent097cd1f8986172d626060867c13ef2fe9759468f (diff)
downloadchromium_src-18cec742ac18f7c99a357e57a659eed68397f8c6.zip
chromium_src-18cec742ac18f7c99a357e57a659eed68397f8c6.tar.gz
chromium_src-18cec742ac18f7c99a357e57a659eed68397f8c6.tar.bz2
gtk: Disable the "Clear browsing data" button on the Clear Browsing Data dialog
if there is no checkbox checked. BUG=30401 TEST=open Clear Browsing Data dialog, unckeck all checkboxes, see if the "Clear browsing data" button is disabled. Patch from Thiago Farina <thiago.farina@gmail.com> Review URL: http://codereview.chromium.org/1602007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45378 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/clear_browsing_data_dialog_gtk.cc113
-rw-r--r--chrome/browser/gtk/clear_browsing_data_dialog_gtk.h32
2 files changed, 76 insertions, 69 deletions
diff --git a/chrome/browser/gtk/clear_browsing_data_dialog_gtk.cc b/chrome/browser/gtk/clear_browsing_data_dialog_gtk.cc
index 44ccb21..88c8348 100644
--- a/chrome/browser/gtk/clear_browsing_data_dialog_gtk.cc
+++ b/chrome/browser/gtk/clear_browsing_data_dialog_gtk.cc
@@ -20,6 +20,15 @@
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
+namespace {
+
+// Returns true if the checkbox is checked.
+gboolean IsChecked(GtkWidget* widget) {
+ return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+}
+
+} // namespace
+
// static
void ClearBrowsingDataDialogGtk::Show(GtkWindow* parent, Profile* profile) {
new ClearBrowsingDataDialogGtk(parent, profile);
@@ -31,7 +40,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
// Build the dialog.
std::string dialog_name = l10n_util::GetStringUTF8(
IDS_CLEAR_BROWSING_DATA_TITLE);
- GtkWidget* dialog = gtk_dialog_new_with_buttons(
+ dialog_ = gtk_dialog_new_with_buttons(
dialog_name.c_str(),
parent,
(GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR),
@@ -39,19 +48,19 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
GTK_RESPONSE_REJECT,
NULL);
- accessible_widget_helper_.reset(new AccessibleWidgetHelper(dialog, profile));
+ accessible_widget_helper_.reset(new AccessibleWidgetHelper(dialog_, profile));
accessible_widget_helper_->SendOpenWindowNotification(dialog_name);
- gtk_widget_realize(dialog);
- gtk_util::SetWindowSizeFromResources(GTK_WINDOW(dialog),
+ gtk_widget_realize(dialog_);
+ gtk_util::SetWindowSizeFromResources(GTK_WINDOW(dialog_),
IDS_CLEARDATA_DIALOG_WIDTH_CHARS,
-1, // height
false); // resizable
- gtk_util::AddButtonToDialog(dialog,
+ gtk_util::AddButtonToDialog(dialog_,
l10n_util::GetStringUTF8(IDS_CLEAR_BROWSING_DATA_COMMIT).c_str(),
GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT);
- GtkWidget* content_area = GTK_DIALOG(dialog)->vbox;
+ GtkWidget* content_area = GTK_DIALOG(dialog_)->vbox;
gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing);
GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing);
@@ -70,7 +79,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_history_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeleteBrowsingHistory));
g_signal_connect(del_history_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Downloads checkbox.
del_downloads_checkbox_ = gtk_check_button_new_with_label(
@@ -79,7 +88,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_downloads_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeleteDownloadHistory));
g_signal_connect(del_downloads_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Cache checkbox.
del_cache_checkbox_ = gtk_check_button_new_with_label(
@@ -88,7 +97,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_cache_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeleteCache));
g_signal_connect(del_cache_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Cookies checkbox.
del_cookies_checkbox_ = gtk_check_button_new_with_label(
@@ -97,7 +106,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_cookies_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeleteCookies));
g_signal_connect(del_cookies_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Passwords checkbox.
del_passwords_checkbox_ = gtk_check_button_new_with_label(
@@ -106,7 +115,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_passwords_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeletePasswords));
g_signal_connect(del_passwords_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Form data checkbox.
del_form_data_checkbox_ = gtk_check_button_new_with_label(
@@ -115,7 +124,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(del_form_data_checkbox_),
profile_->GetPrefs()->GetBoolean(prefs::kDeleteFormData));
g_signal_connect(del_form_data_checkbox_, "toggled",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Create a horizontal layout for the combo box and label.
GtkWidget* combo_hbox = gtk_hbox_new(FALSE, gtk_util::kLabelSpacing);
@@ -140,7 +149,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_box_pack_start(GTK_BOX(combo_hbox),
time_period_combobox_, FALSE, FALSE, 0);
g_signal_connect(time_period_combobox_, "changed",
- G_CALLBACK(HandleOnClickedWidget), this);
+ G_CALLBACK(OnDialogWidgetClickedThunk), this);
// Add the combo/label time period box to the vertical layout.
gtk_box_pack_start(GTK_BOX(vbox), combo_hbox, FALSE, FALSE, 0);
@@ -149,7 +158,7 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
GtkWidget* flash_link = gtk_chrome_link_button_new(
l10n_util::GetStringUTF8(IDS_FLASH_STORAGE_SETTINGS).c_str());
g_signal_connect(G_OBJECT(flash_link), "clicked",
- G_CALLBACK(HandleOnFlashLinkClicked), this);
+ G_CALLBACK(OnFlashLinkClickedThunk), this);
GtkWidget* flash_link_hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(flash_link_hbox), flash_link, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(content_area), flash_link_hbox, FALSE, FALSE, 0);
@@ -158,19 +167,22 @@ ClearBrowsingDataDialogGtk::ClearBrowsingDataDialogGtk(GtkWindow* parent,
gtk_box_pack_end(GTK_BOX(content_area), separator, FALSE, FALSE, 0);
// Make sure we can move things around.
- DCHECK_EQ(GTK_DIALOG(dialog)->action_area->parent, content_area);
+ DCHECK_EQ(GTK_DIALOG(dialog_)->action_area->parent, content_area);
// Now rearrange those because they're *above* the accept buttons...there's
// no way to place them in the correct position with gtk_box_pack_end() so
// manually move things into the correct order.
gtk_box_reorder_child(GTK_BOX(content_area), flash_link_hbox, -1);
gtk_box_reorder_child(GTK_BOX(content_area), separator, -1);
- gtk_box_reorder_child(GTK_BOX(content_area), GTK_DIALOG(dialog)->action_area,
+ gtk_box_reorder_child(GTK_BOX(content_area), GTK_DIALOG(dialog_)->action_area,
-1);
- g_signal_connect(dialog, "response",
- G_CALLBACK(HandleOnResponseDialog), this);
- gtk_widget_show_all(dialog);
+ g_signal_connect(dialog_, "response",
+ G_CALLBACK(OnDialogResponseThunk), this);
+
+ UpdateDialogButtons();
+
+ gtk_widget_show_all(dialog_);
}
ClearBrowsingDataDialogGtk::~ClearBrowsingDataDialogGtk() {
@@ -182,31 +194,11 @@ void ClearBrowsingDataDialogGtk::OnDialogResponse(GtkWidget* widget,
int period_selected = gtk_combo_box_get_active(
GTK_COMBO_BOX(time_period_combobox_));
- int items = 0;
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(del_history_checkbox_)))
- items |= BrowsingDataRemover::REMOVE_HISTORY;
- if (gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(del_downloads_checkbox_))) {
- items |= BrowsingDataRemover::REMOVE_DOWNLOADS;
- }
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(del_cookies_checkbox_)))
- items |= BrowsingDataRemover::REMOVE_COOKIES;
- if (gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(del_passwords_checkbox_))) {
- items |= BrowsingDataRemover::REMOVE_PASSWORDS;
- }
- if (gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(del_form_data_checkbox_))) {
- items |= BrowsingDataRemover::REMOVE_FORM_DATA;
- }
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(del_cache_checkbox_)))
- items |= BrowsingDataRemover::REMOVE_CACHE;
-
// BrowsingDataRemover deletes itself when done.
remover_ = new BrowsingDataRemover(profile_,
static_cast<BrowsingDataRemover::TimePeriod>(period_selected),
base::Time());
- remover_->Remove(items);
+ remover_->Remove(GetCheckedItems());
}
delete this;
@@ -216,32 +208,27 @@ void ClearBrowsingDataDialogGtk::OnDialogResponse(GtkWidget* widget,
void ClearBrowsingDataDialogGtk::OnDialogWidgetClicked(GtkWidget* widget) {
if (widget == del_history_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeleteBrowsingHistory,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == del_downloads_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeleteDownloadHistory,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == del_cache_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeleteCache,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == del_cookies_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeleteCookies,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == del_passwords_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeletePasswords,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == del_form_data_checkbox_) {
profile_->GetPrefs()->SetBoolean(prefs::kDeleteFormData,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?
- true : false);
+ IsChecked(widget));
} else if (widget == time_period_combobox_) {
profile_->GetPrefs()->SetInteger(prefs::kDeleteTimePeriod,
gtk_combo_box_get_active(GTK_COMBO_BOX(widget)));
}
+ UpdateDialogButtons();
}
void ClearBrowsingDataDialogGtk::OnFlashLinkClicked(GtkWidget* button) {
@@ -252,3 +239,25 @@ void ClearBrowsingDataDialogGtk::OnFlashLinkClicked(GtkWidget* button) {
GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
browser->window()->Show();
}
+
+void ClearBrowsingDataDialogGtk::UpdateDialogButtons() {
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT,
+ GetCheckedItems() != 0);
+}
+
+int ClearBrowsingDataDialogGtk::GetCheckedItems() {
+ int items = 0;
+ if (IsChecked(del_history_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_HISTORY;
+ if (IsChecked(del_downloads_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_DOWNLOADS;
+ if (IsChecked(del_cookies_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_COOKIES;
+ if (IsChecked(del_passwords_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_PASSWORDS;
+ if (IsChecked(del_form_data_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_FORM_DATA;
+ if (IsChecked(del_cache_checkbox_))
+ items |= BrowsingDataRemover::REMOVE_CACHE;
+ return items;
+}
diff --git a/chrome/browser/gtk/clear_browsing_data_dialog_gtk.h b/chrome/browser/gtk/clear_browsing_data_dialog_gtk.h
index ce452f6..ba6e512 100644
--- a/chrome/browser/gtk/clear_browsing_data_dialog_gtk.h
+++ b/chrome/browser/gtk/clear_browsing_data_dialog_gtk.h
@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_GTK_CLEAR_BROWSING_DATA_DIALOG_GTK_H_
#define CHROME_BROWSER_GTK_CLEAR_BROWSING_DATA_DIALOG_GTK_H_
+#include "app/gtk_signal.h"
#include "base/basictypes.h"
#include "base/scoped_ptr.h"
@@ -25,25 +26,22 @@ class ClearBrowsingDataDialogGtk {
~ClearBrowsingDataDialogGtk();
// Handler to respond to Ok and Cancel responses from the dialog.
- static void HandleOnResponseDialog(GtkWidget* widget,
- int response,
- ClearBrowsingDataDialogGtk* user_data) {
- user_data->OnDialogResponse(widget, response);
- }
+ CHROMEGTK_CALLBACK_1(ClearBrowsingDataDialogGtk, void, OnDialogResponse, int);
// Handler to respond to widget clicked actions from the dialog.
- static void HandleOnClickedWidget(GtkWidget* widget,
- ClearBrowsingDataDialogGtk* user_data) {
- user_data->OnDialogWidgetClicked(widget);
- }
- void OnDialogResponse(GtkWidget* widget, int response);
- void OnDialogWidgetClicked(GtkWidget* widget);
-
- static void HandleOnFlashLinkClicked(GtkWidget* button,
- ClearBrowsingDataDialogGtk* user_data) {
- user_data->OnFlashLinkClicked(button);
- }
- void OnFlashLinkClicked(GtkWidget* widget);
+ CHROMEGTK_CALLBACK_0(ClearBrowsingDataDialogGtk, void, OnDialogWidgetClicked);
+
+ CHROMEGTK_CALLBACK_0(ClearBrowsingDataDialogGtk, void, OnFlashLinkClicked);
+
+ // Enable or disable the dialog buttons depending on the state of the
+ // checkboxes.
+ void UpdateDialogButtons();
+
+ // Create a bitmask from the checkboxes of the dialog.
+ int GetCheckedItems();
+
+ // The dialog window.
+ GtkWidget* dialog_;
// UI elements.
GtkWidget* del_history_checkbox_;