Home | History | Annotate | Download | only in wm
      1 // Copyright 2013 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_WINDOW_SELECTOR_H_
      6 #define ASH_WM_WINDOW_SELECTOR_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "ui/aura/window_observer.h"
     14 #include "ui/base/events/event_handler.h"
     15 #include "ui/gfx/transform.h"
     16 
     17 namespace aura {
     18 class RootWindow;
     19 }
     20 
     21 namespace ui {
     22 class LocatedEvent;
     23 }
     24 
     25 namespace views {
     26 class Widget;
     27 }
     28 
     29 namespace ash {
     30 
     31 class WindowSelectorDelegate;
     32 class WindowSelectorWindow;
     33 
     34 // The WindowSelector shows a grid of all of your windows and allows selecting
     35 // a window by clicking or tapping on it (OVERVIEW mode) or by alt-tabbing to
     36 // it (CYCLE mode).
     37 class WindowSelector : public ui::EventHandler,
     38                        public aura::WindowObserver {
     39  public:
     40   enum Direction {
     41     FORWARD,
     42     BACKWARD
     43   };
     44   enum Mode {
     45     CYCLE,
     46     OVERVIEW
     47   };
     48 
     49   typedef std::vector<aura::Window*> WindowList;
     50 
     51   WindowSelector(const WindowList& windows,
     52                  Mode mode,
     53                  WindowSelectorDelegate* delegate);
     54   virtual ~WindowSelector();
     55 
     56   // Step to the next window in |direction|.
     57   void Step(Direction direction);
     58 
     59   // Select the current window.
     60   void SelectWindow();
     61 
     62   Mode mode() { return mode_; }
     63 
     64   // ui::EventHandler:
     65   virtual void OnEvent(ui::Event* event) OVERRIDE;
     66   virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
     67   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
     68 
     69   // aura::WindowObserver:
     70   virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
     71 
     72  private:
     73   // Returns the target of |event| or NULL if the event is not targeted at
     74   // any of the windows in the selector.
     75   WindowSelectorWindow* GetEventTarget(ui::LocatedEvent* event);
     76 
     77   // Handles a selection event for |target|.
     78   void HandleSelectionEvent(WindowSelectorWindow* target);
     79 
     80   // Position all of the windows based on the current selection mode.
     81   void PositionWindows();
     82   // Position all of the windows from |root_window| on |root_window|.
     83   void PositionWindowsFromRoot(aura::RootWindow* root_window);
     84   // Position all of the |windows| to fit on the |root_window|.
     85   void PositionWindowsOnRoot(aura::RootWindow* root_window,
     86                              const std::vector<WindowSelectorWindow*>& windows);
     87 
     88   void InitializeSelectionWidget();
     89 
     90   // Updates the selection widget's location to the currently selected window.
     91   // If |animate| the transition to the new location is animated.
     92   void UpdateSelectionLocation(bool animate);
     93 
     94   // The collection of windows in the overview wrapped by a helper class which
     95   // restores their state and helps transform them to other root windows.
     96   ScopedVector<WindowSelectorWindow> windows_;
     97 
     98   // The window selection mode.
     99   Mode mode_;
    100 
    101   // Weak pointer to the selector delegate which will be called when a
    102   // selection is made.
    103   WindowSelectorDelegate* delegate_;
    104 
    105   // Index of the currently selected window if the mode is CYCLE.
    106   size_t selected_window_;
    107 
    108   // Widget indicating which window is currently selected.
    109   scoped_ptr<views::Widget> selection_widget_;
    110 
    111   // In CYCLE mode, the root window in which selection is taking place.
    112   // NULL otherwise.
    113   aura::RootWindow* selection_root_;
    114 
    115   DISALLOW_COPY_AND_ASSIGN(WindowSelector);
    116 };
    117 
    118 }  // namespace ash
    119 
    120 #endif  // ASH_WM_WINDOW_SELECTOR_H_
    121