| Index: chrome/browser/ui/views/first_run_bubble.cc
|
| diff --git a/chrome/browser/ui/views/first_run_bubble.cc b/chrome/browser/ui/views/first_run_bubble.cc
|
| index 39e57e8f93be88079df747ce4b5a8e844d767b42..6f5c8f990120516df6a84c99c6e705730ae659a5 100644
|
| --- a/chrome/browser/ui/views/first_run_bubble.cc
|
| +++ b/chrome/browser/ui/views/first_run_bubble.cc
|
| @@ -20,561 +20,108 @@
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "views/controls/button/image_button.h"
|
| -#include "views/controls/button/text_button.h"
|
| #include "views/controls/label.h"
|
| #include "views/events/event.h"
|
| -#include "views/focus/focus_manager.h"
|
| +#include "views/layout/grid_layout.h"
|
| #include "views/layout/layout_constants.h"
|
| -#include "views/widget/native_widget_win.h"
|
| #include "views/widget/widget.h"
|
|
|
| namespace {
|
| -
|
| -// How much extra padding to put around our content over what the Bubble
|
| -// provides.
|
| -const int kBubblePadding = 4;
|
| -
|
| -// How much extra padding to put around our content over what the Bubble
|
| -// provides in alternative OEM bubble.
|
| -const int kOEMBubblePadding = 4;
|
| -
|
| -// Padding between parts of strings on the same line (for instance,
|
| -// "New!" and "Search from the address bar!"
|
| -const int kStringSeparationPadding = 2;
|
| -
|
| -// Margin around close button.
|
| -const int kMarginRightOfCloseButton = 7;
|
| -
|
| -// The bubble's HWND is actually owned by the border widget, and it's the border
|
| -// widget that's owned by the frame window the bubble is anchored to. This
|
| -// function makes the two leaps necessary to go from the bubble contents HWND
|
| -// to the frame HWND.
|
| -HWND GetLogicalBubbleOwner(HWND bubble_hwnd) {
|
| - HWND border_widget_hwnd = GetWindow(bubble_hwnd, GW_OWNER);
|
| - return GetWindow(border_widget_hwnd, GW_OWNER);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Base class for implementations of the client view which appears inside the
|
| -// first run bubble. It is a dialog-ish view, but is not a true dialog.
|
| -class FirstRunBubbleViewBase : public views::View,
|
| - public views::ButtonListener,
|
| - public views::FocusChangeListener {
|
| - public:
|
| - // Called by FirstRunBubble::Show to request focus for the proper button
|
| - // in the FirstRunBubbleView when it is shown.
|
| - virtual void BubbleShown() = 0;
|
| - virtual void OnDidChangeFocus(View* focused_before, View* focused_now) {}
|
| -};
|
| -
|
| -// FirstRunBubbleView ---------------------------------------------------------
|
| -
|
| -class FirstRunBubbleView : public FirstRunBubbleViewBase {
|
| - public:
|
| - FirstRunBubbleView(FirstRunBubble* bubble_window, Profile* profile);
|
| -
|
| - private:
|
| - virtual ~FirstRunBubbleView() {}
|
| -
|
| - // FirstRunBubbleViewBase:
|
| - virtual void BubbleShown();
|
| -
|
| - // Overridden from View:
|
| - virtual void ButtonPressed(views::Button* sender, const views::Event& event);
|
| - virtual void Layout();
|
| - virtual gfx::Size GetPreferredSize();
|
| -
|
| - // FocusChangeListener:
|
| - virtual void OnWillChangeFocus(View* focused_before, View* focused_now);
|
| -
|
| - FirstRunBubble* bubble_window_;
|
| - views::Label* label1_;
|
| - views::Label* label2_;
|
| - views::Label* label3_;
|
| - views::NativeTextButton* change_button_;
|
| - views::NativeTextButton* keep_button_;
|
| - Profile* profile_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FirstRunBubbleView);
|
| -};
|
| -
|
| -FirstRunBubbleView::FirstRunBubbleView(FirstRunBubble* bubble_window,
|
| - Profile* profile)
|
| - : bubble_window_(bubble_window),
|
| - label1_(NULL),
|
| - label2_(NULL),
|
| - label3_(NULL),
|
| - keep_button_(NULL),
|
| - change_button_(NULL),
|
| - profile_(profile) {
|
| - const gfx::Font& font =
|
| - ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont);
|
| -
|
| - label1_ = new views::Label(l10n_util::GetStringUTF16(IDS_FR_BUBBLE_TITLE));
|
| - label1_->SetFont(font.DeriveFont(3, gfx::Font::BOLD));
|
| - label1_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - AddChildView(label1_);
|
| -
|
| - gfx::Size ps = GetPreferredSize();
|
| -
|
| - label2_ = new views::Label(l10n_util::GetStringUTF16(IDS_FR_BUBBLE_SUBTEXT));
|
| - label2_->SetMultiLine(true);
|
| - label2_->SetFont(font);
|
| - label2_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - label2_->SizeToFit(ps.width() - kBubblePadding * 2);
|
| - AddChildView(label2_);
|
| -
|
| - string16 question_str = l10n_util::GetStringFUTF16(
|
| - IDS_FR_BUBBLE_QUESTION,
|
| - GetDefaultSearchEngineName(profile));
|
| - label3_ = new views::Label(question_str);
|
| - label3_->SetMultiLine(true);
|
| - label3_->SetFont(font);
|
| - label3_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label3_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - label3_->SizeToFit(ps.width() - kBubblePadding * 2);
|
| - AddChildView(label3_);
|
| -
|
| - std::wstring keep_str = UTF16ToWide(l10n_util::GetStringFUTF16(
|
| - IDS_FR_BUBBLE_OK,
|
| - GetDefaultSearchEngineName(profile)));
|
| - keep_button_ = new views::NativeTextButton(this, keep_str);
|
| - keep_button_->SetIsDefault(true);
|
| - AddChildView(keep_button_);
|
| -
|
| - std::wstring change_str =
|
| - UTF16ToWide(l10n_util::GetStringUTF16(IDS_FR_BUBBLE_CHANGE));
|
| - change_button_ = new views::NativeTextButton(this, change_str);
|
| - AddChildView(change_button_);
|
| -}
|
| -
|
| -void FirstRunBubbleView::BubbleShown() {
|
| - keep_button_->RequestFocus();
|
| -}
|
| -
|
| -void FirstRunBubbleView::ButtonPressed(views::Button* sender,
|
| - const views::Event& event) {
|
| - UserMetrics::RecordAction(UserMetricsAction("FirstRunBubbleView_Clicked"));
|
| - bubble_window_->set_fade_away_on_close(true);
|
| - bubble_window_->Close();
|
| - if (change_button_ == sender) {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("FirstRunBubbleView_ChangeButton"));
|
| -
|
| - Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
|
| - if (browser) {
|
| - browser->OpenSearchEngineOptionsDialog();
|
| - }
|
| - }
|
| -}
|
| -
|
| -void FirstRunBubbleView::Layout() {
|
| - gfx::Size canvas = GetPreferredSize();
|
| -
|
| - // The multiline business that follows is dirty hacks to get around
|
| - // bug 1325257.
|
| - label1_->SetMultiLine(false);
|
| - gfx::Size pref_size = label1_->GetPreferredSize();
|
| - label1_->SetMultiLine(true);
|
| - label1_->SizeToFit(canvas.width() - kBubblePadding * 2);
|
| - label1_->SetBounds(kBubblePadding, kBubblePadding,
|
| - canvas.width() - kBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - int next_v_space = label1_->y() + pref_size.height() +
|
| - views::kRelatedControlSmallVerticalSpacing;
|
| -
|
| - pref_size = label2_->GetPreferredSize();
|
| - label2_->SetBounds(kBubblePadding, next_v_space,
|
| - canvas.width() - kBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - next_v_space = label2_->y() + label2_->height() +
|
| - views::kPanelSubVerticalSpacing;
|
| -
|
| - pref_size = label3_->GetPreferredSize();
|
| - label3_->SetBounds(kBubblePadding, next_v_space,
|
| - canvas.width() - kBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - pref_size = change_button_->GetPreferredSize();
|
| - change_button_->SetBounds(
|
| - canvas.width() - pref_size.width() - kBubblePadding,
|
| - canvas.height() - pref_size.height() - views::kButtonVEdgeMargin,
|
| - pref_size.width(), pref_size.height());
|
| -
|
| - pref_size = keep_button_->GetPreferredSize();
|
| - keep_button_->SetBounds(change_button_->x() - pref_size.width() -
|
| - views::kRelatedButtonHSpacing, change_button_->y(),
|
| - pref_size.width(), pref_size.height());
|
| -}
|
| -
|
| -gfx::Size FirstRunBubbleView::GetPreferredSize() {
|
| - return gfx::Size(views::Widget::GetLocalizedContentsSize(
|
| - IDS_FIRSTRUNBUBBLE_DIALOG_WIDTH_CHARS,
|
| - IDS_FIRSTRUNBUBBLE_DIALOG_HEIGHT_LINES));
|
| -}
|
| -
|
| -void FirstRunBubbleView::OnWillChangeFocus(View* focused_before,
|
| - View* focused_now) {
|
| - if (focused_before &&
|
| - (focused_before->GetClassName() ==
|
| - views::NativeTextButton::kViewClassName)) {
|
| - views::NativeTextButton* before =
|
| - static_cast<views::NativeTextButton*>(focused_before);
|
| - before->SetIsDefault(false);
|
| - }
|
| - if (focused_now &&
|
| - (focused_now->GetClassName() ==
|
| - views::NativeTextButton::kViewClassName)) {
|
| - views::NativeTextButton* after =
|
| - static_cast<views::NativeTextButton*>(focused_now);
|
| - after->SetIsDefault(true);
|
| - }
|
| -}
|
| -
|
| -// FirstRunOEMBubbleView ------------------------------------------------------
|
| -
|
| -class FirstRunOEMBubbleView : public FirstRunBubbleViewBase {
|
| - public:
|
| - FirstRunOEMBubbleView(FirstRunBubble* bubble_window, Profile* profile);
|
| -
|
| - private:
|
| - virtual ~FirstRunOEMBubbleView() { }
|
| -
|
| - // FirstRunBubbleViewBase:
|
| - virtual void BubbleShown();
|
| -
|
| - // Overridden from View:
|
| - virtual void ButtonPressed(views::Button* sender, const views::Event& event);
|
| - virtual void Layout();
|
| - virtual gfx::Size GetPreferredSize();
|
| -
|
| - // FocusChangeListener:
|
| - virtual void OnWillChangeFocus(View* focused_before, View* focused_now);
|
| -
|
| - FirstRunBubble* bubble_window_;
|
| - views::Label* label1_;
|
| - views::Label* label2_;
|
| - views::Label* label3_;
|
| - views::ImageButton* close_button_;
|
| - Profile* profile_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FirstRunOEMBubbleView);
|
| -};
|
| -
|
| -FirstRunOEMBubbleView::FirstRunOEMBubbleView(FirstRunBubble* bubble_window,
|
| - Profile* profile)
|
| - : bubble_window_(bubble_window),
|
| - label1_(NULL),
|
| - label2_(NULL),
|
| - label3_(NULL),
|
| - close_button_(NULL),
|
| - profile_(profile) {
|
| - ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| - const gfx::Font& font = rb.GetFont(ResourceBundle::MediumFont);
|
| -
|
| - label1_ = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_FR_OEM_BUBBLE_TITLE_1));
|
| - label1_->SetFont(font.DeriveFont(3, gfx::Font::BOLD));
|
| - label1_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label1_->SetEnabledColor(SK_ColorRED);
|
| - label1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - AddChildView(label1_);
|
| -
|
| - label2_ = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_FR_OEM_BUBBLE_TITLE_2));
|
| - label2_->SetFont(font.DeriveFont(3, gfx::Font::BOLD));
|
| - label2_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - AddChildView(label2_);
|
| -
|
| - gfx::Size ps = GetPreferredSize();
|
| -
|
| - label3_ = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_FR_OEM_BUBBLE_SUBTEXT));
|
| - label3_->SetMultiLine(true);
|
| - label3_->SetFont(font);
|
| - label3_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label3_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - label3_->SizeToFit(ps.width() - kOEMBubblePadding * 2);
|
| - AddChildView(label3_);
|
| -
|
| - close_button_ = new views::ImageButton(this);
|
| - close_button_->SetImage(views::CustomButton::BS_NORMAL,
|
| - rb.GetBitmapNamed(IDR_CLOSE_BAR));
|
| - close_button_->SetImage(views::CustomButton::BS_HOT,
|
| - rb.GetBitmapNamed(IDR_CLOSE_BAR_H));
|
| - close_button_->SetImage(views::CustomButton::BS_PUSHED,
|
| - rb.GetBitmapNamed(IDR_CLOSE_BAR_P));
|
| -
|
| - AddChildView(close_button_);
|
| +const int kAnchorVerticalOffset = -4;
|
| +const int kLayoutTopInset = 1;
|
| +const int kLayoutLeftInset = 2;
|
| +const int kLayoutBottomInset = 7;
|
| +const int kLayoutRightInset = 2;
|
| }
|
|
|
| -void FirstRunOEMBubbleView::BubbleShown() {
|
| - RequestFocus();
|
| - // No button in oem_bubble to request focus.
|
| -}
|
| -
|
| -void FirstRunOEMBubbleView::ButtonPressed(views::Button* sender,
|
| - const views::Event& event) {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("FirstRunOEMBubbleView_Clicked"));
|
| - bubble_window_->set_fade_away_on_close(true);
|
| - bubble_window_->Close();
|
| -}
|
| -
|
| -void FirstRunOEMBubbleView::Layout() {
|
| - gfx::Size canvas = GetPreferredSize();
|
| -
|
| - // First, draw the close button on the far right.
|
| - gfx::Size sz = close_button_->GetPreferredSize();
|
| - close_button_->SetBounds(
|
| - canvas.width() - sz.width() - kMarginRightOfCloseButton,
|
| - kOEMBubblePadding, sz.width(), sz.height());
|
| -
|
| - gfx::Size pref_size = label1_->GetPreferredSize();
|
| - label1_->SetBounds(kOEMBubblePadding, kOEMBubblePadding,
|
| - pref_size.width() + kOEMBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - pref_size = label2_->GetPreferredSize();
|
| - label2_->SetBounds(
|
| - kOEMBubblePadding * 2 + label1_->GetPreferredSize().width(),
|
| - kOEMBubblePadding, canvas.width() - kOEMBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - int next_v_space =
|
| - label1_->y() + pref_size.height() +
|
| - views::kRelatedControlSmallVerticalSpacing;
|
| -
|
| - pref_size = label3_->GetPreferredSize();
|
| - label3_->SetBounds(kOEMBubblePadding, next_v_space,
|
| - canvas.width() - kOEMBubblePadding * 2,
|
| - pref_size.height());
|
| +// static
|
| +FirstRunBubble* FirstRunBubble::ShowBubble(
|
| + Profile* profile,
|
| + views::View* anchor_view,
|
| + views::BubbleBorder::ArrowLocation arrow_location,
|
| + FirstRun::BubbleType bubble_type) {
|
| + FirstRunBubble* delegate =
|
| + new FirstRunBubble(profile,
|
| + anchor_view,
|
| + arrow_location,
|
| + bubble_type);
|
| + views::BubbleDelegateView::CreateBubble(delegate);
|
| + delegate->StartFade(true);
|
| + return delegate;
|
| }
|
|
|
| -gfx::Size FirstRunOEMBubbleView::GetPreferredSize() {
|
| - // Calculate width based on font and text.
|
| +void FirstRunBubble::Init() {
|
| ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| - const gfx::Font& font = rb.GetFont(
|
| - ResourceBundle::MediumFont).DeriveFont(3, gfx::Font::BOLD);
|
| - gfx::Size size = gfx::Size(
|
| - ui::GetLocalizedContentsWidthForFont(
|
| - IDS_FIRSTRUNOEMBUBBLE_DIALOG_WIDTH_CHARS, font),
|
| - ui::GetLocalizedContentsHeightForFont(
|
| - IDS_FIRSTRUNOEMBUBBLE_DIALOG_HEIGHT_LINES, font));
|
| -
|
| - // WARNING: HACK. Vista and XP calculate font size differently; this means
|
| - // that a dialog box correctly proportioned for XP will appear too large in
|
| - // Vista. The correct thing to do is to change font size calculations in
|
| - // XP or Vista so that the length of a string is calculated properly. For
|
| - // now, we force Vista to show a correctly-sized box by taking account of
|
| - // the difference in font size calculation. The coefficient should not be
|
| - // stored in a variable because it's a hack and should go away.
|
| - if (views::NativeWidgetWin::IsAeroGlassEnabled()) {
|
| - size.set_width(static_cast<int>(size.width() * 0.85));
|
| - size.set_height(static_cast<int>(size.height() * 0.85));
|
| - }
|
| - return size;
|
| -}
|
| + const gfx::Font& original_font = rb.GetFont(ResourceBundle::MediumFont);
|
| + const gfx::Font& derived_font = original_font.DeriveFont(2, gfx::Font::BOLD);
|
|
|
| -void FirstRunOEMBubbleView::OnWillChangeFocus(View* focused_before,
|
| - View* focused_now) {
|
| - // No buttons in oem_bubble to register focus changes.
|
| -}
|
| -
|
| -// FirstRunMinimalBubbleView --------------------------------------------------
|
| -// TODO(mirandac): combine FRBubbles more elegantly. http://crbug.com/41353
|
| -
|
| -class FirstRunMinimalBubbleView : public FirstRunBubbleViewBase {
|
| - public:
|
| - FirstRunMinimalBubbleView(FirstRunBubble* bubble_window, Profile* profile);
|
| -
|
| - private:
|
| - virtual ~FirstRunMinimalBubbleView() { }
|
| -
|
| - // FirstRunBubbleViewBase:
|
| - virtual void BubbleShown();
|
| -
|
| - // Overridden from View:
|
| - virtual void ButtonPressed(views::Button* sender,
|
| - const views::Event& event) { }
|
| - virtual void Layout();
|
| - virtual gfx::Size GetPreferredSize();
|
| -
|
| - // FocusChangeListener:
|
| - virtual void OnWillChangeFocus(View* focused_before, View* focused_now);
|
| -
|
| - FirstRunBubble* bubble_window_;
|
| - Profile* profile_;
|
| - views::Label* label1_;
|
| - views::Label* label2_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FirstRunMinimalBubbleView);
|
| -};
|
| -
|
| -FirstRunMinimalBubbleView::FirstRunMinimalBubbleView(
|
| - FirstRunBubble* bubble_window,
|
| - Profile* profile)
|
| - : bubble_window_(bubble_window),
|
| - profile_(profile),
|
| - label1_(NULL),
|
| - label2_(NULL) {
|
| - const gfx::Font& font =
|
| - ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont);
|
| -
|
| - label1_ = new views::Label(l10n_util::GetStringFUTF16(
|
| + views::Label* label1 = new views::Label(l10n_util::GetStringFUTF16(
|
| IDS_FR_SE_BUBBLE_TITLE,
|
| GetDefaultSearchEngineName(profile_)));
|
| - label1_->SetFont(font.DeriveFont(3, gfx::Font::BOLD));
|
| - label1_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - AddChildView(label1_);
|
| -
|
| - gfx::Size ps = GetPreferredSize();
|
| -
|
| - label2_ = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_FR_BUBBLE_SUBTEXT));
|
| - label2_->SetMultiLine(true);
|
| - label2_->SetFont(font);
|
| - label2_->SetBackgroundColor(Bubble::kBackgroundColor);
|
| - label2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| - label2_->SizeToFit(ps.width() - kBubblePadding * 2);
|
| - AddChildView(label2_);
|
| -}
|
| -
|
| -void FirstRunMinimalBubbleView::BubbleShown() {
|
| - RequestFocus();
|
| -}
|
| -
|
| -void FirstRunMinimalBubbleView::Layout() {
|
| - gfx::Size canvas = GetPreferredSize();
|
| -
|
| - // See comments in FirstRunOEMBubbleView::Layout explaining this hack.
|
| - label1_->SetMultiLine(false);
|
| - gfx::Size pref_size = label1_->GetPreferredSize();
|
| - label1_->SetMultiLine(true);
|
| - label1_->SizeToFit(canvas.width() - kBubblePadding * 2);
|
| - label1_->SetBounds(kBubblePadding, kBubblePadding,
|
| - canvas.width() - kBubblePadding * 2,
|
| - pref_size.height());
|
| -
|
| - int next_v_space = label1_->y() + pref_size.height() +
|
| - views::kRelatedControlSmallVerticalSpacing;
|
| -
|
| - pref_size = label2_->GetPreferredSize();
|
| - label2_->SetBounds(kBubblePadding, next_v_space,
|
| - canvas.width() - kBubblePadding * 2,
|
| - pref_size.height());
|
| -}
|
| -
|
| -gfx::Size FirstRunMinimalBubbleView::GetPreferredSize() {
|
| - return gfx::Size(views::Widget::GetLocalizedContentsSize(
|
| - IDS_FIRSTRUN_MINIMAL_BUBBLE_DIALOG_WIDTH_CHARS,
|
| - IDS_FIRSTRUN_MINIMAL_BUBBLE_DIALOG_HEIGHT_LINES));
|
| -}
|
| -
|
| -void FirstRunMinimalBubbleView::OnWillChangeFocus(View* focused_before,
|
| - View* focused_now) {
|
| - // No buttons in minimal bubble to register focus changes.
|
| -}
|
| -
|
| -
|
| -// FirstRunBubble -------------------------------------------------------------
|
| -
|
| -// static
|
| -FirstRunBubble* FirstRunBubble::Show(
|
| + label1->SetFont(derived_font);
|
| +
|
| + views::Label* label2 =
|
| + new views::Label(l10n_util::GetStringUTF16(IDS_FR_BUBBLE_SUBTEXT));
|
| + label2->SetFont(original_font);
|
| +
|
| + views::ImageButton* close_button = new views::ImageButton(this);
|
| + close_button->SetImage(views::CustomButton::BS_NORMAL,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR));
|
| + close_button->SetImage(views::CustomButton::BS_HOT,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR_H));
|
| + close_button->SetImage(views::CustomButton::BS_PUSHED,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR_P));
|
| +
|
| + views::GridLayout* layout = views::GridLayout::CreatePanel(this);
|
| + SetLayoutManager(layout);
|
| + layout->SetInsets(kLayoutTopInset,
|
| + kLayoutLeftInset,
|
| + kLayoutBottomInset,
|
| + kLayoutRightInset);
|
| +
|
| + views::ColumnSet* column_set = layout->AddColumnSet(0);
|
| + column_set->AddColumn(views::GridLayout::LEADING,
|
| + views::GridLayout::LEADING, 1,
|
| + views::GridLayout::USE_PREF, 0, 0);
|
| + column_set->AddColumn(views::GridLayout::TRAILING, views::GridLayout::FILL, 0,
|
| + views::GridLayout::USE_PREF, 0, 0);
|
| +
|
| + layout->StartRow(0, 0);
|
| + layout->AddView(label1);
|
| + layout->AddView(close_button, 1, 1, views::GridLayout::TRAILING,
|
| + views::GridLayout::LEADING);
|
| + layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
|
| +
|
| + layout->StartRow(0, 0);
|
| + layout->AddView(label2);
|
| +}
|
| +
|
| +gfx::Point FirstRunBubble::GetAnchorPoint() {
|
| + // Compensate for padding in anchor.
|
| + return BubbleDelegateView::GetAnchorPoint().Add(
|
| + gfx::Point(0, anchor_view() ? kAnchorVerticalOffset : 0));
|
| +}
|
| +
|
| +FirstRunBubble::FirstRunBubble(
|
| Profile* profile,
|
| - views::Widget* parent,
|
| - const gfx::Rect& position_relative_to,
|
| + views::View* anchor_view,
|
| views::BubbleBorder::ArrowLocation arrow_location,
|
| - FirstRun::BubbleType bubble_type) {
|
| - FirstRunBubble* bubble = new FirstRunBubble();
|
| - FirstRunBubbleViewBase* view = NULL;
|
| -
|
| - switch (bubble_type) {
|
| - case FirstRun::OEM_BUBBLE:
|
| - view = new FirstRunOEMBubbleView(bubble, profile);
|
| - break;
|
| - case FirstRun::LARGE_BUBBLE:
|
| - view = new FirstRunBubbleView(bubble, profile);
|
| - break;
|
| - case FirstRun::MINIMAL_BUBBLE:
|
| - view = new FirstRunMinimalBubbleView(bubble, profile);
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - bubble->set_view(view);
|
| - bubble->InitBubble(
|
| - parent, position_relative_to, arrow_location,
|
| - views::BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR, view, bubble);
|
| - bubble->GetWidget()->GetFocusManager()->AddFocusChangeListener(view);
|
| - view->BubbleShown();
|
| - return bubble;
|
| -}
|
| -
|
| -FirstRunBubble::FirstRunBubble()
|
| - : has_been_activated_(false),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(enable_window_method_factory_(this)),
|
| - view_(NULL) {
|
| + FirstRun::BubbleType bubble_type)
|
| + : views::BubbleDelegateView(anchor_view,
|
| + arrow_location,
|
| + SK_ColorWHITE),
|
| + profile_(profile),
|
| + bubble_type_(bubble_type) {
|
| }
|
|
|
| FirstRunBubble::~FirstRunBubble() {
|
| - enable_window_method_factory_.InvalidateWeakPtrs();
|
| - GetWidget()->GetFocusManager()->RemoveFocusChangeListener(view_);
|
| -}
|
| -
|
| -void FirstRunBubble::EnableParent() {
|
| - ::EnableWindow(GetParent(), true);
|
| - // The EnableWindow() call above causes the parent to become active, which
|
| - // resets the flag set by Bubble's call to DisableInactiveRendering(), so we
|
| - // have to call it again before activating the bubble to prevent the parent
|
| - // window from rendering inactive.
|
| - // TODO(beng): this only works in custom-frame mode, not glass-frame mode.
|
| - HWND bubble_owner = GetLogicalBubbleOwner(GetNativeView());
|
| - views::Widget* parent = views::Widget::GetWidgetForNativeView(bubble_owner);
|
| - if (parent)
|
| - parent->DisableInactiveRendering();
|
| - // Reactivate the FirstRunBubble so it responds to OnActivate messages.
|
| - SetWindowPos(GetParent(), 0, 0, 0, 0,
|
| - SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW | SWP_SHOWWINDOW);
|
| }
|
|
|
| -#if defined(OS_WIN) && !defined(USE_AURA)
|
| -void FirstRunBubble::OnActivate(UINT action, BOOL minimized, HWND window) {
|
| - // Keep the bubble around for kLingerTime milliseconds, to prevent accidental
|
| - // closure.
|
| - const int kLingerTime = 3000;
|
| -
|
| - // We might get re-enabled right before we are closed (sequence is: we get
|
| - // deactivated, we call close, before we are actually closed we get
|
| - // reactivated). Don't do the disabling of the parent in such cases.
|
| - if (action == WA_ACTIVE && !has_been_activated_) {
|
| - has_been_activated_ = true;
|
| -
|
| - ::EnableWindow(GetParent(), false);
|
| -
|
| - MessageLoop::current()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&FirstRunBubble::EnableParent,
|
| - enable_window_method_factory_.GetWeakPtr()),
|
| - kLingerTime);
|
| - return;
|
| +void FirstRunBubble::ButtonPressed(views::Button* sender,
|
| + const views::Event& event) {
|
| + if (bubble_type_ == FirstRun::OEM_BUBBLE) {
|
| + UserMetrics::RecordAction(
|
| + UserMetricsAction("FirstRunOEMBubbleView_Clicked"));
|
| }
|
| -
|
| - // Keep window from automatically closing until kLingerTime has passed.
|
| - if (::IsWindowEnabled(GetParent()))
|
| - Bubble::OnActivate(action, minimized, window);
|
| -}
|
| -#endif
|
| -
|
| -void FirstRunBubble::BubbleClosing(Bubble* bubble, bool closed_by_escape) {
|
| - // Make sure our parent window is re-enabled.
|
| - if (!IsWindowEnabled(GetParent()))
|
| - ::EnableWindow(GetParent(), true);
|
| + GetWidget()->Close();
|
| }
|
|
|