1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_H_ 6 #define CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_H_ 7 #pragma once 8 9 #include "base/basictypes.h" 10 #include "base/scoped_ptr.h" 11 #include "ui/base/animation/animation_delegate.h" 12 #include "ui/gfx/size.h" 13 14 class InfoBarContainer; 15 class InfoBarDelegate; 16 17 namespace ui { 18 class SlideAnimation; 19 } 20 21 class InfoBar : public ui::AnimationDelegate { 22 public: 23 explicit InfoBar(InfoBarDelegate* delegate); 24 virtual ~InfoBar(); 25 26 // Platforms must define these. 27 static const int kSeparatorLineHeight; 28 static const int kDefaultArrowTargetHeight; 29 static const int kMaximumArrowTargetHeight; 30 // The half-width (see comments on |arrow_half_width_| below) scales to its 31 // default and maximum values proportionally to how the height scales to its. 32 static const int kDefaultArrowTargetHalfWidth; 33 static const int kMaximumArrowTargetHalfWidth; 34 delegate()35 InfoBarDelegate* delegate() { return delegate_; } set_container(InfoBarContainer * container)36 void set_container(InfoBarContainer* container) { container_ = container; } 37 38 // Makes the infobar visible. If |animate| is true, the infobar is then 39 // animated to full size. 40 void Show(bool animate); 41 42 // Makes the infobar hidden. If |animate| is true, the infobar is first 43 // animated to zero size. Once the infobar is hidden, it is removed from its 44 // container (triggering its deletion), and its delegate is closed. 45 void Hide(bool animate); 46 47 // Changes the target height of the arrow portion of the infobar. This has no 48 // effect once the infobar is animating closed. 49 void SetArrowTargetHeight(int height); 50 animation()51 const ui::SlideAnimation* animation() const { return animation_.get(); } arrow_height()52 int arrow_height() const { return arrow_height_; } total_height()53 int total_height() const { return arrow_height_ + bar_height_; } 54 55 protected: 56 // Platforms must define this. 57 static const int kDefaultBarTargetHeight; 58 59 // ui::AnimationDelegate: 60 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 61 62 // Called when the user closes the infobar, notifies the delegate we've been 63 // dismissed and forwards a removal request to our owner. 64 void RemoveInfoBar(); 65 66 // Changes the target height of the main ("bar") portion of the infobar. 67 void SetBarTargetHeight(int height); 68 69 // Given a control with size |prefsize|, returns the centered y position 70 // within us, taking into account animation so the control "slides in" (or 71 // out) as we animate open and closed. 72 int OffsetY(const gfx::Size& prefsize) const; 73 container()74 const InfoBarContainer* container() const { return container_; } animation()75 ui::SlideAnimation* animation() { return animation_.get(); } arrow_half_width()76 int arrow_half_width() const { return arrow_half_width_; } bar_height()77 int bar_height() const { return bar_height_; } 78 79 // Platforms may optionally override these if they need to do work during 80 // processing of the given calls. PlatformSpecificHide(bool animate)81 virtual void PlatformSpecificHide(bool animate) {} PlatformSpecificOnHeightsRecalculated()82 virtual void PlatformSpecificOnHeightsRecalculated() {} 83 84 private: 85 // ui::AnimationDelegate: 86 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; 87 88 // Finds the new desired arrow and bar heights, and if they differ from the 89 // current ones, calls PlatformSpecificOnHeightRecalculated(). Informs our 90 // container our state has changed if either the heights have changed or 91 // |force_notify| is set. 92 void RecalculateHeights(bool force_notify); 93 94 // Checks whether we're closed. If so, notifies the container that it should 95 // remove us (which will cause the platform-specific code to asynchronously 96 // delete us) and closes the delegate. 97 void MaybeDelete(); 98 99 InfoBarDelegate* delegate_; 100 InfoBarContainer* container_; 101 scoped_ptr<ui::SlideAnimation> animation_; 102 103 // The current and target heights of the arrow and bar portions, and half the 104 // current arrow width. (It's easier to work in half-widths as we draw the 105 // arrow as two halves on either side of a center point.) 106 int arrow_height_; // Includes both fill and top stroke. 107 int arrow_target_height_; 108 int arrow_half_width_; // Includes only fill. 109 int bar_height_; // Includes both fill and bottom separator. 110 int bar_target_height_; 111 112 DISALLOW_COPY_AND_ASSIGN(InfoBar); 113 }; 114 115 #endif // CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_H_ 116