12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/cancelable_callback.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/weak_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_f.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CC_EXPORT ScrollbarAnimationControllerClient {
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~ScrollbarAnimationControllerClient() {}
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void PostDelayedScrollbarFade(const base::Closure& start_fade,
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                        base::TimeDelta delay) = 0;
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetNeedsScrollbarAnimationFrame() = 0;
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This abstract class represents the compositor-side analogy of
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ScrollbarAnimator.  Individual platforms should subclass it to provide
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// specialized implementation.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT ScrollbarAnimationController {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~ScrollbarAnimationController();
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Animate(base::TimeTicks now);
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidScrollBegin();
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidScrollUpdate();
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidScrollEnd();
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidMouseMoveOffScrollbar() {}
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidMouseMoveNear(float distance) {}
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScrollbarAnimationController(ScrollbarAnimationControllerClient* client,
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               base::TimeDelta delay_before_starting,
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               base::TimeDelta duration);
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void RunAnimationFrame(float progress) = 0;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void StartAnimation();
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void StopAnimation();
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns how far through the animation we are as a progress value from
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // 0 to 1.
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  float AnimationProgressAtTime(base::TimeTicks now);
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void PostDelayedFade();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScrollbarAnimationControllerClient* client_;
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeTicks last_awaken_time_;
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeDelta delay_before_starting_;
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeDelta duration_;
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool is_animating_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool currently_scrolling_;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool scroll_gesture_has_scrolled_;
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::CancelableClosure delayed_scrollbar_fade_;
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::WeakPtrFactory<ScrollbarAnimationController> weak_factory_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_ANIMATION_SCROLLBAR_ANIMATION_CONTROLLER_H_
73