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