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