summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/infobars/infobars.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/views/infobars/infobars.h')
-rw-r--r--chrome/browser/ui/views/infobars/infobars.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/infobars/infobars.h b/chrome/browser/ui/views/infobars/infobars.h
new file mode 100644
index 0000000..a168e3c
--- /dev/null
+++ b/chrome/browser/ui/views/infobars/infobars.h
@@ -0,0 +1,251 @@
+// 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.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBARS_H_
+#define CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBARS_H_
+#pragma once
+
+#include "app/animation.h"
+#include "base/task.h"
+#include "chrome/browser/tab_contents/infobar_delegate.h"
+#include "views/controls/button/button.h"
+#include "views/controls/link.h"
+#include "views/focus/focus_manager.h"
+
+class InfoBarContainer;
+class SlideAnimation;
+namespace views {
+class ExternalFocusTracker;
+class ImageButton;
+class ImageView;
+class Label;
+class NativeButton;
+}
+
+// This file contains implementations for some general purpose InfoBars. See
+// chrome/browser/tab_contents/infobar_delegate.h for the delegate interface(s)
+// that you must implement to use these.
+
+class InfoBarBackground : public views::Background {
+ public:
+ explicit InfoBarBackground(InfoBarDelegate::Type infobar_type);
+
+ // Overridden from views::Background:
+ virtual void Paint(gfx::Canvas* canvas, views::View* view) const;
+
+ private:
+ scoped_ptr<views::Background> gradient_background_;
+
+ DISALLOW_COPY_AND_ASSIGN(InfoBarBackground);
+};
+
+class InfoBar : public views::View,
+ public views::ButtonListener,
+ public views::FocusChangeListener,
+ public AnimationDelegate {
+ public:
+ explicit InfoBar(InfoBarDelegate* delegate);
+ virtual ~InfoBar();
+
+ InfoBarDelegate* delegate() const { return delegate_; }
+
+ // Set a link to the parent InfoBarContainer. This must be set before the
+ // InfoBar is added to the view hierarchy.
+ void set_container(InfoBarContainer* container) { container_ = container; }
+
+ // The target height of the InfoBar, regardless of what its current height
+ // is (due to animation).
+ static const double kDefaultTargetHeight;
+
+ static const int kHorizontalPadding;
+ static const int kIconLabelSpacing;
+ static const int kButtonButtonSpacing;
+ static const int kEndOfLabelSpacing;
+ static const int kCloseButtonSpacing;
+ static const int kButtonInLabelSpacing;
+
+ // Overridden from views::View:
+ virtual AccessibilityTypes::Role GetAccessibleRole();
+ virtual gfx::Size GetPreferredSize();
+ virtual void Layout();
+
+ protected:
+ // Overridden from views::View:
+ virtual void ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child);
+
+ // Returns the available width of the View for use by child view layout,
+ // excluding the close button.
+ virtual int GetAvailableWidth() const;
+
+ // Removes our associated InfoBarDelegate from the associated TabContents.
+ // (Will lead to this InfoBar being closed).
+ void RemoveInfoBar() const;
+
+ void set_target_height(double height) { target_height_ = height; }
+
+ SlideAnimation* animation() { return animation_.get(); }
+
+ // Returns a centered y-position of a control of height specified in
+ // |prefsize| within the standard InfoBar height. Stable during an animation.
+ int CenterY(const gfx::Size prefsize);
+
+ // Returns a centered y-position of a control of height specified in
+ // |prefsize| within the standard InfoBar height, adjusted according to the
+ // current amount of animation offset the |parent| InfoBar currently has.
+ // Changes during an animation.
+ int OffsetY(views::View* parent, const gfx::Size prefsize);
+
+ // Overridden from views::ButtonListener:
+ virtual void ButtonPressed(views::Button* sender, const views::Event& event);
+
+ // Overridden from views::FocusChangeListener:
+ virtual void FocusWillChange(View* focused_before, View* focused_now);
+
+ // Overridden from AnimationDelegate:
+ virtual void AnimationProgressed(const Animation* animation);
+ virtual void AnimationEnded(const Animation* animation);
+
+ private:
+ friend class InfoBarContainer;
+
+ // Starts animating the InfoBar open.
+ void AnimateOpen();
+
+ // Opens the InfoBar immediately.
+ void Open();
+
+ // Starts animating the InfoBar closed. It will not be closed until the
+ // animation has completed, when |Close| will be called.
+ void AnimateClose();
+
+ // Closes the InfoBar immediately and removes it from its container. Notifies
+ // the delegate that it has closed. The InfoBar is deleted after this function
+ // is called.
+ void Close();
+
+ // Called when an InfoBar is added or removed from a view hierarchy to do
+ // setup and shutdown.
+ void InfoBarAdded();
+ void InfoBarRemoved();
+
+ // Destroys the external focus tracker, if present. If |restore_focus| is
+ // true, restores focus to the view tracked by the focus tracker before doing
+ // so.
+ void DestroyFocusTracker(bool restore_focus);
+
+ // Deletes this object (called after a return to the message loop to allow
+ // the stack in ViewHierarchyChanged to unwind).
+ void DeleteSelf();
+
+ // The InfoBar's container
+ InfoBarContainer* container_;
+
+ // The InfoBar's delegate.
+ InfoBarDelegate* delegate_;
+
+ // The Close Button at the right edge of the InfoBar.
+ views::ImageButton* close_button_;
+
+ // The animation that runs when the InfoBar is opened or closed.
+ scoped_ptr<SlideAnimation> animation_;
+
+ // Tracks and stores the last focused view which is not the InfoBar or any of
+ // its children. Used to restore focus once the InfoBar is closed.
+ scoped_ptr<views::ExternalFocusTracker> focus_tracker_;
+
+ // Used to delete this object after a return to the message loop.
+ ScopedRunnableMethodFactory<InfoBar> delete_factory_;
+
+ // The target height for the InfoBar.
+ double target_height_;
+
+ DISALLOW_COPY_AND_ASSIGN(InfoBar);
+};
+
+class AlertInfoBar : public InfoBar {
+ public:
+ explicit AlertInfoBar(AlertInfoBarDelegate* delegate);
+ virtual ~AlertInfoBar();
+
+ // Overridden from views::View:
+ virtual void Layout();
+
+ protected:
+ views::Label* label() const { return label_; }
+ views::ImageView* icon() const { return icon_; }
+
+ private:
+ AlertInfoBarDelegate* GetDelegate();
+
+ views::Label* label_;
+ views::ImageView* icon_;
+
+ DISALLOW_COPY_AND_ASSIGN(AlertInfoBar);
+};
+
+class LinkInfoBar : public InfoBar,
+ public views::LinkController {
+ public:
+ explicit LinkInfoBar(LinkInfoBarDelegate* delegate);
+ virtual ~LinkInfoBar();
+
+ // Overridden from views::LinkController:
+ virtual void LinkActivated(views::Link* source, int event_flags);
+
+ // Overridden from views::View:
+ virtual void Layout();
+
+ private:
+ LinkInfoBarDelegate* GetDelegate();
+
+ views::ImageView* icon_;
+ views::Label* label_1_;
+ views::Label* label_2_;
+ views::Link* link_;
+
+ DISALLOW_COPY_AND_ASSIGN(LinkInfoBar);
+};
+
+class ConfirmInfoBar : public AlertInfoBar,
+ public views::LinkController {
+ public:
+ explicit ConfirmInfoBar(ConfirmInfoBarDelegate* delegate);
+ virtual ~ConfirmInfoBar();
+
+ // Overridden from views::LinkController:
+ virtual void LinkActivated(views::Link* source, int event_flags);
+
+ // Overridden from views::View:
+ virtual void Layout();
+
+ protected:
+ // Overridden from views::View:
+ virtual void ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child);
+
+ // Overridden from views::ButtonListener:
+ virtual void ButtonPressed(views::Button* sender, const views::Event& event);
+
+ // Overridden from InfoBar:
+ virtual int GetAvailableWidth() const;
+
+ private:
+ void Init();
+
+ ConfirmInfoBarDelegate* GetDelegate();
+
+ views::NativeButton* ok_button_;
+ views::NativeButton* cancel_button_;
+ views::Link* link_;
+
+ bool initialized_;
+
+ DISALLOW_COPY_AND_ASSIGN(ConfirmInfoBar);
+};
+
+
+#endif // CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBARS_H_