1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/js_modal_dialog_views.h"
6
7#include "base/utf_string_conversions.h"
8#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
9#include "chrome/browser/ui/views/window.h"
10#include "grit/generated_resources.h"
11#include "ui/base/keycodes/keyboard_codes.h"
12#include "ui/base/l10n/l10n_util.h"
13#include "ui/base/message_box_flags.h"
14#include "views/controls/message_box_view.h"
15#include "views/controls/textfield/textfield.h"
16#include "views/window/window.h"
17
18////////////////////////////////////////////////////////////////////////////////
19// JSModalDialogViews, public:
20
21JSModalDialogViews::JSModalDialogViews(
22    JavaScriptAppModalDialog* parent)
23    : parent_(parent),
24      message_box_view_(new views::MessageBoxView(
25          parent->dialog_flags() | ui::MessageBoxFlags::kAutoDetectAlignment,
26          parent->message_text(), parent->default_prompt_text())) {
27  DCHECK(message_box_view_);
28
29  message_box_view_->AddAccelerator(
30      views::Accelerator(ui::VKEY_C, false, true, false));
31  if (parent->display_suppress_checkbox()) {
32    message_box_view_->SetCheckBoxLabel(UTF16ToWide(
33        l10n_util::GetStringUTF16(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION)));
34  }
35}
36
37JSModalDialogViews::~JSModalDialogViews() {
38}
39
40////////////////////////////////////////////////////////////////////////////////
41// JSModalDialogViews, NativeAppModalDialog implementation:
42
43int JSModalDialogViews::GetAppModalDialogButtons() const {
44  return GetDialogButtons();
45}
46
47void JSModalDialogViews::ShowAppModalDialog() {
48  window()->Show();
49}
50
51void JSModalDialogViews::ActivateAppModalDialog() {
52  window()->Show();
53  window()->Activate();
54}
55
56void JSModalDialogViews::CloseAppModalDialog() {
57  window()->CloseWindow();
58}
59
60void JSModalDialogViews::AcceptAppModalDialog() {
61  GetDialogClientView()->AcceptWindow();
62}
63
64void JSModalDialogViews::CancelAppModalDialog() {
65  GetDialogClientView()->CancelWindow();
66}
67
68//////////////////////////////////////////////////////////////////////////////
69// JSModalDialogViews, views::DialogDelegate implementation:
70
71int JSModalDialogViews::GetDefaultDialogButton() const {
72  if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasOKButton)
73    return ui::MessageBoxFlags::DIALOGBUTTON_OK;
74
75  if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasCancelButton)
76    return ui::MessageBoxFlags::DIALOGBUTTON_CANCEL;
77
78  return ui::MessageBoxFlags::DIALOGBUTTON_NONE;
79}
80
81int JSModalDialogViews::GetDialogButtons() const {
82  int dialog_buttons = 0;
83  if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasOKButton)
84    dialog_buttons = ui::MessageBoxFlags::DIALOGBUTTON_OK;
85
86  if (parent_->dialog_flags() & ui::MessageBoxFlags::kFlagHasCancelButton)
87    dialog_buttons |= ui::MessageBoxFlags::DIALOGBUTTON_CANCEL;
88
89  return dialog_buttons;
90}
91
92std::wstring JSModalDialogViews::GetWindowTitle() const {
93  return parent_->title();
94}
95
96
97void JSModalDialogViews::WindowClosing() {
98}
99
100void JSModalDialogViews::DeleteDelegate() {
101  delete parent_;
102  delete this;
103}
104
105bool JSModalDialogViews::Cancel() {
106  parent_->OnCancel(message_box_view_->IsCheckBoxSelected());
107  return true;
108}
109
110bool JSModalDialogViews::Accept() {
111  parent_->OnAccept(message_box_view_->GetInputText(),
112                    message_box_view_->IsCheckBoxSelected());
113  return true;
114}
115
116void JSModalDialogViews::OnClose() {
117  parent_->OnClose();
118}
119
120std::wstring JSModalDialogViews::GetDialogButtonLabel(
121    ui::MessageBoxFlags::DialogButton button) const {
122  if (parent_->is_before_unload_dialog()) {
123    if (button == ui::MessageBoxFlags::DIALOGBUTTON_OK) {
124      return UTF16ToWide(l10n_util::GetStringUTF16(
125          IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL));
126    } else if (button == ui::MessageBoxFlags::DIALOGBUTTON_CANCEL) {
127      return UTF16ToWide(l10n_util::GetStringUTF16(
128          IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL));
129    }
130  }
131  return DialogDelegate::GetDialogButtonLabel(button);
132}
133
134///////////////////////////////////////////////////////////////////////////////
135// JSModalDialogViews, views::WindowDelegate implementation:
136
137bool JSModalDialogViews::IsModal() const {
138  return true;
139}
140
141views::View* JSModalDialogViews::GetContentsView() {
142  return message_box_view_;
143}
144
145views::View* JSModalDialogViews::GetInitiallyFocusedView() {
146  if (message_box_view_->text_box())
147    return message_box_view_->text_box();
148  return views::DialogDelegate::GetInitiallyFocusedView();
149}
150
151////////////////////////////////////////////////////////////////////////////////
152// NativeAppModalDialog, public:
153
154// static
155NativeAppModalDialog* NativeAppModalDialog::CreateNativeJavaScriptPrompt(
156    JavaScriptAppModalDialog* dialog,
157    gfx::NativeWindow parent_window) {
158  JSModalDialogViews* d = new JSModalDialogViews(dialog);
159
160  browser::CreateViewsWindow(parent_window, gfx::Rect(), d);
161  return d;
162}
163