OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/passwords/manage_password_item_view.h" | 5 #include "chrome/browser/ui/views/passwords/manage_password_item_view.h" |
6 | 6 |
7 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" | 7 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
8 #include "chrome/grit/generated_resources.h" | 8 #include "chrome/grit/generated_resources.h" |
9 #include "components/password_manager/core/common/password_manager_ui.h" | |
10 #include "ui/base/l10n/l10n_util.h" | 9 #include "ui/base/l10n/l10n_util.h" |
11 #include "ui/base/resource/resource_bundle.h" | 10 #include "ui/base/resource/resource_bundle.h" |
12 #include "ui/resources/grit/ui_resources.h" | 11 #include "ui/resources/grit/ui_resources.h" |
| 12 #include "ui/views/border.h" |
13 #include "ui/views/controls/button/button.h" | 13 #include "ui/views/controls/button/button.h" |
14 #include "ui/views/controls/button/image_button.h" | 14 #include "ui/views/controls/button/image_button.h" |
| 15 #include "ui/views/controls/label.h" |
| 16 #include "ui/views/controls/link.h" |
| 17 #include "ui/views/controls/link_listener.h" |
15 #include "ui/views/layout/fill_layout.h" | 18 #include "ui/views/layout/fill_layout.h" |
16 #include "ui/views/layout/grid_layout.h" | 19 #include "ui/views/layout/grid_layout.h" |
17 #include "ui/views/layout/layout_constants.h" | 20 #include "ui/views/layout/layout_constants.h" |
18 | 21 |
19 namespace { | 22 namespace { |
20 | 23 |
21 int FirstFieldWidth() { | 24 int FirstFieldWidth() { |
22 return std::max( | 25 return std::max( |
23 ManagePasswordsBubbleModel::UsernameFieldWidth(), | 26 ManagePasswordsBubbleModel::UsernameFieldWidth(), |
24 views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED)) | 27 views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED)) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 views::Label* label = new views::Label(form.password_value); | 85 views::Label* label = new views::Label(form.password_value); |
83 label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( | 86 label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
84 ui::ResourceBundle::SmallFont)); | 87 ui::ResourceBundle::SmallFont)); |
85 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 88 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
86 label->SetObscured(true); | 89 label->SetObscured(true); |
87 return label; | 90 return label; |
88 } | 91 } |
89 | 92 |
90 } // namespace | 93 } // namespace |
91 | 94 |
92 // Pending View | 95 // Render credentials in two columns: username and password. |
| 96 class ManagePasswordItemView::PendingView : public views::View { |
| 97 public: |
| 98 explicit PendingView(ManagePasswordItemView* parent); |
| 99 |
| 100 private: |
| 101 virtual ~PendingView(); |
| 102 }; |
| 103 |
93 ManagePasswordItemView::PendingView::PendingView( | 104 ManagePasswordItemView::PendingView::PendingView( |
94 ManagePasswordItemView* parent) { | 105 ManagePasswordItemView* parent) { |
95 views::GridLayout* layout = new views::GridLayout(this); | 106 views::GridLayout* layout = new views::GridLayout(this); |
96 SetLayoutManager(layout); | 107 SetLayoutManager(layout); |
97 | 108 |
98 BuildColumnSet(layout, TWO_COLUMN_SET); | 109 BuildColumnSet(layout, TWO_COLUMN_SET); |
99 layout->StartRowWithPadding( | 110 layout->StartRowWithPadding( |
100 0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); | 111 0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); |
101 layout->AddView(GenerateUsernameLabel(parent->password_form_)); | 112 layout->AddView(GenerateUsernameLabel(parent->password_form_)); |
102 layout->AddView(GeneratePasswordLabel(parent->password_form_)); | 113 layout->AddView(GeneratePasswordLabel(parent->password_form_)); |
103 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 114 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
104 } | 115 } |
105 | 116 |
106 ManagePasswordItemView::PendingView::~PendingView() { | 117 ManagePasswordItemView::PendingView::~PendingView() { |
107 } | 118 } |
108 | 119 |
109 // Manage View | 120 // Render credentials in three columns: username, password, and delete. |
| 121 class ManagePasswordItemView::ManageView : public views::View, |
| 122 public views::ButtonListener { |
| 123 public: |
| 124 explicit ManageView(ManagePasswordItemView* parent); |
| 125 |
| 126 private: |
| 127 virtual ~ManageView(); |
| 128 |
| 129 // views::ButtonListener: |
| 130 virtual void ButtonPressed(views::Button* sender, |
| 131 const ui::Event& event) OVERRIDE; |
| 132 |
| 133 views::ImageButton* delete_button_; |
| 134 ManagePasswordItemView* parent_; |
| 135 }; |
| 136 |
110 ManagePasswordItemView::ManageView::ManageView(ManagePasswordItemView* parent) | 137 ManagePasswordItemView::ManageView::ManageView(ManagePasswordItemView* parent) |
111 : parent_(parent) { | 138 : parent_(parent) { |
112 views::GridLayout* layout = new views::GridLayout(this); | 139 views::GridLayout* layout = new views::GridLayout(this); |
113 SetLayoutManager(layout); | 140 SetLayoutManager(layout); |
114 | 141 |
115 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 142 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
116 delete_button_ = new views::ImageButton(this); | 143 delete_button_ = new views::ImageButton(this); |
117 delete_button_->SetImage(views::ImageButton::STATE_NORMAL, | 144 delete_button_->SetImage(views::ImageButton::STATE_NORMAL, |
118 rb->GetImageNamed(IDR_CLOSE_2).ToImageSkia()); | 145 rb->GetImageNamed(IDR_CLOSE_2).ToImageSkia()); |
119 delete_button_->SetImage(views::ImageButton::STATE_HOVERED, | 146 delete_button_->SetImage(views::ImageButton::STATE_HOVERED, |
120 rb->GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); | 147 rb->GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); |
121 delete_button_->SetImage(views::ImageButton::STATE_PRESSED, | 148 delete_button_->SetImage(views::ImageButton::STATE_PRESSED, |
122 rb->GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); | 149 rb->GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); |
123 | 150 |
124 BuildColumnSet(layout, THREE_COLUMN_SET); | 151 BuildColumnSet(layout, THREE_COLUMN_SET); |
125 layout->StartRowWithPadding( | 152 layout->StartRowWithPadding( |
126 0, THREE_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); | 153 0, THREE_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); |
127 layout->AddView(GenerateUsernameLabel(parent->password_form_)); | 154 layout->AddView(GenerateUsernameLabel(parent->password_form_)); |
128 layout->AddView(GeneratePasswordLabel(parent->password_form_)); | 155 layout->AddView(GeneratePasswordLabel(parent->password_form_)); |
129 layout->AddView(delete_button_); | 156 layout->AddView(delete_button_); |
130 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 157 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
131 } | 158 } |
132 | 159 |
| 160 ManagePasswordItemView::ManageView::~ManageView() { |
| 161 } |
| 162 |
133 void ManagePasswordItemView::ManageView::ButtonPressed(views::Button* sender, | 163 void ManagePasswordItemView::ManageView::ButtonPressed(views::Button* sender, |
134 const ui::Event& event) { | 164 const ui::Event& event) { |
135 DCHECK_EQ(delete_button_, sender); | 165 DCHECK_EQ(delete_button_, sender); |
136 parent_->NotifyClickedDelete(); | 166 parent_->NotifyClickedDelete(); |
137 } | 167 } |
138 | 168 |
139 ManagePasswordItemView::ManageView::~ManageView() { | 169 // Render a notification to the user that a password has been removed, and |
140 } | 170 // offer an undo link. |
| 171 class ManagePasswordItemView::UndoView : public views::View, |
| 172 public views::LinkListener { |
| 173 public: |
| 174 explicit UndoView(ManagePasswordItemView* parent); |
141 | 175 |
142 // Undo View | 176 private: |
| 177 virtual ~UndoView(); |
| 178 |
| 179 // views::LinkListener: |
| 180 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; |
| 181 |
| 182 views::Link* undo_link_; |
| 183 ManagePasswordItemView* parent_; |
| 184 }; |
| 185 |
143 ManagePasswordItemView::UndoView::UndoView(ManagePasswordItemView* parent) | 186 ManagePasswordItemView::UndoView::UndoView(ManagePasswordItemView* parent) |
144 : parent_(parent) { | 187 : parent_(parent) { |
145 views::GridLayout* layout = new views::GridLayout(this); | 188 views::GridLayout* layout = new views::GridLayout(this); |
146 SetLayoutManager(layout); | 189 SetLayoutManager(layout); |
147 | 190 |
148 views::Label* text = | 191 views::Label* text = |
149 new views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED)); | 192 new views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED)); |
150 text->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 193 text->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
151 text->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( | 194 text->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
152 ui::ResourceBundle::SmallFont)); | 195 ui::ResourceBundle::SmallFont)); |
153 | 196 |
154 undo_link_ = | 197 undo_link_ = |
155 new views::Link(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO)); | 198 new views::Link(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO)); |
156 undo_link_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 199 undo_link_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
157 undo_link_->set_listener(this); | 200 undo_link_->set_listener(this); |
158 undo_link_->SetUnderline(false); | 201 undo_link_->SetUnderline(false); |
159 undo_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( | 202 undo_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
160 ui::ResourceBundle::SmallFont)); | 203 ui::ResourceBundle::SmallFont)); |
161 | 204 |
162 BuildColumnSet(layout, TWO_COLUMN_SET); | 205 BuildColumnSet(layout, TWO_COLUMN_SET); |
163 layout->StartRowWithPadding( | 206 layout->StartRowWithPadding( |
164 0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); | 207 0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing); |
165 layout->AddView(text); | 208 layout->AddView(text); |
166 layout->AddView(undo_link_); | 209 layout->AddView(undo_link_); |
167 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); | 210 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
168 } | 211 } |
169 | 212 |
| 213 ManagePasswordItemView::UndoView::~UndoView() { |
| 214 } |
| 215 |
170 void ManagePasswordItemView::UndoView::LinkClicked(views::Link* sender, | 216 void ManagePasswordItemView::UndoView::LinkClicked(views::Link* sender, |
171 int event_flags) { | 217 int event_flags) { |
172 DCHECK_EQ(undo_link_, sender); | 218 DCHECK_EQ(undo_link_, sender); |
173 parent_->NotifyClickedUndo(); | 219 parent_->NotifyClickedUndo(); |
174 } | 220 } |
175 | 221 |
176 ManagePasswordItemView::UndoView::~UndoView() { | |
177 } | |
178 | |
179 // ManagePasswordItemView | 222 // ManagePasswordItemView |
180 ManagePasswordItemView::ManagePasswordItemView( | 223 ManagePasswordItemView::ManagePasswordItemView( |
181 ManagePasswordsBubbleModel* manage_passwords_bubble_model, | 224 ManagePasswordsBubbleModel* manage_passwords_bubble_model, |
182 autofill::PasswordForm password_form, | 225 autofill::PasswordForm password_form, |
183 password_manager::ui::PasswordItemPosition position) | 226 password_manager::ui::PasswordItemPosition position) |
184 : model_(manage_passwords_bubble_model), | 227 : model_(manage_passwords_bubble_model), |
185 password_form_(password_form), | 228 password_form_(password_form), |
186 delete_password_(false) { | 229 delete_password_(false) { |
187 views::FillLayout* layout = new views::FillLayout(); | 230 views::FillLayout* layout = new views::FillLayout(); |
188 SetLayoutManager(layout); | 231 SetLayoutManager(layout); |
(...skipping 13 matching lines...) Expand all Loading... |
202 AddChildView(new PendingView(this)); | 245 AddChildView(new PendingView(this)); |
203 } else { | 246 } else { |
204 AddChildView(new ManageView(this)); | 247 AddChildView(new ManageView(this)); |
205 } | 248 } |
206 GetLayoutManager()->Layout(this); | 249 GetLayoutManager()->Layout(this); |
207 } | 250 } |
208 | 251 |
209 ManagePasswordItemView::~ManagePasswordItemView() { | 252 ManagePasswordItemView::~ManagePasswordItemView() { |
210 } | 253 } |
211 | 254 |
| 255 void ManagePasswordItemView::NotifyClickedDelete() { |
| 256 delete_password_ = true; |
| 257 Refresh(); |
| 258 } |
| 259 |
| 260 void ManagePasswordItemView::NotifyClickedUndo() { |
| 261 delete_password_ = false; |
| 262 Refresh(); |
| 263 } |
| 264 |
212 void ManagePasswordItemView::Refresh() { | 265 void ManagePasswordItemView::Refresh() { |
213 DCHECK(!password_manager::ui::IsPendingState(model_->state())); | 266 DCHECK(!password_manager::ui::IsPendingState(model_->state())); |
214 | 267 |
215 RemoveAllChildViews(true); | 268 RemoveAllChildViews(true); |
216 if (delete_password_) | 269 if (delete_password_) |
217 AddChildView(new UndoView(this)); | 270 AddChildView(new UndoView(this)); |
218 else | 271 else |
219 AddChildView(new ManageView(this)); | 272 AddChildView(new ManageView(this)); |
220 GetLayoutManager()->Layout(this); | 273 GetLayoutManager()->Layout(this); |
221 | 274 |
222 // After the view is consistent, notify the model that the password needs to | 275 // After the view is consistent, notify the model that the password needs to |
223 // be updated (either removed or put back into the store, as appropriate. | 276 // be updated (either removed or put back into the store, as appropriate. |
224 model_->OnPasswordAction(password_form_, | 277 model_->OnPasswordAction(password_form_, |
225 delete_password_ | 278 delete_password_ |
226 ? ManagePasswordsBubbleModel::REMOVE_PASSWORD | 279 ? ManagePasswordsBubbleModel::REMOVE_PASSWORD |
227 : ManagePasswordsBubbleModel::ADD_PASSWORD); | 280 : ManagePasswordsBubbleModel::ADD_PASSWORD); |
228 } | 281 } |
229 | |
230 void ManagePasswordItemView::NotifyClickedDelete() { | |
231 delete_password_ = true; | |
232 Refresh(); | |
233 } | |
234 | |
235 void ManagePasswordItemView::NotifyClickedUndo() { | |
236 delete_password_ = false; | |
237 Refresh(); | |
238 } | |
OLD | NEW |