| Index: chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| index e379e67e3dcb6f60cb6318512baa8f6bc96dc841..e9c64e1f3f51381a1f3842b68cd33e64a266aabe 100644
|
| --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc
|
| @@ -23,6 +23,7 @@
|
| #include "ui/views/controls/button/blue_button.h"
|
| #include "ui/views/controls/button/label_button.h"
|
| #include "ui/views/controls/combobox/combobox.h"
|
| +#include "ui/views/layout/fill_layout.h"
|
| #include "ui/views/layout/grid_layout.h"
|
| #include "ui/views/layout/layout_constants.h"
|
|
|
| @@ -30,19 +31,86 @@
|
| // Helpers --------------------------------------------------------------------
|
|
|
| namespace {
|
| +enum ColumnSetType {
|
| + // | | (FILL, FILL) | |
|
| + // Used for the bubble's header, the credentials list, and for simple
|
| + // messages like "No passwords".
|
| + SINGLE_VIEW_COLUMN_SET = 0,
|
| +
|
| + // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | |
|
| + // Used for buttons at the bottom of the bubble which should nest at the
|
| + // bottom-right corner.
|
| + DOUBLE_BUTTON_COLUMN_SET = 1,
|
| +
|
| + // | | (LEADING, CENTER) | | (TRAILING, CENTER) | |
|
| + // Used for buttons at the bottom of the bubble which should occupy
|
| + // the corners.
|
| + LINK_BUTTON_COLUMN_SET = 2,
|
| +};
|
| +
|
| +// Construct an appropriate ColumnSet for the given |type|, and add it
|
| +// to |layout|.
|
| +void BuildColumnSet(views::GridLayout* layout, ColumnSetType type) {
|
| + views::ColumnSet* column_set = layout->AddColumnSet(type);
|
| + column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
|
| + switch (type) {
|
| + case SINGLE_VIEW_COLUMN_SET:
|
| + column_set->AddColumn(views::GridLayout::FILL,
|
| + views::GridLayout::FILL,
|
| + 0,
|
| + views::GridLayout::USE_PREF,
|
| + 0,
|
| + 0);
|
| + break;
|
|
|
| -enum FieldType { USERNAME_FIELD, PASSWORD_FIELD };
|
| + case DOUBLE_BUTTON_COLUMN_SET:
|
| + column_set->AddColumn(views::GridLayout::TRAILING,
|
| + views::GridLayout::CENTER,
|
| + 1,
|
| + views::GridLayout::USE_PREF,
|
| + 0,
|
| + 0);
|
| + column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
|
| + column_set->AddColumn(views::GridLayout::TRAILING,
|
| + views::GridLayout::CENTER,
|
| + 0,
|
| + views::GridLayout::USE_PREF,
|
| + 0,
|
| + 0);
|
| + break;
|
| + case LINK_BUTTON_COLUMN_SET:
|
| + column_set->AddColumn(views::GridLayout::LEADING,
|
| + views::GridLayout::CENTER,
|
| + 1,
|
| + views::GridLayout::USE_PREF,
|
| + 0,
|
| + 0);
|
| + column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
|
| + column_set->AddColumn(views::GridLayout::TRAILING,
|
| + views::GridLayout::CENTER,
|
| + 0,
|
| + views::GridLayout::USE_PREF,
|
| + 0,
|
| + 0);
|
| + break;
|
| + }
|
| + column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
|
| +}
|
|
|
| -// Upper limit on the size of the username and password fields.
|
| -const int kUsernameFieldSize = 30;
|
| -const int kPasswordFieldSize = 22;
|
| +// Given a layout and a model, add an appropriate title using a
|
| +// SINGLE_VIEW_COLUMN_SET, followed by a spacer row.
|
| +void AddTitleRow(views::GridLayout* layout, ManagePasswordsBubbleModel* model) {
|
| + views::Label* title_label = new views::Label(model->title());
|
| + title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + title_label->SetMultiLine(true);
|
| + title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
|
| + ui::ResourceBundle::MediumFont));
|
|
|
| -// Returns the width of |type| field.
|
| -int GetFieldWidth(FieldType type) {
|
| - return ui::ResourceBundle::GetSharedInstance()
|
| - .GetFontList(ui::ResourceBundle::SmallFont)
|
| - .GetExpectedTextWidth(type == USERNAME_FIELD ? kUsernameFieldSize
|
| - : kPasswordFieldSize);
|
| + // Add the title to the layout with appropriate padding.
|
| + layout->StartRowWithPadding(
|
| + 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
|
| + layout->AddView(title_label);
|
| + layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| }
|
|
|
| } // namespace
|
| @@ -65,6 +133,149 @@ void ShowManagePasswordsBubble(content::WebContents* web_contents) {
|
| } // namespace chrome
|
|
|
|
|
| +// ManagePasswordsBubbleView::PendingView -------------------------------------
|
| +
|
| +ManagePasswordsBubbleView::PendingView::PendingView(
|
| + ManagePasswordsBubbleView* parent)
|
| + : parent_(parent) {
|
| + views::GridLayout* layout = new views::GridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + // Create the pending credential item, save button and refusal combobox.
|
| + ManagePasswordItemView* item =
|
| + new ManagePasswordItemView(parent->model(),
|
| + parent->model()->pending_credentials(),
|
| + ManagePasswordItemView::FIRST_ITEM);
|
| + save_button_ = new views::BlueButton(
|
| + this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
|
| +
|
| + combobox_model_.reset(new SavePasswordRefusalComboboxModel());
|
| + refuse_combobox_.reset(new views::Combobox(combobox_model_.get()));
|
| + refuse_combobox_->set_listener(this);
|
| + refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
|
| +
|
| + // Title row.
|
| + BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| + AddTitleRow(layout, parent_->model());
|
| +
|
| + // Credential row.
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(item);
|
| +
|
| + // Button row.
|
| + BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
|
| + layout->StartRowWithPadding(
|
| + 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| + layout->AddView(save_button_);
|
| + layout->AddView(refuse_combobox_.get());
|
| +
|
| + // Extra padding for visual awesomeness.
|
| + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| +}
|
| +
|
| +ManagePasswordsBubbleView::PendingView::~PendingView() {
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::PendingView::ButtonPressed(
|
| + views::Button* sender,
|
| + const ui::Event& event) {
|
| + DCHECK(sender == save_button_);
|
| + parent_->model()->OnSaveClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::PendingView::OnPerformAction(
|
| + views::Combobox* source) {
|
| + DCHECK_EQ(source, refuse_combobox_);
|
| + switch (refuse_combobox_->selected_index()) {
|
| + case SavePasswordRefusalComboboxModel::INDEX_NOPE:
|
| + parent_->model()->OnNopeClicked();
|
| + break;
|
| + case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
|
| + parent_->model()->OnNeverForThisSiteClicked();
|
| + break;
|
| + }
|
| + parent_->Close();
|
| +}
|
| +
|
| +// ManagePasswordsBubbleView::ManageView --------------------------------------
|
| +
|
| +ManagePasswordsBubbleView::ManageView::ManageView(
|
| + ManagePasswordsBubbleView* parent)
|
| + : parent_(parent) {
|
| + views::GridLayout* layout = new views::GridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + // Add the title.
|
| + BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| + AddTitleRow(layout, parent_->model());
|
| +
|
| + // If we have a list of passwords to store for the current site, display
|
| + // them to the user for management. Otherwise, render a "No passwords for
|
| + // this site" message.
|
| + if (!parent_->model()->best_matches().empty()) {
|
| + for (autofill::PasswordFormMap::const_iterator i(
|
| + parent_->model()->best_matches().begin());
|
| + i != parent_->model()->best_matches().end();
|
| + ++i) {
|
| + ManagePasswordItemView* item = new ManagePasswordItemView(
|
| + parent_->model(),
|
| + *i->second,
|
| + i == parent_->model()->best_matches().begin()
|
| + ? ManagePasswordItemView::FIRST_ITEM
|
| + : ManagePasswordItemView::SUBSEQUENT_ITEM);
|
| +
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(item);
|
| + }
|
| + } else {
|
| + views::Label* empty_label = new views::Label(
|
| + l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
|
| + empty_label->SetMultiLine(true);
|
| +
|
| + layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| + layout->AddView(empty_label);
|
| + }
|
| +
|
| + // Then add the "manage passwords" link and "Done" button.
|
| + manage_link_ = new views::Link(parent_->model()->manage_link());
|
| + manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + manage_link_->SetUnderline(false);
|
| + manage_link_->set_listener(this);
|
| +
|
| + done_button_ =
|
| + new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
|
| + done_button_->SetStyle(views::Button::STYLE_BUTTON);
|
| +
|
| + BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
|
| + layout->StartRowWithPadding(
|
| + 0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| + layout->AddView(manage_link_);
|
| + layout->AddView(done_button_);
|
| +
|
| + // Extra padding for visual awesomeness.
|
| + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| +}
|
| +
|
| +ManagePasswordsBubbleView::ManageView::~ManageView() {
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::ManageView::ButtonPressed(
|
| + views::Button* sender,
|
| + const ui::Event& event) {
|
| + DCHECK(sender == done_button_);
|
| + parent_->model()->OnDoneClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| +void ManagePasswordsBubbleView::ManageView::LinkClicked(views::Link* source,
|
| + int event_flags) {
|
| + DCHECK_EQ(source, manage_link_);
|
| + parent_->model()->OnManageLinkClicked();
|
| + parent_->Close();
|
| +}
|
| +
|
| +
|
| // ManagePasswordsBubbleView --------------------------------------------------
|
|
|
| // static
|
| @@ -133,54 +344,6 @@ ManagePasswordsBubbleView::ManagePasswordsBubbleView(
|
|
|
| ManagePasswordsBubbleView::~ManagePasswordsBubbleView() {}
|
|
|
| -void ManagePasswordsBubbleView::BuildColumnSet(views::GridLayout* layout,
|
| - ColumnSetType type) {
|
| - views::ColumnSet* column_set = layout->AddColumnSet(type);
|
| - column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
|
| - switch (type) {
|
| - case SINGLE_VIEW_COLUMN_SET:
|
| - column_set->AddColumn(views::GridLayout::FILL,
|
| - views::GridLayout::FILL,
|
| - 0,
|
| - views::GridLayout::USE_PREF,
|
| - 0,
|
| - 0);
|
| - break;
|
| -
|
| - case DOUBLE_BUTTON_COLUMN_SET:
|
| - column_set->AddColumn(views::GridLayout::TRAILING,
|
| - views::GridLayout::CENTER,
|
| - 1,
|
| - views::GridLayout::USE_PREF,
|
| - 0,
|
| - 0);
|
| - column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
|
| - column_set->AddColumn(views::GridLayout::TRAILING,
|
| - views::GridLayout::CENTER,
|
| - 0,
|
| - views::GridLayout::USE_PREF,
|
| - 0,
|
| - 0);
|
| - break;
|
| - case LINK_BUTTON_COLUMN_SET:
|
| - column_set->AddColumn(views::GridLayout::LEADING,
|
| - views::GridLayout::CENTER,
|
| - 1,
|
| - views::GridLayout::USE_PREF,
|
| - 0,
|
| - 0);
|
| - column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
|
| - column_set->AddColumn(views::GridLayout::TRAILING,
|
| - views::GridLayout::CENTER,
|
| - 0,
|
| - views::GridLayout::USE_PREF,
|
| - 0,
|
| - 0);
|
| - break;
|
| - }
|
| - column_set->AddPaddingColumn(0, views::kPanelHorizMargin);
|
| -}
|
| -
|
| void ManagePasswordsBubbleView::AdjustForFullscreen(
|
| const gfx::Rect& screen_bounds) {
|
| if (GetAnchorView())
|
| @@ -205,118 +368,14 @@ void ManagePasswordsBubbleView::CloseWithoutLogging() {
|
| }
|
|
|
| void ManagePasswordsBubbleView::Init() {
|
| - using views::GridLayout;
|
| -
|
| - GridLayout* layout = new GridLayout(this);
|
| - SetFocusable(true);
|
| + views::FillLayout* layout = new views::FillLayout();
|
| SetLayoutManager(layout);
|
| - BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET);
|
| - BuildColumnSet(layout, DOUBLE_BUTTON_COLUMN_SET);
|
| - BuildColumnSet(layout, LINK_BUTTON_COLUMN_SET);
|
| -
|
| - // This calculates the necessary widths for credential columns in the bubble.
|
| - const int first_field_width = std::max(
|
| - GetFieldWidth(USERNAME_FIELD),
|
| - views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_DELETED))
|
| - .GetPreferredSize()
|
| - .width());
|
| -
|
| - const int second_field_width = std::max(
|
| - GetFieldWidth(PASSWORD_FIELD),
|
| - views::Label(l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_UNDO))
|
| - .GetPreferredSize()
|
| - .width());
|
| -
|
| - // Build and populate the header.
|
| - views::Label* title_label = new views::Label(model()->title());
|
| - title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - title_label->SetMultiLine(true);
|
| - title_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
|
| - ui::ResourceBundle::MediumFont));
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, SINGLE_VIEW_COLUMN_SET, 0, views::kRelatedControlSmallVerticalSpacing);
|
| - layout->AddView(title_label);
|
| - layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
|
| -
|
| - if (model()->WaitingToSavePassword()) {
|
| - // If we've got a password that we're deciding whether or not to save,
|
| - // then we need to display a single-view columnset containing the
|
| - // ManagePasswordItemView, followed by double-view columnset containing
|
| - // a "Save" and "Reject" button.
|
| - ManagePasswordItemView* item =
|
| - new ManagePasswordItemView(model(),
|
| - model()->pending_credentials(),
|
| - first_field_width,
|
| - second_field_width,
|
| - ManagePasswordItemView::FIRST_ITEM);
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(item);
|
| -
|
| - combobox_model_.reset(new SavePasswordRefusalComboboxModel());
|
| - refuse_combobox_.reset(new views::Combobox(combobox_model_.get()));
|
| - refuse_combobox_->set_listener(this);
|
| - refuse_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
|
| -
|
| - save_button_ = new views::BlueButton(
|
| - this, l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_BUTTON));
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, DOUBLE_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| - layout->AddView(save_button_);
|
| - layout->AddView(refuse_combobox_.get());
|
| - layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
|
| - } else {
|
| - // If we have a list of passwords to store for the current site, display
|
| - // them to the user for management. Otherwise, render a "No passwords for
|
| - // this site" message.
|
| - //
|
| - // TODO(mkwst): Do we really want the "No passwords" case? It would probably
|
| - // be better to only clear the pending password upon navigation, rather than
|
| - // as soon as the bubble closes.
|
| - if (!model()->best_matches().empty()) {
|
| - for (autofill::PasswordFormMap::const_iterator i(
|
| - model()->best_matches().begin());
|
| - i != model()->best_matches().end();
|
| - ++i) {
|
| - ManagePasswordItemView* item = new ManagePasswordItemView(
|
| - model(),
|
| - *i->second,
|
| - first_field_width,
|
| - second_field_width,
|
| - i == model()->best_matches().begin()
|
| - ? ManagePasswordItemView::FIRST_ITEM
|
| - : ManagePasswordItemView::SUBSEQUENT_ITEM);
|
| -
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(item);
|
| - }
|
| - } else {
|
| - views::Label* empty_label = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NO_PASSWORDS));
|
| - empty_label->SetMultiLine(true);
|
| -
|
| - layout->StartRow(0, SINGLE_VIEW_COLUMN_SET);
|
| - layout->AddView(empty_label);
|
| - }
|
| + SetFocusable(true);
|
|
|
| - // Build a "manage" link and "done" button, and throw them both into a new
|
| - // row
|
| - // containing a double-view columnset.
|
| - manage_link_ = new views::Link(model()->manage_link());
|
| - manage_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - manage_link_->SetUnderline(false);
|
| - manage_link_->set_listener(this);
|
| -
|
| - done_button_ =
|
| - new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_DONE));
|
| - done_button_->SetStyle(views::Button::STYLE_BUTTON);
|
| -
|
| - layout->StartRowWithPadding(
|
| - 0, LINK_BUTTON_COLUMN_SET, 0, views::kRelatedControlVerticalSpacing);
|
| - layout->AddView(manage_link_);
|
| - layout->AddView(done_button_);
|
| - }
|
| + if (model()->WaitingToSavePassword())
|
| + AddChildView(new PendingView(this));
|
| + else
|
| + AddChildView(new ManageView(this));
|
| }
|
|
|
| void ManagePasswordsBubbleView::WindowClosing() {
|
| @@ -325,37 +384,3 @@ void ManagePasswordsBubbleView::WindowClosing() {
|
| if (manage_passwords_bubble_ == this)
|
| manage_passwords_bubble_ = NULL;
|
| }
|
| -
|
| -void ManagePasswordsBubbleView::ButtonPressed(views::Button* sender,
|
| - const ui::Event& event) {
|
| - DCHECK(sender == save_button_ || sender == done_button_);
|
| -
|
| - if (sender == save_button_)
|
| - model()->OnSaveClicked();
|
| - else
|
| - model()->OnDoneClicked();
|
| - Close();
|
| -}
|
| -
|
| -void ManagePasswordsBubbleView::LinkClicked(views::Link* source,
|
| - int event_flags) {
|
| - DCHECK_EQ(source, manage_link_);
|
| - model()->OnManageLinkClicked();
|
| - Close();
|
| -}
|
| -
|
| -void ManagePasswordsBubbleView::OnPerformAction(views::Combobox* source) {
|
| - DCHECK_EQ(source, refuse_combobox_);
|
| - switch (refuse_combobox_->selected_index()) {
|
| - case SavePasswordRefusalComboboxModel::INDEX_NOPE:
|
| - model()->OnNopeClicked();
|
| - break;
|
| - case SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE:
|
| - model()->OnNeverForThisSiteClicked();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - Close();
|
| -}
|
|
|