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