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_passwords_bubble_view.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/passwords/save_password_refusal_combobox_model.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_password_item_view.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/render_view_host.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/web_contents.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/base/resource/resource_bundle.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/blue_button.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/controls/combobox/combobox.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/combobox/combobox_listener.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/link_listener.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/controls/styled_label.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/styled_label_listener.h"
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/grid_layout.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/layout/layout_constants.h"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Helpers --------------------------------------------------------------------
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kDesiredBubbleWidth = 370;
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)enum ColumnSetType {
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // | | (FILL, FILL) | |
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Used for the bubble's header, the credentials list, and for simple
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // messages like "No passwords".
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SINGLE_VIEW_COLUMN_SET = 0,
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | |
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Used for buttons at the bottom of the bubble which should nest at the
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // bottom-right corner.
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DOUBLE_BUTTON_COLUMN_SET = 1,
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // | | (LEADING, CENTER) | | (TRAILING, CENTER) | |
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Used for buttons at the bottom of the bubble which should occupy
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // the corners.
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LINK_BUTTON_COLUMN_SET = 2,
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // | | (TRAILING, CENTER) | |
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Used when there is only one button which should next at the bottom-right
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // corner.
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SINGLE_BUTTON_COLUMN_SET = 3,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Construct an appropriate ColumnSet for the given |type|, and add it
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// to |layout|.
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildColumnSet(views::GridLayout* layout, ColumnSetType type) {
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(type);
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  int full_width = kDesiredBubbleWidth - (2 * views::kPanelHorizMargin);
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (type) {
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SINGLE_VIEW_COLUMN_SET:
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::FILL,
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::FILL,
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            views::GridLayout::FIXED,
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            full_width,
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0);
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case DOUBLE_BUTTON_COLUMN_SET:
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::TRAILING,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::CENTER,
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::USE_PREF,
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::TRAILING,
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::CENTER,
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::USE_PREF,
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0);
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case LINK_BUTTON_COLUMN_SET:
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::LEADING,
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::CENTER,
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::USE_PREF,
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0);
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::TRAILING,
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::CENTER,
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            views::GridLayout::USE_PREF,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0);
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case SINGLE_BUTTON_COLUMN_SET:
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      column_set->AddColumn(views::GridLayout::TRAILING,
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            views::GridLayout::CENTER,
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            1,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            views::GridLayout::USE_PREF,
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            0,
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            0);
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Given a layout and a model, add an appropriate title using a
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// SINGLE_VIEW_COLUMN_SET, followed by a spacer row.
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) {
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* title_label = new views::Label(model->title());
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  title_label->SetMultiLine(true);
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::MediumFont));
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Add the title to the layout with appropriate padding.
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRowWithPadding(
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(title_label);
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Globals --------------------------------------------------------------------
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace chrome {
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ShowManagePasswordsBubble(content::WebContents* web_contents) {
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ManagePasswordsBubbleView::IsShowing()) {
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // The bubble is currently shown for some other tab. We should close it now
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // and open for |web_contents|.
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ManagePasswordsBubbleView::CloseBubble();
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ManagePasswordsUIController* controller =
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ManagePasswordsUIController::FromWebContents(web_contents);
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ManagePasswordsBubbleView::ShowBubble(
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      web_contents,
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      password_manager::ui::IsAutomaticDisplayState(controller->state())
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ? ManagePasswordsBubbleView::AUTOMATIC
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          : ManagePasswordsBubbleView::USER_ACTION);
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CloseManagePasswordsBubble(content::WebContents* web_contents) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ManagePasswordsBubbleView::IsShowing())
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* bubble_web_contents =
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ManagePasswordsBubbleView::manage_password_bubble()->web_contents();
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (web_contents == bubble_web_contents)
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagePasswordsBubbleView::CloseBubble();
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace chrome
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::PendingView -------------------------------------
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to save credentials. Contains a
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// single ManagePasswordItemView, along with a "Save Passwords" button
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// and a rejection combobox.
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::PendingView : public views::View,
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               public views::ButtonListener,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               public views::ComboboxListener {
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit PendingView(ManagePasswordsBubbleView* parent);
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~PendingView();
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Handles the event when the user changes an index of a combobox.
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnPerformAction(views::Combobox* source) OVERRIDE;
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* parent_;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::BlueButton* save_button_;
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The combobox doesn't take ownership of its model. If we created a
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // combobox we need to ensure that we delete the model here, and because the
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // combobox uses the model in it's destructor, we need to make sure we
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // delete the model _after_ the combobox itself is deleted.
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<SavePasswordRefusalComboboxModel> combobox_model_;
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<views::Combobox> refuse_combobox_;
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::PendingView::PendingView(
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ManagePasswordsBubbleView* parent)
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : parent_(parent) {
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetLayoutManager(layout);
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Create the pending credential item, save button and refusal combobox.
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ManagePasswordItemView* item =
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new ManagePasswordItemView(parent->model(),
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                 parent->model()->pending_credentials(),
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                 password_manager::ui::FIRST_ITEM);
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  save_button_ = new views::BlueButton(
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  save_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  combobox_model_.reset(new SavePasswordRefusalComboboxModel());
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  refuse_combobox_.reset(new views::Combobox(combobox_model_.get()));
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  refuse_combobox_->set_listener(this);
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(mkwst): Need a mechanism to pipe a font list down into a combobox.
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Title row.
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddTitleRow(layout, parent_->model());
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Credential row.
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(item);
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Button row.
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRowWithPadding(
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(save_button_);
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(refuse_combobox_.get());
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Extra padding for visual awesomeness.
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->set_initially_focused_view(save_button_);
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::PendingView::~PendingView() {
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::PendingView::ButtonPressed(
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    views::Button* sender,
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::Event& event) {
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(sender == save_button_);
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->model()->OnSaveClicked();
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->Close();
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::PendingView::OnPerformAction(
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    views::Combobox* source) {
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_EQ(source, refuse_combobox_);
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (refuse_combobox_->selected_index()) {
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SavePasswordRefusalComboboxModel::INDEX_NOPE:
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      parent_->model()->OnNopeClicked();
2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      parent_->Close();
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      parent_->NotifyNeverForThisSiteClicked();
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// ManagePasswordsBubbleView::ConfirmNeverView ---------------------------------
2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to undo her decision to never save
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// passwords for a particular site.
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::ConfirmNeverView
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public views::View,
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public views::ButtonListener {
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit ConfirmNeverView(ManagePasswordsBubbleView* parent);
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ConfirmNeverView();
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* parent_;
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::LabelButton* confirm_button_;
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::LabelButton* undo_button_;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ManagePasswordsBubbleView::ConfirmNeverView::ConfirmNeverView(
2946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ManagePasswordsBubbleView* parent)
2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    : parent_(parent) {
2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
2976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetLayoutManager(layout);
2996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Title row.
3016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
3026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  views::Label* title_label = new views::Label(l10n_util::GetStringUTF16(
3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_TITLE));
3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  title_label->SetMultiLine(true);
3066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
3076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      ui::ResourceBundle::MediumFont));
3086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->StartRowWithPadding(
3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddView(title_label);
3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Confirmation text.
3146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  views::Label* confirmation = new views::Label(l10n_util::GetStringUTF16(
3156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_TEXT));
3166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirmation->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirmation->SetMultiLine(true);
3186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirmation->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
3196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      ui::ResourceBundle::SmallFont));
3206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddView(confirmation);
3226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Confirm and undo buttons.
3256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
3266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->StartRowWithPadding(
3276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirm_button_ = new views::LabelButton(
3306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      this,
3316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      l10n_util::GetStringUTF16(
3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          IDS_MANAGE_PASSWORDS_BLACKLIST_CONFIRMATION_BUTTON));
3336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirm_button_->SetStyle(views::Button::STYLE_BUTTON);
3346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  confirm_button_->SetFontList(
3356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      ui::ResourceBundle::GetSharedInstance().GetFontList(
3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          ui::ResourceBundle::SmallFont));
3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddView(confirm_button_);
3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  undo_button_ =
3406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_CANCEL));
3416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  undo_button_->SetStyle(views::Button::STYLE_BUTTON);
3426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  undo_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      ui::ResourceBundle::SmallFont));
3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddView(undo_button_);
3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Extra padding for visual awesomeness.
3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->set_initially_focused_view(confirm_button_);
3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ManagePasswordsBubbleView::ConfirmNeverView::~ConfirmNeverView() {
3536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::ConfirmNeverView::ButtonPressed(
3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    views::Button* sender,
3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const ui::Event& event) {
3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(sender == confirm_button_ || sender == undo_button_);
3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (sender == confirm_button_)
3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    parent_->NotifyConfirmedNeverForThisSite();
3616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  else
3626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    parent_->NotifyUndoNeverForThisSite();
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::ManageView --------------------------------------
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user a list of her currently saved credentials
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// for the current page, along with a "Manage passwords" link and a
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// "Done" button.
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::ManageView : public views::View,
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              public views::ButtonListener,
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              public views::LinkListener {
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit ManageView(ManagePasswordsBubbleView* parent);
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ManageView();
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::LinkListener:
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* parent_;
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::Link* manage_link_;
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::LabelButton* done_button_;
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::ManageView::ManageView(
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ManagePasswordsBubbleView* parent)
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : parent_(parent) {
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetLayoutManager(layout);
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Add the title.
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddTitleRow(layout, parent_->model());
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If we have a list of passwords to store for the current site, display
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // them to the user for management. Otherwise, render a "No passwords for
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // this site" message.
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!parent_->model()->best_matches().empty()) {
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (autofill::ConstPasswordFormMap::const_iterator i(
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             parent_->model()->best_matches().begin());
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         i != parent_->model()->best_matches().end();
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         ++i) {
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ManagePasswordItemView* item = new ManagePasswordItemView(
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          parent_->model(),
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          *i->second,
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          i == parent_->model()->best_matches().begin()
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              ? password_manager::ui::FIRST_ITEM
4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              : password_manager::ui::SUBSEQUENT_ITEM);
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      layout->AddView(item);
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    views::Label* empty_label = new views::Label(
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    empty_label->SetMultiLine(true);
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    empty_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    empty_label->SetFontList(
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ui::ResourceBundle::GetSharedInstance().GetFontList(
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            ui::ResourceBundle::SmallFont));
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layout->AddView(empty_label);
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Then add the "manage passwords" link and "Done" button.
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_link_ = new views::Link(parent_->model()->manage_link());
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_link_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_link_->SetUnderline(false);
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  manage_link_->set_listener(this);
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_ =
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_->SetStyle(views::Button::STYLE_BUTTON);
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRowWithPadding(
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(manage_link_);
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(done_button_);
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Extra padding for visual awesomeness.
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->set_initially_focused_view(done_button_);
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::ManageView::~ManageView() {
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::ManageView::ButtonPressed(
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    views::Button* sender,
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::Event& event) {
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(sender == done_button_);
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->model()->OnDoneClicked();
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->Close();
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::ManageView::LinkClicked(views::Link* source,
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                        int event_flags) {
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_EQ(source, manage_link_);
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->model()->OnManageLinkClicked();
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->Close();
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ManagePasswordsBubbleView::BlacklistedView ---------------------------------
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view offering the user the ability to re-enable the password manager for
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// a specific site after she's decided to "never save passwords".
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::BlacklistedView
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public views::View,
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public views::ButtonListener {
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit BlacklistedView(ManagePasswordsBubbleView* parent);
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~BlacklistedView();
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* parent_;
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::BlueButton* unblacklist_button_;
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::LabelButton* done_button_;
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::BlacklistedView::BlacklistedView(
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ManagePasswordsBubbleView* parent)
502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : parent_(parent) {
503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetLayoutManager(layout);
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Add the title.
508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddTitleRow(layout, parent_->model());
510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Add the "Hey! You blacklisted this site!" text.
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  views::Label* blacklisted = new views::Label(
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_BLACKLISTED));
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blacklisted->SetMultiLine(true);
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blacklisted->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(blacklisted);
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Then add the "enable password manager" and "Done" buttons.
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  unblacklist_button_ = new views::BlueButton(
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UNBLACKLIST_BUTTON));
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  unblacklist_button_->SetFontList(
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::GetSharedInstance().GetFontList(
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ui::ResourceBundle::SmallFont));
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_ =
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_->SetStyle(views::Button::STYLE_BUTTON);
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  done_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->StartRowWithPadding(
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(unblacklist_button_);
537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddView(done_button_);
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Extra padding for visual awesomeness.
540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->set_initially_focused_view(unblacklist_button_);
543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ManagePasswordsBubbleView::BlacklistedView::~BlacklistedView() {
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagePasswordsBubbleView::BlacklistedView::ButtonPressed(
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    views::Button* sender,
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::Event& event) {
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (sender == done_button_)
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    parent_->model()->OnDoneClicked();
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else if (sender == unblacklist_button_)
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    parent_->model()->OnUnblacklistClicked();
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    NOTREACHED();
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parent_->Close();
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// ManagePasswordsBubbleView::SaveConfirmationView ----------------------------
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A view confirming to the user that a password was saved and offering a link
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// to the Google account manager.
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::SaveConfirmationView
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public views::View,
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public views::ButtonListener,
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public views::StyledLabelListener {
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit SaveConfirmationView(ManagePasswordsBubbleView* parent);
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~SaveConfirmationView();
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::ButtonListener:
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ButtonPressed(views::Button* sender,
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const ui::Event& event) OVERRIDE;
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::StyledLabelListener implementation
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void StyledLabelLinkClicked(const gfx::Range& range,
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      int event_flags) OVERRIDE;
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* parent_;
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::LabelButton* ok_button_;
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ManagePasswordsBubbleView::SaveConfirmationView::SaveConfirmationView(
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ManagePasswordsBubbleView* parent)
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : parent_(parent) {
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0));
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetLayoutManager(layout);
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddTitleRow(layout, parent_->model());
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::StyledLabel* confirmation =
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new views::StyledLabel(parent_->model()->save_confirmation_text(), this);
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  confirmation->SetBaseFontList(
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ui::ResourceBundle::GetSharedInstance().GetFontList(
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ui::ResourceBundle::SmallFont));
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  confirmation->AddStyleRange(
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      parent_->model()->save_confirmation_link_range(),
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      views::StyledLabel::RangeStyleInfo::CreateForLink());
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->AddView(confirmation);
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ok_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_OK));
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ok_button_->SetStyle(views::Button::STYLE_BUTTON);
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ok_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ui::ResourceBundle::SmallFont));
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BuildColumnSet(layout, SINGLE_BUTTON_COLUMN_SET);
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->StartRowWithPadding(
6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      0, SINGLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->AddView(ok_button_);
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Extra padding for visual awesomeness.
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->set_initially_focused_view(ok_button_);
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ManagePasswordsBubbleView::SaveConfirmationView::~SaveConfirmationView() {
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::SaveConfirmationView::StyledLabelLinkClicked(
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const gfx::Range& range, int event_flags) {
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_EQ(range, parent_->model()->save_confirmation_link_range());
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parent_->model()->OnManageLinkClicked();
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->Close();
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::SaveConfirmationView::ButtonPressed(
6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    views::Button* sender, const ui::Event& event) {
6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_EQ(sender, ok_button_);
6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->model()->OnOKClicked();
6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parent_->Close();
6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ManagePasswordsBubbleView::WebContentMouseHandler --------------------------
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The class listens for WebContentsView events and notifies the bubble if the
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// view was clicked on or received keystrokes.
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ManagePasswordsBubbleView::WebContentMouseHandler
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public ui::EventHandler {
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit WebContentMouseHandler(ManagePasswordsBubbleView* bubble);
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~WebContentMouseHandler();
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  aura::Window* GetWebContentsWindow();
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ManagePasswordsBubbleView* bubble_;
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(WebContentMouseHandler);
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::WebContentMouseHandler(
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ManagePasswordsBubbleView* bubble)
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : bubble_(bubble) {
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetWebContentsWindow()->AddPreTargetHandler(this);
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::~WebContentMouseHandler() {
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (aura::Window* window = GetWebContentsWindow())
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    window->RemovePreTargetHandler(this);
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WebContentMouseHandler::OnKeyEvent(
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::KeyEvent* event) {
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents = bubble_->model()->web_contents();
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (rvh->IsFocusedElementEditable() &&
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      event->type() == ui::ET_KEY_PRESSED)
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bubble_->Close();
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WebContentMouseHandler::OnMouseEvent(
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::MouseEvent* event) {
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->type() == ui::ET_MOUSE_PRESSED)
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bubble_->Close();
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciaura::Window*
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManagePasswordsBubbleView::WebContentMouseHandler::GetWebContentsWindow() {
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents = bubble_->model()->web_contents();
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return web_contents ? web_contents->GetNativeView() : NULL;
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// ManagePasswordsBubbleView --------------------------------------------------
695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordsBubbleView* ManagePasswordsBubbleView::manage_passwords_bubble_ =
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NULL;
699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordsBubbleView::ShowBubble(content::WebContents* web_contents,
7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                           DisplayReason reason) {
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(browser);
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(browser->window());
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(browser->fullscreen_controller());
7075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (IsShowing())
7095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool is_fullscreen = browser_view->IsFullscreen();
713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ManagePasswordsIconView* anchor_view =
714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      is_fullscreen
715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ? NULL
716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          : browser_view->GetLocationBarView()->manage_passwords_icon_view();
717c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  manage_passwords_bubble_ = new ManagePasswordsBubbleView(
7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      web_contents, anchor_view, reason);
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (is_fullscreen) {
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    manage_passwords_bubble_->set_parent_window(
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        web_contents->GetTopLevelNativeWindow());
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::BubbleDelegateView::CreateBubble(manage_passwords_bubble_);
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Adjust for fullscreen after creation as it relies on the content size.
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (is_fullscreen) {
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    manage_passwords_bubble_->AdjustForFullscreen(
730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        browser_view->GetBoundsInScreen());
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
7325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (reason == AUTOMATIC)
7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    manage_passwords_bubble_->GetWidget()->ShowInactive();
7345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else
7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    manage_passwords_bubble_->GetWidget()->Show();
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ManagePasswordsBubbleView::CloseBubble() {
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manage_passwords_bubble_)
741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    manage_passwords_bubble_->Close();
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ManagePasswordsBubbleView::ActivateBubble() {
7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!IsShowing())
7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  manage_passwords_bubble_->GetWidget()->Activate();
7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ManagePasswordsBubbleView::IsShowing() {
753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The bubble may be in the process of closing.
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (manage_passwords_bubble_ != NULL) &&
755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      manage_passwords_bubble_->GetWidget()->IsVisible();
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicontent::WebContents* ManagePasswordsBubbleView::web_contents() const {
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return model()->web_contents();
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ManagePasswordsBubbleView::ManagePasswordsBubbleView(
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WebContents* web_contents,
764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ManagePasswordsIconView* anchor_view,
7650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DisplayReason reason)
7660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : ManagePasswordsBubble(web_contents, reason),
7670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      BubbleDelegateView(anchor_view,
768c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         anchor_view ? views::BubbleBorder::TOP_RIGHT
769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     : views::BubbleBorder::NONE),
7706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      anchor_view_(anchor_view),
7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      never_save_passwords_(false),
7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      initially_focused_view_(NULL) {
773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Compensate for built-in vertical padding in the anchor view's image.
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  set_anchor_view_insets(gfx::Insets(5, 0, 5, 0));
775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (anchor_view)
776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    anchor_view->SetActive(true);
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mouse_handler_.reset(new WebContentMouseHandler(this));
778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
779c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
780f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ManagePasswordsBubbleView::~ManagePasswordsBubbleView() {
781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (anchor_view_)
782f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    anchor_view_->SetActive(false);
783f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
784c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ManagePasswordsBubbleView::AdjustForFullscreen(
786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const gfx::Rect& screen_bounds) {
787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetAnchorView())
788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The bubble's padding from the screen edge, used in fullscreen.
791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int kFullscreenPaddingEnd = 20;
792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t bubble_half_width = width() / 2;
793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int x_pos = base::i18n::IsRTL() ?
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      screen_bounds.x() + bubble_half_width + kFullscreenPaddingEnd :
795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      screen_bounds.right() - bubble_half_width - kFullscreenPaddingEnd;
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetAnchorRect(gfx::Rect(x_pos, screen_bounds.y(), 0, 0));
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ManagePasswordsBubbleView::Close() {
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mouse_handler_.reset();
8010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GetWidget()->Close();
8020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
8030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::Refresh() {
8056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RemoveAllChildViews(true);
8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  initially_focused_view_ = NULL;
8076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (password_manager::ui::IsPendingState(model()->state())) {
8086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (never_save_passwords_)
8096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AddChildView(new ConfirmNeverView(this));
8106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    else
8116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AddChildView(new PendingView(this));
8126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) {
8136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    AddChildView(new BlacklistedView(this));
8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) {
8155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AddChildView(new SaveConfirmationView(this));
8166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else {
8176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    AddChildView(new ManageView(this));
8186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
8196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  GetLayoutManager()->Layout(this);
8206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
8216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
8226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() {
8236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (model()->best_matches().empty()) {
8246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Skip confirmation if there are no existing passwords for this site.
8256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    NotifyConfirmedNeverForThisSite();
8266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else {
8276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    never_save_passwords_ = true;
8286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    Refresh();
8296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
8306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
8316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
8326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() {
8336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  model()->OnNeverForThisSiteClicked();
8346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Close();
8356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
8366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
8376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() {
8386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  never_save_passwords_ = false;
8396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Refresh();
8406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
8415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::Init() {
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::FillLayout* layout = new views::FillLayout();
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetLayoutManager(layout);
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Refresh();
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ManagePasswordsBubbleView::WindowClosing() {
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Close() closes the window asynchronously, so by the time we reach here,
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |manage_passwords_bubble_| may have already been reset.
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (manage_passwords_bubble_ == this)
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manage_passwords_bubble_ = NULL;
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciviews::View* ManagePasswordsBubbleView::GetInitiallyFocusedView() {
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return initially_focused_view_;
8585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
859