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