Index: chrome/browser/views/infobars/infobars.cc |
=================================================================== |
--- chrome/browser/views/infobars/infobars.cc (revision 0) |
+++ chrome/browser/views/infobars/infobars.cc (revision 0) |
@@ -0,0 +1,291 @@ |
+// Copyright (c) 2006-2008 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 "chrome/app/theme/theme_resources.h" |
+#include "chrome/browser/views/infobars/infobar_container.h" |
+#include "chrome/common/l10n_util.h" |
+#include "chrome/common/resource_bundle.h" |
+#include "chrome/common/slide_animation.h" |
+#include "chrome/views/background.h" |
+#include "chrome/views/button.h" |
+#include "chrome/views/image_view.h" |
+#include "chrome/views/label.h" |
+ |
+#include "generated_resources.h" |
+ |
+const double kInfoBarHeight = 37.0; |
+ |
+static const int kVerticalPadding = 3; |
+static const int kHorizontalPadding = 3; |
+static const int kIconLabelSpacing = 5; |
+static const int kButtonSpacing = 5; |
+ |
+static const SkColor kBackgroundColorTop = SkColorSetRGB(255, 242, 183); |
+static const SkColor kBackgroundColorBottom = SkColorSetRGB(250, 230, 145); |
+ |
+static const int kSeparatorLineHeight = 1; |
+static const SkColor kSeparatorColor = SkColorSetRGB(165, 165, 165); |
+ |
+namespace { |
+int OffsetY(views::View* parent, const gfx::Size prefsize) { |
+ return std::max((parent->height() - prefsize.height()) / 2, 0); |
+} |
+} |
+ |
+// InfoBarBackground ----------------------------------------------------------- |
+ |
+class InfoBarBackground : public views::Background { |
+ public: |
+ InfoBarBackground() { |
+ gradient_background_.reset( |
+ views::Background::CreateVerticalGradientBackground( |
+ kBackgroundColorTop, kBackgroundColorBottom)); |
+ } |
+ |
+ // Overridden from views::View: |
+ virtual void Paint(ChromeCanvas* canvas, views::View* view) const { |
+ // First paint the gradient background. |
+ gradient_background_->Paint(canvas, view); |
+ |
+ // Now paint the separator line. |
+ canvas->FillRectInt(kSeparatorColor, 0, |
+ view->height() - kSeparatorLineHeight, view->width(), |
+ kSeparatorLineHeight); |
+ } |
+ |
+ private: |
+ scoped_ptr<views::Background> gradient_background_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InfoBarBackground); |
+}; |
+ |
+// InfoBar, public: ------------------------------------------------------------ |
+ |
+InfoBar::InfoBar(InfoBarDelegate* delegate) |
+ : delegate_(delegate), |
+ close_button_(new views::Button) { |
+ set_background(new InfoBarBackground); |
+ |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ close_button_->SetImage(views::Button::BS_NORMAL, |
+ rb.GetBitmapNamed(IDR_CLOSE_BAR)); |
+ close_button_->SetImage(views::Button::BS_HOT, |
+ rb.GetBitmapNamed(IDR_CLOSE_BAR_H)); |
+ close_button_->SetImage(views::Button::BS_PUSHED, |
+ rb.GetBitmapNamed(IDR_CLOSE_BAR_P)); |
+ close_button_->SetListener(this, 0); |
+ close_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_CLOSE)); |
+ AddChildView(close_button_); |
+ |
+ animation_.reset(new SlideAnimation(this)); |
+ animation_->SetTweenType(SlideAnimation::NONE); |
+} |
+ |
+InfoBar::~InfoBar() { |
+} |
+ |
+void InfoBar::AnimateOpen() { |
+ animation_->Show(); |
+} |
+ |
+void InfoBar::Open() { |
+ animation_->Reset(1.0); |
+ animation_->Show(); |
+} |
+ |
+void InfoBar::AnimateClose() { |
+ animation_->Hide(); |
+} |
+ |
+void InfoBar::Close() { |
+ GetParent()->RemoveChildView(this); |
+ if (delegate()) |
+ delegate()->InfoBarClosed(); |
+ delete this; |
+} |
+ |
+// InfoBar, views::View overrides: --------------------------------------------- |
+ |
+gfx::Size InfoBar::GetPreferredSize() { |
+ int height = static_cast<int>(kInfoBarHeight * 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()); |
+ |
+} |
+ |
+// InfoBar, protected: --------------------------------------------------------- |
+ |
+int InfoBar::GetAvailableWidth() const { |
+ return close_button_->x() - kIconLabelSpacing; |
+} |
+ |
+// InfoBar, views::BaseButton::ButtonListener implementation: ------------------ |
+ |
+void InfoBar::ButtonPressed(views::BaseButton* sender) { |
+ if (sender == close_button_) |
+ container_->RemoveDelegate(delegate()); |
+} |
+ |
+// InfoBar, AnimationDelegate implementation: ---------------------------------- |
+ |
+void InfoBar::AnimationProgressed(const Animation* animation) { |
+ container_->InfoBarAnimated(true); |
+} |
+ |
+void InfoBar::AnimationEnded(const Animation* animation) { |
+ container_->InfoBarAnimated(false); |
+ |
+ if (!animation_->IsShowing()) |
+ Close(); |
+} |
+ |
+// AlertInfoBar, public: ------------------------------------------------------- |
+ |
+AlertInfoBar::AlertInfoBar(AlertInfoBarDelegate* delegate) |
+ : InfoBar(delegate) { |
+ label_ = new views::Label( |
+ delegate->GetMessageText(), |
+ ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont)); |
+ 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 = |
+ 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(); |
+} |
+ |
+// ConfirmInfoBar, public: ----------------------------------------------------- |
+ |
+ConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate) |
+ : ok_button_(NULL), |
+ cancel_button_(NULL), |
+ initialized_(false), |
+ AlertInfoBar(delegate) { |
+} |
+ |
+ConfirmInfoBar::~ConfirmInfoBar() { |
+} |
+ |
+// ConfirmInfoBar, views::View overrides: -------------------------------------- |
+ |
+void ConfirmInfoBar::Layout() { |
+ InfoBar::Layout(); |
+ int available_width = InfoBar::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(); |
+ if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_CANCEL) |
+ cancel_button_width = cancel_ps.width(); |
+ |
+ cancel_button_->SetBounds(available_width - cancel_button_width, |
+ OffsetY(this, cancel_ps), cancel_ps.width(), |
+ cancel_ps.height()); |
+ int spacing = cancel_button_width > 0 ? kButtonSpacing : 0; |
+ ok_button_->SetBounds(cancel_button_->x() - spacing - ok_button_width, |
+ OffsetY(this, ok_ps), ok_ps.width(), ok_ps.height()); |
+ |
+ AlertInfoBar::Layout(); |
+} |
+ |
+void ConfirmInfoBar::ViewHierarchyChanged(bool is_add, |
+ views::View* parent, |
+ views::View* child) { |
+ if (is_add && child == this && !initialized_) { |
+ Init(); |
+ initialized_ = true; |
+ } |
+} |
+ |
+// ConfirmInfoBar, views::NativeButton::Listener implementation: --------------- |
+ |
+void ConfirmInfoBar::ButtonPressed(views::NativeButton* sender) { |
+ if (sender == ok_button_) { |
+ GetDelegate()->Accept(); |
+ } else if (sender == cancel_button_) { |
+ GetDelegate()->Cancel(); |
+ } else { |
+ NOTREACHED(); |
+ } |
+} |
+ |
+// ConfirmInfoBar, InfoBar overrides: ------------------------------------------ |
+ |
+int ConfirmInfoBar::GetAvailableWidth() const { |
+ if (ok_button_) |
+ return ok_button_->x() - kButtonSpacing; |
+ if (cancel_button_) |
+ return cancel_button_->x() - kButtonSpacing; |
+ return InfoBar::GetAvailableWidth(); |
+} |
+ |
+// ConfirmInfoBar, private: ---------------------------------------------------- |
+ |
+ConfirmInfoBarDelegate* ConfirmInfoBar::GetDelegate() { |
+ return delegate()->AsConfirmInfoBarDelegate(); |
+} |
+ |
+void ConfirmInfoBar::Init() { |
+ ok_button_ = new views::NativeButton( |
+ GetDelegate()->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK)); |
+ ok_button_->SetListener(this); |
+ AddChildView(ok_button_); |
+ |
+ cancel_button_ = new views::NativeButton( |
+ GetDelegate()->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL)); |
+ cancel_button_->SetListener(this); |
+ AddChildView(cancel_button_); |
+} |
+ |
+// AlertInfoBarDelegate, InfoBarDelegate overrides: ---------------------------- |
+ |
+InfoBar* AlertInfoBarDelegate::CreateInfoBar() { |
+ return new AlertInfoBar(this); |
+} |
+ |
+// ConfirmInfoBarDelegate, InfoBarDelegate overrides: -------------------------- |
+ |
+InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() { |
+ return new ConfirmInfoBar(this); |
+} |
Property changes on: chrome\browser\views\infobars\infobars.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |