Chromium Code Reviews| Index: chrome/browser/ui/views/autofill/password_generation_popup_view_views.cc |
| diff --git a/chrome/browser/ui/views/autofill/password_generation_popup_view_views.cc b/chrome/browser/ui/views/autofill/password_generation_popup_view_views.cc |
| index d15b870e722a2f36edcdf7fa17f635f31e88fee4..16c2494059a88cfe00e83e637baff5b2abb19c29 100644 |
| --- a/chrome/browser/ui/views/autofill/password_generation_popup_view_views.cc |
| +++ b/chrome/browser/ui/views/autofill/password_generation_popup_view_views.cc |
| @@ -6,9 +6,13 @@ |
| #include "base/strings/string16.h" |
| #include "chrome/browser/ui/autofill/password_generation_popup_controller.h" |
| +#include "chrome/browser/ui/autofill/popup_constants.h" |
| +#include "grit/theme_resources.h" |
| +#include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/views/background.h" |
| #include "ui/views/border.h" |
| +#include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/styled_label.h" |
| #include "ui/views/layout/box_layout.h" |
| @@ -20,35 +24,41 @@ namespace { |
| // The amount of whitespace that is present when there is no padding. Used |
| // to get the proper spacing in the help section. |
| -const int kHelpVerticalOffset = 3; |
| +const int kHelpVerticalOffset = 5; |
| +const int kPasswordSectionHeight = 62; |
| -// Class that shows the password and the suggestion side-by-side. |
| -class PasswordRow : public views::View { |
| +// Wrapper around just the text portions of the generation UI (password and |
| +// prompting text). |
| +class PasswordTextBox : public views::View { |
| public: |
| - PasswordRow(const base::string16& password, |
| - const base::string16& suggestion, |
| - const gfx::FontList& font_list, |
| - int horizontal_border) { |
| - set_clip_insets(gfx::Insets( |
| - PasswordGenerationPopupView::kPasswordVerticalInset, 0, |
| - PasswordGenerationPopupView::kPasswordVerticalInset, 0)); |
| + PasswordTextBox() {} |
| + virtual ~PasswordTextBox() {} |
| + |
| + // |suggestion_text| prompts the user to select the password, |
| + // |generated_password| is the generated password, and |font_list| is the font |
| + // used for all text in this class. |
| + void Init(const base::string16& suggestion_text, |
| + const base::string16& generated_password, |
| + const gfx::FontList& font_list, |
| + const SkColor& text_color) { |
| views::BoxLayout* box_layout = new views::BoxLayout( |
| - views::BoxLayout::kHorizontal, horizontal_border, 0, 0); |
| + views::BoxLayout::kVertical, 0, 13, 5); |
| box_layout->set_main_axis_alignment( |
| - views::BoxLayout::MAIN_AXIS_ALIGNMENT_FILL); |
| + views::BoxLayout::MAIN_AXIS_ALIGNMENT_START); |
| SetLayoutManager(box_layout); |
| - password_label_ = new views::Label(password, font_list); |
| - password_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| - AddChildView(password_label_); |
| - |
| - suggestion_label_ = new views::Label(suggestion, font_list); |
| - suggestion_label_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| - suggestion_label_->SetEnabledColor( |
| - PasswordGenerationPopupView::kExplanatoryTextColor); |
| - AddChildView(suggestion_label_); |
| + views::Label* suggestion_label = new views::Label( |
| + suggestion_text, font_list.DeriveWithStyle(gfx::Font::BOLD)); |
| + suggestion_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + suggestion_label->SetEnabledColor(text_color); |
| + AddChildView(suggestion_label); |
| + |
| + views::Label* password_label = |
| + new views::Label(generated_password, font_list); |
| + password_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + password_label->SetEnabledColor(text_color); |
| + AddChildView(password_label); |
| } |
| - virtual ~PasswordRow() {} |
| // views::View: |
| virtual bool CanProcessEventsWithinSubtree() const OVERRIDE { |
| @@ -57,11 +67,50 @@ class PasswordRow : public views::View { |
| } |
| private: |
| - // Child views. Not owned. |
| - views::Label* suggestion_label_; |
| - views::Label* password_label_; |
| + DISALLOW_COPY_AND_ASSIGN(PasswordTextBox); |
| +}; |
| + |
| +// Class that shows the generated password and associated UI (currently a key |
| +// image and some explanatory text). |
| +class PasswordBox : public views::View { |
| + public: |
| + PasswordBox() {} |
| + virtual ~PasswordBox() {} |
| + |
| + // |password| is the generated password, |suggestion| is the text prompting |
| + // the user to select the password, |font_list| is the font used for all the |
| + // text, and |horizontal_border| is the horizontal whitespace between the |
| + // parent element and this object. |
| + void Init(const base::string16& password, |
| + const base::string16& suggestion, |
| + const gfx::FontList& font_list, |
| + const SkColor& text_color, |
| + int horizontal_border) { |
| + views::BoxLayout* box_layout = new views::BoxLayout( |
| + views::BoxLayout::kHorizontal, horizontal_border, 0, 15); |
| + box_layout->set_main_axis_alignment( |
| + views::BoxLayout::MAIN_AXIS_ALIGNMENT_START); |
| + SetLayoutManager(box_layout); |
| + |
| + views::ImageView* key_image = new views::ImageView(); |
| + key_image->SetImage( |
| + ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| + IDR_GENERATE_PASSWORD_KEY).ToImageSkia()); |
| + AddChildView(key_image); |
| + |
| + PasswordTextBox* password_text_box = new PasswordTextBox(); |
| + password_text_box->Init(suggestion, password, font_list, text_color); |
| + AddChildView(password_text_box); |
| + } |
| + |
| + // views::View: |
| + virtual bool CanProcessEventsWithinSubtree() const OVERRIDE { |
| + // Send events to the parent view for handling. |
| + return false; |
| + } |
| - DISALLOW_COPY_AND_ASSIGN(PasswordRow); |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(PasswordBox); |
| }; |
| } // namespace |
| @@ -77,16 +126,15 @@ PasswordGenerationPopupViewViews::PasswordGenerationPopupViewViews( |
| help_label_ = new views::StyledLabel(controller_->HelpText(), this); |
| help_label_->SetBaseFontList(controller_->font_list()); |
| + help_label_->SetLineHeight(18); |
| views::StyledLabel::RangeStyleInfo default_style; |
| default_style.color = kExplanatoryTextColor; |
| help_label_->SetDefaultStyle(default_style); |
| - views::StyledLabel::RangeStyleInfo link_style = |
| - views::StyledLabel::RangeStyleInfo::CreateForLink(); |
| - link_style.color = kLinkColor; |
| - help_label_->AddStyleRange(controller_->HelpTextLinkRange(), link_style); |
| + help_label_->AddStyleRange( |
| + controller_->HelpTextLinkRange(), |
| + views::StyledLabel::RangeStyleInfo::CreateForLink()); |
| - help_label_->SetBoundsRect(controller_->help_bounds()); |
| help_label_->set_background( |
| views::Background::CreateSolidBackground( |
| kExplanatoryTextBackgroundColor)); |
| @@ -106,13 +154,52 @@ void PasswordGenerationPopupViewViews::CreatePasswordView() { |
| if (password_view_) |
| return; |
| - password_view_ = new PasswordRow(controller_->password(), |
| - controller_->SuggestedText(), |
| - controller_->font_list(), |
| - controller_->kHorizontalPadding); |
| + password_view_ = new PasswordBox(); |
| + static_cast<PasswordBox*>(password_view_)->Init( |
| + controller_->password(), |
| + controller_->SuggestedText(), |
| + controller_->font_list(), |
| + kItemTextColor, |
| + controller_->kHorizontalPadding); |
| + password_view_->SetPosition(gfx::Point(kPopupBorderThickness, |
| + kPopupBorderThickness)); |
| + password_view_->SizeToPreferredSize(); |
| AddChildView(password_view_); |
| } |
| +void PasswordGenerationPopupViewViews::SetBoundsForWidth(int width) { |
|
Evan Stade
2014/06/25 00:02:41
nit: does this need to be its own function now? Ca
Garrett Casto
2014/06/25 19:38:14
Done.
|
| + // Need to leave room for the border. |
| + int y = kPopupBorderThickness; |
| + int popup_width = width - 2 * kPopupBorderThickness; |
| + if (controller_->display_password()) { |
| + // Currently the UI can change from not offering a password to offering |
| + // a password (e.g. the user is editing a generated password and deletes |
| + // it), but it can't change the other way around. |
| + CreatePasswordView(); |
| + password_view_->SetBounds( |
| + kPopupBorderThickness, y, popup_width, kPasswordSectionHeight); |
| + divider_bounds_ = |
| + gfx::Rect(kPopupBorderThickness, password_view_->bounds().bottom(), |
| + popup_width, 1); |
| + y = divider_bounds_.bottom(); |
| + } |
| + help_label_->SetBounds(kPopupBorderThickness, y, popup_width, |
| + help_label_->GetHeightForWidth(popup_width) + |
| + help_label_->GetInsets().height()); |
| +} |
| + |
| +int PasswordGenerationPopupViewViews::GetHeight(int width) { |
| + int y = kPopupBorderThickness; |
| + if (controller_->display_password()) { |
| + // Add divider height as well. |
| + y += kPasswordSectionHeight + 1; |
| + } |
| + int popup_width = width - 2 * kPopupBorderThickness; |
| + y += help_label_->GetHeightForWidth(popup_width) + |
| + help_label_->GetInsets().height(); |
| + return y + kPopupBorderThickness; |
| +} |
| + |
| void PasswordGenerationPopupViewViews::Show() { |
| DoShow(); |
| } |
| @@ -125,11 +212,6 @@ void PasswordGenerationPopupViewViews::Hide() { |
| } |
| void PasswordGenerationPopupViewViews::UpdateBoundsAndRedrawPopup() { |
| - // Currently the UI can change from not offering a password to offering |
| - // a password (e.g. the user is editing a generated password and deletes it), |
| - // but it can't change the other way around. |
| - if (controller_->display_password()) |
| - CreatePasswordView(); |
| DoUpdateBoundsAndRedrawPopup(); |
| } |
| @@ -146,10 +228,7 @@ void PasswordGenerationPopupViewViews::PasswordSelectionUpdated() { |
| } |
| void PasswordGenerationPopupViewViews::Layout() { |
| - if (password_view_) |
| - password_view_->SetBoundsRect(controller_->password_bounds()); |
| - |
| - help_label_->SetBoundsRect(controller_->help_bounds()); |
| + SetBoundsForWidth(controller_->popup_bounds().width()); |
| } |
| void PasswordGenerationPopupViewViews::OnPaint(gfx::Canvas* canvas) { |
| @@ -162,7 +241,7 @@ void PasswordGenerationPopupViewViews::OnPaint(gfx::Canvas* canvas) { |
| // Divider line needs to be drawn after OnPaint() otherwise the background |
| // will overwrite the divider. |
| if (password_view_) |
| - canvas->FillRect(controller_->divider_bounds(), kDividerColor); |
| + canvas->FillRect(divider_bounds_, kDividerColor); |
| } |
| void PasswordGenerationPopupViewViews::StyledLabelLinkClicked( |
| @@ -170,6 +249,11 @@ void PasswordGenerationPopupViewViews::StyledLabelLinkClicked( |
| controller_->OnSavedPasswordsLinkClicked(); |
| } |
| +bool PasswordGenerationPopupViewViews::IsPointInPasswordBounds( |
| + const gfx::Point& point) { |
| + return password_view_->bounds().Contains(point); |
| +} |
| + |
| PasswordGenerationPopupView* PasswordGenerationPopupView::Create( |
| PasswordGenerationPopupController* controller) { |
| views::Widget* observing_widget = |