| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ |
| #define ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ |
| |
| #include <set> |
| |
| #include "ash/ash_export.h" |
| #include "ash/display/display_controller.h" |
| #include "ash/wm/wm_types.h" |
| #include "base/callback.h" |
| #include "base/compiler_specific.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "ui/events/event_handler.h" |
| #include "ui/gfx/point.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/wm/public/window_move_client.h" |
| |
| namespace aura { |
| class Window; |
| } |
| |
| namespace ui { |
| class LocatedEvent; |
| } |
| |
| namespace ash { |
| |
| class WindowResizer; |
| |
| class ASH_EXPORT ToplevelWindowEventHandler |
| : public ui::EventHandler, |
| public aura::client::WindowMoveClient, |
| public DisplayController::Observer { |
| public: |
| ToplevelWindowEventHandler(); |
| virtual ~ToplevelWindowEventHandler(); |
| |
| // Overridden from ui::EventHandler: |
| virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; |
| virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; |
| virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; |
| |
| // Overridden form aura::client::WindowMoveClient: |
| virtual aura::client::WindowMoveResult RunMoveLoop( |
| aura::Window* source, |
| const gfx::Vector2d& drag_offset, |
| aura::client::WindowMoveSource move_source) OVERRIDE; |
| virtual void EndMoveLoop() OVERRIDE; |
| |
| // Overridden form ash::DisplayController::Observer: |
| virtual void OnDisplayConfigurationChanging() OVERRIDE; |
| |
| private: |
| class ScopedWindowResizer; |
| |
| enum DragCompletionStatus { |
| DRAG_COMPLETE, |
| DRAG_REVERT |
| }; |
| |
| // Attempts to start a drag if one is not already in progress. Returns true if |
| // successful. |
| bool AttemptToStartDrag(aura::Window* window, |
| const gfx::Point& point_in_parent, |
| int window_component, |
| aura::client::WindowMoveSource source); |
| |
| // Finishes the drag. |
| void CompleteDrag(DragCompletionStatus status); |
| |
| void HandleMousePressed(aura::Window* target, ui::MouseEvent* event); |
| void HandleMouseReleased(aura::Window* target, ui::MouseEvent* event); |
| |
| // Called during a drag to resize/position the window. |
| void HandleDrag(aura::Window* target, ui::LocatedEvent* event); |
| |
| // Called during mouse moves to update window resize shadows. |
| void HandleMouseMoved(aura::Window* target, ui::LocatedEvent* event); |
| |
| // Called for mouse exits to hide window resize shadows. |
| void HandleMouseExited(aura::Window* target, ui::LocatedEvent* event); |
| |
| // Sets |window|'s state type to |new_state_type|. Called after the drag has |
| // been completed for fling gestures. |
| void SetWindowStateTypeFromGesture(aura::Window* window, |
| wm::WindowStateType new_state_type); |
| |
| // Invoked from ScopedWindowResizer if the window is destroyed. |
| void ResizerWindowDestroyed(); |
| |
| // The hittest result for the first finger at the time that it initially |
| // touched the screen. |first_finger_hittest_| is one of ui/base/hit_test.h |
| int first_finger_hittest_; |
| |
| // The window bounds when the drag was started. When a window is minimized, |
| // maximized or snapped via a swipe/fling gesture, the restore bounds should |
| // be set to the bounds of the window when the drag was started. |
| gfx::Rect pre_drag_window_bounds_; |
| |
| // Are we running a nested message loop from RunMoveLoop(). |
| bool in_move_loop_; |
| |
| // Is a window move/resize in progress because of gesture events? |
| bool in_gesture_drag_; |
| |
| // Whether the drag was reverted. Set by CompleteDrag(). |
| bool drag_reverted_; |
| |
| scoped_ptr<ScopedWindowResizer> window_resizer_; |
| |
| base::Closure quit_closure_; |
| |
| // Used to track if this object is deleted while running a nested message |
| // loop. If non-null the destructor sets this to true. |
| bool* destroyed_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandler); |
| }; |
| |
| } // namespace aura |
| |
| #endif // ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ |