Index: chrome/browser/js_modal_dialog_gtk.cc |
=================================================================== |
--- chrome/browser/js_modal_dialog_gtk.cc (revision 0) |
+++ chrome/browser/js_modal_dialog_gtk.cc (revision 0) |
@@ -0,0 +1,215 @@ |
+// 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/js_modal_dialog.h" |
+ |
+#include <gtk/gtk.h> |
+ |
+#include "app/l10n_util.h" |
+#include "app/message_box_flags.h" |
+#include "base/logging.h" |
+#include "base/string_util.h" |
+#include "chrome/browser/browser_list.h" |
+#include "chrome/browser/browser_window.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/tab_contents/tab_contents_view.h" |
+#include "chrome/common/gtk_util.h" |
+#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; |
+} |
+ |
+} // namespace |
+ |
+void JavaScriptAppModalDialog::CreateAndShowDialog() { |
+ dialog_ = CreateNativeDialog(); |
+ 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); |
+} |
+ |
+void JavaScriptAppModalDialog::HandleDialogResponse(GtkDialog* dialog, |
+ gint response_id) { |
+ 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. |
+ OnAccept(GetPromptText(dialog), ShouldSuppressJSDialogs(dialog)); |
+ break; |
+ |
+ case GTK_RESPONSE_CANCEL: |
+ case GTK_RESPONSE_DELETE_EVENT: // User hit the X on the 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 this; |
+} |
+ |
+int JavaScriptAppModalDialog::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 JavaScriptAppModalDialog::AcceptWindow() { |
+ HandleDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_OK); |
+} |
+ |
+void JavaScriptAppModalDialog::CancelWindow() { |
+ HandleDialogResponse(GTK_DIALOG(dialog_), GTK_RESPONSE_CANCEL); |
+} |
+ |
+NativeDialog JavaScriptAppModalDialog::CreateNativeDialog() { |
+ 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(); |
+ NativeDialog 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(AppModalDialog::OnDialogResponse), |
+ reinterpret_cast<AppModalDialog*>(this)); |
+ return dialog; |
+} |
+ |
Property changes on: chrome/browser/js_modal_dialog_gtk.cc |
___________________________________________________________________ |
Name: svn:eol-style |
+ LF |