manage_password_item_view.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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/views/controls/button/button.h"
11#include "ui/views/controls/button/label_button.h"
12#include "ui/views/layout/grid_layout.h"
13#include "ui/views/layout/layout_constants.h"
14
15ManagePasswordItemView::ManagePasswordItemView(
16    ManagePasswordsBubbleModel* manage_passwords_bubble_model,
17    autofill::PasswordForm password_form,
18    int field_1_width,
19    int field_2_width)
20    : manage_passwords_bubble_model_(manage_passwords_bubble_model),
21      password_form_(password_form),
22      delete_password_(false),
23      field_1_width_(field_1_width),
24      field_2_width_(field_2_width) {
25  views::GridLayout* layout = new views::GridLayout(this);
26  ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
27  SetLayoutManager(layout);
28
29  const int column_set_save_id = 0;
30  views::ColumnSet* column_set_save = layout->AddColumnSet(column_set_save_id);
31  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
32  column_set_save->AddColumn(
33      views::GridLayout::FILL, views::GridLayout::FILL, 0,
34      views::GridLayout::FIXED, field_1_width_, field_1_width_);
35  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
36  column_set_save->AddColumn(
37      views::GridLayout::FILL, views::GridLayout::FILL, 1,
38      views::GridLayout::USE_PREF, field_2_width_, field_2_width_);
39  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
40
41  const int column_set_manage_id = 1;
42  views::ColumnSet* column_set_manage =
43      layout->AddColumnSet(column_set_manage_id);
44  column_set_manage->AddPaddingColumn(0, views::kItemLabelSpacing);
45  column_set_manage->AddColumn(
46      views::GridLayout::FILL, views::GridLayout::FILL, 0,
47      views::GridLayout::FIXED, field_1_width_, field_1_width_);
48  column_set_manage->AddPaddingColumn(0, views::kItemLabelSpacing);
49  column_set_manage->AddColumn(
50      views::GridLayout::FILL, views::GridLayout::FILL, 1,
51      views::GridLayout::USE_PREF, field_2_width_, field_2_width_);
52  column_set_manage->AddColumn(views::GridLayout::TRAILING,
53      views::GridLayout::FILL, 0, views::GridLayout::USE_PREF, 0, 0);
54
55  if (manage_passwords_bubble_model_->manage_passwords_bubble_state() !=
56      ManagePasswordsBubbleModel::PASSWORD_TO_BE_SAVED)
57    layout->StartRow(0, column_set_manage_id);
58  else
59    layout->StartRow(0, column_set_save_id);
60
61  label_1_ = new views::Label(password_form_.username_value);
62  label_1_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
63
64  label_2_ =
65      new views::Link(GetPasswordDisplayString(password_form_.password_value));
66  label_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
67  label_2_->set_listener(this);
68  label_2_->set_focusable(false);
69  label_2_->SetEnabled(false);
70  label_2_->SetUnderline(false);
71
72  delete_button_ = new views::LabelButton(this, base::string16());
73  delete_button_->SetStyle(views::Button::STYLE_TEXTBUTTON);
74  delete_button_->SetImage(views::Button::STATE_NORMAL,
75                           *rb->GetImageSkiaNamed(IDR_CLOSE_2));
76  const int delete_button_height = delete_button_->GetPreferredSize().height();
77
78  layout->AddView(label_1_, 1, 1,
79                  views::GridLayout::FILL, views::GridLayout::FILL,
80                  -1, delete_button_height);
81  layout->AddView(label_2_, 1, 1,
82                  views::GridLayout::FILL, views::GridLayout::FILL,
83                  -1, delete_button_height);
84
85  if (manage_passwords_bubble_model_->manage_passwords_bubble_state() !=
86      ManagePasswordsBubbleModel::PASSWORD_TO_BE_SAVED) {
87    layout->AddView(delete_button_, 1, 1,
88                    views::GridLayout::FILL, views::GridLayout::FILL,
89                    -1, delete_button_height);
90  }
91}
92
93// static
94string16 ManagePasswordItemView::GetPasswordDisplayString(
95    const base::string16& password) {
96  const wchar_t kPasswordBullet = 0x2022;
97  const size_t kMaxPasswordChar = 22;
98  return base::string16(std::min(password.length(), kMaxPasswordChar),
99                  kPasswordBullet);
100}
101
102ManagePasswordItemView::~ManagePasswordItemView() {
103  if (delete_password_)
104    manage_passwords_bubble_model_->DeleteFromBestMatches(password_form_);
105}
106
107void ManagePasswordItemView::Refresh() {
108  if (delete_password_) {
109    label_1_->SetText(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED));
110    label_2_->SetText(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO));
111    label_2_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
112    label_2_->SetEnabled(true);
113    delete_button_->SetVisible(false);
114    manage_passwords_bubble_model_->OnPasswordAction(password_form_, true);
115  } else {
116    label_1_->SetText(password_form_.username_value);
117    label_2_->SetText(GetPasswordDisplayString(password_form_.password_value));
118    label_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
119    label_2_->SetEnabled(false);
120    delete_button_->SetVisible(true);
121    manage_passwords_bubble_model_->OnPasswordAction(password_form_, false);
122  }
123}
124
125void ManagePasswordItemView::ButtonPressed(views::Button* sender,
126                                           const ui::Event& event) {
127  DCHECK_EQ(delete_button_, sender);
128  delete_password_ = true;
129  Refresh();
130}
131
132void ManagePasswordItemView::LinkClicked(views::Link* source,
133                                         int event_flags) {
134  DCHECK_EQ(source, label_2_);
135  delete_password_ = false;
136  Refresh();
137}
138