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"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/base/resource/resource_bundle.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/border.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/button.h"
144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/views/controls/button/image_button.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/label.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link_listener.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/layout/fill_layout.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/grid_layout.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/layout_constants.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum ColumnSets {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TWO_COLUMN_SET,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  THREE_COLUMN_SET
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildColumnSet(views::GridLayout* layout, int column_set_id) {
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(column_set_id);
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The username/"Deleted!" field.
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddColumn(views::GridLayout::FILL,
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::FILL,
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        2,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        views::GridLayout::USE_PREF,
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        0,
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        0);
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The password/"Undo!" field.
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddColumn(views::GridLayout::FILL,
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::FILL,
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        1,
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        views::GridLayout::USE_PREF,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        0,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        0);
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If we're in manage-mode, we need another column for the delete button.
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (column_set_id == THREE_COLUMN_SET) {
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    column_set->AddColumn(views::GridLayout::TRAILING,
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          views::GridLayout::FILL,
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0,
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          views::GridLayout::USE_PREF,
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0,
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          0);
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kItemLabelSpacing);
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)views::Label* GenerateUsernameLabel(const autofill::PasswordForm& form) {
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* label = new views::Label(form.username_value);
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return label;
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)views::Label* GeneratePasswordLabel(const autofill::PasswordForm& form) {
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* label = new views::Label(form.password_value);
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  label->SetObscured(true);
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return label;
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Render credentials in two columns: username and password.
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordItemView::PendingView : public views::View {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit PendingView(ManagePasswordItemView* parent);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~PendingView();
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochManagePasswordItemView::PendingView::PendingView(
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ManagePasswordItemView* parent) {
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::GridLayout* layout = new views::GridLayout(this);
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetLayoutManager(layout);
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, TWO_COLUMN_SET);
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->StartRowWithPadding(
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GenerateUsernameLabel(parent->password_form_));
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(GeneratePasswordLabel(parent->password_form_));
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::PendingView::~PendingView() {
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Render credentials in three columns: username, password, and delete.
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordItemView::ManageView : public views::View,
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           public views::ButtonListener {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit ManageView(ManagePasswordItemView* parent);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ManageView();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::ImageButton* delete_button_;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordItemView* parent_;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
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
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordItemView::ManageView::~ManageView() {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::ManageView::ButtonPressed(views::Button* sender,
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                       const ui::Event& event) {
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(delete_button_, sender);
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  parent_->NotifyClickedDelete();
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Render a notification to the user that a password has been removed, and
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// offer an undo link.
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordItemView::UndoView : public views::View,
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         public views::LinkListener {
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit UndoView(ManagePasswordItemView* parent);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~UndoView();
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::LinkListener:
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::Link* undo_link_;
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordItemView* parent_;
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochManagePasswordItemView::UndoView::UndoView(ManagePasswordItemView* parent)
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : parent_(parent) {
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::GridLayout* layout = new views::GridLayout(this);
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetLayoutManager(layout);
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::Label* text =
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED));
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  text->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_ =
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new views::Link(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO));
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->set_listener(this);
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  undo_link_->SetUnderline(false);
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  undo_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, TWO_COLUMN_SET);
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->StartRowWithPadding(
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0, TWO_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddView(text);
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddView(undo_link_);
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordItemView::UndoView::~UndoView() {
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ManagePasswordItemView::UndoView::LinkClicked(views::Link* sender,
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                   int event_flags) {
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK_EQ(undo_link_, sender);
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  parent_->NotifyClickedUndo();
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ManagePasswordItemView
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordItemView::ManagePasswordItemView(
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ManagePasswordsBubbleModel* manage_passwords_bubble_model,
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const autofill::PasswordForm& password_form,
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    password_manager::ui::PasswordItemPosition position)
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : model_(manage_passwords_bubble_model),
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      password_form_(password_form),
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      delete_password_(false) {
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::FillLayout* layout = new views::FillLayout();
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetLayoutManager(layout);
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // When a password is displayed as the first item in a list, it has borders
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // on both the top and bottom. When it's in the middle of a list, or at the
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // end, it has a border only on the bottom.
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetBorder(views::Border::CreateSolidSidedBorder(
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      position == password_manager::ui::FIRST_ITEM ? 1 : 0,
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      1,
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      0,
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetNativeTheme()->GetSystemColor(
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ui::NativeTheme::kColorId_EnabledMenuButtonBorderColor)));
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (password_manager::ui::IsPendingState(model_->state())) {
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new PendingView(this));
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new ManageView(this));
235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetLayoutManager()->Layout(this);
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordItemView::~ManagePasswordItemView() {
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordItemView::NotifyClickedDelete() {
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delete_password_ = true;
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Refresh();
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordItemView::NotifyClickedUndo() {
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delete_password_ = false;
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Refresh();
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordItemView::Refresh() {
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(!password_manager::ui::IsPendingState(model_->state()));
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RemoveAllChildViews(true);
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (delete_password_)
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new UndoView(this));
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  else
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    AddChildView(new ManageView(this));
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetLayoutManager()->Layout(this);
261e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
262e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // After the view is consistent, notify the model that the password needs to
263e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // be updated (either removed or put back into the store, as appropriate.
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  model_->OnPasswordAction(password_form_,
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           delete_password_
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               ? ManagePasswordsBubbleModel::REMOVE_PASSWORD
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               : ManagePasswordsBubbleModel::ADD_PASSWORD);
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
269