| // Copyright 2013 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_OVERVIEW_WINDOW_SELECTOR_H_ |
| #define ASH_WM_OVERVIEW_WINDOW_SELECTOR_H_ |
| |
| #include <set> |
| #include <vector> |
| |
| #include "ash/ash_export.h" |
| #include "base/compiler_specific.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/scoped_vector.h" |
| #include "base/time/time.h" |
| #include "ui/aura/window_observer.h" |
| #include "ui/aura/window_tracker.h" |
| #include "ui/events/event_handler.h" |
| #include "ui/gfx/display_observer.h" |
| #include "ui/wm/public/activation_change_observer.h" |
| |
| namespace aura { |
| class RootWindow; |
| class Window; |
| } |
| |
| namespace gfx { |
| class Rect; |
| } |
| |
| namespace ui { |
| class LocatedEvent; |
| } |
| |
| namespace ash { |
| class WindowSelectorDelegate; |
| class WindowSelectorItem; |
| class WindowSelectorTest; |
| class WindowGrid; |
| |
| // The WindowSelector shows a grid of all of your windows, allowing to select |
| // one by clicking or tapping on it. |
| class ASH_EXPORT WindowSelector |
| : public ui::EventHandler, |
| public gfx::DisplayObserver, |
| public aura::WindowObserver, |
| public aura::client::ActivationChangeObserver { |
| public: |
| enum Direction { |
| LEFT, |
| UP, |
| RIGHT, |
| DOWN |
| }; |
| |
| typedef std::vector<aura::Window*> WindowList; |
| typedef ScopedVector<WindowSelectorItem> WindowSelectorItemList; |
| |
| WindowSelector(const WindowList& windows, |
| WindowSelectorDelegate* delegate); |
| virtual ~WindowSelector(); |
| |
| // Cancels window selection. |
| void CancelSelection(); |
| |
| // Called when the last window selector item from a grid is deleted. |
| void OnGridEmpty(WindowGrid* grid); |
| |
| // ui::EventHandler: |
| virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; |
| |
| // gfx::DisplayObserver: |
| virtual void OnDisplayAdded(const gfx::Display& display) OVERRIDE; |
| virtual void OnDisplayRemoved(const gfx::Display& display) OVERRIDE; |
| virtual void OnDisplayMetricsChanged(const gfx::Display& display, |
| uint32_t metrics) OVERRIDE; |
| |
| // aura::WindowObserver: |
| virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE; |
| virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; |
| |
| // aura::client::ActivationChangeObserver: |
| virtual void OnWindowActivated(aura::Window* gained_active, |
| aura::Window* lost_active) OVERRIDE; |
| virtual void OnAttemptToReactivateWindow( |
| aura::Window* request_active, |
| aura::Window* actual_active) OVERRIDE; |
| |
| private: |
| friend class WindowSelectorTest; |
| |
| // Begins positioning windows such that all windows are visible on the screen. |
| void StartOverview(); |
| |
| // Position all of the windows in the overview. |
| void PositionWindows(bool animate); |
| |
| // Hide and track all hidden windows not in the overview item list. |
| void HideAndTrackNonOverviewWindows(); |
| |
| // |focus|, restores focus to the stored window. |
| void ResetFocusRestoreWindow(bool focus); |
| |
| // Helper function that moves the selection widget to |direction| on the |
| // corresponding window grid. |
| void Move(Direction direction); |
| |
| // Tracks observed windows. |
| std::set<aura::Window*> observed_windows_; |
| |
| // Weak pointer to the selector delegate which will be called when a |
| // selection is made. |
| WindowSelectorDelegate* delegate_; |
| |
| // A weak pointer to the window which was focused on beginning window |
| // selection. If window selection is canceled the focus should be restored to |
| // this window. |
| aura::Window* restore_focus_window_; |
| |
| // True when performing operations that may cause window activations. This is |
| // used to prevent handling the resulting expected activation. |
| bool ignore_activations_; |
| |
| // List of all the window overview grids, one for each root window. |
| ScopedVector<WindowGrid> grid_list_; |
| |
| // Tracks windows which were hidden because they were not part of the |
| // overview. |
| aura::WindowTracker hidden_windows_; |
| |
| // Tracks the index of the root window the selection widget is in. |
| size_t selected_grid_index_; |
| |
| // The following variables are used for metric collection purposes. All of |
| // them refer to this particular overview session and are not cumulative: |
| // The time when overview was started. |
| base::Time overview_start_time_; |
| |
| // The number of arrow key presses. |
| size_t num_key_presses_; |
| |
| // The number of items in the overview. |
| size_t num_items_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WindowSelector); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_WM_OVERVIEW_WINDOW_SELECTOR_H_ |