Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1443)

Unified Diff: chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc

Issue 1503583002: [Extensions Views] Update the extension installed bubble's sync promo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Latest master Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
index 46e291eba0da4573cb2ddd3b5a375abd6b393477..b732e2a292ffa9b0eacd7df2c5136c330a1a5228 100644
--- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "chrome/browser/ui/views/location_bar/page_action_with_badge_view.h"
+#include "chrome/browser/ui/views/sync/bubble_sync_promo_view.h"
#include "chrome/browser/ui/views/toolbar/app_menu_button.h"
#include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
@@ -33,12 +34,15 @@
#include "ui/gfx/render_text.h"
#include "ui/gfx/text_elider.h"
#include "ui/resources/grit/ui_resources.h"
+#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"
#include "ui/views/controls/link_listener.h"
+#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_constants.h"
using extensions::Extension;
@@ -49,19 +53,13 @@ const int kIconSize = 43;
const int kRightColumnWidth = 285;
-// The Bubble uses a BubbleBorder which adds about 6 pixels of whitespace
-// around the content view. We compensate by reducing our outer borders by this
-// amount + 4px.
-const int kOuterMarginInset = 10;
-const int kHorizOuterMargin = views::kPanelHorizMargin - kOuterMarginInset;
-const int kVertOuterMargin = views::kPanelVertMargin - kOuterMarginInset;
-
-// Interior vertical margin is 8px smaller than standard
-const int kVertInnerMargin = views::kPanelVertMargin - 8;
-
-// We want to shift the right column (which contains the header and text) up
-// 4px to align with icon.
-const int kRightcolumnVerticalShift = -4;
+views::Label* CreateLabel(const base::string16& text,
+ const gfx::FontList& font) {
+ views::Label* label = new views::Label(text, font);
+ label->SetMultiLine(true);
+ label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ return label;
+}
} // namespace
@@ -71,7 +69,11 @@ ExtensionInstalledBubbleView::ExtensionInstalledBubbleView(
: bubble_reference_(bubble_reference),
extension_(bubble->extension()),
browser_(bubble->browser()),
- type_(bubble->type()) {}
+ type_(bubble->type()),
+ options_(NONE),
+ sync_promo_(nullptr),
+ close_(nullptr),
+ manage_shortcut_(nullptr) {}
ExtensionInstalledBubbleView::~ExtensionInstalledBubbleView() {}
@@ -165,122 +167,33 @@ bool ExtensionInstalledBubbleView::AcceleratorPressed(
return true;
}
-// Views specific implementation.
-bool ExtensionInstalledBubble::ShouldShow() {
- if (type() == BROWSER_ACTION ||
- extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) {
- BrowserActionsContainer* container =
- BrowserView::GetBrowserViewForBrowser(browser())
- ->GetToolbarView()
- ->browser_actions();
- return !container->animating();
- }
- return true;
+void ExtensionInstalledBubbleView::OnSignInLinkClicked() {
+ GetWidget()->Close();
+ chrome::ShowBrowserSignin(
+ browser_,
+ signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE);
}
-class ExtensionInstalledBubbleUi : public BubbleUi {
- public:
- explicit ExtensionInstalledBubbleUi(ExtensionInstalledBubble* bubble);
- ~ExtensionInstalledBubbleUi() override;
-
- private:
- // BubbleUi:
- void Show(BubbleReference bubble_reference) override;
- void Close() override;
- void UpdateAnchorPosition() override;
-
- ExtensionInstalledBubble* bubble_;
- ExtensionInstalledBubbleView* delegate_view_;
-
- DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubbleUi);
-};
-
-// Implemented here to create the platform specific instance of the BubbleUi.
-scoped_ptr<BubbleUi> ExtensionInstalledBubble::BuildBubbleUi() {
- return make_scoped_ptr(new ExtensionInstalledBubbleUi(this));
+void ExtensionInstalledBubbleView::ButtonPressed(views::Button* sender,
+ const ui::Event& event) {
+ DCHECK_EQ(sender, close_);
+ GetWidget()->Close();
}
-// InstalledBubbleContent is the content view which is placed in the
-// ExtensionInstalledBubbleView. It displays the install icon and explanatory
-// text about the installed extension.
-class InstalledBubbleContent : public views::View,
- public views::ButtonListener,
- public views::LinkListener {
- public:
- InstalledBubbleContent(const ExtensionInstalledBubble& bubble,
- const BubbleReference& bubble_reference,
- Browser* browser);
-
- // Overridden from views::ButtonListener.
- void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
- // Overriden from views::LinkListener.
- void LinkClicked(views::Link* source, int event_flags) override;
-
- private:
- enum Flavors {
- NONE = 0,
- HOW_TO_USE = 1 << 0,
- HOW_TO_MANAGE = 1 << 1,
- SHOW_KEYBINDING = 1 << 2,
- SIGN_IN_PROMO = 1 << 3,
- };
-
- // Layout the signin promo at coordinates |offset_x| and |offset_y|. Returns
- // the height (in pixels) of the promo UI.
- int LayoutSigninPromo(int offset_x, int offset_y);
-
- // Overriden from views::View.
- gfx::Size GetPreferredSize() const override;
- void Layout() override;
- void OnPaint(gfx::Canvas* canvas) override;
-
- // The browser we're associated with.
- Browser* browser_;
-
- // A reference to the bubble to send close events to.
- BubbleReference bubble_reference_;
-
- // The string that contains the link text at the beginning of the sign-in
- // promo text.
- base::string16 signin_promo_link_text_;
- // The remaining text of the sign-in promo text.
- base::string16 signin_promo_text_;
-
- // A vector of RenderText objects representing the full sign-in promo
- // paragraph as layed out within the bubble, but has the text of the link
- // whited out so the link can be drawn in its place.
- ScopedVector<gfx::RenderText> sign_in_promo_lines_;
-
- // A bitmask containing the various flavors of bubble sections to show.
- int flavors_;
-
- // The height, in pixels, of the sign-in promo.
- size_t height_of_signin_promo_;
-
- views::ImageView* icon_;
- views::Label* heading_;
- views::Label* how_to_use_;
- views::Link* sign_in_link_;
- views::Label* manage_;
- views::Link* manage_shortcut_;
- views::ImageButton* close_button_;
+void ExtensionInstalledBubbleView::LinkClicked(views::Link* source,
+ int event_flags) {
+ DCHECK_EQ(manage_shortcut_, source);
+ GetWidget()->Close();
- DISALLOW_COPY_AND_ASSIGN(InstalledBubbleContent);
-};
+ std::string configure_url = chrome::kChromeUIExtensionsURL;
+ configure_url += chrome::kExtensionConfigureCommandsSubPage;
+ chrome::NavigateParams params(
+ chrome::GetSingletonTabNavigateParams(browser_, GURL(configure_url)));
+ chrome::Navigate(&params);
+}
-InstalledBubbleContent::InstalledBubbleContent(
- const ExtensionInstalledBubble& bubble,
- const BubbleReference& bubble_reference,
- Browser* browser)
- : browser_(browser),
- bubble_reference_(bubble_reference),
- flavors_(NONE),
- height_of_signin_promo_(0u),
- how_to_use_(nullptr),
- sign_in_link_(nullptr),
- manage_(nullptr),
- manage_shortcut_(nullptr) {
+void ExtensionInstalledBubbleView::InitLayout(
+ const ExtensionInstalledBubble& bubble) {
// The Extension Installed bubble takes on various forms, depending on the
// type of extension installed. In general, though, they are all similar:
//
@@ -298,296 +211,177 @@ InstalledBubbleContent::InstalledBubbleContent(
// or a link to configure the keybinding shortcut (if one exists).
// Extra info can include a promo for signing into sync.
- const Extension* extension = bubble.extension();
- if (extensions::sync_helper::IsSyncable(extension) &&
- SyncPromoUI::ShouldShowSyncPromo(browser->profile()))
- flavors_ |= SIGN_IN_PROMO;
+ set_margins(gfx::Insets(views::kPanelVertMargin, 0, 0, 0));
- // Determine the bubble flavor we want, based on the extension type.
- switch (bubble.type()) {
+ if (extensions::sync_helper::IsSyncable(extension_) &&
+ SyncPromoUI::ShouldShowSyncPromo(browser_->profile()))
+ options_ |= SIGN_IN_PROMO;
+
+ // The number of rows in the content section of the bubble.
+ int main_content_row_count = 1;
+ // Determine the bubble option we want, based on the extension type.
+ switch (type_) {
case ExtensionInstalledBubble::BROWSER_ACTION:
case ExtensionInstalledBubble::PAGE_ACTION:
- flavors_ |= HOW_TO_USE;
+ options_ |= HOW_TO_USE;
if (bubble.has_command_keybinding()) {
- flavors_ |= SHOW_KEYBINDING;
+ options_ |= SHOW_KEYBINDING;
} else {
// The How-To-Use text makes the bubble seem a little crowded when the
// extension has a keybinding, so the How-To-Manage text is not shown
// in those cases.
- flavors_ |= HOW_TO_MANAGE;
+ options_ |= HOW_TO_MANAGE;
}
+ main_content_row_count += 2;
break;
case ExtensionInstalledBubble::OMNIBOX_KEYWORD:
- flavors_ |= HOW_TO_USE | HOW_TO_MANAGE;
+ options_ |= HOW_TO_USE | HOW_TO_MANAGE;
+ main_content_row_count += 2;
break;
case ExtensionInstalledBubble::GENERIC:
break;
default:
- // When adding a new bubble type, the flavor needs to be set.
+ // When adding a new bubble type, the option needs to be set.
static_assert(ExtensionInstalledBubble::GENERIC == 3,
- "kBubbleType enum has changed, this switch statement must "
- "be updateed");
+ "kBubbleType enum has changed, this switch statement must "
+ "be updateed");
break;
}
+ views::GridLayout* layout = new views::GridLayout(this);
+ SetLayoutManager(layout);
+
+ enum ColumnSetId {
+ MAIN_COLUMN_SET = 0,
+ SYNC_PROMO_COLUMN_SET,
+ };
+
+ views::ColumnSet* main_cs = layout->AddColumnSet(MAIN_COLUMN_SET);
+ // Note: the left padding column is set to kUnrelatedControlHorizontalSpacing
+ // so that the distance between the left edge and the icon matches the
+ // distance between the icon and the content.
+ main_cs->AddPaddingColumn(0 /* not resizable */,
+ views::kUnrelatedControlHorizontalSpacing);
+ // Icon column.
+ main_cs->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING, 0,
+ views::GridLayout::USE_PREF, 0, 0);
+ main_cs->AddPaddingColumn(0, views::kUnrelatedControlHorizontalSpacing);
+ // Heading column:
+ main_cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::LEADING, 0,
+ views::GridLayout::FIXED, kRightColumnWidth, 0);
+ main_cs->AddPaddingColumn(0 /* not resizable */,
+ views::kUnrelatedControlHorizontalSpacing);
+
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- const gfx::FontList& font_list =
- rb.GetFontList(ui::ResourceBundle::BaseFont);
+ const gfx::FontList& font_list = rb.GetFontList(ui::ResourceBundle::BaseFont);
- const SkBitmap& icon = bubble.icon();
- // Add the icon (for all flavors).
+ const SkBitmap& bitmap = bubble.icon();
+ // Add the icon (for all options).
// Scale down to 43x43, but allow smaller icons (don't scale up).
- gfx::Size size(icon.width(), icon.height());
+ gfx::Size size(bitmap.width(), bitmap.height());
if (size.width() > kIconSize || size.height() > kIconSize)
size = gfx::Size(kIconSize, kIconSize);
- icon_ = new views::ImageView();
- icon_->SetImageSize(size);
- icon_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(icon));
- AddChildView(icon_);
+ views::ImageView* icon = new views::ImageView();
+ icon->SetImageSize(size);
+ icon->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(bitmap));
+
+ layout->StartRow(0, MAIN_COLUMN_SET);
+ layout->AddView(icon, 1, main_content_row_count);
- // Add the heading (for all flavors).
- base::string16 extension_name = base::UTF8ToUTF16(extension->name());
+ // Add the heading (for all options).
+ base::string16 extension_name = base::UTF8ToUTF16(extension_->name());
base::i18n::AdjustStringForLocaleDirection(&extension_name);
- heading_ = new views::Label(l10n_util::GetStringFUTF16(
- IDS_EXTENSION_INSTALLED_HEADING, extension_name));
- heading_->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
- heading_->SetMultiLine(true);
- heading_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(heading_);
-
- if (flavors_ & HOW_TO_USE) {
- how_to_use_ = new views::Label(bubble.GetHowToUseDescription());
- how_to_use_->SetFontList(font_list);
- how_to_use_->SetMultiLine(true);
- how_to_use_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(how_to_use_);
+ views::Label* heading =
+ CreateLabel(l10n_util::GetStringFUTF16(IDS_EXTENSION_INSTALLED_HEADING,
+ extension_name),
+ rb.GetFontList(ui::ResourceBundle::MediumFont));
+
+ close_ = views::BubbleFrameView::CreateCloseButton(this);
+
+ views::View* heading_and_close = new views::View();
+ views::BoxLayout* heading_and_close_layout =
+ new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
+ views::kUnrelatedControlHorizontalSpacing);
+ heading_and_close_layout->set_cross_axis_alignment(
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_START);
+ heading_and_close->SetLayoutManager(heading_and_close_layout);
+ heading_and_close->AddChildView(heading);
+ heading_and_close->AddChildView(close_);
+
+ layout->AddView(heading_and_close);
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+
+ auto add_content_view = [&layout](views::View* view) {
+ layout->StartRow(0, MAIN_COLUMN_SET);
+ // Skip the icon column.
+ layout->SkipColumns(1);
+ layout->AddView(view);
+ layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ };
+
+ if (options_ & HOW_TO_USE) {
+ add_content_view(CreateLabel(bubble.GetHowToUseDescription(), font_list));
}
- if (flavors_ & SHOW_KEYBINDING) {
+ if (options_ & SHOW_KEYBINDING) {
manage_shortcut_ = new views::Link(
l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_MANAGE_SHORTCUTS));
manage_shortcut_->set_listener(this);
- AddChildView(manage_shortcut_);
- }
-
- if (flavors_ & HOW_TO_MANAGE) {
- manage_ = new views::Label(l10n_util::GetStringUTF16(
- IDS_EXTENSION_INSTALLED_MANAGE_INFO));
- manage_->SetFontList(font_list);
- manage_->SetMultiLine(true);
- manage_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(manage_);
+ manage_shortcut_->SetUnderline(false);
+ add_content_view(manage_shortcut_);
}
- if (flavors_ & SIGN_IN_PROMO) {
- signin_promo_text_ =
- l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_SIGNIN_PROMO);
-
- signin_promo_link_text_ =
- l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_SIGNIN_PROMO_LINK);
- sign_in_link_ = new views::Link(signin_promo_link_text_);
- sign_in_link_->SetFontList(font_list);
- sign_in_link_->set_listener(this);
- AddChildView(sign_in_link_);
+ if (options_ & HOW_TO_MANAGE) {
+ add_content_view(CreateLabel(
+ l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_MANAGE_INFO),
+ font_list));
}
- // Add the Close button (for all flavors).
- close_button_ = new views::ImageButton(this);
- close_button_->SetImage(views::CustomButton::STATE_NORMAL,
- rb.GetImageSkiaNamed(IDR_CLOSE_2));
- close_button_->SetImage(views::CustomButton::STATE_HOVERED,
- rb.GetImageSkiaNamed(IDR_CLOSE_2_H));
- close_button_->SetImage(views::CustomButton::STATE_PRESSED,
- rb.GetImageSkiaNamed(IDR_CLOSE_2_P));
- AddChildView(close_button_);
-}
-
-void InstalledBubbleContent::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- DCHECK_EQ(sender, close_button_);
- DCHECK(bubble_reference_);
- bool did_close = bubble_reference_->CloseBubble(BUBBLE_CLOSE_USER_DISMISSED);
- DCHECK(did_close);
-}
-
-void InstalledBubbleContent::LinkClicked(views::Link* source, int event_flags) {
- DCHECK(bubble_reference_);
- bool did_close = bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED);
- DCHECK(did_close);
-
- if (source == sign_in_link_) {
-#if defined(OS_ANDROID)
- // TODO(bshe): Figure out what to do on Android platform. See
- // crbug.com/559340.
- NOTIMPLEMENTED();
-#else
- chrome::ShowBrowserSignin(
- browser_,
- signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE);
-#endif
- return;
+ if (options_ & SIGN_IN_PROMO) {
+ views::ColumnSet* sync_cs = layout->AddColumnSet(SYNC_PROMO_COLUMN_SET);
+ sync_cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
+ views::GridLayout::USE_PREF, 0, 0);
+ layout->StartRow(0, SYNC_PROMO_COLUMN_SET);
+ sync_promo_ = new BubbleSyncPromoView(
+ this, IDS_EXTENSION_INSTALLED_SYNC_PROMO_LINK_NEW,
+ IDS_EXTENSION_INSTALLED_SYNC_PROMO_NEW);
+ layout->AddView(sync_promo_);
}
-
- DCHECK_EQ(manage_shortcut_, source);
-
- std::string configure_url = chrome::kChromeUIExtensionsURL;
- configure_url += chrome::kExtensionConfigureCommandsSubPage;
- chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams(
- browser_, GURL(configure_url)));
- chrome::Navigate(&params);
}
-int InstalledBubbleContent::LayoutSigninPromo(int offset_x, int offset_y) {
- sign_in_promo_lines_.clear();
- int height = 0;
- gfx::Rect contents_area = GetContentsBounds();
- if (contents_area.IsEmpty())
- return height;
- contents_area.set_width(kRightColumnWidth);
-
- base::string16 full_text = signin_promo_link_text_ + signin_promo_text_;
-
- // The link is the first item in the text.
- const gfx::Size link_size = sign_in_link_->GetPreferredSize();
- sign_in_link_->SetBounds(
- offset_x, offset_y, link_size.width(), link_size.height());
-
- // Word-wrap the full label text.
- const gfx::FontList font_list;
- std::vector<base::string16> lines;
- gfx::ElideRectangleText(full_text, font_list, contents_area.width(),
- contents_area.height(), gfx::ELIDE_LONG_WORDS,
- &lines);
-
- gfx::Point position = gfx::Point(
- contents_area.origin().x() + offset_x,
- contents_area.origin().y() + offset_y + 1);
- if (base::i18n::IsRTL()) {
- position -= gfx::Vector2d(
- 2 * views::kPanelHorizMargin + kHorizOuterMargin, 0);
- }
-
- // Loop through the lines, creating a renderer for each.
- for (std::vector<base::string16>::const_iterator it = lines.begin();
- it != lines.end(); ++it) {
- gfx::RenderText* line = gfx::RenderText::CreateInstance();
- line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI);
- line->SetText(*it);
- const gfx::Size size(contents_area.width(),
- line->GetStringSize().height());
- line->SetDisplayRect(gfx::Rect(position, size));
- position.set_y(position.y() + size.height());
- sign_in_promo_lines_.push_back(line);
- height += size.height();
- }
-
- // The link is drawn separately; make it transparent here to only draw once.
- // The link always leads other text and is assumed to fit on the first line.
- sign_in_promo_lines_.front()->ApplyColor(SK_ColorTRANSPARENT,
- gfx::Range(0, signin_promo_link_text_.size()));
-
- return height;
-}
-
-gfx::Size InstalledBubbleContent::GetPreferredSize() const {
- int width = kHorizOuterMargin;
- width += kIconSize;
- width += views::kPanelHorizMargin;
- width += kRightColumnWidth;
- width += 2 * views::kPanelHorizMargin;
- width += kHorizOuterMargin;
-
- int height = kVertOuterMargin;
- height += heading_->GetHeightForWidth(kRightColumnWidth);
- height += kVertInnerMargin;
-
- if (flavors_ & HOW_TO_USE) {
- height += how_to_use_->GetHeightForWidth(kRightColumnWidth);
- height += kVertInnerMargin;
- }
-
- if (flavors_ & HOW_TO_MANAGE) {
- height += manage_->GetHeightForWidth(kRightColumnWidth);
- height += kVertInnerMargin;
- }
-
- if (flavors_ & SIGN_IN_PROMO && height_of_signin_promo_ > 0u) {
- height += height_of_signin_promo_;
- height += kVertInnerMargin;
- }
-
- if (flavors_ & SHOW_KEYBINDING) {
- height += manage_shortcut_->GetHeightForWidth(kRightColumnWidth);
- height += kVertInnerMargin;
+// Views specific implementation.
+bool ExtensionInstalledBubble::ShouldShow() {
+ if (type() == BROWSER_ACTION ||
+ extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) {
+ BrowserActionsContainer* container =
+ BrowserView::GetBrowserViewForBrowser(browser())
+ ->GetToolbarView()
+ ->browser_actions();
+ return !container->animating();
}
-
- return gfx::Size(width, std::max(height, kIconSize + 2 * kVertOuterMargin));
+ return true;
}
-void InstalledBubbleContent::Layout() {
- int x = kHorizOuterMargin;
- int y = kVertOuterMargin;
-
- icon_->SetBounds(x, y, kIconSize, kIconSize);
- x += kIconSize;
- x += views::kPanelHorizMargin;
-
- y += kRightcolumnVerticalShift;
- heading_->SizeToFit(kRightColumnWidth);
- heading_->SetX(x);
- heading_->SetY(y);
- y += heading_->height();
- y += kVertInnerMargin;
-
- if (flavors_ & HOW_TO_USE) {
- how_to_use_->SizeToFit(kRightColumnWidth);
- how_to_use_->SetX(x);
- how_to_use_->SetY(y);
- y += how_to_use_->height();
- y += kVertInnerMargin;
- }
-
- if (flavors_ & HOW_TO_MANAGE) {
- manage_->SizeToFit(kRightColumnWidth);
- manage_->SetX(x);
- manage_->SetY(y);
- y += manage_->height();
- y += kVertInnerMargin;
- }
-
- if (flavors_ & SIGN_IN_PROMO) {
- height_of_signin_promo_ = LayoutSigninPromo(x, y);
- y += height_of_signin_promo_;
- y += kVertInnerMargin;
- }
+class ExtensionInstalledBubbleUi : public BubbleUi {
+ public:
+ explicit ExtensionInstalledBubbleUi(ExtensionInstalledBubble* bubble);
+ ~ExtensionInstalledBubbleUi() override;
- if (flavors_ & SHOW_KEYBINDING) {
- gfx::Size sz = manage_shortcut_->GetPreferredSize();
- manage_shortcut_->SetBounds(width() - 2 * kHorizOuterMargin - sz.width(),
- y,
- sz.width(),
- sz.height());
- y += manage_shortcut_->height();
- y += kVertInnerMargin;
- }
+ private:
+ // BubbleUi:
+ void Show(BubbleReference bubble_reference) override;
+ void Close() override;
+ void UpdateAnchorPosition() override;
- gfx::Size sz;
- x += kRightColumnWidth + 2 * views::kPanelHorizMargin + kHorizOuterMargin -
- close_button_->GetPreferredSize().width();
- y = kVertOuterMargin;
- sz = close_button_->GetPreferredSize();
- // x-1 & y-1 is just slop to get the close button visually aligned with the
- // title text and bubble arrow.
- close_button_->SetBounds(x - 1, y - 1, sz.width(), sz.height());
-}
+ ExtensionInstalledBubble* bubble_;
+ ExtensionInstalledBubbleView* delegate_view_;
-void InstalledBubbleContent::OnPaint(gfx::Canvas* canvas) {
- for (ScopedVector<gfx::RenderText>::const_iterator it =
- sign_in_promo_lines_.begin();
- it != sign_in_promo_lines_.end(); ++it)
- (*it)->Draw(canvas);
+ DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubbleUi);
+};
- views::View::OnPaint(canvas);
+// Implemented here to create the platform specific instance of the BubbleUi.
+scoped_ptr<BubbleUi> ExtensionInstalledBubble::BuildBubbleUi() {
+ return make_scoped_ptr(new ExtensionInstalledBubbleUi(this));
}
ExtensionInstalledBubbleUi::ExtensionInstalledBubbleUi(
@@ -606,9 +400,8 @@ void ExtensionInstalledBubbleUi::Show(BubbleReference bubble_reference) {
delegate_view_->set_arrow(bubble_->type() == bubble_->OMNIBOX_KEYWORD
? views::BubbleBorder::TOP_LEFT
: views::BubbleBorder::TOP_RIGHT);
- delegate_view_->SetLayoutManager(new views::FillLayout());
- delegate_view_->AddChildView(new InstalledBubbleContent(
- *bubble_, bubble_reference, bubble_->browser()));
+
+ delegate_view_->InitLayout(*bubble_);
views::BubbleDelegateView::CreateBubble(delegate_view_)->Show();
}
« no previous file with comments | « chrome/browser/ui/views/extensions/extension_installed_bubble_view.h ('k') | chrome/browser/ui/views/frame/browser_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698