diff options
author | dantasse@chromium.org <dantasse@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-14 22:54:53 +0000 |
---|---|---|
committer | dantasse@chromium.org <dantasse@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-14 22:54:53 +0000 |
commit | 3ed957e0fe0ac13eba0923a9e92e11743de4a2a0 (patch) | |
tree | 47fe3501b71237c355409a510fa26ed636f75e91 /chrome | |
parent | be075d7c07f48cfaca42131a47aa83eb8688c1b9 (diff) | |
download | chromium_src-3ed957e0fe0ac13eba0923a9e92e11743de4a2a0.zip chromium_src-3ed957e0fe0ac13eba0923a9e92e11743de4a2a0.tar.gz chromium_src-3ed957e0fe0ac13eba0923a9e92e11743de4a2a0.tar.bz2 |
Make it impossible to click OK if you've selected 0 datatypes.
BUG=40880
TEST=try to Customize Sync so you're syncing 0 datatypes. You shouldn't be able to.
Review URL: http://codereview.chromium.org/1641001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44571 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/gtk/options/customize_sync_window_gtk.cc | 56 | ||||
-rw-r--r-- | chrome/browser/gtk/options/customize_sync_window_gtk.h | 2 | ||||
-rw-r--r-- | chrome/browser/sync/sync_setup_flow.h | 3 |
3 files changed, 52 insertions, 9 deletions
diff --git a/chrome/browser/gtk/options/customize_sync_window_gtk.cc b/chrome/browser/gtk/options/customize_sync_window_gtk.cc index b29abff..04a698f 100644 --- a/chrome/browser/gtk/options/customize_sync_window_gtk.cc +++ b/chrome/browser/gtk/options/customize_sync_window_gtk.cc @@ -8,6 +8,7 @@ #include <string> +#include "app/gtk_signal.h" #include "app/l10n_util.h" #include "base/message_loop.h" #include "chrome/browser/browser_process.h" @@ -34,7 +35,7 @@ class CustomizeSyncWindowGtk { ~CustomizeSyncWindowGtk(); void Show(); - void ClickOk(); + bool ClickOk(); void ClickCancel(); private: @@ -50,6 +51,8 @@ class CustomizeSyncWindowGtk { static void OnResponse(GtkDialog* dialog, gint response_id, CustomizeSyncWindowGtk* customize_sync_window); + CHROMEGTK_CALLBACK_0(CustomizeSyncWindowGtk, void, OnCheckboxClicked); + // The customize sync dialog. GtkWidget *dialog_; @@ -162,9 +165,25 @@ void CustomizeSyncWindowGtk::Show() { gtk_window_present(GTK_WINDOW(dialog_)); } -void CustomizeSyncWindowGtk::ClickOk() { - Accept(); - gtk_widget_destroy(GTK_WIDGET(dialog_)); +bool CustomizeSyncWindowGtk::ClickOk() { + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bookmarks_check_box_)) || + (preferences_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + preferences_check_box_))) || + (autofill_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(autofill_check_box_))) || + (themes_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(themes_check_box_)))) { + Accept(); + gtk_widget_destroy(GTK_WIDGET(dialog_)); + return true; + } else { + // show the user that something's wrong with this dialog (not perfect, but + // a temporary fix) + gtk_window_present(GTK_WINDOW(dialog_)); + return false; + } } void CustomizeSyncWindowGtk::ClickCancel() { @@ -184,6 +203,9 @@ GtkWidget* CustomizeSyncWindowGtk::AddCheckbox(GtkWidget* parent, int label_id, accessible_widget_helper_->SetWidgetName(checkbox, label_id); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), checked); + g_signal_connect(checkbox, "clicked", G_CALLBACK(OnCheckboxClickedThunk), + this); + return checkbox; } @@ -240,6 +262,26 @@ void CustomizeSyncWindowGtk::OnResponse( } } +// Deactivate the "OK" button if you uncheck all the data types. +void CustomizeSyncWindowGtk::OnCheckboxClicked(GtkWidget* widget) { + bool any_datatypes_selected = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bookmarks_check_box_)) || + (preferences_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + preferences_check_box_))) || + (autofill_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(autofill_check_box_))) || + (themes_check_box_ && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(themes_check_box_))); + if (any_datatypes_selected) { + gtk_dialog_set_response_sensitive( + GTK_DIALOG(customize_sync_window->dialog_), GTK_RESPONSE_OK, TRUE); + } else { + gtk_dialog_set_response_sensitive( + GTK_DIALOG(customize_sync_window->dialog_), GTK_RESPONSE_OK, FALSE); + } +} + /////////////////////////////////////////////////////////////////////////////// // Factory/finder method: @@ -252,9 +294,11 @@ void ShowCustomizeSyncWindow(Profile* profile) { customize_sync_window->Show(); } -void CustomizeSyncWindowOk() { +bool CustomizeSyncWindowOk() { if (customize_sync_window) { - customize_sync_window->ClickOk(); + return customize_sync_window->ClickOk(); + } else { + return true; } } diff --git a/chrome/browser/gtk/options/customize_sync_window_gtk.h b/chrome/browser/gtk/options/customize_sync_window_gtk.h index f1e3c2b..009b6f2 100644 --- a/chrome/browser/gtk/options/customize_sync_window_gtk.h +++ b/chrome/browser/gtk/options/customize_sync_window_gtk.h @@ -8,7 +8,7 @@ class Profile; void ShowCustomizeSyncWindow(Profile* profile); -void CustomizeSyncWindowOk(); +bool CustomizeSyncWindowOk(); void CustomizeSyncWindowCancel(); #endif // CHROME_BROWSER_GTK_OPTIONS_CUSTOMIZE_SYNC_WINDOW_GTK_H_ diff --git a/chrome/browser/sync/sync_setup_flow.h b/chrome/browser/sync/sync_setup_flow.h index 42198fa..4e52ee3 100644 --- a/chrome/browser/sync/sync_setup_flow.h +++ b/chrome/browser/sync/sync_setup_flow.h @@ -99,8 +99,7 @@ class SyncSetupFlow : public HtmlDialogUIDelegate { #if defined(OS_WIN) return CustomizeSyncWindowView::ClickOk(); #elif defined(OS_LINUX) - CustomizeSyncWindowOk(); - return true; + return CustomizeSyncWindowOk(); #else return true; #endif |