• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DRAG_DROP_DRAG_DROP_CONTROLLER_H_
6 #define ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_
7 
8 #include "ash/ash_export.h"
9 #include "base/callback.h"
10 #include "base/memory/weak_ptr.h"
11 #include "ui/aura/window_observer.h"
12 #include "ui/base/dragdrop/os_exchange_data.h"
13 #include "ui/events/event_constants.h"
14 #include "ui/events/event_handler.h"
15 #include "ui/gfx/animation/animation_delegate.h"
16 #include "ui/gfx/rect.h"
17 #include "ui/wm/public/drag_drop_client.h"
18 
19 namespace gfx {
20 class LinearAnimation;
21 }
22 
23 namespace ash {
24 class DragDropTracker;
25 class DragDropTrackerDelegate;
26 class DragImageView;
27 
28 namespace test {
29 class DragDropControllerTest;
30 }
31 
32 class ASH_EXPORT DragDropController
33     : public aura::client::DragDropClient,
34       public ui::EventHandler,
35       public gfx::AnimationDelegate,
36       public aura::WindowObserver {
37  public:
38   DragDropController();
39   virtual ~DragDropController();
40 
set_should_block_during_drag_drop(bool should_block_during_drag_drop)41   void set_should_block_during_drag_drop(bool should_block_during_drag_drop) {
42     should_block_during_drag_drop_ = should_block_during_drag_drop;
43   }
44 
45   // Overridden from aura::client::DragDropClient:
46   virtual int StartDragAndDrop(
47       const ui::OSExchangeData& data,
48       aura::Window* root_window,
49       aura::Window* source_window,
50       const gfx::Point& root_location,
51       int operation,
52       ui::DragDropTypes::DragEventSource source) OVERRIDE;
53   virtual void DragUpdate(aura::Window* target,
54                           const ui::LocatedEvent& event) OVERRIDE;
55   virtual void Drop(aura::Window* target,
56                     const ui::LocatedEvent& event) OVERRIDE;
57   virtual void DragCancel() OVERRIDE;
58   virtual bool IsDragDropInProgress() OVERRIDE;
59 
60   // Overridden from ui::EventHandler:
61   virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
62   virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
63   virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
64   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
65 
66   // Overridden from aura::WindowObserver.
67   virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
68 
69  protected:
70   // Helper method to create a LinearAnimation object that will run the drag
71   // cancel animation. Caller take ownership of the returned object. Protected
72   // for testing.
73   virtual gfx::LinearAnimation* CreateCancelAnimation(
74       int duration,
75       int frame_rate,
76       gfx::AnimationDelegate* delegate);
77 
78   // Actual implementation of |DragCancel()|. protected for testing.
79   virtual void DoDragCancel(int drag_cancel_animation_duration_ms);
80 
81  private:
82   friend class ash::test::DragDropControllerTest;
83 
84   // Overridden from gfx::AnimationDelegate:
85   virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
86   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
87   virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE;
88 
89   // Helper method to start drag widget flying back animation.
90   void StartCanceledAnimation(int animation_duration_ms);
91 
92   // Helper method to forward |pending_log_tap_| event to |drag_source_window_|.
93   void ForwardPendingLongTap();
94 
95   // Helper method to reset everything.
96   void Cleanup();
97 
98   scoped_ptr<DragImageView> drag_image_;
99   gfx::Vector2d drag_image_offset_;
100   const ui::OSExchangeData* drag_data_;
101   int drag_operation_;
102 
103   // Window that is currently under the drag cursor.
104   aura::Window* drag_window_;
105 
106   // Starting and final bounds for the drag image for the drag cancel animation.
107   gfx::Rect drag_image_initial_bounds_for_cancel_animation_;
108   gfx::Rect drag_image_final_bounds_for_cancel_animation_;
109 
110   scoped_ptr<gfx::LinearAnimation> cancel_animation_;
111 
112   // Window that started the drag.
113   aura::Window* drag_source_window_;
114 
115   // Indicates whether the caller should be blocked on a drag/drop session.
116   // Only be used for tests.
117   bool should_block_during_drag_drop_;
118 
119   // Closure for quitting nested message loop.
120   base::Closure quit_closure_;
121 
122   scoped_ptr<ash::DragDropTracker> drag_drop_tracker_;
123   scoped_ptr<DragDropTrackerDelegate> drag_drop_window_delegate_;
124 
125   ui::DragDropTypes::DragEventSource current_drag_event_source_;
126 
127   // Holds a synthetic long tap event to be sent to the |drag_source_window_|.
128   // See comment in OnGestureEvent() on why we need this.
129   scoped_ptr<ui::GestureEvent> pending_long_tap_;
130 
131   base::WeakPtrFactory<DragDropController> weak_factory_;
132 
133   DISALLOW_COPY_AND_ASSIGN(DragDropController);
134 };
135 
136 }  // namespace ash
137 
138 #endif  // ASH_DRAG_DROP_DRAG_DROP_CONTROLLER_H_
139