OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/views/new_task_manager_view.h" | 5 #include "chrome/browser/ui/views/new_task_manager_view.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
10 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
11 #include "chrome/browser/profiles/profile_manager.h" | 11 #include "chrome/browser/profiles/profile_manager.h" |
12 #include "chrome/browser/profiles/profile_window.h" | 12 #include "chrome/browser/profiles/profile_window.h" |
13 #include "chrome/browser/task_management/task_manager_observer.h" | 13 #include "chrome/browser/task_management/task_manager_observer.h" |
14 #include "chrome/browser/ui/browser_navigator_params.h" | 14 #include "chrome/browser/ui/browser_navigator_params.h" |
15 #include "chrome/browser/ui/task_manager/task_manager_columns.h" | 15 #include "chrome/browser/ui/task_manager/task_manager_columns.h" |
16 #include "chrome/browser/ui/user_manager.h" | 16 #include "chrome/browser/ui/user_manager.h" |
17 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
18 #include "chrome/common/url_constants.h" | 18 #include "chrome/common/url_constants.h" |
19 #include "chrome/grit/chromium_strings.h" | 19 #include "chrome/grit/chromium_strings.h" |
20 #include "chrome/grit/generated_resources.h" | 20 #include "chrome/grit/generated_resources.h" |
21 #include "components/prefs/pref_service.h" | 21 #include "components/prefs/pref_service.h" |
22 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
23 #include "ui/base/models/table_model_observer.h" | 23 #include "ui/base/models/table_model_observer.h" |
24 #include "ui/views/controls/label.h" | 24 #include "ui/views/controls/label.h" |
25 #include "ui/views/controls/link.h" | |
26 #include "ui/views/controls/table/table_view.h" | 25 #include "ui/views/controls/table/table_view.h" |
27 #include "ui/views/layout/layout_constants.h" | 26 #include "ui/views/layout/layout_constants.h" |
28 #include "ui/views/view.h" | 27 #include "ui/views/view.h" |
29 #include "ui/views/widget/widget.h" | 28 #include "ui/views/widget/widget.h" |
30 | 29 |
31 #if defined(USE_ASH) | 30 #if defined(USE_ASH) |
32 #include "ash/shelf/shelf_util.h" | 31 #include "ash/shelf/shelf_util.h" |
33 #include "ash/wm/window_util.h" | 32 #include "ash/wm/window_util.h" |
34 #include "grit/ash_resources.h" | 33 #include "grit/ash_resources.h" |
35 #endif // defined(USE_ASH) | 34 #endif // defined(USE_ASH) |
36 | 35 |
37 #if defined(OS_WIN) | 36 #if defined(OS_WIN) |
38 #include "chrome/browser/shell_integration.h" | 37 #include "chrome/browser/shell_integration.h" |
39 #include "ui/base/win/shell.h" | 38 #include "ui/base/win/shell.h" |
40 #include "ui/views/win/hwnd_util.h" | 39 #include "ui/views/win/hwnd_util.h" |
41 #endif // defined(OS_WIN) | 40 #endif // defined(OS_WIN) |
42 | 41 |
43 namespace task_management { | 42 namespace task_management { |
44 | 43 |
45 namespace { | 44 namespace { |
46 | 45 |
47 NewTaskManagerView* g_task_manager_view = nullptr; | 46 NewTaskManagerView* g_task_manager_view = nullptr; |
48 | 47 |
49 // Opens the "about:memory" for the "stats for nerds" link. | |
50 void OpenAboutMemory() { | |
51 Profile* profile = ProfileManager::GetLastUsedProfileAllowedByPolicy(); | |
52 if (profile->IsGuestSession() && | |
53 !g_browser_process->local_state()->GetBoolean( | |
54 prefs::kBrowserGuestModeEnabled)) { | |
55 UserManager::Show(base::FilePath(), | |
56 profiles::USER_MANAGER_NO_TUTORIAL, | |
57 profiles::USER_MANAGER_SELECT_PROFILE_CHROME_MEMORY); | |
58 return; | |
59 } | |
60 | |
61 chrome::NavigateParams params(profile, | |
62 GURL(chrome::kChromeUIMemoryURL), | |
63 ui::PAGE_TRANSITION_LINK); | |
64 params.disposition = NEW_FOREGROUND_TAB; | |
65 chrome::Navigate(¶ms); | |
66 } | |
67 | |
68 } // namespace | 48 } // namespace |
69 | 49 |
70 NewTaskManagerView::~NewTaskManagerView() { | 50 NewTaskManagerView::~NewTaskManagerView() { |
71 // Delete child views now, while our table model still exists. | 51 // Delete child views now, while our table model still exists. |
72 RemoveAllChildViews(true); | 52 RemoveAllChildViews(true); |
73 } | 53 } |
74 | 54 |
75 // static | 55 // static |
76 void NewTaskManagerView::Show(Browser* browser) { | 56 void NewTaskManagerView::Show(Browser* browser) { |
77 if (g_task_manager_view) { | 57 if (g_task_manager_view) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 | 137 |
158 void NewTaskManagerView::Layout() { | 138 void NewTaskManagerView::Layout() { |
159 gfx::Size size = kill_button_->GetPreferredSize(); | 139 gfx::Size size = kill_button_->GetPreferredSize(); |
160 gfx::Rect parent_bounds = parent()->GetContentsBounds(); | 140 gfx::Rect parent_bounds = parent()->GetContentsBounds(); |
161 const int horizontal_margin = views::kPanelHorizMargin; | 141 const int horizontal_margin = views::kPanelHorizMargin; |
162 const int vertical_margin = views::kButtonVEdgeMargin; | 142 const int vertical_margin = views::kButtonVEdgeMargin; |
163 int x = width() - size.width() - horizontal_margin; | 143 int x = width() - size.width() - horizontal_margin; |
164 int y_buttons = parent_bounds.bottom() - size.height() - vertical_margin; | 144 int y_buttons = parent_bounds.bottom() - size.height() - vertical_margin; |
165 kill_button_->SetBounds(x, y_buttons, size.width(), size.height()); | 145 kill_button_->SetBounds(x, y_buttons, size.width(), size.height()); |
166 | 146 |
167 size = about_memory_link_->GetPreferredSize(); | |
168 about_memory_link_->SetBounds( | |
169 horizontal_margin, | |
170 y_buttons + (kill_button_->height() - size.height()) / 2, | |
171 size.width(), size.height()); | |
172 | |
173 gfx::Rect rect = GetLocalBounds(); | 147 gfx::Rect rect = GetLocalBounds(); |
174 rect.Inset(horizontal_margin, views::kPanelVertMargin); | 148 rect.Inset(horizontal_margin, views::kPanelVertMargin); |
175 rect.Inset(0, 0, 0, | 149 rect.Inset(0, 0, 0, |
176 kill_button_->height() + views::kUnrelatedControlVerticalSpacing); | 150 kill_button_->height() + views::kUnrelatedControlVerticalSpacing); |
177 tab_table_parent_->SetBoundsRect(rect); | 151 tab_table_parent_->SetBoundsRect(rect); |
178 } | 152 } |
179 | 153 |
180 gfx::Size NewTaskManagerView::GetPreferredSize() const { | 154 gfx::Size NewTaskManagerView::GetPreferredSize() const { |
181 return gfx::Size(460, 270); | 155 return gfx::Size(460, 270); |
182 } | 156 } |
183 | 157 |
184 bool NewTaskManagerView::AcceleratorPressed( | 158 bool NewTaskManagerView::AcceleratorPressed( |
185 const ui::Accelerator& accelerator) { | 159 const ui::Accelerator& accelerator) { |
186 DCHECK_EQ(ui::VKEY_W, accelerator.key_code()); | 160 DCHECK_EQ(ui::VKEY_W, accelerator.key_code()); |
187 DCHECK_EQ(ui::EF_CONTROL_DOWN, accelerator.modifiers()); | 161 DCHECK_EQ(ui::EF_CONTROL_DOWN, accelerator.modifiers()); |
188 GetWidget()->Close(); | 162 GetWidget()->Close(); |
189 return true; | 163 return true; |
190 } | 164 } |
191 | 165 |
192 void NewTaskManagerView::ViewHierarchyChanged( | 166 void NewTaskManagerView::ViewHierarchyChanged( |
193 const ViewHierarchyChangedDetails& details) { | 167 const ViewHierarchyChangedDetails& details) { |
194 views::DialogDelegateView::ViewHierarchyChanged(details); | 168 views::DialogDelegateView::ViewHierarchyChanged(details); |
195 // Since we want the Kill button and the Memory Details link to show up in | 169 // Since we want the Kill button to show up in the same visual row as the |
196 // the same visual row as the close button, which is provided by the | 170 // close button, which is provided by the framework, we must add it to the |
197 // framework, we must add the buttons to the non-client view, which is the | 171 // non-client view, which is the parent of this view. Similarly, when we're |
198 // parent of this view. Similarly, when we're removed from the view | 172 // removed from the view hierarchy, we must take care to clean up that item. |
199 // hierarchy, we must take care to clean up those items as well. | |
200 if (details.child == this) { | 173 if (details.child == this) { |
201 if (details.is_add) { | 174 if (details.is_add) { |
202 details.parent->AddChildView(about_memory_link_); | |
203 details.parent->AddChildView(kill_button_); | 175 details.parent->AddChildView(kill_button_); |
204 tab_table_parent_ = tab_table_->CreateParentIfNecessary(); | 176 tab_table_parent_ = tab_table_->CreateParentIfNecessary(); |
205 AddChildView(tab_table_parent_); | 177 AddChildView(tab_table_parent_); |
206 } else { | 178 } else { |
207 details.parent->RemoveChildView(kill_button_); | 179 details.parent->RemoveChildView(kill_button_); |
208 details.parent->RemoveChildView(about_memory_link_); | |
209 } | 180 } |
210 } | 181 } |
211 } | 182 } |
212 | 183 |
213 void NewTaskManagerView::ButtonPressed(views::Button* sender, | 184 void NewTaskManagerView::ButtonPressed(views::Button* sender, |
214 const ui::Event& event) { | 185 const ui::Event& event) { |
215 DCHECK_EQ(kill_button_, sender); | 186 DCHECK_EQ(kill_button_, sender); |
216 | 187 |
217 using SelectedIndices = ui::ListSelectionModel::SelectedIndices; | 188 using SelectedIndices = ui::ListSelectionModel::SelectedIndices; |
218 SelectedIndices selection(tab_table_->selection_model().selected_indices()); | 189 SelectedIndices selection(tab_table_->selection_model().selected_indices()); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 | 260 |
290 void NewTaskManagerView::OnDoubleClick() { | 261 void NewTaskManagerView::OnDoubleClick() { |
291 ActivateFocusedTab(); | 262 ActivateFocusedTab(); |
292 } | 263 } |
293 | 264 |
294 void NewTaskManagerView::OnKeyDown(ui::KeyboardCode keycode) { | 265 void NewTaskManagerView::OnKeyDown(ui::KeyboardCode keycode) { |
295 if (keycode == ui::VKEY_RETURN) | 266 if (keycode == ui::VKEY_RETURN) |
296 ActivateFocusedTab(); | 267 ActivateFocusedTab(); |
297 } | 268 } |
298 | 269 |
299 void NewTaskManagerView::LinkClicked(views::Link* source, int event_flags) { | |
300 DCHECK_EQ(about_memory_link_, source); | |
301 OpenAboutMemory(); | |
302 } | |
303 | |
304 void NewTaskManagerView::ShowContextMenuForView( | 270 void NewTaskManagerView::ShowContextMenuForView( |
305 views::View* source, | 271 views::View* source, |
306 const gfx::Point& point, | 272 const gfx::Point& point, |
307 ui::MenuSourceType source_type) { | 273 ui::MenuSourceType source_type) { |
308 ui::SimpleMenuModel menu_model(this); | 274 ui::SimpleMenuModel menu_model(this); |
309 | 275 |
310 for (const auto& table_column : columns_) { | 276 for (const auto& table_column : columns_) { |
311 menu_model.AddCheckItem(table_column.id, | 277 menu_model.AddCheckItem(table_column.id, |
312 l10n_util::GetStringUTF16(table_column.id)); | 278 l10n_util::GetStringUTF16(table_column.id)); |
313 } | 279 } |
(...skipping 23 matching lines...) Expand all Loading... |
337 ui::Accelerator* accelerator) { | 303 ui::Accelerator* accelerator) { |
338 return false; | 304 return false; |
339 } | 305 } |
340 | 306 |
341 void NewTaskManagerView::ExecuteCommand(int id, int event_flags) { | 307 void NewTaskManagerView::ExecuteCommand(int id, int event_flags) { |
342 table_model_->ToggleColumnVisibility(id); | 308 table_model_->ToggleColumnVisibility(id); |
343 } | 309 } |
344 | 310 |
345 NewTaskManagerView::NewTaskManagerView() | 311 NewTaskManagerView::NewTaskManagerView() |
346 : kill_button_(nullptr), | 312 : kill_button_(nullptr), |
347 about_memory_link_(nullptr), | |
348 tab_table_(nullptr), | 313 tab_table_(nullptr), |
349 tab_table_parent_(nullptr), | 314 tab_table_parent_(nullptr), |
350 is_always_on_top_(false) { | 315 is_always_on_top_(false) { |
351 Init(); | 316 Init(); |
352 } | 317 } |
353 | 318 |
354 // static | 319 // static |
355 NewTaskManagerView* NewTaskManagerView::GetInstanceForTests() { | 320 NewTaskManagerView* NewTaskManagerView::GetInstanceForTests() { |
356 return g_task_manager_view; | 321 return g_task_manager_view; |
357 } | 322 } |
(...skipping 21 matching lines...) Expand all Loading... |
379 tab_table_->SetObserver(this); | 344 tab_table_->SetObserver(this); |
380 tab_table_->set_context_menu_controller(this); | 345 tab_table_->set_context_menu_controller(this); |
381 set_context_menu_controller(this); | 346 set_context_menu_controller(this); |
382 | 347 |
383 table_model_->RetrieveSavedColumnsSettingsAndUpdateTable(); | 348 table_model_->RetrieveSavedColumnsSettingsAndUpdateTable(); |
384 | 349 |
385 kill_button_ = new views::LabelButton(this, | 350 kill_button_ = new views::LabelButton(this, |
386 l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL)); | 351 l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL)); |
387 kill_button_->SetStyle(views::Button::STYLE_BUTTON); | 352 kill_button_->SetStyle(views::Button::STYLE_BUTTON); |
388 | 353 |
389 about_memory_link_ = new views::Link( | |
390 l10n_util::GetStringUTF16(IDS_TASK_MANAGER_ABOUT_MEMORY_LINK)); | |
391 about_memory_link_->set_listener(this); | |
392 | |
393 // Makes sure our state is consistent. | 354 // Makes sure our state is consistent. |
394 OnSelectionChanged(); | 355 OnSelectionChanged(); |
395 | 356 |
396 AddAccelerator(ui::Accelerator(ui::VKEY_W, ui::EF_CONTROL_DOWN)); | 357 AddAccelerator(ui::Accelerator(ui::VKEY_W, ui::EF_CONTROL_DOWN)); |
397 } | 358 } |
398 | 359 |
399 void NewTaskManagerView::InitAlwaysOnTopState() { | 360 void NewTaskManagerView::InitAlwaysOnTopState() { |
400 RetriveSavedAlwaysOnTopState(); | 361 RetriveSavedAlwaysOnTopState(); |
401 GetWidget()->SetAlwaysOnTop(is_always_on_top_); | 362 GetWidget()->SetAlwaysOnTop(is_always_on_top_); |
402 } | 363 } |
(...skipping 10 matching lines...) Expand all Loading... |
413 if (!g_browser_process->local_state()) | 374 if (!g_browser_process->local_state()) |
414 return; | 375 return; |
415 | 376 |
416 const base::DictionaryValue* dictionary = | 377 const base::DictionaryValue* dictionary = |
417 g_browser_process->local_state()->GetDictionary(GetWindowName()); | 378 g_browser_process->local_state()->GetDictionary(GetWindowName()); |
418 if (dictionary) | 379 if (dictionary) |
419 dictionary->GetBoolean("always_on_top", &is_always_on_top_); | 380 dictionary->GetBoolean("always_on_top", &is_always_on_top_); |
420 } | 381 } |
421 | 382 |
422 } // namespace task_management | 383 } // namespace task_management |
OLD | NEW |