172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/js_modal_dialog_views.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/utf_string_conversions.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_codes.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/message_box_flags.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/message_box_view.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/window/window.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogViews, public: 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenJSModalDialogViews::JSModalDialogViews( 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen JavaScriptAppModalDialog* parent) 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : parent_(parent), 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message_box_view_(new views::MessageBoxView( 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen parent->dialog_flags() | ui::MessageBoxFlags::kAutoDetectAlignment, 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen parent->message_text(), parent->default_prompt_text())) { 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(message_box_view_); 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen message_box_view_->AddAccelerator( 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::Accelerator(ui::VKEY_C, false, true, false)); 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (parent->display_suppress_checkbox()) { 323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen message_box_view_->SetCheckBoxLabel(UTF16ToWide( 333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION))); 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenJSModalDialogViews::~JSModalDialogViews() { 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogViews, NativeAppModalDialog implementation: 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint JSModalDialogViews::GetAppModalDialogButtons() const { 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return GetDialogButtons(); 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::ShowAppModalDialog() { 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen window()->Show(); 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::ActivateAppModalDialog() { 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen window()->Show(); 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen window()->Activate(); 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::CloseAppModalDialog() { 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen window()->CloseWindow(); 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::AcceptAppModalDialog() { 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetDialogClientView()->AcceptWindow(); 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::CancelAppModalDialog() { 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetDialogClientView()->CancelWindow(); 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////// 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogViews, views::DialogDelegate implementation: 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint JSModalDialogViews::GetDefaultDialogButton() const { 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasOKButton) 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_OK; 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasCancelButton) 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_CANCEL; 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_NONE; 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint JSModalDialogViews::GetDialogButtons() const { 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int dialog_buttons = 0; 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasOKButton) 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dialog_buttons = ui::MessageBoxFlags::DIALOGBUTTON_OK; 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasCancelButton) 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen dialog_buttons |= ui::MessageBoxFlags::DIALOGBUTTON_CANCEL; 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return dialog_buttons; 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring JSModalDialogViews::GetWindowTitle() const { 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return parent_->title(); 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::WindowClosing() { 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::DeleteDelegate() { 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete parent_; 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete this; 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool JSModalDialogViews::Cancel() { 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick parent_->OnCancel(message_box_view_->IsCheckBoxSelected()); 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool JSModalDialogViews::Accept() { 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen parent_->OnAccept(message_box_view_->GetInputText(), 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen message_box_view_->IsCheckBoxSelected()); 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogViews::OnClose() { 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen parent_->OnClose(); 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring JSModalDialogViews::GetDialogButtonLabel( 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::MessageBoxFlags::DialogButton button) const { 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (parent_->is_before_unload_dialog()) { 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (button == ui::MessageBoxFlags::DIALOGBUTTON_OK) { 1243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide(l10n_util::GetStringUTF16( 1253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL)); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (button == ui::MessageBoxFlags::DIALOGBUTTON_CANCEL) { 1273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide(l10n_util::GetStringUTF16( 1283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL)); 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return DialogDelegate::GetDialogButtonLabel(button); 132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen/////////////////////////////////////////////////////////////////////////////// 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogViews, views::WindowDelegate implementation: 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool JSModalDialogViews::IsModal() const { 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenviews::View* JSModalDialogViews::GetContentsView() { 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return message_box_view_; 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenviews::View* JSModalDialogViews::GetInitiallyFocusedView() { 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (message_box_view_->text_box()) 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return message_box_view_->text_box(); 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return views::DialogDelegate::GetInitiallyFocusedView(); 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// NativeAppModalDialog, public: 153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenNativeAppModalDialog* NativeAppModalDialog::CreateNativeJavaScriptPrompt( 156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen JavaScriptAppModalDialog* dialog, 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::NativeWindow parent_window) { 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen JSModalDialogViews* d = new JSModalDialogViews(dialog); 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser::CreateViewsWindow(parent_window, gfx::Rect(), d); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return d; 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 163