diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-10 18:05:13 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-10 18:05:13 +0000 |
commit | c30fa32ff166ba04adc796e59dec61466b8ae479 (patch) | |
tree | a1f4838726c4712d8847015b4105a5da05586fae /chrome/browser/ui/views/global_error_bubble_view.cc | |
parent | c5219ddac893aafb507d759773fc9d3be7378464 (diff) | |
download | chromium_src-c30fa32ff166ba04adc796e59dec61466b8ae479.zip chromium_src-c30fa32ff166ba04adc796e59dec61466b8ae479.tar.gz chromium_src-c30fa32ff166ba04adc796e59dec61466b8ae479.tar.bz2 |
Add global error bubble view for Views
This change adds a bubble view to show global errors on toolkit Views. Tests comming in a separate CL.
BUG=95146
Review URL: http://codereview.chromium.org/7859025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100588 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/ui/views/global_error_bubble_view.cc')
-rw-r--r-- | chrome/browser/ui/views/global_error_bubble_view.cc | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/global_error_bubble_view.cc b/chrome/browser/ui/views/global_error_bubble_view.cc new file mode 100644 index 0000000..fa4ebc5 --- /dev/null +++ b/chrome/browser/ui/views/global_error_bubble_view.cc @@ -0,0 +1,157 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/global_error_bubble_view.h" + +#include "base/logging.h" +#include "chrome/browser/ui/global_error.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/toolbar_view.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" +#include "views/controls/button/text_button.h" +#include "views/controls/image_view.h" +#include "views/controls/label.h" +#include "views/layout/grid_layout.h" +#include "views/layout/layout_constants.h" + +namespace { + +enum { + TAG_ACCEPT_BUTTON = 1, + TAG_CANCEL_BUTTON, +}; + +const int kBubbleViewWidth = 262; + +// The vertical offset of the wrench bubble from the wrench menu button. +const int kWrenchBubblePointOffsetY = 6; + +} // namespace + +GlobalErrorBubbleView::GlobalErrorBubbleView(Browser* browser, + GlobalError* error) + : browser_(browser), + error_(error) { + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + int resource_id = error_->GetBubbleViewIconResourceID(); + scoped_ptr<views::ImageView> image_view(new views::ImageView()); + image_view->SetImage(rb.GetImageNamed(resource_id).ToSkBitmap()); + + string16 title_string(error_->GetBubbleViewTitle()); + scoped_ptr<views::Label> title_label( + new views::Label(UTF16ToWideHack(title_string))); + title_label->SetMultiLine(true); + title_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + title_label->SetFont(title_label->font().DeriveFont(1)); + + string16 message_string(error_->GetBubbleViewMessage()); + scoped_ptr<views::Label> message_label( + new views::Label(UTF16ToWideHack(message_string))); + message_label->SetMultiLine(true); + message_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + + string16 accept_string(error_->GetBubbleViewAcceptButtonLabel()); + scoped_ptr<views::TextButton> accept_button( + new views::NativeTextButton(this, UTF16ToWideHack(accept_string))); + accept_button->SetIsDefault(true); + + string16 cancel_string(error_->GetBubbleViewCancelButtonLabel()); + scoped_ptr<views::TextButton> cancel_button; + if (!cancel_string.empty()) { + cancel_button.reset( + new views::NativeTextButton(this, UTF16ToWideHack(cancel_string))); + } + + views::GridLayout* layout = new views::GridLayout(this); + SetLayoutManager(layout); + + // Top row, icon and title. + views::ColumnSet* cs = layout->AddColumnSet(0); + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::LEADING, + 0, views::GridLayout::USE_PREF, 0, 0); + cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, + 1, views::GridLayout::USE_PREF, 0, 0); + + // Middle row, message label. + cs = layout->AddColumnSet(1); + cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, + 1, views::GridLayout::USE_PREF, 0, 0); + + // Bottom row, accept and cancel button. + cs = layout->AddColumnSet(2); + cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing); + cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, + 0, views::GridLayout::USE_PREF, 0, 0); + cs->AddPaddingColumn(0, views::kRelatedButtonHSpacing); + cs->AddColumn(views::GridLayout::TRAILING, views::GridLayout::LEADING, + 0, views::GridLayout::USE_PREF, 0, 0); + + layout->StartRow(1, 0); + layout->AddView(image_view.release()); + layout->AddView(title_label.release()); + layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); + + layout->StartRow(1, 1); + layout->AddView(message_label.release()); + layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); + + layout->StartRow(0, 2); + if (cancel_button.get()) + layout->AddView(cancel_button.release()); + else + layout->SkipColumns(1); + layout->AddView(accept_button.release()); +} + +GlobalErrorBubbleView::~GlobalErrorBubbleView() { +} + +gfx::Size GlobalErrorBubbleView::GetPreferredSize() { + views::GridLayout* layout = + static_cast<views::GridLayout*>(GetLayoutManager()); + int height = layout->GetPreferredHeightForWidth(this, kBubbleViewWidth); + return gfx::Size(kBubbleViewWidth, height); +} + +void GlobalErrorBubbleView::ButtonPressed(views::Button* sender, + const views::Event& event) { + if (sender->tag() == TAG_ACCEPT_BUTTON) + error_->BubbleViewAcceptButtonPressed(); + else if (sender->tag() == TAG_CANCEL_BUTTON) + error_->BubbleViewCancelButtonPressed(); + else + NOTREACHED(); +} + +void GlobalErrorBubbleView::BubbleClosing(Bubble* bubble, + bool closed_by_escape) { + error_->BubbleViewDidClose(); +} + +bool GlobalErrorBubbleView::CloseOnEscape() { + return true; +} + +bool GlobalErrorBubbleView::FadeInOnShow() { + return true; +} + +void GlobalError::ShowBubbleView(Browser* browser, GlobalError* error) { + BrowserView* browser_view = BrowserView::GetBrowserViewForNativeWindow( + browser->window()->GetNativeHandle()); + 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 = + new GlobalErrorBubbleView(browser, error); + // Bubble::Show() takes ownership of the view. + Bubble::Show(browser_view->GetWidget(), bounds, + views::BubbleBorder::TOP_RIGHT, bubble_view, bubble_view); +} |