1 // Copyright 2014 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 ATHENA_WM_TITLE_DRAG_CONTROLLER_H_ 6 #define ATHENA_WM_TITLE_DRAG_CONTROLLER_H_ 7 8 #include "base/macros.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/weak_ptr.h" 11 #include "ui/aura/window_tracker.h" 12 #include "ui/events/event_handler.h" 13 #include "ui/gfx/geometry/point.h" 14 15 namespace aura { 16 class Window; 17 } 18 19 namespace wm { 20 class Shadow; 21 } 22 23 namespace athena { 24 25 class TitleDragControllerDelegate { 26 public: 27 virtual ~TitleDragControllerDelegate() {} 28 29 // Returns the window behind |window|. The returned window is the one that 30 // would be revealed while |window|'s title is dragged. 31 virtual aura::Window* GetWindowBehind(aura::Window* window) = 0; 32 33 // Notifies the delegate during various stages of the drag. 34 virtual void OnTitleDragStarted(aura::Window* window) = 0; 35 virtual void OnTitleDragCompleted(aura::Window* window) = 0; 36 virtual void OnTitleDragCanceled(aura::Window* window) = 0; 37 }; 38 39 // Responsible for allowing dragging a window by its title bar. 40 class TitleDragController : public ui::EventHandler { 41 public: 42 TitleDragController(aura::Window* container, 43 TitleDragControllerDelegate* delegate); 44 virtual ~TitleDragController(); 45 46 private: 47 void EndTransition(aura::Window* window, bool complete); 48 void OnTransitionEnd(aura::Window* window, bool complete); 49 50 // ui::EventHandler: 51 virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE; 52 53 aura::Window* container_; 54 TitleDragControllerDelegate* delegate_; 55 gfx::Point drag_start_location_; 56 scoped_ptr<wm::Shadow> shadow_; 57 aura::WindowTracker tracker_; 58 59 base::WeakPtrFactory<TitleDragController> weak_ptr_; 60 61 DISALLOW_COPY_AND_ASSIGN(TitleDragController); 62 }; 63 64 } // namespace athena 65 66 #endif // ATHENA_WM_TITLE_DRAG_CONTROLLER_H_ 67