1// Copyright (c) 2012 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 ASH_SYSTEM_TRAY_TRAY_ITEM_VIEW_H_ 6#define ASH_SYSTEM_TRAY_TRAY_ITEM_VIEW_H_ 7 8#include "ash/ash_export.h" 9#include "ui/gfx/animation/animation_delegate.h" 10#include "ui/views/view.h" 11 12namespace gfx { 13class SlideAnimation; 14} 15 16namespace views { 17class ImageView; 18class Label; 19} 20 21namespace ash { 22class SystemTrayItem; 23 24// Base-class for items in the tray. It makes sure the widget is updated 25// correctly when the visibility/size of the tray item changes. It also adds 26// animation when showing/hiding the item in the tray. 27class ASH_EXPORT TrayItemView : public views::View, 28 public gfx::AnimationDelegate { 29 public: 30 explicit TrayItemView(SystemTrayItem* owner); 31 virtual ~TrayItemView(); 32 33 static void DisableAnimationsForTest(); 34 35 // Convenience function for creating a child Label or ImageView. 36 void CreateLabel(); 37 void CreateImageView(); 38 39 SystemTrayItem* owner() const { return owner_; } 40 views::Label* label() const { return label_; } 41 views::ImageView* image_view() const { return image_view_; } 42 43 // Overridden from views::View. 44 virtual void SetVisible(bool visible) OVERRIDE; 45 virtual gfx::Size GetPreferredSize() const OVERRIDE; 46 virtual int GetHeightForWidth(int width) const OVERRIDE; 47 48 protected: 49 // Makes sure the widget relayouts after the size/visibility of the view 50 // changes. 51 void ApplyChange(); 52 53 // This should return the desired size of the view. For most views, this 54 // returns GetPreferredSize. But since this class overrides GetPreferredSize 55 // for animation purposes, we allow a different way to get this size, and do 56 // not allow GetPreferredSize to be overridden. 57 virtual gfx::Size DesiredSize() const; 58 59 // The default animation duration is 200ms. But each view can customize this. 60 virtual int GetAnimationDurationMS(); 61 62 private: 63 // Overridden from views::View. 64 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 65 66 // Overridden from gfx::AnimationDelegate. 67 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 68 virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE; 69 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE; 70 71 SystemTrayItem* owner_; 72 scoped_ptr<gfx::SlideAnimation> animation_; 73 views::Label* label_; 74 views::ImageView* image_view_; 75 76 DISALLOW_COPY_AND_ASSIGN(TrayItemView); 77}; 78 79} // namespace ash 80 81#endif // ASH_SYSTEM_TRAY_TRAY_ITEM_VIEW_H_ 82