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