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 UI_GFX_ANIMATION_ANIMATION_CONTAINER_H_
6#define UI_GFX_ANIMATION_ANIMATION_CONTAINER_H_
7
8#include <set>
9
10#include "base/memory/ref_counted.h"
11#include "base/time/time.h"
12#include "base/timer/timer.h"
13#include "ui/gfx/gfx_export.h"
14
15namespace gfx {
16
17class AnimationContainerElement;
18class AnimationContainerObserver;
19
20// AnimationContainer is used by Animation to manage the underlying timer.
21// Internally each Animation creates a single AnimationContainer. You can
22// group a set of Animations into the same AnimationContainer by way of
23// Animation::SetContainer. Grouping a set of Animations into the same
24// AnimationContainer ensures they all update and start at the same time.
25//
26// AnimationContainer is ref counted. Each Animation contained within the
27// AnimationContainer own it.
28class GFX_EXPORT AnimationContainer
29    : public base::RefCounted<AnimationContainer> {
30 public:
31  AnimationContainer();
32
33  // Invoked by Animation when it needs to start. Starts the timer if necessary.
34  // NOTE: This is invoked by Animation for you, you shouldn't invoke this
35  // directly.
36  void Start(AnimationContainerElement* animation);
37
38  // Invoked by Animation when it needs to stop. If there are no more animations
39  // running the timer stops.
40  // NOTE: This is invoked by Animation for you, you shouldn't invoke this
41  // directly.
42  void Stop(AnimationContainerElement* animation);
43
44  void set_observer(AnimationContainerObserver* observer) {
45    observer_ = observer;
46  }
47
48  // The time the last animation ran at.
49  base::TimeTicks last_tick_time() const { return last_tick_time_; }
50
51  // Are there any timers running?
52  bool is_running() const { return !elements_.empty(); }
53
54 private:
55  friend class base::RefCounted<AnimationContainer>;
56
57  typedef std::set<AnimationContainerElement*> Elements;
58
59  ~AnimationContainer();
60
61  // Timer callback method.
62  void Run();
63
64  // Sets min_timer_interval_ and restarts the timer.
65  void SetMinTimerInterval(base::TimeDelta delta);
66
67  // Returns the min timer interval of all the timers.
68  base::TimeDelta GetMinInterval();
69
70  // Represents one of two possible values:
71  // . If only a single animation has been started and the timer hasn't yet
72  //   fired this is the time the animation was added.
73  // . The time the last animation ran at (::Run was invoked).
74  base::TimeTicks last_tick_time_;
75
76  // Set of elements (animations) being managed.
77  Elements elements_;
78
79  // Minimum interval the timers run at.
80  base::TimeDelta min_timer_interval_;
81
82  base::RepeatingTimer<AnimationContainer> timer_;
83
84  AnimationContainerObserver* observer_;
85
86  DISALLOW_COPY_AND_ASSIGN(AnimationContainer);
87};
88
89}  // namespace gfx
90
91#endif  // UI_GFX_ANIMATION_ANIMATION_CONTAINER_H_
92