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
PasswordChangedView(Delegate * delegate,bool full_sync_disabled)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
Accept()46 bool PasswordChangedView::Accept() {
47 return ExitDialog();
48 }
49
GetDialogButtons() const50 int PasswordChangedView::GetDialogButtons() const {
51 return MessageBoxFlags::DIALOGBUTTON_OK;
52 }
53
GetInitiallyFocusedView()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
GetWindowTitle() const63 std::wstring PasswordChangedView::GetWindowTitle() const {
64 return UTF16ToWide(
65 l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_DIALOG_BOX_TITLE));
66 }
67
GetPreferredSize()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
ViewHierarchyChanged(bool is_add,views::View * parent,views::View * child)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
Init()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
ExitDialog()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
ButtonPressed(Button * sender,const views::Event & event)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