crypto_module_password_dialog_view.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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/crypto_module_password_dialog_view.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "grit/generated_resources.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/events/event.h"
11#include "ui/views/controls/button/text_button.h"
12#include "ui/views/controls/label.h"
13#include "ui/views/controls/textfield/textfield.h"
14#include "ui/views/layout/grid_layout.h"
15#include "ui/views/layout/layout_constants.h"
16#include "ui/views/widget/widget.h"
17
18namespace chrome {
19
20////////////////////////////////////////////////////////////////////////////////
21// CryptoModulePasswordDialogView, public:
22
23CryptoModulePasswordDialogView::CryptoModulePasswordDialogView(
24    const std::string& slot_name,
25    CryptoModulePasswordReason reason,
26    const std::string& hostname,
27    const CryptoModulePasswordCallback& callback)
28    : callback_(callback) {
29  Init(hostname, slot_name, reason);
30}
31
32CryptoModulePasswordDialogView::~CryptoModulePasswordDialogView() {
33}
34
35////////////////////////////////////////////////////////////////////////////////
36// CryptoModulePasswordDialogView, private:
37
38views::View* CryptoModulePasswordDialogView::GetInitiallyFocusedView() {
39  return password_entry_;
40}
41
42ui::ModalType CryptoModulePasswordDialogView::GetModalType() const {
43  return ui::MODAL_TYPE_WINDOW;
44}
45
46base::string16 CryptoModulePasswordDialogView::GetWindowTitle() const {
47  return l10n_util::GetStringUTF16(IDS_CRYPTO_MODULE_AUTH_DIALOG_TITLE);
48}
49
50base::string16 CryptoModulePasswordDialogView::GetDialogButtonLabel(
51    ui::DialogButton button) const {
52  return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK ?
53      IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL : IDS_CANCEL);
54}
55
56bool CryptoModulePasswordDialogView::Cancel() {
57  callback_.Run(std::string());
58  const base::string16 empty;
59  password_entry_->SetText(empty);
60  return true;
61}
62
63bool CryptoModulePasswordDialogView::Accept() {
64  callback_.Run(base::UTF16ToUTF8(password_entry_->text()));
65  const base::string16 empty;
66  password_entry_->SetText(empty);
67  return true;
68}
69
70void CryptoModulePasswordDialogView::ContentsChanged(
71    views::Textfield* sender,
72    const base::string16& new_contents) {
73}
74
75bool CryptoModulePasswordDialogView::HandleKeyEvent(
76    views::Textfield* sender,
77    const ui::KeyEvent& keystroke) {
78  return false;
79}
80
81void CryptoModulePasswordDialogView::Init(const std::string& hostname,
82                                          const std::string& slot_name,
83                                          CryptoModulePasswordReason reason) {
84  // Select an appropriate text for the reason.
85  std::string text;
86  const base::string16& hostname16 = base::UTF8ToUTF16(hostname);
87  const base::string16& slot16 = base::UTF8ToUTF16(slot_name);
88  switch (reason) {
89    case chrome::kCryptoModulePasswordKeygen:
90      text = l10n_util::GetStringFUTF8(
91          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_KEYGEN, slot16, hostname16);
92      break;
93    case chrome::kCryptoModulePasswordCertEnrollment:
94      text = l10n_util::GetStringFUTF8(
95          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_ENROLLMENT,
96          slot16,
97          hostname16);
98      break;
99    case chrome::kCryptoModulePasswordClientAuth:
100      text = l10n_util::GetStringFUTF8(
101          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CLIENT_AUTH, slot16, hostname16);
102      break;
103    case chrome::kCryptoModulePasswordListCerts:
104      text = l10n_util::GetStringFUTF8(
105          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_LIST_CERTS, slot16);
106      break;
107    case chrome::kCryptoModulePasswordCertImport:
108      text = l10n_util::GetStringFUTF8(
109          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_IMPORT, slot16);
110      break;
111    case chrome::kCryptoModulePasswordCertExport:
112      text = l10n_util::GetStringFUTF8(
113          IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_EXPORT, slot16);
114      break;
115    default:
116      NOTREACHED();
117  }
118  reason_label_ = new views::Label(base::UTF8ToUTF16(text));
119  reason_label_->SetMultiLine(true);
120
121  password_label_ = new views::Label(l10n_util::GetStringUTF16(
122      IDS_CRYPTO_MODULE_AUTH_DIALOG_PASSWORD_FIELD));
123
124  password_entry_ = new views::Textfield();
125  password_entry_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
126  password_entry_->set_controller(this);
127
128  views::GridLayout* layout = views::GridLayout::CreatePanel(this);
129  SetLayoutManager(layout);
130
131  views::ColumnSet* reason_column_set = layout->AddColumnSet(0);
132  reason_column_set->AddColumn(
133      views::GridLayout::LEADING, views::GridLayout::LEADING, 1,
134      views::GridLayout::USE_PREF, 0, 0);
135
136  views::ColumnSet* column_set = layout->AddColumnSet(1);
137  column_set->AddColumn(views::GridLayout::LEADING,
138                        views::GridLayout::LEADING, 0,
139                        views::GridLayout::USE_PREF, 0, 0);
140  column_set->AddPaddingColumn(
141      0, views::kUnrelatedControlLargeHorizontalSpacing);
142  column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
143                        views::GridLayout::USE_PREF, 0, 0);
144
145  layout->StartRow(0, 0);
146  layout->AddView(reason_label_);
147  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
148
149  layout->StartRow(0, 1);
150  layout->AddView(password_label_);
151  layout->AddView(password_entry_);
152}
153
154void ShowCryptoModulePasswordDialog(
155    const std::string& slot_name,
156    bool retry,
157    CryptoModulePasswordReason reason,
158    const std::string& hostname,
159    gfx::NativeWindow parent,
160    const CryptoModulePasswordCallback& callback) {
161  CryptoModulePasswordDialogView* dialog =
162      new CryptoModulePasswordDialogView(slot_name, reason, hostname, callback);
163  views::DialogDelegate::CreateDialogWidget(dialog, NULL, parent)->Show();
164}
165
166}  // namespace chrome
167