Commit d6087963 authored by alicet@chromium.org's avatar alicet@chromium.org

global error bubble view move to views/bubble api.

BUG=98323
TEST=None


Review URL: http://codereview.chromium.org/8570014

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110646 0039d316-1c4b-4281-b951-d872f2087c98
parent 3b9bb046
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "chrome/browser/ui/views/global_error_bubble_view.h" #include "chrome/browser/ui/views/global_error_bubble_view.h"
#include "base/logging.h" #include "base/utf_string_conversions.h"
#include "chrome/browser/ui/global_error.h" #include "chrome/browser/ui/global_error.h"
#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar_view.h" #include "chrome/browser/ui/views/toolbar_view.h"
...@@ -23,19 +23,26 @@ enum { ...@@ -23,19 +23,26 @@ enum {
TAG_CANCEL_BUTTON, TAG_CANCEL_BUTTON,
}; };
const int kBubbleViewWidth = 262; const int kMaxBubbleViewWidth = 262;
// The horizontal padding between the title and the icon. // The horizontal padding between the title and the icon.
const int kTitleHorizontalPadding = 3; const int kTitleHorizontalPadding = 3;
// The vertical offset of the wrench bubble from the wrench menu button. // The vertical offset of the wrench bubble from the wrench menu button.
const int kWrenchBubblePointOffsetY = 6; const int kWrenchBubblePointOffsetY = -6;
const int kLayoutBottomPadding = 2;
} // namespace } // namespace
GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, GlobalErrorBubbleView::GlobalErrorBubbleView(
views::View* anchor_view,
views::BubbleBorder::ArrowLocation location,
const SkColor& color,
Browser* browser,
GlobalError* error) GlobalError* error)
: browser_(browser), : BubbleDelegateView(anchor_view, location, color),
browser_(browser),
error_(error) { error_(error) {
ResourceBundle& rb = ResourceBundle::GetSharedInstance(); ResourceBundle& rb = ResourceBundle::GetSharedInstance();
int resource_id = error_->GetBubbleViewIconResourceID(); int resource_id = error_->GetBubbleViewIconResourceID();
...@@ -49,9 +56,10 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, ...@@ -49,9 +56,10 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser,
title_label->SetFont(title_label->font().DeriveFont(1)); title_label->SetFont(title_label->font().DeriveFont(1));
string16 message_string(error_->GetBubbleViewMessage()); string16 message_string(error_->GetBubbleViewMessage());
message_label_ = new views::Label(message_string); views::Label* message_label = new views::Label(message_string);
message_label_->SetMultiLine(true); message_label->SetMultiLine(true);
message_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); message_label->SizeToFit(kMaxBubbleViewWidth);
message_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
string16 accept_string(error_->GetBubbleViewAcceptButtonLabel()); string16 accept_string(error_->GetBubbleViewAcceptButtonLabel());
scoped_ptr<views::TextButton> accept_button( scoped_ptr<views::TextButton> accept_button(
...@@ -68,6 +76,7 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, ...@@ -68,6 +76,7 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser,
views::GridLayout* layout = new views::GridLayout(this); views::GridLayout* layout = new views::GridLayout(this);
SetLayoutManager(layout); SetLayoutManager(layout);
layout->SetInsets(0, 0, kLayoutBottomPadding, 0);
// Top row, icon and title. // Top row, icon and title.
views::ColumnSet* cs = layout->AddColumnSet(0); views::ColumnSet* cs = layout->AddColumnSet(0);
...@@ -87,9 +96,11 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, ...@@ -87,9 +96,11 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser,
cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing); cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing);
cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
0, views::GridLayout::USE_PREF, 0, 0); 0, views::GridLayout::USE_PREF, 0, 0);
if (cancel_button.get()) {
cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING,
0, views::GridLayout::USE_PREF, 0, 0); 0, views::GridLayout::USE_PREF, 0, 0);
}
layout->StartRow(1, 0); layout->StartRow(1, 0);
layout->AddView(image_view.release()); layout->AddView(image_view.release());
...@@ -97,80 +108,50 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, ...@@ -97,80 +108,50 @@ GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser,
layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
layout->StartRow(1, 1); layout->StartRow(1, 1);
layout->AddView(message_label_); layout->AddView(message_label);
layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing); layout->AddPaddingRow(0, views::kLabelToControlVerticalSpacing);
layout->StartRow(0, 2); layout->StartRow(0, 2);
layout->AddView(accept_button.release()); layout->AddView(accept_button.release());
if (cancel_button.get()) if (cancel_button.get())
layout->AddView(cancel_button.release()); layout->AddView(cancel_button.release());
else
layout->SkipColumns(1); // Adjust the message label size in case buttons are too long.
message_label->SizeToFit(layout->GetPreferredSize(this).width());
} }
GlobalErrorBubbleView::~GlobalErrorBubbleView() { GlobalErrorBubbleView::~GlobalErrorBubbleView() {
} }
gfx::Size GlobalErrorBubbleView::GetPreferredSize() { gfx::Point GlobalErrorBubbleView::GetAnchorPoint() {
views::GridLayout* layout = return (views::BubbleDelegateView::GetAnchorPoint().Add(
static_cast<views::GridLayout*>(GetLayoutManager()); gfx::Point(0, anchor_view() ? kWrenchBubblePointOffsetY : 0)));
// Buttons row may require bigger width than |kBubbleViewWidth|. To support
// this case, we first set the message label to fit our preferred width.
// Then, get the desired width from GridLayout (it may be bigger than
// |kBubbleViewWidth| if button text is long enough). This width is used as
// the final width for our view, so message label's preferred width is reset
// back to 0.
message_label_->SizeToFit(kBubbleViewWidth);
int width = std::max(layout->GetPreferredSize(this).width(),
kBubbleViewWidth);
message_label_->SizeToFit(0);
int height = layout->GetPreferredHeightForWidth(this, width);
return gfx::Size(width, height);
} }
void GlobalErrorBubbleView::ButtonPressed(views::Button* sender, void GlobalErrorBubbleView::ButtonPressed(views::Button* sender,
const views::Event& event) { const views::Event& event) {
DCHECK(bubble_);
if (sender->tag() == TAG_ACCEPT_BUTTON) if (sender->tag() == TAG_ACCEPT_BUTTON)
error_->BubbleViewAcceptButtonPressed(); error_->BubbleViewAcceptButtonPressed();
else if (sender->tag() == TAG_CANCEL_BUTTON) else if (sender->tag() == TAG_CANCEL_BUTTON)
error_->BubbleViewCancelButtonPressed(); error_->BubbleViewCancelButtonPressed();
else else
NOTREACHED(); NOTREACHED();
bubble_->Close(); GetWidget()->Close();
} }
void GlobalErrorBubbleView::BubbleClosing(Bubble* bubble, void GlobalErrorBubbleView::WindowClosing() {
bool closed_by_escape) {
error_->BubbleViewDidClose(); error_->BubbleViewDidClose();
} }
bool GlobalErrorBubbleView::CloseOnEscape() {
return true;
}
bool GlobalErrorBubbleView::FadeInOnShow() {
// TODO(sail): Enabling fade causes the window to be disabled for some
// reason. Until this is fixed we need to disable fade.
return false;
}
void GlobalError::ShowBubbleView(Browser* browser, GlobalError* error) { void GlobalError::ShowBubbleView(Browser* browser, GlobalError* error) {
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
views::View* wrench_button = browser_view->toolbar()->app_menu(); views::View* wrench_button = browser_view->toolbar()->app_menu();
gfx::Point origin;
views::View::ConvertPointToScreen(wrench_button, &origin);
gfx::Rect bounds(origin.x(), origin.y(), wrench_button->width(),
wrench_button->height());
bounds.Inset(0, kWrenchBubblePointOffsetY);
GlobalErrorBubbleView* bubble_view = GlobalErrorBubbleView* bubble_view =
new GlobalErrorBubbleView(browser, error); new GlobalErrorBubbleView(wrench_button,
// Bubble::Show() takes ownership of the view. views::BubbleBorder::TOP_RIGHT,
Bubble* bubble = Bubble::Show( SK_ColorWHITE,
browser_view->GetWidget(), bounds, views::BubbleBorder::TOP_RIGHT, browser,
views::BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR, bubble_view, error);
bubble_view); views::BubbleDelegateView::CreateBubble(bubble_view);
bubble_view->set_bubble(bubble); bubble_view->StartFade(true);
} }
...@@ -6,44 +6,36 @@ ...@@ -6,44 +6,36 @@
#define CHROME_BROWSER_UI_VIEWS_GLOBAL_ERROR_BUBBLE_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_GLOBAL_ERROR_BUBBLE_VIEW_H_
#pragma once #pragma once
#include "chrome/browser/ui/views/bubble/bubble.h" #include "views/bubble/bubble_delegate.h"
#include "views/controls/button/button.h" #include "views/controls/button/button.h"
class Browser; class Browser;
class GlobalError; class GlobalError;
namespace views { class GlobalErrorBubbleView : public views::ButtonListener,
class Label; public views::BubbleDelegateView {
}
class GlobalErrorBubbleView : public views::View,
public views::ButtonListener,
public BubbleDelegate {
public: public:
GlobalErrorBubbleView(Browser* browser, GlobalError* error); GlobalErrorBubbleView(views::View* anchor_view,
views::BubbleBorder::ArrowLocation location,
const SkColor& color,
Browser* browser,
GlobalError* error);
virtual ~GlobalErrorBubbleView(); virtual ~GlobalErrorBubbleView();
// views::View implementation. // views::BubbleDelegateView implementation.
virtual gfx::Size GetPreferredSize() OVERRIDE; virtual gfx::Point GetAnchorPoint() OVERRIDE;
// views::ButtonListener implementation. // views::ButtonListener implementation.
virtual void ButtonPressed(views::Button* sender, virtual void ButtonPressed(views::Button* sender,
const views::Event& event) OVERRIDE; const views::Event& event) OVERRIDE;
// BubbleDelegate implementation. // views::WidgetDelegate implementation.
virtual void BubbleClosing(Bubble* bubble, bool closed_by_escape) OVERRIDE; virtual void WindowClosing() OVERRIDE;
virtual bool CloseOnEscape() OVERRIDE;
virtual bool FadeInOnShow() OVERRIDE;
void set_bubble(Bubble* bubble) { bubble_ = bubble; }
private: private:
Browser* browser_; Browser* browser_;
GlobalError* error_; GlobalError* error_;
views::Label* message_label_;
Bubble* bubble_;
DISALLOW_COPY_AND_ASSIGN(GlobalErrorBubbleView); DISALLOW_COPY_AND_ASSIGN(GlobalErrorBubbleView);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment