Index: chrome/browser/app_modal_dialog_gtk.cc |
=================================================================== |
--- chrome/browser/app_modal_dialog_gtk.cc (revision 38222) |
+++ chrome/browser/app_modal_dialog_gtk.cc (working copy) |
@@ -18,172 +18,16 @@ |
#include "grit/generated_resources.h" |
#include "grit/locale_settings.h" |
-namespace { |
- |
-// We stash pointers to widgets on the gtk_dialog so we can refer to them |
-// after dialog creation. |
-const char kPromptTextId[] = "chrome_prompt_text"; |
-const char kSuppressCheckboxId[] = "chrome_suppress_checkbox"; |
- |
-// If there's a text entry in the dialog, get the text from the first one and |
-// return it. |
-std::wstring GetPromptText(GtkDialog* dialog) { |
- GtkWidget* widget = static_cast<GtkWidget*>( |
- g_object_get_data(G_OBJECT(dialog), kPromptTextId)); |
- if (widget) |
- return UTF8ToWide(gtk_entry_get_text(GTK_ENTRY(widget))); |
- return std::wstring(); |
-} |
- |
-// If there's a toggle button in the dialog, return the toggled state. |
-// Otherwise, return false. |
-bool ShouldSuppressJSDialogs(GtkDialog* dialog) { |
- GtkWidget* widget = static_cast<GtkWidget*>( |
- g_object_get_data(G_OBJECT(dialog), kSuppressCheckboxId)); |
- if (widget) |
- return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); |
- return false; |
-} |
- |
-void OnDialogResponse(GtkDialog* dialog, gint response_id, |
- AppModalDialog* app_modal_dialog) { |
- switch (response_id) { |
- case GTK_RESPONSE_OK: |
- // The first arg is the prompt text and the second is true if we want to |
- // suppress additional popups from the page. |
- app_modal_dialog->OnAccept(GetPromptText(dialog), |
- ShouldSuppressJSDialogs(dialog)); |
- break; |
- |
- case GTK_RESPONSE_CANCEL: |
- case GTK_RESPONSE_DELETE_EVENT: // User hit the X on the dialog. |
- app_modal_dialog->OnCancel(); |
- break; |
- |
- default: |
- NOTREACHED(); |
- } |
- gtk_widget_destroy(GTK_WIDGET(dialog)); |
- |
- // Now that the dialog is gone, we can put all the windows into separate |
- // window groups so other dialogs are no longer app modal. |
- for (BrowserList::const_iterator it = BrowserList::begin(); |
- it != BrowserList::end(); ++it) { |
- GtkWindowGroup* window_group = gtk_window_group_new(); |
- gtk_window_group_add_window(window_group, |
- (*it)->window()->GetNativeHandle()); |
- g_object_unref(window_group); |
- } |
- |
- delete app_modal_dialog; |
-} |
- |
-} // namespace |
- |
AppModalDialog::~AppModalDialog() { |
} |
void AppModalDialog::CreateAndShowDialog() { |
- GtkButtonsType buttons = GTK_BUTTONS_NONE; |
- GtkMessageType message_type = GTK_MESSAGE_OTHER; |
- // We add in the OK button manually later because we want to focus it |
- // explicitly. |
- switch (dialog_flags_) { |
- case MessageBoxFlags::kIsJavascriptAlert: |
- buttons = GTK_BUTTONS_NONE; |
- message_type = GTK_MESSAGE_WARNING; |
- break; |
+} |
- case MessageBoxFlags::kIsJavascriptConfirm: |
- if (is_before_unload_dialog_) { |
- // onbeforeunload also uses a confirm prompt, it just has custom |
- // buttons. We add the buttons using gtk_dialog_add_button below. |
- buttons = GTK_BUTTONS_NONE; |
- } else { |
- buttons = GTK_BUTTONS_CANCEL; |
- } |
- message_type = GTK_MESSAGE_QUESTION; |
- break; |
- |
- case MessageBoxFlags::kIsJavascriptPrompt: |
- buttons = GTK_BUTTONS_CANCEL; |
- message_type = GTK_MESSAGE_QUESTION; |
- break; |
- |
- default: |
- NOTREACHED(); |
- } |
- |
- // We want the alert to be app modal so put all the browser windows into the |
- // same window group. |
- GtkWindowGroup* window_group = gtk_window_group_new(); |
- for (BrowserList::const_iterator it = BrowserList::begin(); |
- it != BrowserList::end(); ++it) { |
- gtk_window_group_add_window(window_group, |
- (*it)->window()->GetNativeHandle()); |
- } |
- g_object_unref(window_group); |
- |
- gfx::NativeWindow window = client_->GetMessageBoxRootWindow(); |
- dialog_ = gtk_message_dialog_new(window, GTK_DIALOG_MODAL, |
- message_type, buttons, "%s", WideToUTF8(message_text_).c_str()); |
- gtk_util::ApplyMessageDialogQuirks(dialog_); |
- gtk_window_set_title(GTK_WINDOW(dialog_), WideToUTF8(title_).c_str()); |
- |
- // Adjust content area as needed. Set up the prompt text entry or |
- // suppression check box. |
- if (MessageBoxFlags::kIsJavascriptPrompt == dialog_flags_) { |
- // TODO(tc): Replace with gtk_dialog_get_content_area() when using GTK 2.14+ |
- GtkWidget* contents_vbox = GTK_DIALOG(dialog_)->vbox; |
- GtkWidget* text_box = gtk_entry_new(); |
- gtk_entry_set_text(GTK_ENTRY(text_box), |
- WideToUTF8(default_prompt_text_).c_str()); |
- gtk_box_pack_start(GTK_BOX(contents_vbox), text_box, TRUE, TRUE, 0); |
- g_object_set_data(G_OBJECT(dialog_), kPromptTextId, text_box); |
- gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE); |
- } |
- |
- if (display_suppress_checkbox_) { |
- GtkWidget* contents_vbox = GTK_DIALOG(dialog_)->vbox; |
- GtkWidget* check_box = gtk_check_button_new_with_label( |
- l10n_util::GetStringUTF8( |
- IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION).c_str()); |
- gtk_box_pack_start(GTK_BOX(contents_vbox), check_box, TRUE, TRUE, 0); |
- g_object_set_data(G_OBJECT(dialog_), kSuppressCheckboxId, check_box); |
- } |
- |
- // Adjust buttons/action area as needed. |
- if (is_before_unload_dialog_) { |
- std::string button_text = l10n_util::GetStringUTF8( |
- IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL); |
- gtk_dialog_add_button(GTK_DIALOG(dialog_), button_text.c_str(), |
- GTK_RESPONSE_OK); |
- |
- button_text = l10n_util::GetStringUTF8( |
- IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL); |
- gtk_dialog_add_button(GTK_DIALOG(dialog_), button_text.c_str(), |
- GTK_RESPONSE_CANCEL); |
- } else { |
- // Add the OK button and focus it. |
- GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(dialog_), |
- GTK_STOCK_OK, GTK_RESPONSE_OK); |
- if (MessageBoxFlags::kIsJavascriptPrompt != dialog_flags_) |
- gtk_widget_grab_focus(ok_button); |
- } |
- |
- gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_OK); |
- g_signal_connect(dialog_, "response", G_CALLBACK(OnDialogResponse), this); |
- |
- gtk_widget_show_all(GTK_WIDGET(GTK_DIALOG(dialog_))); |
- |
- // Suggest a minimum size. |
- gint width; |
- GtkRequisition req; |
- gtk_widget_size_request(dialog_, &req); |
- gtk_util::GetWidgetSizeFromResources(dialog_, IDS_ALERT_DIALOG_WIDTH_CHARS, 0, |
- &width, NULL); |
- if (width > req.width) |
- gtk_widget_set_size_request(dialog_, width, -1); |
+// static |
+void AppModalDialog::OnDialogResponse(GtkDialog* dialog, gint response_id, |
+ AppModalDialog* app_modal_dialog) { |
+ app_modal_dialog->HandleDialogResponse(dialog, response_id); |
} |
void AppModalDialog::ActivateModalDialog() { |
@@ -191,31 +35,13 @@ |
} |
void AppModalDialog::CloseModalDialog() { |
- OnDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_DELETE_EVENT, this); |
+ HandleDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_DELETE_EVENT); |
} |
-int AppModalDialog::GetDialogButtons() { |
- switch (dialog_flags_) { |
- case MessageBoxFlags::kIsJavascriptAlert: |
- return MessageBoxFlags::DIALOGBUTTON_OK; |
- |
- case MessageBoxFlags::kIsJavascriptConfirm: |
- return MessageBoxFlags::DIALOGBUTTON_OK | |
- MessageBoxFlags::DIALOGBUTTON_CANCEL; |
- |
- case MessageBoxFlags::kIsJavascriptPrompt: |
- return MessageBoxFlags::DIALOGBUTTON_OK; |
- |
- default: |
- NOTREACHED(); |
- return 0; |
- } |
-} |
- |
void AppModalDialog::AcceptWindow() { |
- OnDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_OK, this); |
+ HandleDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_OK); |
} |
void AppModalDialog::CancelWindow() { |
- OnDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_CANCEL, this); |
+ HandleDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_CANCEL); |
} |