summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/global_error_bubble_view.cc
diff options
context:
space:
mode:
authorsail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-10 18:05:13 +0000
committersail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-10 18:05:13 +0000
commitc30fa32ff166ba04adc796e59dec61466b8ae479 (patch)
treea1f4838726c4712d8847015b4105a5da05586fae /chrome/browser/ui/views/global_error_bubble_view.cc
parentc5219ddac893aafb507d759773fc9d3be7378464 (diff)
downloadchromium_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.cc157
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);
+}