Home | History | Annotate | Download | only in wm
      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 "base/callback.h"
     13 #include "base/compiler_specific.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "ui/aura/client/window_move_client.h"
     16 #include "ui/base/events/event_handler.h"
     17 #include "ui/gfx/point.h"
     18 #include "ui/gfx/rect.h"
     19 
     20 namespace aura {
     21 class Window;
     22 }
     23 
     24 namespace ui {
     25 class LocatedEvent;
     26 }
     27 
     28 namespace ash {
     29 
     30 class WindowResizer;
     31 
     32 class ASH_EXPORT ToplevelWindowEventHandler
     33     : public ui::EventHandler,
     34       public aura::client::WindowMoveClient,
     35       public DisplayController::Observer {
     36  public:
     37   explicit ToplevelWindowEventHandler(aura::Window* owner);
     38   virtual ~ToplevelWindowEventHandler();
     39 
     40   const aura::Window* owner() const { return owner_; }
     41 
     42   // Overridden from ui::EventHandler:
     43   virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
     44   virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
     45   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
     46 
     47   // Overridden form aura::client::WindowMoveClient:
     48   virtual aura::client::WindowMoveResult RunMoveLoop(
     49       aura::Window* source,
     50       const gfx::Vector2d& drag_offset,
     51       aura::client::WindowMoveSource move_source) OVERRIDE;
     52   virtual void EndMoveLoop() OVERRIDE;
     53 
     54   // Overridden form ash::DisplayController::Observer:
     55   virtual void OnDisplayConfigurationChanging() OVERRIDE;
     56 
     57  private:
     58   class ScopedWindowResizer;
     59 
     60   enum DragCompletionStatus {
     61     DRAG_COMPLETE,
     62     DRAG_REVERT
     63   };
     64 
     65   void CreateScopedWindowResizer(aura::Window* window,
     66                                  const gfx::Point& point_in_parent,
     67                                  int window_component,
     68                                  aura::client::WindowMoveSource source);
     69 
     70   // Finishes the drag.
     71   void CompleteDrag(DragCompletionStatus status, int event_flags);
     72 
     73   void HandleMousePressed(aura::Window* target, ui::MouseEvent* event);
     74   void HandleMouseReleased(aura::Window* target, ui::MouseEvent* event);
     75 
     76   // Called during a drag to resize/position the window.
     77   // The return value is returned by OnMouseEvent() above.
     78   void HandleDrag(aura::Window* target, ui::LocatedEvent* event);
     79 
     80   // Called during mouse moves to update window resize shadows.
     81   // Return value is returned by OnMouseEvent() above.
     82   void HandleMouseMoved(aura::Window* target, ui::LocatedEvent* event);
     83 
     84   // Called for mouse exits to hide window resize shadows.
     85   // Return value is returned by OnMouseEvent() above.
     86   void HandleMouseExited(aura::Window* target, ui::LocatedEvent* event);
     87 
     88   // Invoked from ScopedWindowResizer if the window is destroyed.
     89   void ResizerWindowDestroyed();
     90 
     91   // The container which this event handler is handling events on.
     92   aura::Window* owner_;
     93 
     94   // Are we running a nested message loop from RunMoveLoop().
     95   bool in_move_loop_;
     96 
     97   // Was the move operation cancelled? Used only when the nested loop
     98   // is used to move a window.
     99   bool move_cancelled_;
    100 
    101   // Is a window move/resize in progress because of gesture events?
    102   bool in_gesture_drag_;
    103 
    104   // The window bounds before it started the drag.
    105   // When a window is moved using a touch gesture, and it is swiped up/down
    106   // maximize/minimize, the restore bounds should be set to the bounds of the
    107   // window when the drag started.
    108   gfx::Rect pre_drag_window_bounds_;
    109 
    110   scoped_ptr<ScopedWindowResizer> window_resizer_;
    111 
    112   base::Closure quit_closure_;
    113 
    114   // Used to track if this object is deleted while running a nested message
    115   // loop. If non-null the destructor sets this to true.
    116   bool* destroyed_;
    117 
    118   DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandler);
    119 };
    120 
    121 }  // namespace aura
    122 
    123 #endif  // ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_
    124