OLD | NEW |
| (Empty) |
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_COMMON_WM_OVERVIEW_WINDOW_SELECTOR_H_ | |
6 #define ASH_COMMON_WM_OVERVIEW_WINDOW_SELECTOR_H_ | |
7 | |
8 #include <stddef.h> | |
9 #include <stdint.h> | |
10 | |
11 #include <memory> | |
12 #include <set> | |
13 #include <vector> | |
14 | |
15 #include "ash/ash_export.h" | |
16 #include "ash/common/wm_activation_observer.h" | |
17 #include "base/macros.h" | |
18 #include "base/time/time.h" | |
19 #include "ui/aura/window_observer.h" | |
20 #include "ui/display/display_observer.h" | |
21 #include "ui/gfx/image/image_skia.h" | |
22 #include "ui/views/controls/textfield/textfield_controller.h" | |
23 | |
24 namespace views { | |
25 class Textfield; | |
26 class Widget; | |
27 } | |
28 | |
29 namespace ash { | |
30 class WindowSelectorDelegate; | |
31 class WindowSelectorItem; | |
32 class WindowSelectorTest; | |
33 class WindowGrid; | |
34 | |
35 // The WindowSelector shows a grid of all of your windows, allowing to select | |
36 // one by clicking or tapping on it. | |
37 class ASH_EXPORT WindowSelector : public display::DisplayObserver, | |
38 public aura::WindowObserver, | |
39 public WmActivationObserver, | |
40 public views::TextfieldController { | |
41 public: | |
42 // Returns true if the window can be selected in overview mode. | |
43 static bool IsSelectable(WmWindow* window); | |
44 | |
45 enum Direction { LEFT, UP, RIGHT, DOWN }; | |
46 | |
47 using WindowList = std::vector<WmWindow*>; | |
48 | |
49 explicit WindowSelector(WindowSelectorDelegate* delegate); | |
50 ~WindowSelector() override; | |
51 | |
52 // Initialize with the windows that can be selected. | |
53 void Init(const WindowList& windows); | |
54 | |
55 // Perform cleanup that cannot be done in the destructor. | |
56 void Shutdown(); | |
57 | |
58 // Cancels window selection. | |
59 void CancelSelection(); | |
60 | |
61 // Called when the last window selector item from a grid is deleted. | |
62 void OnGridEmpty(WindowGrid* grid); | |
63 | |
64 // Moves the current selection by |increment| items. Positive values of | |
65 // |increment| move the selection forward, negative values move it backward. | |
66 void IncrementSelection(int increment); | |
67 | |
68 // Accepts current selection if any. Returns true if a selection was made, | |
69 // false otherwise. | |
70 bool AcceptSelection(); | |
71 | |
72 // Activates |item's| window. | |
73 void SelectWindow(WindowSelectorItem* item); | |
74 | |
75 // Called when |window| is about to get closed. | |
76 void WindowClosing(WindowSelectorItem* window); | |
77 | |
78 WindowSelectorDelegate* delegate() { return delegate_; } | |
79 | |
80 bool restoring_minimized_windows() const { | |
81 return restoring_minimized_windows_; | |
82 } | |
83 | |
84 int text_filter_bottom() const { return text_filter_bottom_; } | |
85 | |
86 bool is_shut_down() const { return is_shut_down_; } | |
87 | |
88 // display::DisplayObserver: | |
89 void OnDisplayAdded(const display::Display& display) override; | |
90 void OnDisplayRemoved(const display::Display& display) override; | |
91 void OnDisplayMetricsChanged(const display::Display& display, | |
92 uint32_t metrics) override; | |
93 | |
94 // aura::WindowObserver: | |
95 void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override; | |
96 void OnWindowDestroying(aura::Window* window) override; | |
97 | |
98 // WmActivationObserver | |
99 void OnWindowActivated(WmWindow* gained_active, | |
100 WmWindow* lost_active) override; | |
101 void OnAttemptToReactivateWindow(WmWindow* request_active, | |
102 WmWindow* actual_active) override; | |
103 | |
104 // views::TextfieldController: | |
105 void ContentsChanged(views::Textfield* sender, | |
106 const base::string16& new_contents) override; | |
107 bool HandleKeyEvent(views::Textfield* sender, | |
108 const ui::KeyEvent& key_event) override; | |
109 | |
110 private: | |
111 friend class WindowSelectorTest; | |
112 | |
113 // Returns the WmWindow for |text_filter_widget_|. | |
114 WmWindow* GetTextFilterWidgetWindow(); | |
115 | |
116 // Position all of the windows in the overview. | |
117 void PositionWindows(bool animate); | |
118 | |
119 // Repositions and resizes |text_filter_widget_| on | |
120 // DisplayMetricsChanged event. | |
121 void RepositionTextFilterOnDisplayMetricsChange(); | |
122 | |
123 // |focus|, restores focus to the stored window. | |
124 void ResetFocusRestoreWindow(bool focus); | |
125 | |
126 // Helper function that moves the selection widget to |direction| on the | |
127 // corresponding window grid. | |
128 void Move(Direction direction, bool animate); | |
129 | |
130 // Removes all observers that were registered during construction and/or | |
131 // initialization. | |
132 void RemoveAllObservers(); | |
133 | |
134 // Tracks observed windows. | |
135 std::set<WmWindow*> observed_windows_; | |
136 | |
137 // Weak pointer to the selector delegate which will be called when a | |
138 // selection is made. | |
139 WindowSelectorDelegate* delegate_; | |
140 | |
141 // A weak pointer to the window which was focused on beginning window | |
142 // selection. If window selection is canceled the focus should be restored to | |
143 // this window. | |
144 WmWindow* restore_focus_window_; | |
145 | |
146 // True when performing operations that may cause window activations. This is | |
147 // used to prevent handling the resulting expected activation. | |
148 bool ignore_activations_; | |
149 | |
150 // List of all the window overview grids, one for each root window. | |
151 std::vector<std::unique_ptr<WindowGrid>> grid_list_; | |
152 | |
153 // Tracks the index of the root window the selection widget is in. | |
154 size_t selected_grid_index_; | |
155 | |
156 // The following variables are used for metric collection purposes. All of | |
157 // them refer to this particular overview session and are not cumulative: | |
158 // The time when overview was started. | |
159 base::Time overview_start_time_; | |
160 | |
161 // The number of arrow key presses. | |
162 size_t num_key_presses_; | |
163 | |
164 // The number of items in the overview. | |
165 size_t num_items_; | |
166 | |
167 // Indicates if the text filter is shown on screen (rather than above it). | |
168 bool showing_text_filter_; | |
169 | |
170 // Window text filter widget. As the user writes on it, we filter the items | |
171 // in the overview. It is also responsible for handling overview key events, | |
172 // such as enter key to select. | |
173 std::unique_ptr<views::Widget> text_filter_widget_; | |
174 | |
175 // Image used for text filter textfield. | |
176 gfx::ImageSkia search_image_; | |
177 | |
178 // The current length of the string entered into the text filtering textfield. | |
179 size_t text_filter_string_length_; | |
180 | |
181 // The number of times the text filtering textfield has been cleared of text | |
182 // during this overview mode session. | |
183 size_t num_times_textfield_cleared_; | |
184 | |
185 // Tracks whether minimized windows are currently being restored for overview | |
186 // mode. | |
187 bool restoring_minimized_windows_; | |
188 | |
189 // The distance between the top edge of the screen and the bottom edge of | |
190 // the text filtering textfield. | |
191 int text_filter_bottom_; | |
192 | |
193 bool is_shut_down_ = false; | |
194 | |
195 DISALLOW_COPY_AND_ASSIGN(WindowSelector); | |
196 }; | |
197 | |
198 } // namespace ash | |
199 | |
200 #endif // ASH_COMMON_WM_OVERVIEW_WINDOW_SELECTOR_H_ | |
OLD | NEW |