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