manage_password_item_view.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/passwords/manage_password_item_view.h"
6
7#include "grit/generated_resources.h"
8#include "grit/ui_resources.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/views/controls/button/button.h"
12#include "ui/views/controls/button/image_button.h"
13#include "ui/views/layout/fill_layout.h"
14#include "ui/views/layout/grid_layout.h"
15#include "ui/views/layout/layout_constants.h"
16
17// Pending View
18ManagePasswordItemView::PendingView::PendingView(
19    ManagePasswordItemView* parent) {
20  views::GridLayout* layout = new views::GridLayout(this);
21  SetLayoutManager(layout);
22
23  parent->BuildColumnSet(layout, TWO_COLUMN_SET);
24  layout->StartRowWithPadding(
25      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
26  layout->AddView(parent->GenerateUsernameLabel());
27  layout->AddView(parent->GeneratePasswordLabel());
28  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
29}
30
31ManagePasswordItemView::PendingView::~PendingView() {}
32
33// Manage View
34ManagePasswordItemView::ManageView::ManageView(ManagePasswordItemView* parent)
35    : parent_(parent) {
36  views::GridLayout* layout = new views::GridLayout(this);
37  SetLayoutManager(layout);
38
39  ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
40  delete_button_ = new views::ImageButton(this);
41  delete_button_->SetImage(views::ImageButton::STATE_NORMAL,
42                           rb->GetImageNamed(IDR_CLOSE_2).ToImageSkia());
43  delete_button_->SetImage(views::ImageButton::STATE_HOVERED,
44                           rb->GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
45  delete_button_->SetImage(views::ImageButton::STATE_PRESSED,
46                           rb->GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
47
48  parent->BuildColumnSet(layout, THREE_COLUMN_SET);
49  layout->StartRowWithPadding(
50      0, THREE_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
51  layout->AddView(parent->GenerateUsernameLabel());
52  layout->AddView(parent->GeneratePasswordLabel());
53  layout->AddView(delete_button_);
54  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
55}
56
57void ManagePasswordItemView::ManageView::ButtonPressed(views::Button* sender,
58                                                       const ui::Event& event) {
59  DCHECK_EQ(delete_button_, sender);
60  parent_->NotifyClickedDelete();
61}
62
63ManagePasswordItemView::ManageView::~ManageView() {}
64
65// Undo View
66ManagePasswordItemView::UndoView::UndoView(ManagePasswordItemView* parent)
67    : parent_(parent) {
68  views::GridLayout* layout = new views::GridLayout(this);
69  SetLayoutManager(layout);
70
71  views::Label* text =
72      new views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED));
73  text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
74
75  undo_link_ =
76      new views::Link(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO));
77  undo_link_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
78  undo_link_->set_listener(this);
79  undo_link_->SetUnderline(false);
80
81  parent->BuildColumnSet(layout, TWO_COLUMN_SET);
82  layout->StartRowWithPadding(
83      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
84  layout->AddView(text);
85  layout->AddView(undo_link_);
86  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
87}
88
89void ManagePasswordItemView::UndoView::LinkClicked(views::Link* sender,
90                                                   int event_flags) {
91  DCHECK_EQ(undo_link_, sender);
92  parent_->NotifyClickedUndo();
93}
94
95ManagePasswordItemView::UndoView::~UndoView() {}
96
97// ManagePasswordItemView
98ManagePasswordItemView::ManagePasswordItemView(
99    ManagePasswordsBubbleModel* manage_passwords_bubble_model,
100    autofill::PasswordForm password_form,
101    int field_1_width,
102    int field_2_width,
103    Position position)
104    : manage_passwords_bubble_model_(manage_passwords_bubble_model),
105      password_form_(password_form),
106      delete_password_(false),
107      field_1_width_(field_1_width),
108      field_2_width_(field_2_width) {
109  views::FillLayout* layout = new views::FillLayout();
110  SetLayoutManager(layout);
111
112  // When a password is displayed as the first item in a list, it has borders
113  // on both the top and bottom. When it's in the middle of a list, or at the
114  // end, it has a border only on the bottom.
115  SetBorder(views::Border::CreateSolidSidedBorder(
116      position == FIRST_ITEM ? 1 : 0,
117      0,
118      1,
119      0,
120      GetNativeTheme()->GetSystemColor(
121          ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor)));
122
123  if (manage_passwords_bubble_model_->WaitingToSavePassword())
124    AddChildView(new PendingView(this));
125  else
126    AddChildView(new ManageView(this));
127  GetLayoutManager()->Layout(this);
128}
129
130ManagePasswordItemView::~ManagePasswordItemView() {
131  if (delete_password_)
132    manage_passwords_bubble_model_->DeleteFromBestMatches(password_form_);
133}
134
135void ManagePasswordItemView::BuildColumnSet(views::GridLayout* layout,
136                                            int column_set_id) {
137  views::ColumnSet* column_set = layout->AddColumnSet(column_set_id);
138
139  // The username/"Deleted!" field.
140  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
141  column_set->AddColumn(views::GridLayout::FILL,
142                        views::GridLayout::FILL,
143                        0,
144                        views::GridLayout::FIXED,
145                        field_1_width_,
146                        field_1_width_);
147
148  // The password/"Undo!" field.
149  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
150  column_set->AddColumn(views::GridLayout::FILL,
151                        views::GridLayout::FILL,
152                        1,
153                        views::GridLayout::USE_PREF,
154                        field_2_width_,
155                        field_2_width_);
156
157  // If we're in manage-mode, we need another column for the delete button.
158  if (column_set_id == THREE_COLUMN_SET) {
159    column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
160    column_set->AddColumn(views::GridLayout::TRAILING,
161                          views::GridLayout::FILL,
162                          0,
163                          views::GridLayout::USE_PREF,
164                          0,
165                          0);
166  }
167  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
168}
169
170views::Label* ManagePasswordItemView::GenerateUsernameLabel() const {
171  views::Label* label = new views::Label(password_form_.username_value);
172  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
173      ui::ResourceBundle::SmallFont));
174  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
175  return label;
176}
177
178views::Label* ManagePasswordItemView::GeneratePasswordLabel() const {
179  views::Label* label = new views::Label(password_form_.password_value);
180  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
181      ui::ResourceBundle::SmallFont));
182  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
183  label->SetObscured(true);
184  return label;
185}
186
187void ManagePasswordItemView::Refresh() {
188  DCHECK(!manage_passwords_bubble_model_->WaitingToSavePassword());
189
190  RemoveAllChildViews(true);
191  if (delete_password_)
192    AddChildView(new UndoView(this));
193  else
194    AddChildView(new ManageView(this));
195  GetLayoutManager()->Layout(this);
196
197  // After the view is consistent, notify the model that the password needs to
198  // be updated (either removed or put back into the store, as appropriate.
199  manage_passwords_bubble_model_->OnPasswordAction(
200      password_form_,
201      delete_password_ ? ManagePasswordsBubbleModel::REMOVE_PASSWORD
202                       : ManagePasswordsBubbleModel::ADD_PASSWORD);
203}
204
205void ManagePasswordItemView::NotifyClickedDelete() {
206  delete_password_ = true;
207  Refresh();
208}
209
210void ManagePasswordItemView::NotifyClickedUndo() {
211  delete_password_ = false;
212  Refresh();
213}
214