manage_password_item_view.cc revision 010d83a9304c5a91596085d917d248abff47903a
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_password_item_view.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/password_manager/core/common/password_manager_ui.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "grit/generated_resources.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "grit/ui_resources.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/base/resource/resource_bundle.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/button.h"
144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/views/controls/button/image_button.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/layout/fill_layout.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/grid_layout.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/layout_constants.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)enum FieldType { USERNAME_FIELD, PASSWORD_FIELD };
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Upper limit on the size of the username and password fields.
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kUsernameFieldSize = 30;
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kPasswordFieldSize = 22;
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Returns the width of |type| field.
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int GetFieldWidth(FieldType type) {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return ui::ResourceBundle::GetSharedInstance()
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .GetFontList(ui::ResourceBundle::SmallFont)
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .GetExpectedTextWidth(type == USERNAME_FIELD ? kUsernameFieldSize
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                   : kPasswordFieldSize);
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int FirstFieldWidth() {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return std::max(
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetFieldWidth(USERNAME_FIELD),
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED))
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .GetPreferredSize()
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .width());
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int SecondFieldWidth() {
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return std::max(
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetFieldWidth(PASSWORD_FIELD),
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO))
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .GetPreferredSize()
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .width());
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)enum ColumnSets { TWO_COLUMN_SET = 0, THREE_COLUMN_SET };
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildColumnSet(views::GridLayout* layout, int column_set_id) {
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(column_set_id);
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The username/"Deleted!" field.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddColumn(views::GridLayout::FILL,
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::FILL,
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        0,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::FIXED,
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        FirstFieldWidth(),
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        FirstFieldWidth());
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The password/"Undo!" field.
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddColumn(views::GridLayout::FILL,
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::FILL,
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        1,
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::USE_PREF,
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        SecondFieldWidth(),
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        SecondFieldWidth());
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If we're in manage-mode, we need another column for the delete button.
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (column_set_id == THREE_COLUMN_SET) {
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    column_set->AddColumn(views::GridLayout::TRAILING,
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          views::GridLayout::FILL,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0,
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          views::GridLayout::USE_PREF,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0,
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0);
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)views::Label* GenerateUsernameLabel(const autofill::PasswordForm& form) {
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* label = new views::Label(form.username_value);
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return label;
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)views::Label* GeneratePasswordLabel(const autofill::PasswordForm& form) {
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* label = new views::Label(form.password_value);
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetObscured(true);
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return label;
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Pending View
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochManagePasswordItemView::PendingView::PendingView(
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ManagePasswordItemView* parent) {
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::GridLayout* layout = new views::GridLayout(this);
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetLayoutManager(layout);
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, TWO_COLUMN_SET);
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->StartRowWithPadding(
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GenerateUsernameLabel(parent->password_form_));
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GeneratePasswordLabel(parent->password_form_));
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::PendingView::~PendingView() {
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Manage View
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochManagePasswordItemView::ManageView::ManageView(ManagePasswordItemView* parent)
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : parent_(parent) {
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::GridLayout* layout = new views::GridLayout(this);
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetLayoutManager(layout);
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delete_button_ = new views::ImageButton(this);
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delete_button_->SetImage(views::ImageButton::STATE_NORMAL,
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           rb->GetImageNamed(IDR_CLOSE_2).ToImageSkia());
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delete_button_->SetImage(views::ImageButton::STATE_HOVERED,
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           rb->GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delete_button_->SetImage(views::ImageButton::STATE_PRESSED,
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           rb->GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, THREE_COLUMN_SET);
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->StartRowWithPadding(
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0, THREE_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GenerateUsernameLabel(parent->password_form_));
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GeneratePasswordLabel(parent->password_form_));
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddView(delete_button_);
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::ManageView::ButtonPressed(views::Button* sender,
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                       const ui::Event& event) {
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(delete_button_, sender);
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  parent_->NotifyClickedDelete();
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::ManageView::~ManageView() {
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Undo View
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochManagePasswordItemView::UndoView::UndoView(ManagePasswordItemView* parent)
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : parent_(parent) {
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::GridLayout* layout = new views::GridLayout(this);
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetLayoutManager(layout);
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::Label* text =
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED));
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  text->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_ =
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new views::Link(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO));
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->set_listener(this);
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->SetUnderline(false);
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  undo_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, TWO_COLUMN_SET);
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->StartRowWithPadding(
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddView(text);
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddView(undo_link_);
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::UndoView::LinkClicked(views::Link* sender,
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                   int event_flags) {
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(undo_link_, sender);
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  parent_->NotifyClickedUndo();
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::UndoView::~UndoView() {
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ManagePasswordItemView
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordItemView::ManagePasswordItemView(
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ManagePasswordsBubbleModel* manage_passwords_bubble_model,
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    autofill::PasswordForm password_form,
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Position position)
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : model_(manage_passwords_bubble_model),
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      password_form_(password_form),
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      delete_password_(false) {
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::FillLayout* layout = new views::FillLayout();
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetLayoutManager(layout);
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // When a password is displayed as the first item in a list, it has borders
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // on both the top and bottom. When it's in the middle of a list, or at the
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // end, it has a border only on the bottom.
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetBorder(views::Border::CreateSolidSidedBorder(
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      position == FIRST_ITEM ? 1 : 0,
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      1,
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetNativeTheme()->GetSystemColor(
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor)));
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (password_manager::ui::IsPendingState(model_->state())) {
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new PendingView(this));
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new ManageView(this));
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetLayoutManager()->Layout(this);
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::~ManagePasswordItemView() {
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordItemView::Refresh() {
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(!password_manager::ui::IsPendingState(model_->state()));
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RemoveAllChildViews(true);
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (delete_password_)
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new UndoView(this));
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  else
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new ManageView(this));
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetLayoutManager()->Layout(this);
235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // After the view is consistent, notify the model that the password needs to
237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // be updated (either removed or put back into the store, as appropriate.
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  model_->OnPasswordAction(password_form_,
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           delete_password_
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               ? ManagePasswordsBubbleModel::REMOVE_PASSWORD
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               : ManagePasswordsBubbleModel::ADD_PASSWORD);
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::NotifyClickedDelete() {
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delete_password_ = true;
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Refresh();
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::NotifyClickedUndo() {
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delete_password_ = false;
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Refresh();
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
253