Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ash / wm / toplevel_window_event_handler.h
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_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_
6 #define ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_
7
8 #include <set>
9
10 #include "ash/ash_export.h"
11 #include "ash/display/display_controller.h"
12 #include "ash/wm/wm_types.h"
13 #include "base/callback.h"
14 #include "base/compiler_specific.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "ui/events/event_handler.h"
17 #include "ui/gfx/point.h"
18 #include "ui/gfx/rect.h"
19 #include "ui/wm/public/window_move_client.h"
20
21 namespace aura {
22 class Window;
23 }
24
25 namespace ui {
26 class LocatedEvent;
27 }
28
29 namespace ash {
30
31 class WindowResizer;
32
33 class ASH_EXPORT ToplevelWindowEventHandler
34     : public ui::EventHandler,
35       public aura::client::WindowMoveClient,
36       public DisplayController::Observer {
37  public:
38   ToplevelWindowEventHandler();
39   ~ToplevelWindowEventHandler() override;
40
41   // Overridden from ui::EventHandler:
42   void OnKeyEvent(ui::KeyEvent* event) override;
43   void OnMouseEvent(ui::MouseEvent* event) override;
44   void OnGestureEvent(ui::GestureEvent* event) override;
45
46   // Overridden form aura::client::WindowMoveClient:
47   aura::client::WindowMoveResult RunMoveLoop(
48       aura::Window* source,
49       const gfx::Vector2d& drag_offset,
50       aura::client::WindowMoveSource move_source) override;
51   void EndMoveLoop() override;
52
53   // Overridden form ash::DisplayController::Observer:
54   void OnDisplayConfigurationChanging() override;
55
56  private:
57   class ScopedWindowResizer;
58
59   enum DragCompletionStatus {
60     DRAG_COMPLETE,
61     DRAG_REVERT,
62
63     // To be used when WindowResizer::GetTarget() is destroyed. Neither
64     // completes nor reverts the drag because both access the WindowResizer's
65     // window.
66     DRAG_RESIZER_WINDOW_DESTROYED
67   };
68
69   // Attempts to start a drag if one is not already in progress. Returns true if
70   // successful.
71   bool AttemptToStartDrag(aura::Window* window,
72                           const gfx::Point& point_in_parent,
73                           int window_component,
74                           aura::client::WindowMoveSource source);
75
76   // Completes or reverts the drag if one is in progress. Returns true if a
77   // drag was completed or reverted.
78   bool CompleteDrag(DragCompletionStatus status);
79
80   void HandleMousePressed(aura::Window* target, ui::MouseEvent* event);
81   void HandleMouseReleased(aura::Window* target, ui::MouseEvent* event);
82
83   // Called during a drag to resize/position the window.
84   void HandleDrag(aura::Window* target, ui::LocatedEvent* event);
85
86   // Called during mouse moves to update window resize shadows.
87   void HandleMouseMoved(aura::Window* target, ui::LocatedEvent* event);
88
89   // Called for mouse exits to hide window resize shadows.
90   void HandleMouseExited(aura::Window* target, ui::LocatedEvent* event);
91
92   // Sets |window|'s state type to |new_state_type|. Called after the drag has
93   // been completed for fling gestures.
94   void SetWindowStateTypeFromGesture(aura::Window* window,
95                                     wm::WindowStateType new_state_type);
96
97   // Invoked from ScopedWindowResizer if the window is destroyed.
98   void ResizerWindowDestroyed();
99
100   // The hittest result for the first finger at the time that it initially
101   // touched the screen. |first_finger_hittest_| is one of ui/base/hit_test.h
102   int first_finger_hittest_;
103
104   // The window bounds when the drag was started. When a window is minimized,
105   // maximized or snapped via a swipe/fling gesture, the restore bounds should
106   // be set to the bounds of the window when the drag was started.
107   gfx::Rect pre_drag_window_bounds_;
108
109   // Are we running a nested message loop from RunMoveLoop().
110   bool in_move_loop_;
111
112   // Is a window move/resize in progress because of gesture events?
113   bool in_gesture_drag_;
114
115   // Whether the drag was reverted. Set by CompleteDrag().
116   bool drag_reverted_;
117
118   scoped_ptr<ScopedWindowResizer> window_resizer_;
119
120   base::Closure quit_closure_;
121
122   // Used to track if this object is deleted while running a nested message
123   // loop. If non-null the destructor sets this to true.
124   bool* destroyed_;
125
126   DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandler);
127 };
128
129 }  // namespace aura
130
131 #endif  // ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_