summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/infobars/infobars.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/views/infobars/infobars.cc')
-rw-r--r--chrome/browser/views/infobars/infobars.cc614
1 files changed, 0 insertions, 614 deletions
diff --git a/chrome/browser/views/infobars/infobars.cc b/chrome/browser/views/infobars/infobars.cc
deleted file mode 100644
index c96f72f..0000000
--- a/chrome/browser/views/infobars/infobars.cc
+++ /dev/null
@@ -1,614 +0,0 @@
-// Copyright (c) 2010 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/views/infobars/infobars.h"
-
-#include "app/l10n_util.h"
-#include "app/resource_bundle.h"
-#include "app/slide_animation.h"
-#if defined(OS_WIN)
-#include "app/win_util.h"
-#endif // defined(OS_WIN)
-#include "base/message_loop.h"
-#include "base/utf_string_conversions.h"
-#include "chrome/browser/views/event_utils.h"
-#include "chrome/browser/views/infobars/infobar_container.h"
-#include "gfx/canvas.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "views/background.h"
-#include "views/controls/button/image_button.h"
-#include "views/controls/button/native_button.h"
-#include "views/controls/image_view.h"
-#include "views/controls/label.h"
-#include "views/focus/external_focus_tracker.h"
-#include "views/widget/widget.h"
-
-// static
-const double InfoBar::kDefaultTargetHeight = 36.0;
-const int InfoBar::kHorizontalPadding = 6;
-const int InfoBar::kIconLabelSpacing = 6;
-const int InfoBar::kButtonButtonSpacing = 10;
-const int InfoBar::kEndOfLabelSpacing = 16;
-const int InfoBar::kCloseButtonSpacing = 12;
-const int InfoBar::kButtonInLabelSpacing = 5;
-
-static const SkColor kWarningBackgroundColorTop = SkColorSetRGB(255, 242, 183);
-static const SkColor kWarningBackgroundColorBottom =
- SkColorSetRGB(250, 230, 145);
-
-static const SkColor kPageActionBackgroundColorTop =
- SkColorSetRGB(218, 231, 249);
-static const SkColor kPageActionBackgroundColorBottom =
- SkColorSetRGB(179, 202, 231);
-
-static const int kSeparatorLineHeight = 1;
-
-// InfoBarBackground, public: --------------------------------------------------
-
-InfoBarBackground::InfoBarBackground(InfoBarDelegate::Type infobar_type) {
- SkColor top_color;
- SkColor bottom_color;
- switch (infobar_type) {
- case InfoBarDelegate::WARNING_TYPE:
- top_color = kWarningBackgroundColorTop;
- bottom_color = kWarningBackgroundColorBottom;
- break;
- case InfoBarDelegate::PAGE_ACTION_TYPE:
- top_color = kPageActionBackgroundColorTop;
- bottom_color = kPageActionBackgroundColorBottom;
- break;
- default:
- NOTREACHED();
- break;
- }
- gradient_background_.reset(
- views::Background::CreateVerticalGradientBackground(top_color,
- bottom_color));
-}
-
-// InfoBarBackground, views::Background overrides: -----------------------------
-
-void InfoBarBackground::Paint(gfx::Canvas* canvas, views::View* view) const {
- // First paint the gradient background.
- gradient_background_->Paint(canvas, view);
-
- // Now paint the separator line.
- canvas->FillRectInt(ResourceBundle::toolbar_separator_color, 0,
- view->height() - kSeparatorLineHeight, view->width(),
- kSeparatorLineHeight);
-}
-
-// InfoBar, public: ------------------------------------------------------------
-
-InfoBar::InfoBar(InfoBarDelegate* delegate)
- : delegate_(delegate),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- close_button_(new views::ImageButton(this))),
- ALLOW_THIS_IN_INITIALIZER_LIST(delete_factory_(this)),
- target_height_(kDefaultTargetHeight) {
- // We delete ourselves when we're removed from the view hierarchy.
- set_parent_owned(false);
-
- set_background(new InfoBarBackground(delegate->GetInfoBarType()));
-
- switch (delegate->GetInfoBarType()) {
- case InfoBarDelegate::WARNING_TYPE:
- SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_INFOBAR_WARNING));
- break;
- case InfoBarDelegate::PAGE_ACTION_TYPE:
- SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_INFOBAR_PAGE_ACTION));
- break;
- default:
- NOTREACHED();
- break;
- }
-
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- 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));
- close_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_CLOSE));
- AddChildView(close_button_);
-
- animation_.reset(new SlideAnimation(this));
- animation_->SetTweenType(Tween::LINEAR);
-}
-
-InfoBar::~InfoBar() {
-}
-
-// InfoBar, views::View overrides: ---------------------------------------------
-
-AccessibilityTypes::Role InfoBar::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_ALERT;
-}
-
-gfx::Size InfoBar::GetPreferredSize() {
- int height = static_cast<int>(target_height_ * animation_->GetCurrentValue());
- return gfx::Size(0, height);
-}
-
-void InfoBar::Layout() {
- gfx::Size button_ps = close_button_->GetPreferredSize();
- close_button_->SetBounds(width() - kHorizontalPadding - button_ps.width(),
- OffsetY(this, button_ps), button_ps.width(),
- button_ps.height());
-}
-
-void InfoBar::ViewHierarchyChanged(bool is_add, views::View* parent,
- views::View* child) {
- if (child == this) {
- if (is_add) {
- InfoBarAdded();
- } else {
- InfoBarRemoved();
- }
- }
-
- if (GetWidget() && GetWidget()->IsAccessibleWidget()) {
- // For accessibility, make the close button the last child view.
- if (parent == this && child != close_button_ &&
- HasChildView(close_button_) &&
- GetChildViewAt(GetChildViewCount() - 1) != close_button_) {
- RemoveChildView(close_button_);
- AddChildView(close_button_);
- }
-
- // Allow screen reader users to focus the close button.
- close_button_->SetFocusable(true);
- }
-}
-
-// InfoBar, protected: ---------------------------------------------------------
-
-int InfoBar::GetAvailableWidth() const {
- return close_button_->x() - kCloseButtonSpacing;
-}
-
-void InfoBar::RemoveInfoBar() const {
- if (container_)
- container_->RemoveDelegate(delegate());
-}
-
-int InfoBar::CenterY(const gfx::Size prefsize) {
- return std::max((static_cast<int>(target_height_) -
- prefsize.height()) / 2, 0);
-}
-
-int InfoBar::OffsetY(views::View* parent, const gfx::Size prefsize) {
- return CenterY(prefsize) -
- (static_cast<int>(target_height_) - parent->height());
-}
-
-// InfoBar, views::ButtonListener implementation: ------------------
-
-void InfoBar::ButtonPressed(views::Button* sender, const views::Event& event) {
- if (sender == close_button_) {
- if (delegate_)
- delegate_->InfoBarDismissed();
- RemoveInfoBar();
- }
-}
-
-// InfoBar, views::FocusChangeListener implementation: ------------------
-
-void InfoBar::FocusWillChange(View* focused_before, View* focused_now) {
- // This will trigger some screen readers to read the entire contents of this
- // infobar.
- if (focused_before && focused_now &&
- !this->IsParentOf(focused_before) && this->IsParentOf(focused_now)) {
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT);
- }
-}
-
-// InfoBar, AnimationDelegate implementation: ----------------------------------
-
-void InfoBar::AnimationProgressed(const Animation* animation) {
- if (container_)
- container_->InfoBarAnimated(true);
-}
-
-void InfoBar::AnimationEnded(const Animation* animation) {
- if (container_) {
- container_->InfoBarAnimated(false);
-
- if (!animation_->IsShowing())
- Close();
- }
-}
-
-// InfoBar, private: -----------------------------------------------------------
-
-void InfoBar::AnimateOpen() {
- animation_->Show();
-}
-
-void InfoBar::Open() {
- // Set the animation value to 1.0 so that GetPreferredSize() returns the right
- // size.
- animation_->Reset(1.0);
- if (container_)
- container_->InfoBarAnimated(false);
-}
-
-void InfoBar::AnimateClose() {
- bool restore_focus = true;
-#if defined(OS_WIN)
- // Do not restore focus (and active state with it) on Windows if some other
- // top-level window became active.
- if (GetWidget() &&
- !win_util::DoesWindowBelongToActiveWindow(GetWidget()->GetNativeView())) {
- restore_focus = false;
- }
-#endif // defined(OS_WIN)
- DestroyFocusTracker(restore_focus);
- animation_->Hide();
-}
-
-void InfoBar::Close() {
- GetParent()->RemoveChildView(this);
- // Note that we only tell the delegate we're closed here, and not when we're
- // simply destroyed (by virtue of a tab switch or being moved from window to
- // window), since this action can cause the delegate to destroy itself.
- if (delegate_) {
- delegate_->InfoBarClosed();
- delegate_ = NULL;
- }
-}
-
-void InfoBar::InfoBarAdded() {
- // The container_ pointer must be set before adding to the view hierarchy.
- DCHECK(container_);
-#if defined(OS_WIN)
- // When we're added to a view hierarchy within a widget, we create an
- // external focus tracker to track what was focused in case we obtain
- // focus so that we can restore focus when we're removed.
- views::Widget* widget = GetWidget();
- if (widget) {
- focus_tracker_.reset(new views::ExternalFocusTracker(this,
- GetFocusManager()));
- }
-#endif
-
- if (GetFocusManager())
- GetFocusManager()->AddFocusChangeListener(this);
-
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT);
-}
-
-void InfoBar::InfoBarRemoved() {
- DestroyFocusTracker(false);
- // NULL our container_ pointer so that if Animation::Stop results in
- // AnimationEnded being called, we do not try and delete ourselves twice.
- container_ = NULL;
- animation_->Stop();
- // Finally, clean ourselves up when we're removed from the view hierarchy
- // since no-one refers to us now.
- MessageLoop::current()->PostTask(FROM_HERE,
- delete_factory_.NewRunnableMethod(&InfoBar::DeleteSelf));
-
- if (GetFocusManager())
- GetFocusManager()->RemoveFocusChangeListener(this);
-}
-
-void InfoBar::DestroyFocusTracker(bool restore_focus) {
- if (focus_tracker_.get()) {
- if (restore_focus)
- focus_tracker_->FocusLastFocusedExternalView();
- focus_tracker_->SetFocusManager(NULL);
- focus_tracker_.reset(NULL);
- }
-}
-
-void InfoBar::DeleteSelf() {
- delete this;
-}
-
-// AlertInfoBar, public: -------------------------------------------------------
-
-AlertInfoBar::AlertInfoBar(AlertInfoBarDelegate* delegate)
- : InfoBar(delegate) {
- label_ = new views::Label(
- UTF16ToWideHack(delegate->GetMessageText()),
- ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont));
- label_->SetColor(SK_ColorBLACK);
- label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- AddChildView(label_);
-
- icon_ = new views::ImageView;
- if (delegate->GetIcon())
- icon_->SetImage(delegate->GetIcon());
- AddChildView(icon_);
-}
-
-AlertInfoBar::~AlertInfoBar() {
-}
-
-// AlertInfoBar, views::View overrides: ----------------------------------------
-
-void AlertInfoBar::Layout() {
- // Layout the close button.
- InfoBar::Layout();
-
- // Layout the icon and text.
- gfx::Size icon_ps = icon_->GetPreferredSize();
- icon_->SetBounds(kHorizontalPadding, OffsetY(this, icon_ps), icon_ps.width(),
- icon_ps.height());
-
- gfx::Size text_ps = label_->GetPreferredSize();
- int text_width = std::min(
- text_ps.width(),
- GetAvailableWidth() - icon_->bounds().right() - kIconLabelSpacing);
- label_->SetBounds(icon_->bounds().right() + kIconLabelSpacing,
- OffsetY(this, text_ps), text_width, text_ps.height());
-}
-
-// AlertInfoBar, private: ------------------------------------------------------
-
-AlertInfoBarDelegate* AlertInfoBar::GetDelegate() {
- return delegate()->AsAlertInfoBarDelegate();
-}
-
-// LinkInfoBar, public: --------------------------------------------------------
-
-LinkInfoBar::LinkInfoBar(LinkInfoBarDelegate* delegate)
- : InfoBar(delegate),
- icon_(new views::ImageView),
- label_1_(new views::Label),
- label_2_(new views::Label),
- link_(new views::Link) {
- // Set up the icon.
- if (delegate->GetIcon())
- icon_->SetImage(delegate->GetIcon());
- AddChildView(icon_);
-
- // Set up the labels.
- size_t offset;
- string16 message_text = delegate->GetMessageTextWithOffset(&offset);
- if (offset != string16::npos) {
- label_1_->SetText(UTF16ToWideHack(message_text.substr(0, offset)));
- label_2_->SetText(UTF16ToWideHack(message_text.substr(offset)));
- } else {
- label_1_->SetText(UTF16ToWideHack(message_text));
- }
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- label_1_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
- label_2_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
- label_1_->SetColor(SK_ColorBLACK);
- label_2_->SetColor(SK_ColorBLACK);
- label_1_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- label_2_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- AddChildView(label_1_);
- AddChildView(label_2_);
-
- // Set up the link.
- link_->SetText(UTF16ToWideHack(delegate->GetLinkText()));
- link_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
- link_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- link_->SetController(this);
- link_->MakeReadableOverBackgroundColor(background()->get_color());
- AddChildView(link_);
-}
-
-LinkInfoBar::~LinkInfoBar() {
-}
-
-// LinkInfoBar, views::LinkController implementation: --------------------------
-
-void LinkInfoBar::LinkActivated(views::Link* source, int event_flags) {
- DCHECK(source == link_);
- if (GetDelegate()->LinkClicked(
- event_utils::DispositionFromEventFlags(event_flags))) {
- RemoveInfoBar();
- }
-}
-
-// LinkInfoBar, views::View overrides: -----------------------------------------
-
-void LinkInfoBar::Layout() {
- // Layout the close button.
- InfoBar::Layout();
-
- // Layout the icon.
- gfx::Size icon_ps = icon_->GetPreferredSize();
- icon_->SetBounds(kHorizontalPadding, OffsetY(this, icon_ps), icon_ps.width(),
- icon_ps.height());
-
- int label_1_x = icon_->bounds().right() + kIconLabelSpacing;
-
- // Figure out the amount of space available to the rest of the content now
- // that the close button and the icon have been positioned.
- int available_width = GetAvailableWidth() - label_1_x;
-
- // Layout the left label.
- gfx::Size label_1_ps = label_1_->GetPreferredSize();
- label_1_->SetBounds(label_1_x, OffsetY(this, label_1_ps), label_1_ps.width(),
- label_1_ps.height());
-
- // Layout the link.
- gfx::Size link_ps = link_->GetPreferredSize();
- bool has_second_label = !label_2_->GetText().empty();
- if (has_second_label) {
- // Embed the link in the text string between the two labels.
- link_->SetBounds(label_1_->bounds().right(),
- OffsetY(this, link_ps), link_ps.width(), link_ps.height());
- } else {
- // Right-align the link toward the edge of the InfoBar.
- link_->SetBounds(label_1_x + available_width - link_ps.width(),
- OffsetY(this, link_ps), link_ps.width(), link_ps.height());
- }
-
- // Layout the right label (we do this regardless of whether or not it has
- // text).
- gfx::Size label_2_ps = label_2_->GetPreferredSize();
- label_2_->SetBounds(link_->bounds().right(),
- OffsetY(this, label_2_ps), label_2_ps.width(),
- label_2_ps.height());
-}
-
-// LinkInfoBar, private: -------------------------------------------------------
-
-LinkInfoBarDelegate* LinkInfoBar::GetDelegate() {
- return delegate()->AsLinkInfoBarDelegate();
-}
-
-// ConfirmInfoBar, public: -----------------------------------------------------
-
-ConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate)
- : AlertInfoBar(delegate),
- ok_button_(NULL),
- cancel_button_(NULL),
- link_(NULL),
- initialized_(false) {
- ok_button_ = new views::NativeButton(this,
- UTF16ToWideHack(delegate->GetButtonLabel(
- ConfirmInfoBarDelegate::BUTTON_OK)));
- ok_button_->SetAccessibleName(ok_button_->label());
- if (delegate->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK_DEFAULT)
- ok_button_->SetAppearsAsDefault(true);
- if (delegate->NeedElevation(ConfirmInfoBarDelegate::BUTTON_OK))
- ok_button_->SetNeedElevation(true);
- cancel_button_ = new views::NativeButton(
- this, UTF16ToWideHack(
- delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL)));
- cancel_button_->SetAccessibleName(cancel_button_->label());
-
- // Set up the link.
- link_ = new views::Link;
- link_->SetText(UTF16ToWideHack(delegate->GetLinkText()));
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- link_->SetFont(rb.GetFont(ResourceBundle::MediumFont));
- link_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- link_->SetController(this);
- link_->MakeReadableOverBackgroundColor(background()->get_color());
-}
-
-ConfirmInfoBar::~ConfirmInfoBar() {
- if (!initialized_) {
- delete ok_button_;
- delete cancel_button_;
- delete link_;
- }
-}
-
-// ConfirmInfoBar, views::LinkController implementation: -----------------------
-
-void ConfirmInfoBar::LinkActivated(views::Link* source, int event_flags) {
- DCHECK(source == link_);
- DCHECK(link_->IsVisible());
- DCHECK(!link_->GetText().empty());
- if (GetDelegate()->LinkClicked(
- event_utils::DispositionFromEventFlags(event_flags))) {
- RemoveInfoBar();
- }
-}
-
-// ConfirmInfoBar, views::View overrides: --------------------------------------
-
-void ConfirmInfoBar::Layout() {
- // First layout right aligned items (from right to left) in order to determine
- // the space avalable, then layout the left aligned items.
-
- // Layout the close button.
- InfoBar::Layout();
-
- // Layout the cancel and OK buttons.
- int available_width = AlertInfoBar::GetAvailableWidth();
- int ok_button_width = 0;
- int cancel_button_width = 0;
- gfx::Size ok_ps = ok_button_->GetPreferredSize();
- gfx::Size cancel_ps = cancel_button_->GetPreferredSize();
-
- if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK) {
- ok_button_width = ok_ps.width();
- } else {
- ok_button_->SetVisible(false);
- }
- if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
- cancel_button_width = cancel_ps.width();
- } else {
- cancel_button_->SetVisible(false);
- }
-
- cancel_button_->SetBounds(available_width - cancel_button_width,
- OffsetY(this, cancel_ps), cancel_ps.width(),
- cancel_ps.height());
- int spacing = cancel_button_width > 0 ? kButtonButtonSpacing : 0;
- ok_button_->SetBounds(cancel_button_->x() - spacing - ok_button_width,
- OffsetY(this, ok_ps), ok_ps.width(), ok_ps.height());
-
- // Layout the icon and label.
- AlertInfoBar::Layout();
-
- // Now append the link to the label's right edge.
- link_->SetVisible(!link_->GetText().empty());
- gfx::Size link_ps = link_->GetPreferredSize();
- int link_x = label()->bounds().right() + kEndOfLabelSpacing;
- int link_w = std::min(GetAvailableWidth() - link_x, link_ps.width());
- link_->SetBounds(link_x, OffsetY(this, link_ps), link_w, link_ps.height());
-}
-
-void ConfirmInfoBar::ViewHierarchyChanged(bool is_add,
- views::View* parent,
- views::View* child) {
- if (is_add && child == this && !initialized_) {
- Init();
- initialized_ = true;
- }
- InfoBar::ViewHierarchyChanged(is_add, parent, child);
-}
-
-// ConfirmInfoBar, views::ButtonListener implementation: ---------------
-
-void ConfirmInfoBar::ButtonPressed(
- views::Button* sender, const views::Event& event) {
- InfoBar::ButtonPressed(sender, event);
- if (sender == ok_button_) {
- if (GetDelegate()->Accept())
- RemoveInfoBar();
- } else if (sender == cancel_button_) {
- if (GetDelegate()->Cancel())
- RemoveInfoBar();
- }
-}
-
-// ConfirmInfoBar, InfoBar overrides: ------------------------------------------
-
-int ConfirmInfoBar::GetAvailableWidth() const {
- return ok_button_->x() - kEndOfLabelSpacing;
-}
-
-// ConfirmInfoBar, private: ----------------------------------------------------
-
-ConfirmInfoBarDelegate* ConfirmInfoBar::GetDelegate() {
- return delegate()->AsConfirmInfoBarDelegate();
-}
-
-void ConfirmInfoBar::Init() {
- AddChildView(ok_button_);
- AddChildView(cancel_button_);
- AddChildView(link_);
-}
-
-// AlertInfoBarDelegate, InfoBarDelegate overrides: ----------------------------
-
-InfoBar* AlertInfoBarDelegate::CreateInfoBar() {
- return new AlertInfoBar(this);
-}
-
-// LinkInfoBarDelegate, InfoBarDelegate overrides: -----------------------------
-
-InfoBar* LinkInfoBarDelegate::CreateInfoBar() {
- return new LinkInfoBar(this);
-}
-
-// ConfirmInfoBarDelegate, InfoBarDelegate overrides: --------------------------
-
-InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() {
- return new ConfirmInfoBar(this);
-}