OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/ash/launcher/shell_window_launcher_item_controller.h
" | 5 #include "chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h" |
6 | 6 |
7 #include "apps/app_window.h" | 7 #include "apps/app_window.h" |
8 #include "apps/ui/native_app_window.h" | 8 #include "apps/ui/native_app_window.h" |
9 #include "ash/shelf/shelf_model.h" | 9 #include "ash/shelf/shelf_model.h" |
10 #include "ash/wm/window_state.h" | 10 #include "ash/wm/window_state.h" |
11 #include "ash/wm/window_util.h" | 11 #include "ash/wm/window_util.h" |
12 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h" | 12 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h" |
13 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_v2app.h" | 13 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_v2app.h" |
14 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" | 14 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
15 #include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h" | 15 #include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 bool operator()(AppWindow* app_window) const { | 58 bool operator()(AppWindow* app_window) const { |
59 return app_window->GetNativeWindow() == window_; | 59 return app_window->GetNativeWindow() == window_; |
60 } | 60 } |
61 | 61 |
62 private: | 62 private: |
63 const aura::Window* window_; | 63 const aura::Window* window_; |
64 }; | 64 }; |
65 | 65 |
66 } // namespace | 66 } // namespace |
67 | 67 |
68 ShellWindowLauncherItemController::ShellWindowLauncherItemController( | 68 AppWindowLauncherItemController::AppWindowLauncherItemController( |
69 Type type, | 69 Type type, |
70 const std::string& app_shelf_id, | 70 const std::string& app_shelf_id, |
71 const std::string& app_id, | 71 const std::string& app_id, |
72 ChromeLauncherController* controller) | 72 ChromeLauncherController* controller) |
73 : LauncherItemController(type, app_id, controller), | 73 : LauncherItemController(type, app_id, controller), |
74 last_active_app_window_(NULL), | 74 last_active_app_window_(NULL), |
75 app_shelf_id_(app_shelf_id), | 75 app_shelf_id_(app_shelf_id), |
76 observed_windows_(this) {} | 76 observed_windows_(this) {} |
77 | 77 |
78 ShellWindowLauncherItemController::~ShellWindowLauncherItemController() { | 78 AppWindowLauncherItemController::~AppWindowLauncherItemController() {} |
79 } | |
80 | 79 |
81 void ShellWindowLauncherItemController::AddAppWindow( | 80 void AppWindowLauncherItemController::AddAppWindow( |
82 AppWindow* app_window, | 81 AppWindow* app_window, |
83 ash::ShelfItemStatus status) { | 82 ash::ShelfItemStatus status) { |
84 if (app_window->window_type_is_panel() && type() != TYPE_APP_PANEL) | 83 if (app_window->window_type_is_panel() && type() != TYPE_APP_PANEL) |
85 LOG(ERROR) << "AppWindow of type Panel added to non-panel launcher item"; | 84 LOG(ERROR) << "AppWindow of type Panel added to non-panel launcher item"; |
86 app_windows_.push_front(app_window); | 85 app_windows_.push_front(app_window); |
87 observed_windows_.Add(app_window->GetNativeWindow()); | 86 observed_windows_.Add(app_window->GetNativeWindow()); |
88 } | 87 } |
89 | 88 |
90 void ShellWindowLauncherItemController::RemoveShellWindowForWindow( | 89 void AppWindowLauncherItemController::RemoveAppWindowForWindow( |
91 aura::Window* window) { | 90 aura::Window* window) { |
92 AppWindowList::iterator iter = std::find_if( | 91 AppWindowList::iterator iter = std::find_if( |
93 app_windows_.begin(), app_windows_.end(), AppWindowHasWindow(window)); | 92 app_windows_.begin(), app_windows_.end(), AppWindowHasWindow(window)); |
94 if (iter != app_windows_.end()) { | 93 if (iter != app_windows_.end()) { |
95 if (*iter == last_active_app_window_) | 94 if (*iter == last_active_app_window_) |
96 last_active_app_window_ = NULL; | 95 last_active_app_window_ = NULL; |
97 app_windows_.erase(iter); | 96 app_windows_.erase(iter); |
98 } | 97 } |
99 observed_windows_.Remove(window); | 98 observed_windows_.Remove(window); |
100 } | 99 } |
101 | 100 |
102 void ShellWindowLauncherItemController::SetActiveWindow(aura::Window* window) { | 101 void AppWindowLauncherItemController::SetActiveWindow(aura::Window* window) { |
103 AppWindowList::iterator iter = std::find_if( | 102 AppWindowList::iterator iter = std::find_if( |
104 app_windows_.begin(), app_windows_.end(), AppWindowHasWindow(window)); | 103 app_windows_.begin(), app_windows_.end(), AppWindowHasWindow(window)); |
105 if (iter != app_windows_.end()) | 104 if (iter != app_windows_.end()) |
106 last_active_app_window_ = *iter; | 105 last_active_app_window_ = *iter; |
107 } | 106 } |
108 | 107 |
109 bool ShellWindowLauncherItemController::IsOpen() const { | 108 bool AppWindowLauncherItemController::IsOpen() const { |
110 return !app_windows_.empty(); | 109 return !app_windows_.empty(); |
111 } | 110 } |
112 | 111 |
113 bool ShellWindowLauncherItemController::IsVisible() const { | 112 bool AppWindowLauncherItemController::IsVisible() const { |
114 // Return true if any windows are visible. | 113 // Return true if any windows are visible. |
115 for (AppWindowList::const_iterator iter = app_windows_.begin(); | 114 for (AppWindowList::const_iterator iter = app_windows_.begin(); |
116 iter != app_windows_.end(); | 115 iter != app_windows_.end(); |
117 ++iter) { | 116 ++iter) { |
118 if ((*iter)->GetNativeWindow()->IsVisible()) | 117 if ((*iter)->GetNativeWindow()->IsVisible()) |
119 return true; | 118 return true; |
120 } | 119 } |
121 return false; | 120 return false; |
122 } | 121 } |
123 | 122 |
124 void ShellWindowLauncherItemController::Launch(ash::LaunchSource source, | 123 void AppWindowLauncherItemController::Launch(ash::LaunchSource source, |
125 int event_flags) { | 124 int event_flags) { |
126 launcher_controller()->LaunchApp(app_id(), | 125 launcher_controller()->LaunchApp(app_id(), source, ui::EF_NONE); |
127 source, | |
128 ui::EF_NONE); | |
129 } | 126 } |
130 | 127 |
131 bool ShellWindowLauncherItemController::Activate(ash::LaunchSource source) { | 128 bool AppWindowLauncherItemController::Activate(ash::LaunchSource source) { |
132 DCHECK(!app_windows_.empty()); | 129 DCHECK(!app_windows_.empty()); |
133 AppWindow* window_to_activate = | 130 AppWindow* window_to_activate = |
134 last_active_app_window_ ? last_active_app_window_ : app_windows_.back(); | 131 last_active_app_window_ ? last_active_app_window_ : app_windows_.back(); |
135 window_to_activate->GetBaseWindow()->Activate(); | 132 window_to_activate->GetBaseWindow()->Activate(); |
136 return false; | 133 return false; |
137 } | 134 } |
138 | 135 |
139 void ShellWindowLauncherItemController::Close() { | 136 void AppWindowLauncherItemController::Close() { |
140 // Note: Closing windows may affect the contents of app_windows_. | 137 // Note: Closing windows may affect the contents of app_windows_. |
141 AppWindowList windows_to_close = app_windows_; | 138 AppWindowList windows_to_close = app_windows_; |
142 for (AppWindowList::iterator iter = windows_to_close.begin(); | 139 for (AppWindowList::iterator iter = windows_to_close.begin(); |
143 iter != windows_to_close.end(); | 140 iter != windows_to_close.end(); |
144 ++iter) { | 141 ++iter) { |
145 (*iter)->GetBaseWindow()->Close(); | 142 (*iter)->GetBaseWindow()->Close(); |
146 } | 143 } |
147 } | 144 } |
148 | 145 |
149 void ShellWindowLauncherItemController::ActivateIndexedApp(size_t index) { | 146 void AppWindowLauncherItemController::ActivateIndexedApp(size_t index) { |
150 if (index >= app_windows_.size()) | 147 if (index >= app_windows_.size()) |
151 return; | 148 return; |
152 AppWindowList::iterator it = app_windows_.begin(); | 149 AppWindowList::iterator it = app_windows_.begin(); |
153 std::advance(it, index); | 150 std::advance(it, index); |
154 ShowAndActivateOrMinimize(*it); | 151 ShowAndActivateOrMinimize(*it); |
155 } | 152 } |
156 | 153 |
157 ChromeLauncherAppMenuItems | 154 ChromeLauncherAppMenuItems AppWindowLauncherItemController::GetApplicationList( |
158 ShellWindowLauncherItemController::GetApplicationList(int event_flags) { | 155 int event_flags) { |
159 ChromeLauncherAppMenuItems items; | 156 ChromeLauncherAppMenuItems items; |
160 items.push_back(new ChromeLauncherAppMenuItem(GetTitle(), NULL, false)); | 157 items.push_back(new ChromeLauncherAppMenuItem(GetTitle(), NULL, false)); |
161 int index = 0; | 158 int index = 0; |
162 for (AppWindowList::iterator iter = app_windows_.begin(); | 159 for (AppWindowList::iterator iter = app_windows_.begin(); |
163 iter != app_windows_.end(); | 160 iter != app_windows_.end(); |
164 ++iter) { | 161 ++iter) { |
165 AppWindow* app_window = *iter; | 162 AppWindow* app_window = *iter; |
166 scoped_ptr<gfx::Image> image(GetAppListIcon(app_window)); | 163 scoped_ptr<gfx::Image> image(GetAppListIcon(app_window)); |
167 items.push_back(new ChromeLauncherAppMenuItemV2App( | 164 items.push_back(new ChromeLauncherAppMenuItemV2App( |
168 app_window->GetTitle(), | 165 app_window->GetTitle(), |
169 image.get(), // Will be copied | 166 image.get(), // Will be copied |
170 app_id(), | 167 app_id(), |
171 launcher_controller(), | 168 launcher_controller(), |
172 index, | 169 index, |
173 index == 0 /* has_leading_separator */)); | 170 index == 0 /* has_leading_separator */)); |
174 ++index; | 171 ++index; |
175 } | 172 } |
176 return items.Pass(); | 173 return items.Pass(); |
177 } | 174 } |
178 | 175 |
179 bool ShellWindowLauncherItemController::ItemSelected(const ui::Event& event) { | 176 bool AppWindowLauncherItemController::ItemSelected(const ui::Event& event) { |
180 if (app_windows_.empty()) | 177 if (app_windows_.empty()) |
181 return false; | 178 return false; |
182 if (type() == TYPE_APP_PANEL) { | 179 if (type() == TYPE_APP_PANEL) { |
183 DCHECK(app_windows_.size() == 1); | 180 DCHECK(app_windows_.size() == 1); |
184 AppWindow* panel = app_windows_.front(); | 181 AppWindow* panel = app_windows_.front(); |
185 aura::Window* panel_window = panel->GetNativeWindow(); | 182 aura::Window* panel_window = panel->GetNativeWindow(); |
186 // If the panel is attached on another display, move it to the current | 183 // If the panel is attached on another display, move it to the current |
187 // display and activate it. | 184 // display and activate it. |
188 if (ash::wm::GetWindowState(panel_window)->panel_attached() && | 185 if (ash::wm::GetWindowState(panel_window)->panel_attached() && |
189 ash::wm::MoveWindowToEventRoot(panel_window, event)) { | 186 ash::wm::MoveWindowToEventRoot(panel_window, event)) { |
190 if (!panel->GetBaseWindow()->IsActive()) | 187 if (!panel->GetBaseWindow()->IsActive()) |
191 ShowAndActivateOrMinimize(panel); | 188 ShowAndActivateOrMinimize(panel); |
192 } else { | 189 } else { |
193 ShowAndActivateOrMinimize(panel); | 190 ShowAndActivateOrMinimize(panel); |
194 } | 191 } |
195 } else { | 192 } else { |
196 AppWindow* window_to_show = last_active_app_window_ | 193 AppWindow* window_to_show = last_active_app_window_ |
197 ? last_active_app_window_ | 194 ? last_active_app_window_ |
198 : app_windows_.front(); | 195 : app_windows_.front(); |
199 // If the event was triggered by a keystroke, we try to advance to the next | 196 // If the event was triggered by a keystroke, we try to advance to the next |
200 // item if the window we are trying to activate is already active. | 197 // item if the window we are trying to activate is already active. |
201 if (app_windows_.size() >= 1 && | 198 if (app_windows_.size() >= 1 && |
202 window_to_show->GetBaseWindow()->IsActive() && | 199 window_to_show->GetBaseWindow()->IsActive() && |
203 event.type() == ui::ET_KEY_RELEASED) { | 200 event.type() == ui::ET_KEY_RELEASED) { |
204 ActivateOrAdvanceToNextShellWindow(window_to_show); | 201 ActivateOrAdvanceToNextAppWindow(window_to_show); |
205 } else { | 202 } else { |
206 ShowAndActivateOrMinimize(window_to_show); | 203 ShowAndActivateOrMinimize(window_to_show); |
207 } | 204 } |
208 } | 205 } |
209 return false; | 206 return false; |
210 } | 207 } |
211 | 208 |
212 base::string16 ShellWindowLauncherItemController::GetTitle() { | 209 base::string16 AppWindowLauncherItemController::GetTitle() { |
213 // For panels return the title of the contents if set. | 210 // For panels return the title of the contents if set. |
214 // Otherwise return the title of the app. | 211 // Otherwise return the title of the app. |
215 if (type() == TYPE_APP_PANEL && !app_windows_.empty()) { | 212 if (type() == TYPE_APP_PANEL && !app_windows_.empty()) { |
216 AppWindow* app_window = app_windows_.front(); | 213 AppWindow* app_window = app_windows_.front(); |
217 if (app_window->web_contents()) { | 214 if (app_window->web_contents()) { |
218 base::string16 title = app_window->web_contents()->GetTitle(); | 215 base::string16 title = app_window->web_contents()->GetTitle(); |
219 if (!title.empty()) | 216 if (!title.empty()) |
220 return title; | 217 return title; |
221 } | 218 } |
222 } | 219 } |
223 return GetAppTitle(); | 220 return GetAppTitle(); |
224 } | 221 } |
225 | 222 |
226 ui::MenuModel* ShellWindowLauncherItemController::CreateContextMenu( | 223 ui::MenuModel* AppWindowLauncherItemController::CreateContextMenu( |
227 aura::Window* root_window) { | 224 aura::Window* root_window) { |
228 ash::ShelfItem item = | 225 ash::ShelfItem item = *(launcher_controller()->model()->ItemByID(shelf_id())); |
229 *(launcher_controller()->model()->ItemByID(shelf_id())); | |
230 return new LauncherContextMenu(launcher_controller(), &item, root_window); | 226 return new LauncherContextMenu(launcher_controller(), &item, root_window); |
231 } | 227 } |
232 | 228 |
233 ash::ShelfMenuModel* ShellWindowLauncherItemController::CreateApplicationMenu( | 229 ash::ShelfMenuModel* AppWindowLauncherItemController::CreateApplicationMenu( |
234 int event_flags) { | 230 int event_flags) { |
235 return new LauncherApplicationMenuItemModel(GetApplicationList(event_flags)); | 231 return new LauncherApplicationMenuItemModel(GetApplicationList(event_flags)); |
236 } | 232 } |
237 | 233 |
238 bool ShellWindowLauncherItemController::IsDraggable() { | 234 bool AppWindowLauncherItemController::IsDraggable() { |
239 if (type() == TYPE_APP_PANEL) | 235 if (type() == TYPE_APP_PANEL) |
240 return true; | 236 return true; |
241 return launcher_controller()->CanPin() ? true : false; | 237 return launcher_controller()->CanPin() ? true : false; |
242 } | 238 } |
243 | 239 |
244 bool ShellWindowLauncherItemController::ShouldShowTooltip() { | 240 bool AppWindowLauncherItemController::ShouldShowTooltip() { |
245 if (type() == TYPE_APP_PANEL && IsVisible()) | 241 if (type() == TYPE_APP_PANEL && IsVisible()) |
246 return false; | 242 return false; |
247 return true; | 243 return true; |
248 } | 244 } |
249 | 245 |
250 void ShellWindowLauncherItemController::OnWindowPropertyChanged( | 246 void AppWindowLauncherItemController::OnWindowPropertyChanged( |
251 aura::Window* window, | 247 aura::Window* window, |
252 const void* key, | 248 const void* key, |
253 intptr_t old) { | 249 intptr_t old) { |
254 if (key == aura::client::kDrawAttentionKey) { | 250 if (key == aura::client::kDrawAttentionKey) { |
255 ash::ShelfItemStatus status; | 251 ash::ShelfItemStatus status; |
256 if (ash::wm::IsActiveWindow(window)) { | 252 if (ash::wm::IsActiveWindow(window)) { |
257 status = ash::STATUS_ACTIVE; | 253 status = ash::STATUS_ACTIVE; |
258 } else if (window->GetProperty(aura::client::kDrawAttentionKey)) { | 254 } else if (window->GetProperty(aura::client::kDrawAttentionKey)) { |
259 status = ash::STATUS_ATTENTION; | 255 status = ash::STATUS_ATTENTION; |
260 } else { | 256 } else { |
261 status = ash::STATUS_RUNNING; | 257 status = ash::STATUS_RUNNING; |
262 } | 258 } |
263 launcher_controller()->SetItemStatus(shelf_id(), status); | 259 launcher_controller()->SetItemStatus(shelf_id(), status); |
264 } | 260 } |
265 } | 261 } |
266 | 262 |
267 void ShellWindowLauncherItemController::ShowAndActivateOrMinimize( | 263 void AppWindowLauncherItemController::ShowAndActivateOrMinimize( |
268 AppWindow* app_window) { | 264 AppWindow* app_window) { |
269 // Either show or minimize windows when shown from the launcher. | 265 // Either show or minimize windows when shown from the launcher. |
270 launcher_controller()->ActivateWindowOrMinimizeIfActive( | 266 launcher_controller()->ActivateWindowOrMinimizeIfActive( |
271 app_window->GetBaseWindow(), GetApplicationList(0).size() == 2); | 267 app_window->GetBaseWindow(), GetApplicationList(0).size() == 2); |
272 } | 268 } |
273 | 269 |
274 void ShellWindowLauncherItemController::ActivateOrAdvanceToNextShellWindow( | 270 void AppWindowLauncherItemController::ActivateOrAdvanceToNextAppWindow( |
275 AppWindow* window_to_show) { | 271 AppWindow* window_to_show) { |
276 AppWindowList::iterator i( | 272 AppWindowList::iterator i( |
277 std::find(app_windows_.begin(), app_windows_.end(), window_to_show)); | 273 std::find(app_windows_.begin(), app_windows_.end(), window_to_show)); |
278 if (i != app_windows_.end()) { | 274 if (i != app_windows_.end()) { |
279 if (++i != app_windows_.end()) | 275 if (++i != app_windows_.end()) |
280 window_to_show = *i; | 276 window_to_show = *i; |
281 else | 277 else |
282 window_to_show = app_windows_.front(); | 278 window_to_show = app_windows_.front(); |
283 } | 279 } |
284 if (window_to_show->GetBaseWindow()->IsActive()) { | 280 if (window_to_show->GetBaseWindow()->IsActive()) { |
285 // Coming here, only a single window is active. For keyboard activations | 281 // Coming here, only a single window is active. For keyboard activations |
286 // the window gets animated. | 282 // the window gets animated. |
287 AnimateWindow(window_to_show->GetNativeWindow(), | 283 AnimateWindow(window_to_show->GetNativeWindow(), |
288 views::corewm::WINDOW_ANIMATION_TYPE_BOUNCE); | 284 views::corewm::WINDOW_ANIMATION_TYPE_BOUNCE); |
289 } else { | 285 } else { |
290 ShowAndActivateOrMinimize(window_to_show); | 286 ShowAndActivateOrMinimize(window_to_show); |
291 } | 287 } |
292 } | 288 } |
OLD | NEW |