manage_password_item_view.cc revision 4ad1aa43a48567659193a298fad74f55e00b3dd9
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)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "grit/generated_resources.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "grit/ui_resources.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/base/resource/resource_bundle.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/button.h"
124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/views/controls/button/image_button.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/grid_layout.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/layout_constants.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordItemView::ManagePasswordItemView(
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ManagePasswordsBubbleModel* manage_passwords_bubble_model,
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    autofill::PasswordForm password_form,
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int field_1_width,
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int field_2_width)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : manage_passwords_bubble_model_(manage_passwords_bubble_model),
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      password_form_(password_form),
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      delete_password_(false),
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      field_1_width_(field_1_width),
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      field_2_width_(field_2_width) {
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetLayoutManager(layout);
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int column_set_save_id = 0;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::ColumnSet* column_set_save = layout->AddColumnSet(column_set_save_id);
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_save->AddColumn(
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::FILL, 0,
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FIXED, field_1_width_, field_1_width_);
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_save->AddColumn(
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::FILL, 1,
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::USE_PREF, field_2_width_, field_2_width_);
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_save->AddPaddingColumn(0, views::kItemLabelSpacing);
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int column_set_manage_id = 1;
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::ColumnSet* column_set_manage =
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      layout->AddColumnSet(column_set_manage_id);
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_manage->AddPaddingColumn(0, views::kItemLabelSpacing);
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_manage->AddColumn(
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::FILL, 0,
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FIXED, field_1_width_, field_1_width_);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_manage->AddPaddingColumn(0, views::kItemLabelSpacing);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_manage->AddColumn(
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FILL, views::GridLayout::FILL, 1,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::USE_PREF, field_2_width_, field_2_width_);
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  column_set_manage->AddColumn(views::GridLayout::TRAILING,
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::GridLayout::FILL, 0, views::GridLayout::USE_PREF, 0, 0);
554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  column_set_manage->AddPaddingColumn(0, views::kItemLabelSpacing);
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manage_passwords_bubble_model_->manage_passwords_bubble_state() !=
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ManagePasswordsBubbleModel::PASSWORD_TO_BE_SAVED)
594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    layout->StartRowWithPadding(0, column_set_manage_id,
604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                0, views::kRelatedControlVerticalSpacing);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    layout->StartRowWithPadding(0, column_set_save_id,
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                                0, views::kRelatedControlVerticalSpacing);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  label_1_ = new views::Label(password_form_.username_value);
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  label_1_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  label_2_ =
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new views::Link(GetPasswordDisplayString(password_form_.password_value));
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  label_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  label_2_->set_listener(this);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  label_2_->SetFocusable(false);
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  label_2_->SetEnabled(false);
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  label_2_->SetUnderline(false);
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  delete_button_ = new views::ImageButton(this);
774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  delete_button_->SetImage(views::ImageButton::STATE_NORMAL,
784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           rb->GetImageNamed(IDR_CLOSE_2).ToImageSkia());
794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  delete_button_->SetImage(views::ImageButton::STATE_HOVERED,
804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           rb->GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  delete_button_->SetImage(views::ImageButton::STATE_PRESSED,
824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           rb->GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddView(label_1_, 1, 1,
854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                  views::GridLayout::FILL, views::GridLayout::FILL);
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddView(label_2_, 1, 1,
874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                  views::GridLayout::FILL, views::GridLayout::FILL);
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manage_passwords_bubble_model_->manage_passwords_bubble_state() !=
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ManagePasswordsBubbleModel::PASSWORD_TO_BE_SAVED) {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    layout->AddView(delete_button_, 1, 1,
924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                    views::GridLayout::FILL, views::GridLayout::FILL);
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ManagePasswordItemView::GetPasswordDisplayString(
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& password) {
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const wchar_t kPasswordBullet = 0x2022;
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const size_t kMaxPasswordChar = 22;
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16(std::min(password.length(), kMaxPasswordChar),
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  kPasswordBullet);
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordItemView::~ManagePasswordItemView() {
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (delete_password_)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    manage_passwords_bubble_model_->DeleteFromBestMatches(password_form_);
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordItemView::Refresh() {
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (delete_password_) {
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_1_->SetText(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED));
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_2_->SetText(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO));
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_2_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    label_2_->SetEnabled(true);
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    delete_button_->SetVisible(false);
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    manage_passwords_bubble_model_->OnPasswordAction(password_form_, true);
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_1_->SetText(password_form_.username_value);
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_2_->SetText(GetPasswordDisplayString(password_form_.password_value));
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    label_2_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    label_2_->SetEnabled(false);
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    delete_button_->SetVisible(true);
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    manage_passwords_bubble_model_->OnPasswordAction(password_form_, false);
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordItemView::ButtonPressed(views::Button* sender,
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           const ui::Event& event) {
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK_EQ(delete_button_, sender);
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delete_password_ = true;
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Refresh();
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ManagePasswordItemView::LinkClicked(views::Link* source,
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         int event_flags) {
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK_EQ(source, label_2_);
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delete_password_ = false;
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Refresh();
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
142