Home | History | Annotate | Download | only in login
      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/chromeos/login/password_changed_view.h"
      6 
      7 #include "base/utf_string_conversions.h"
      8 #include "chrome/browser/chromeos/login/rounded_rect_painter.h"
      9 #include "chrome/browser/chromeos/login/textfield_with_margin.h"
     10 #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
     11 #include "grit/generated_resources.h"
     12 #include "grit/locale_settings.h"
     13 #include "ui/base/keycodes/keyboard_codes.h"
     14 #include "ui/base/l10n/l10n_util.h"
     15 #include "ui/base/resource/resource_bundle.h"
     16 #include "views/controls/button/radio_button.h"
     17 #include "views/controls/label.h"
     18 #include "views/controls/textfield/textfield.h"
     19 #include "views/layout/grid_layout.h"
     20 #include "views/layout/layout_constants.h"
     21 #include "views/window/window.h"
     22 
     23 using views::Button;
     24 using views::GridLayout;
     25 using views::Label;
     26 using views::RadioButton;
     27 using views::Textfield;
     28 
     29 namespace chromeos {
     30 
     31 namespace {
     32 const int kPasswordFieldWidthChars = 20;
     33 }  // namespace
     34 
     35 PasswordChangedView::PasswordChangedView(Delegate* delegate,
     36                                          bool full_sync_disabled)
     37     : title_label_(NULL),
     38       description_label_(NULL),
     39       full_sync_radio_(NULL),
     40       delta_sync_radio_(NULL),
     41       old_password_field_(NULL),
     42       delegate_(delegate),
     43       full_sync_disabled_(full_sync_disabled) {
     44 }
     45 
     46 bool PasswordChangedView::Accept() {
     47   return ExitDialog();
     48 }
     49 
     50 int PasswordChangedView::GetDialogButtons() const {
     51  return MessageBoxFlags::DIALOGBUTTON_OK;
     52 }
     53 
     54 views::View* PasswordChangedView::GetInitiallyFocusedView() {
     55   if (!full_sync_disabled_) {
     56     return views::DialogDelegate::GetInitiallyFocusedView();
     57   } else {
     58     DCHECK(old_password_field_);
     59     return old_password_field_;
     60   }
     61 }
     62 
     63 std::wstring PasswordChangedView::GetWindowTitle() const {
     64   return UTF16ToWide(
     65       l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_DIALOG_BOX_TITLE));
     66 }
     67 
     68 gfx::Size PasswordChangedView::GetPreferredSize() {
     69   // TODO(nkostylev): Once UI is finalized, create locale settings.
     70   return gfx::Size(views::Window::GetLocalizedContentsSize(
     71       IDS_PASSWORD_CHANGED_DIALOG_WIDTH_CHARS,
     72       IDS_PASSWORD_CHANGED_DIALOG_HEIGHT_LINES));
     73 }
     74 
     75 void PasswordChangedView::ViewHierarchyChanged(bool is_add,
     76                                                views::View* parent,
     77                                                views::View* child) {
     78   if (is_add && child == this) {
     79     Init();
     80   }
     81 }
     82 
     83 void PasswordChangedView::Init() {
     84   // Set up fonts.
     85   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
     86   gfx::Font title_font = rb.GetFont(ResourceBundle::MediumBoldFont);
     87 
     88   // Create controls
     89   title_label_ = new Label();
     90   title_label_->SetFont(title_font);
     91   title_label_->SetText(
     92       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_TITLE)));
     93   title_label_->SetHorizontalAlignment(Label::ALIGN_LEFT);
     94 
     95   description_label_ = new Label();
     96   description_label_->SetText(
     97       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_DESC)));
     98   description_label_->SetMultiLine(true);
     99   description_label_->SetHorizontalAlignment(Label::ALIGN_LEFT);
    100 
    101   full_sync_radio_ = new RadioButton(
    102       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_RESET)),
    103       0);
    104   full_sync_radio_->set_listener(this);
    105   full_sync_radio_->SetMultiLine(true);
    106 
    107   delta_sync_radio_ = new RadioButton(
    108       UTF16ToWide(
    109           l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_MIGRATE)),
    110       0);
    111   delta_sync_radio_->set_listener(this);
    112   delta_sync_radio_->SetMultiLine(true);
    113 
    114   old_password_field_ = new TextfieldWithMargin(Textfield::STYLE_PASSWORD);
    115   old_password_field_->set_text_to_display_when_empty(
    116       l10n_util::GetStringUTF16(IDS_LOGIN_PREVIOUS_PASSWORD));
    117   old_password_field_->set_default_width_in_chars(kPasswordFieldWidthChars);
    118   old_password_field_->SetController(this);
    119 
    120   // Define controls layout.
    121   GridLayout* layout = GridLayout::CreatePanel(this);
    122   SetLayoutManager(layout);
    123 
    124   views::ColumnSet* column_set = layout->AddColumnSet(0);
    125   column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
    126                         GridLayout::USE_PREF, 0, 0);
    127   column_set = layout->AddColumnSet(1);
    128   column_set->AddPaddingColumn(
    129       0, views::kUnrelatedControlLargeHorizontalSpacing);
    130   column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
    131                         GridLayout::USE_PREF, 0, 0);
    132 
    133   layout->StartRow(0, 0);
    134   layout->AddView(title_label_);
    135   layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
    136 
    137   layout->StartRow(0, 0);
    138   layout->AddView(description_label_);
    139   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
    140 
    141   layout->StartRow(0, 0);
    142   layout->AddView(full_sync_radio_);
    143   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
    144 
    145   layout->StartRow(0, 0);
    146   layout->AddView(delta_sync_radio_);
    147   layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
    148 
    149   layout->StartRow(0, 1);
    150   layout->AddView(
    151       old_password_field_, 1, 1, GridLayout::LEADING, GridLayout::CENTER);
    152   layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
    153 
    154   layout->StartRow(0, 0);
    155   layout->AddView(old_password_field_);
    156 
    157   // Disable options if needed.
    158   if (!full_sync_disabled_) {
    159     full_sync_radio_->SetChecked(true);
    160     old_password_field_->SetEnabled(false);
    161   } else {
    162     full_sync_radio_->SetEnabled(false);
    163     delta_sync_radio_->SetChecked(true);
    164     old_password_field_->SetEnabled(true);
    165   }
    166 
    167 }
    168 
    169 bool PasswordChangedView::ExitDialog() {
    170   if (delta_sync_radio_->checked() && old_password_field_->text().empty())
    171     return false;
    172 
    173   // TODO(nkostylev): Need to sanitize memory used to store password.
    174   if (full_sync_radio_->checked())
    175     delegate_->ResyncEncryptedData();
    176   else
    177     delegate_->RecoverEncryptedData(UTF16ToUTF8(old_password_field_->text()));
    178 
    179   return true;
    180 }
    181 
    182 void PasswordChangedView::ButtonPressed(Button* sender,
    183                                         const views::Event& event) {
    184   if (sender == full_sync_radio_) {
    185     old_password_field_->SetEnabled(false);
    186     old_password_field_->SetText(string16());
    187   } else if (sender == delta_sync_radio_) {
    188     old_password_field_->SetEnabled(true);
    189     old_password_field_->RequestFocus();
    190   }
    191 }
    192 
    193 }  // namespace chromeos
    194