| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/task_manager.h" | 5 #include "chrome/browser/task_manager.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/table_model_observer.h" | 8 #include "app/table_model_observer.h" |
| 9 #include "base/stats_table.h" | 9 #include "base/stats_table.h" |
| 10 #include "chrome/app/chrome_dll_resource.h" | 10 #include "chrome/app/chrome_dll_resource.h" |
| 11 #include "chrome/browser/browser_list.h" | 11 #include "chrome/browser/browser_list.h" |
| 12 #include "chrome/browser/browser_process.h" | 12 #include "chrome/browser/browser_process.h" |
| 13 #include "chrome/browser/browser_window.h" | 13 #include "chrome/browser/browser_window.h" |
| 14 #include "chrome/browser/views/browser_dialogs.h" |
| 14 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
| 15 #include "chrome/common/pref_service.h" | 16 #include "chrome/common/pref_service.h" |
| 16 #include "grit/chromium_strings.h" | 17 #include "grit/chromium_strings.h" |
| 17 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
| 18 #include "grit/theme_resources.h" | 19 #include "grit/theme_resources.h" |
| 19 #include "views/accelerator.h" | 20 #include "views/accelerator.h" |
| 20 #include "views/background.h" | 21 #include "views/background.h" |
| 21 #include "views/controls/button/native_button.h" | 22 #include "views/controls/button/native_button.h" |
| 22 #include "views/controls/link.h" | 23 #include "views/controls/link.h" |
| 23 #include "views/controls/menu/menu.h" | 24 #include "views/controls/menu/menu.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 void TaskManagerTableModel::OnItemsAdded(int start, int length) { | 152 void TaskManagerTableModel::OnItemsAdded(int start, int length) { |
| 152 if (observer_) | 153 if (observer_) |
| 153 observer_->OnItemsAdded(start, length); | 154 observer_->OnItemsAdded(start, length); |
| 154 } | 155 } |
| 155 | 156 |
| 156 void TaskManagerTableModel::OnItemsRemoved(int start, int length) { | 157 void TaskManagerTableModel::OnItemsRemoved(int start, int length) { |
| 157 if (observer_) | 158 if (observer_) |
| 158 observer_->OnItemsRemoved(start, length); | 159 observer_->OnItemsRemoved(start, length); |
| 159 } | 160 } |
| 160 | 161 |
| 161 //////////////////////////////////////////////////////////////////////////////// | 162 // The Task manager UI container. |
| 162 // TaskManagerViewImpl class | 163 class TaskManagerView : public views::View, |
| 163 // | 164 public views::ButtonListener, |
| 164 // The view containing the different widgets. | 165 public views::DialogDelegate, |
| 165 // | 166 public views::TableViewObserver, |
| 166 //////////////////////////////////////////////////////////////////////////////// | 167 public views::LinkController, |
| 168 public views::ContextMenuController, |
| 169 public views::Menu::Delegate { |
| 170 public: |
| 171 TaskManagerView(); |
| 172 virtual ~TaskManagerView(); |
| 167 | 173 |
| 168 class TaskManagerViewImpl : public TaskManagerView, | 174 // Shows the Task manager window, or re-activates an existing one. |
| 169 public views::View, | 175 static void Show(); |
| 170 public views::ButtonListener, | |
| 171 public views::DialogDelegate, | |
| 172 public views::TableViewObserver, | |
| 173 public views::LinkController, | |
| 174 public views::ContextMenuController, | |
| 175 public views::Menu::Delegate { | |
| 176 public: | |
| 177 TaskManagerViewImpl(TaskManager* task_manager, | |
| 178 TaskManagerModel* model); | |
| 179 virtual ~TaskManagerViewImpl(); | |
| 180 | 176 |
| 181 void Init(); | 177 // views::View |
| 182 virtual void Layout(); | 178 virtual void Layout(); |
| 183 virtual gfx::Size GetPreferredSize(); | 179 virtual gfx::Size GetPreferredSize(); |
| 184 virtual void ViewHierarchyChanged(bool is_add, views::View* parent, | 180 virtual void ViewHierarchyChanged(bool is_add, views::View* parent, |
| 185 views::View* child); | 181 views::View* child); |
| 186 | 182 |
| 187 // TaskManagerView | |
| 188 virtual void GetSelection(std::vector<int>* selection); | |
| 189 virtual void GetFocused(std::vector<int>* focused); | |
| 190 virtual void OpenWindow(); | |
| 191 virtual void ActivateWindow(); | |
| 192 virtual void CloseWindow(); | |
| 193 | |
| 194 // ButtonListener implementation. | 183 // ButtonListener implementation. |
| 195 virtual void ButtonPressed(views::Button* sender); | 184 virtual void ButtonPressed(views::Button* sender); |
| 196 | 185 |
| 197 // views::DialogDelegate | 186 // views::DialogDelegate |
| 198 virtual bool CanResize() const; | 187 virtual bool CanResize() const; |
| 199 virtual bool CanMaximize() const; | 188 virtual bool CanMaximize() const; |
| 200 virtual bool ExecuteWindowsCommand(int command_id); | 189 virtual bool ExecuteWindowsCommand(int command_id); |
| 201 virtual std::wstring GetWindowTitle() const; | 190 virtual std::wstring GetWindowTitle() const; |
| 202 virtual std::wstring GetWindowName() const; | 191 virtual std::wstring GetWindowName() const; |
| 203 virtual int GetDialogButtons() const; | 192 virtual int GetDialogButtons() const; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 219 | 208 |
| 220 // Menu::Delegate | 209 // Menu::Delegate |
| 221 virtual void ShowContextMenu(views::View* source, | 210 virtual void ShowContextMenu(views::View* source, |
| 222 int x, | 211 int x, |
| 223 int y, | 212 int y, |
| 224 bool is_mouse_gesture); | 213 bool is_mouse_gesture); |
| 225 virtual bool IsItemChecked(int id) const; | 214 virtual bool IsItemChecked(int id) const; |
| 226 virtual void ExecuteCommand(int id); | 215 virtual void ExecuteCommand(int id); |
| 227 | 216 |
| 228 private: | 217 private: |
| 218 // Creates the child controls. |
| 219 void Init(); |
| 220 |
| 229 // Initializes the state of the always-on-top setting as the window is shown. | 221 // Initializes the state of the always-on-top setting as the window is shown. |
| 230 void InitAlwaysOnTopState(); | 222 void InitAlwaysOnTopState(); |
| 231 | 223 |
| 224 // Activates the tab associated with the focused row. |
| 225 void ActivateFocusedTab(); |
| 226 |
| 232 // Adds an always on top item to the window's system menu. | 227 // Adds an always on top item to the window's system menu. |
| 233 void AddAlwaysOnTopSystemMenuItem(); | 228 void AddAlwaysOnTopSystemMenuItem(); |
| 234 | 229 |
| 235 // Restores saved always on top state from a previous session. | 230 // Restores saved always on top state from a previous session. |
| 236 bool GetSavedAlwaysOnTopState(bool* always_on_top) const; | 231 bool GetSavedAlwaysOnTopState(bool* always_on_top) const; |
| 237 | 232 |
| 238 views::NativeButton* kill_button_; | 233 views::NativeButton* kill_button_; |
| 239 views::Link* about_memory_link_; | 234 views::Link* about_memory_link_; |
| 240 views::GroupTableView* tab_table_; | 235 views::GroupTableView* tab_table_; |
| 241 | 236 |
| 242 TaskManager* task_manager_; | 237 TaskManager* task_manager_; |
| 243 | 238 |
| 244 TaskManagerModel* model_; | 239 TaskManagerModel* model_; |
| 245 | 240 |
| 246 // all possible columns, not necessarily visible | 241 // all possible columns, not necessarily visible |
| 247 std::vector<TableColumn> columns_; | 242 std::vector<TableColumn> columns_; |
| 248 | 243 |
| 249 scoped_ptr<TaskManagerTableModel> table_model_; | 244 scoped_ptr<TaskManagerTableModel> table_model_; |
| 250 | 245 |
| 251 // True when the Task Manager window should be shown on top of other windows. | 246 // True when the Task Manager window should be shown on top of other windows. |
| 252 bool is_always_on_top_; | 247 bool is_always_on_top_; |
| 253 | 248 |
| 254 // We need to own the text of the menu, the Windows API does not copy it. | 249 // We need to own the text of the menu, the Windows API does not copy it. |
| 255 std::wstring always_on_top_menu_text_; | 250 std::wstring always_on_top_menu_text_; |
| 256 | 251 |
| 257 DISALLOW_COPY_AND_ASSIGN(TaskManagerViewImpl); | 252 // An open Task manager window. There can only be one open at a time. This |
| 253 // is reset to NULL when the window is closed. |
| 254 static TaskManagerView* instance_; |
| 255 |
| 256 DISALLOW_COPY_AND_ASSIGN(TaskManagerView); |
| 258 }; | 257 }; |
| 259 | 258 |
| 260 TaskManagerViewImpl::TaskManagerViewImpl(TaskManager* task_manager, | 259 // static |
| 261 TaskManagerModel* model) | 260 TaskManagerView* TaskManagerView::instance_ = NULL; |
| 262 : task_manager_(task_manager), | 261 |
| 263 model_(model), | 262 |
| 263 TaskManagerView::TaskManagerView() |
| 264 : task_manager_(TaskManager::GetInstance()), |
| 265 model_(TaskManager::GetInstance()->model()), |
| 264 is_always_on_top_(false) { | 266 is_always_on_top_(false) { |
| 265 Init(); | 267 Init(); |
| 266 } | 268 } |
| 267 | 269 |
| 268 TaskManagerViewImpl::~TaskManagerViewImpl() { | 270 TaskManagerView::~TaskManagerView() { |
| 269 // Delete child views now, while our table model still exists. | 271 // Delete child views now, while our table model still exists. |
| 270 RemoveAllChildViews(true); | 272 RemoveAllChildViews(true); |
| 271 | 273 |
| 272 // Prevent the table from accessing the model as part of its destruction, as | 274 // Prevent the table from accessing the model as part of its destruction, as |
| 273 // the model might already be destroyed. | 275 // the model might already be destroyed. |
| 274 tab_table_->SetModel(NULL); | 276 tab_table_->SetModel(NULL); |
| 275 } | 277 } |
| 276 | 278 |
| 277 void TaskManagerViewImpl::Init() { | 279 void TaskManagerView::Init() { |
| 278 table_model_.reset(new TaskManagerTableModel(model_)); | 280 table_model_.reset(new TaskManagerTableModel(model_)); |
| 279 | 281 |
| 280 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PAGE_COLUMN, | 282 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PAGE_COLUMN, |
| 281 TableColumn::LEFT, -1, 1)); | 283 TableColumn::LEFT, -1, 1)); |
| 282 columns_.back().sortable = true; | 284 columns_.back().sortable = true; |
| 283 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, | 285 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, |
| 284 TableColumn::RIGHT, -1, 0)); | 286 TableColumn::RIGHT, -1, 0)); |
| 285 columns_.back().sortable = true; | 287 columns_.back().sortable = true; |
| 286 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, | 288 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, |
| 287 TableColumn::RIGHT, -1, 0)); | 289 TableColumn::RIGHT, -1, 0)); |
| 288 columns_.back().sortable = true; | 290 columns_.back().sortable = true; |
| 289 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, | 291 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, |
| 290 TableColumn::RIGHT, -1, 0)); | 292 TableColumn::RIGHT, -1, 0)); |
| 291 columns_.back().sortable = true; | 293 columns_.back().sortable = true; |
| 292 columns_.push_back(TableColumn(IDS_TASK_MANAGER_CPU_COLUMN, | 294 columns_.push_back(TableColumn(IDS_TASK_MANAGER_CPU_COLUMN, |
| 293 TableColumn::RIGHT, -1, 0)); | 295 TableColumn::RIGHT, -1, 0)); |
| 294 columns_.back().sortable = true; | 296 columns_.back().sortable = true; |
| 295 columns_.push_back(TableColumn(IDS_TASK_MANAGER_NET_COLUMN, | 297 columns_.push_back(TableColumn(IDS_TASK_MANAGER_NET_COLUMN, |
| 296 TableColumn::RIGHT, -1, 0)); | 298 TableColumn::RIGHT, -1, 0)); |
| 297 columns_.back().sortable = true; | 299 columns_.back().sortable = true; |
| 298 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, | 300 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, |
| 299 TableColumn::RIGHT, -1, 0)); | 301 TableColumn::RIGHT, -1, 0)); |
| 300 columns_.back().sortable = true; | 302 columns_.back().sortable = true; |
| 301 | 303 |
| 302 tab_table_ = new views::GroupTableView(table_model_.get(), columns_, | 304 tab_table_ = new views::GroupTableView(table_model_.get(), columns_, |
| 303 views::ICON_AND_TEXT, false, true, | 305 views::ICON_AND_TEXT, false, true, |
| 304 true); | 306 true); |
| 305 tab_table_->SetParentOwned(false); | |
| 306 | 307 |
| 307 // Hide some columns by default | 308 // Hide some columns by default |
| 308 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, false); | 309 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, false); |
| 309 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); | 310 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); |
| 310 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); | 311 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); |
| 311 | 312 |
| 312 UpdateStatsCounters(); | 313 UpdateStatsCounters(); |
| 313 TableColumn col(kGoatsTeleportedColumn, L"Goats Teleported", | 314 TableColumn col(kGoatsTeleportedColumn, L"Goats Teleported", |
| 314 TableColumn::RIGHT, -1, 0); | 315 TableColumn::RIGHT, -1, 0); |
| 315 col.sortable = true; | 316 col.sortable = true; |
| 316 columns_.push_back(col); | 317 columns_.push_back(col); |
| 317 tab_table_->AddColumn(col); | 318 tab_table_->AddColumn(col); |
| 318 tab_table_->SetObserver(this); | 319 tab_table_->SetObserver(this); |
| 319 SetContextMenuController(this); | 320 SetContextMenuController(this); |
| 320 kill_button_ = new views::NativeButton( | 321 kill_button_ = new views::NativeButton( |
| 321 this, l10n_util::GetString(IDS_TASK_MANAGER_KILL)); | 322 this, l10n_util::GetString(IDS_TASK_MANAGER_KILL)); |
| 322 kill_button_->AddAccelerator(views::Accelerator('E', false, false, false)); | 323 kill_button_->AddAccelerator(views::Accelerator('E', false, false, false)); |
| 323 kill_button_->SetAccessibleKeyboardShortcut(L"E"); | 324 kill_button_->SetAccessibleKeyboardShortcut(L"E"); |
| 324 about_memory_link_ = new views::Link( | 325 about_memory_link_ = new views::Link( |
| 325 l10n_util::GetString(IDS_TASK_MANAGER_ABOUT_MEMORY_LINK)); | 326 l10n_util::GetString(IDS_TASK_MANAGER_ABOUT_MEMORY_LINK)); |
| 326 about_memory_link_->SetController(this); | 327 about_memory_link_->SetController(this); |
| 327 | 328 |
| 328 // Makes sure our state is consistent. | 329 // Makes sure our state is consistent. |
| 329 OnSelectionChanged(); | 330 OnSelectionChanged(); |
| 330 } | 331 } |
| 331 | 332 |
| 332 void TaskManagerViewImpl::UpdateStatsCounters() { | 333 void TaskManagerView::UpdateStatsCounters() { |
| 333 StatsTable* stats = StatsTable::current(); | 334 StatsTable* stats = StatsTable::current(); |
| 334 if (stats != NULL) { | 335 if (stats != NULL) { |
| 335 int max = stats->GetMaxCounters(); | 336 int max = stats->GetMaxCounters(); |
| 336 // skip the first row (it's header data) | 337 // skip the first row (it's header data) |
| 337 for (int i = 1; i < max; i++) { | 338 for (int i = 1; i < max; i++) { |
| 338 const char* row = stats->GetRowName(i); | 339 const char* row = stats->GetRowName(i); |
| 339 if (row != NULL && row[0] != '\0' && !tab_table_->HasColumn(i)) { | 340 if (row != NULL && row[0] != '\0' && !tab_table_->HasColumn(i)) { |
| 340 // TODO(erikkay): Use l10n to get display names for stats. Right | 341 // TODO(erikkay): Use l10n to get display names for stats. Right |
| 341 // now we're just displaying the internal counter name. Perhaps | 342 // now we're just displaying the internal counter name. Perhaps |
| 342 // stat names not in the string table would be filtered out. | 343 // stat names not in the string table would be filtered out. |
| 343 // TODO(erikkay): Width is hard-coded right now, so many column | 344 // TODO(erikkay): Width is hard-coded right now, so many column |
| 344 // names are clipped. | 345 // names are clipped. |
| 345 TableColumn col(i, ASCIIToWide(row), TableColumn::RIGHT, 90, 0); | 346 TableColumn col(i, ASCIIToWide(row), TableColumn::RIGHT, 90, 0); |
| 346 col.sortable = true; | 347 col.sortable = true; |
| 347 columns_.push_back(col); | 348 columns_.push_back(col); |
| 348 tab_table_->AddColumn(col); | 349 tab_table_->AddColumn(col); |
| 349 } | 350 } |
| 350 } | 351 } |
| 351 } | 352 } |
| 352 } | 353 } |
| 353 | 354 |
| 354 void TaskManagerViewImpl::ViewHierarchyChanged(bool is_add, | 355 void TaskManagerView::ViewHierarchyChanged(bool is_add, |
| 355 views::View* parent, | 356 views::View* parent, |
| 356 views::View* child) { | 357 views::View* child) { |
| 357 // Since we want the Kill button and the Memory Details link to show up in | 358 // Since we want the Kill button and the Memory Details link to show up in |
| 358 // the same visual row as the close button, which is provided by the | 359 // the same visual row as the close button, which is provided by the |
| 359 // framework, we must add the buttons to the non-client view, which is the | 360 // framework, we must add the buttons to the non-client view, which is the |
| 360 // parent of this view. Similarly, when we're removed from the view | 361 // parent of this view. Similarly, when we're removed from the view |
| 361 // hierarchy, we must take care to clean up those items as well. | 362 // hierarchy, we must take care to clean up those items as well. |
| 362 if (child == this) { | 363 if (child == this) { |
| 363 if (is_add) { | 364 if (is_add) { |
| 364 parent->AddChildView(kill_button_); | 365 parent->AddChildView(kill_button_); |
| 365 parent->AddChildView(about_memory_link_); | 366 parent->AddChildView(about_memory_link_); |
| 366 AddChildView(tab_table_); | 367 AddChildView(tab_table_); |
| 367 } else { | 368 } else { |
| 368 parent->RemoveChildView(kill_button_); | 369 parent->RemoveChildView(kill_button_); |
| 369 parent->RemoveChildView(about_memory_link_); | 370 parent->RemoveChildView(about_memory_link_); |
| 370 } | 371 } |
| 371 } | 372 } |
| 372 } | 373 } |
| 373 | 374 |
| 374 void TaskManagerViewImpl::Layout() { | 375 void TaskManagerView::Layout() { |
| 375 // kPanelHorizMargin is too big. | 376 // kPanelHorizMargin is too big. |
| 376 const int kTableButtonSpacing = 12; | 377 const int kTableButtonSpacing = 12; |
| 377 | 378 |
| 378 gfx::Size size = kill_button_->GetPreferredSize(); | 379 gfx::Size size = kill_button_->GetPreferredSize(); |
| 379 int prefered_width = size.width(); | 380 int prefered_width = size.width(); |
| 380 int prefered_height = size.height(); | 381 int prefered_height = size.height(); |
| 381 | 382 |
| 382 tab_table_->SetBounds(x() + kPanelHorizMargin, | 383 tab_table_->SetBounds(x() + kPanelHorizMargin, |
| 383 y() + kPanelVertMargin, | 384 y() + kPanelVertMargin, |
| 384 width() - 2 * kPanelHorizMargin, | 385 width() - 2 * kPanelHorizMargin, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 399 // center between the two buttons horizontally, and line up with | 400 // center between the two buttons horizontally, and line up with |
| 400 // bottom of buttons vertically. | 401 // bottom of buttons vertically. |
| 401 int link_y_offset = std::max(0, prefered_height - link_prefered_height) / 2; | 402 int link_y_offset = std::max(0, prefered_height - link_prefered_height) / 2; |
| 402 about_memory_link_->SetBounds( | 403 about_memory_link_->SetBounds( |
| 403 x() + kPanelHorizMargin, | 404 x() + kPanelHorizMargin, |
| 404 y_buttons + prefered_height - link_prefered_height - link_y_offset, | 405 y_buttons + prefered_height - link_prefered_height - link_y_offset, |
| 405 link_prefered_width, | 406 link_prefered_width, |
| 406 link_prefered_height); | 407 link_prefered_height); |
| 407 } | 408 } |
| 408 | 409 |
| 409 gfx::Size TaskManagerViewImpl::GetPreferredSize() { | 410 gfx::Size TaskManagerView::GetPreferredSize() { |
| 410 return gfx::Size(kDefaultWidth, kDefaultHeight); | 411 return gfx::Size(kDefaultWidth, kDefaultHeight); |
| 411 } | 412 } |
| 412 | 413 |
| 413 void TaskManagerViewImpl::GetSelection(std::vector<int>* selection) { | 414 // static |
| 414 DCHECK(selection); | 415 void TaskManagerView::Show() { |
| 415 for (views::TableSelectionIterator iter = tab_table_->SelectionBegin(); | 416 if (instance_) { |
| 416 iter != tab_table_->SelectionEnd(); ++iter) { | 417 // If there's a Task manager window open already, just activate it. |
| 417 // The TableView returns the selection starting from the end. | 418 instance_->window()->Activate(); |
| 418 selection->insert(selection->begin(), *iter); | 419 } else { |
| 420 instance_ = new TaskManagerView; |
| 421 views::Window::CreateChromeWindow(NULL, gfx::Rect(), instance_); |
| 422 instance_->InitAlwaysOnTopState(); |
| 423 instance_->model_->StartUpdating(); |
| 424 instance_->window()->Show(); |
| 419 } | 425 } |
| 420 } | 426 } |
| 421 | 427 |
| 422 void TaskManagerViewImpl::GetFocused(std::vector<int>* focused) { | 428 // ButtonListener implementation. |
| 423 DCHECK(focused); | 429 void TaskManagerView::ButtonPressed(views::Button* sender) { |
| 424 int row_count = tab_table_->RowCount(); | 430 DCHECK(sender == kill_button_); |
| 425 for (int i = 0; i < row_count; ++i) { | 431 for (views::TableSelectionIterator iter = tab_table_->SelectionBegin(); |
| 426 // The TableView returns the selection starting from the end. | 432 iter != tab_table_->SelectionEnd(); ++iter) { |
| 427 if (tab_table_->ItemHasTheFocus(i)) | 433 task_manager_->KillProcess(*iter); |
| 428 focused->insert(focused->begin(), i); | |
| 429 } | 434 } |
| 430 } | 435 } |
| 431 | 436 |
| 432 void TaskManagerViewImpl::OpenWindow() { | |
| 433 DCHECK(!window()); | |
| 434 views::Window::CreateChromeWindow(NULL, gfx::Rect(), this); | |
| 435 InitAlwaysOnTopState(); | |
| 436 model_->StartUpdating(); | |
| 437 window()->Show(); | |
| 438 } | |
| 439 | |
| 440 void TaskManagerViewImpl::ActivateWindow() { | |
| 441 DCHECK(window()); | |
| 442 window()->Activate(); | |
| 443 } | |
| 444 | |
| 445 void TaskManagerViewImpl::CloseWindow() { | |
| 446 if (!window()) | |
| 447 return; | |
| 448 // TODO(phajdan.jr): Destroy the window, not just hide it. | |
| 449 window()->HideWindow(); | |
| 450 } | |
| 451 | |
| 452 // ButtonListener implementation. | |
| 453 void TaskManagerViewImpl::ButtonPressed(views::Button* sender) { | |
| 454 if (sender == kill_button_) | |
| 455 task_manager_->KillSelectedProcesses(); | |
| 456 } | |
| 457 | |
| 458 // DialogDelegate implementation. | 437 // DialogDelegate implementation. |
| 459 bool TaskManagerViewImpl::CanResize() const { | 438 bool TaskManagerView::CanResize() const { |
| 460 return true; | 439 return true; |
| 461 } | 440 } |
| 462 | 441 |
| 463 bool TaskManagerViewImpl::CanMaximize() const { | 442 bool TaskManagerView::CanMaximize() const { |
| 464 return true; | 443 return true; |
| 465 } | 444 } |
| 466 | 445 |
| 467 bool TaskManagerViewImpl::ExecuteWindowsCommand(int command_id) { | 446 bool TaskManagerView::ExecuteWindowsCommand(int command_id) { |
| 468 if (command_id == IDC_ALWAYS_ON_TOP) { | 447 if (command_id == IDC_ALWAYS_ON_TOP) { |
| 469 is_always_on_top_ = !is_always_on_top_; | 448 is_always_on_top_ = !is_always_on_top_; |
| 470 | 449 |
| 471 // Change the menu check state. | 450 // Change the menu check state. |
| 472 HMENU system_menu = GetSystemMenu(GetWindow()->GetNativeWindow(), FALSE); | 451 HMENU system_menu = GetSystemMenu(GetWindow()->GetNativeWindow(), FALSE); |
| 473 MENUITEMINFO menu_info; | 452 MENUITEMINFO menu_info; |
| 474 memset(&menu_info, 0, sizeof(MENUITEMINFO)); | 453 memset(&menu_info, 0, sizeof(MENUITEMINFO)); |
| 475 menu_info.cbSize = sizeof(MENUITEMINFO); | 454 menu_info.cbSize = sizeof(MENUITEMINFO); |
| 476 BOOL r = GetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, | 455 BOOL r = GetMenuItemInfo(system_menu, IDC_ALWAYS_ON_TOP, |
| 477 FALSE, &menu_info); | 456 FALSE, &menu_info); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 489 DictionaryValue* window_preferences = | 468 DictionaryValue* window_preferences = |
| 490 g_browser_process->local_state()->GetMutableDictionary( | 469 g_browser_process->local_state()->GetMutableDictionary( |
| 491 GetWindowName().c_str()); | 470 GetWindowName().c_str()); |
| 492 window_preferences->SetBoolean(L"always_on_top", is_always_on_top_); | 471 window_preferences->SetBoolean(L"always_on_top", is_always_on_top_); |
| 493 } | 472 } |
| 494 return true; | 473 return true; |
| 495 } | 474 } |
| 496 return false; | 475 return false; |
| 497 } | 476 } |
| 498 | 477 |
| 499 std::wstring TaskManagerViewImpl::GetWindowTitle() const { | 478 std::wstring TaskManagerView::GetWindowTitle() const { |
| 500 return l10n_util::GetString(IDS_TASK_MANAGER_TITLE); | 479 return l10n_util::GetString(IDS_TASK_MANAGER_TITLE); |
| 501 } | 480 } |
| 502 | 481 |
| 503 std::wstring TaskManagerViewImpl::GetWindowName() const { | 482 std::wstring TaskManagerView::GetWindowName() const { |
| 504 return prefs::kTaskManagerWindowPlacement; | 483 return prefs::kTaskManagerWindowPlacement; |
| 505 } | 484 } |
| 506 | 485 |
| 507 int TaskManagerViewImpl::GetDialogButtons() const { | 486 int TaskManagerView::GetDialogButtons() const { |
| 508 return MessageBoxFlags::DIALOGBUTTON_NONE; | 487 return MessageBoxFlags::DIALOGBUTTON_NONE; |
| 509 } | 488 } |
| 510 | 489 |
| 511 void TaskManagerViewImpl::WindowClosing() { | 490 void TaskManagerView::WindowClosing() { |
| 491 // Now that the window is closed, we can allow a new one to be opened. |
| 492 instance_ = NULL; |
| 512 task_manager_->OnWindowClosed(); | 493 task_manager_->OnWindowClosed(); |
| 513 } | 494 } |
| 514 | 495 |
| 515 void TaskManagerViewImpl::DeleteDelegate() { | 496 void TaskManagerView::DeleteDelegate() { |
| 516 ReleaseWindow(); | 497 ReleaseWindow(); |
| 517 } | 498 } |
| 518 | 499 |
| 519 views::View* TaskManagerViewImpl::GetContentsView() { | 500 views::View* TaskManagerView::GetContentsView() { |
| 520 return this; | 501 return this; |
| 521 } | 502 } |
| 522 | 503 |
| 523 // views::TableViewObserver implementation. | 504 // views::TableViewObserver implementation. |
| 524 void TaskManagerViewImpl::OnSelectionChanged() { | 505 void TaskManagerView::OnSelectionChanged() { |
| 525 kill_button_->SetEnabled(!task_manager_->BrowserProcessIsSelected() && | 506 bool selection_contains_browser_process = false; |
| 507 for (views::TableSelectionIterator iter = tab_table_->SelectionBegin(); |
| 508 iter != tab_table_->SelectionEnd(); ++iter) { |
| 509 if (task_manager_->IsBrowserProcess(*iter)) { |
| 510 selection_contains_browser_process = true; |
| 511 break; |
| 512 } |
| 513 } |
| 514 kill_button_->SetEnabled(!selection_contains_browser_process && |
| 526 tab_table_->SelectedRowCount() > 0); | 515 tab_table_->SelectedRowCount() > 0); |
| 527 } | 516 } |
| 528 | 517 |
| 529 void TaskManagerViewImpl::OnDoubleClick() { | 518 void TaskManagerView::OnDoubleClick() { |
| 530 task_manager_->ActivateFocusedTab(); | 519 ActivateFocusedTab(); |
| 531 } | 520 } |
| 532 | 521 |
| 533 void TaskManagerViewImpl::OnKeyDown(unsigned short virtual_keycode) { | 522 void TaskManagerView::OnKeyDown(unsigned short virtual_keycode) { |
| 534 if (virtual_keycode == VK_RETURN) | 523 if (virtual_keycode == VK_RETURN) |
| 535 task_manager_->ActivateFocusedTab(); | 524 ActivateFocusedTab(); |
| 536 } | 525 } |
| 537 | 526 |
| 538 // views::LinkController implementation | 527 // views::LinkController implementation |
| 539 void TaskManagerViewImpl::LinkActivated(views::Link* source, | 528 void TaskManagerView::LinkActivated(views::Link* source, int event_flags) { |
| 540 int event_flags) { | |
| 541 DCHECK(source == about_memory_link_); | 529 DCHECK(source == about_memory_link_); |
| 542 Browser* browser = BrowserList::GetLastActive(); | 530 Browser* browser = BrowserList::GetLastActive(); |
| 543 DCHECK(browser); | 531 DCHECK(browser); |
| 544 browser->OpenURL(GURL("about:memory"), GURL(), NEW_FOREGROUND_TAB, | 532 browser->OpenURL(GURL("about:memory"), GURL(), NEW_FOREGROUND_TAB, |
| 545 PageTransition::LINK); | 533 PageTransition::LINK); |
| 546 // In case the browser window is minimzed, show it. If this is an application | 534 // In case the browser window is minimzed, show it. If this is an application |
| 547 // or popup, we can only have one tab, hence we need to process this in a | 535 // or popup, we can only have one tab, hence we need to process this in a |
| 548 // tabbed browser window. Currently, |browser| is pointing to the application, | 536 // tabbed browser window. Currently, |browser| is pointing to the application, |
| 549 // popup window. Therefore, we have to retrieve the last active tab again, | 537 // popup window. Therefore, we have to retrieve the last active tab again, |
| 550 // since a new window has been used. | 538 // since a new window has been used. |
| 551 if (browser->type() & Browser::TYPE_APP_POPUP) { | 539 if (browser->type() & Browser::TYPE_APP_POPUP) { |
| 552 browser = BrowserList::GetLastActive(); | 540 browser = BrowserList::GetLastActive(); |
| 553 DCHECK(browser); | 541 DCHECK(browser); |
| 554 } | 542 } |
| 555 browser->window()->Show(); | 543 browser->window()->Show(); |
| 556 } | 544 } |
| 557 | 545 |
| 558 void TaskManagerViewImpl::ShowContextMenu(views::View* source, | 546 void TaskManagerView::ShowContextMenu(views::View* source, int x, int y, |
| 559 int x, | 547 bool is_mouse_gesture) { |
| 560 int y, | |
| 561 bool is_mouse_gesture) { | |
| 562 UpdateStatsCounters(); | 548 UpdateStatsCounters(); |
| 563 scoped_ptr<views::Menu> menu(views::Menu::Create( | 549 scoped_ptr<views::Menu> menu(views::Menu::Create( |
| 564 this, views::Menu::TOPLEFT, source->GetWidget()->GetNativeView())); | 550 this, views::Menu::TOPLEFT, source->GetWidget()->GetNativeView())); |
| 565 for (std::vector<TableColumn>::iterator i = | 551 for (std::vector<TableColumn>::iterator i = |
| 566 columns_.begin(); i != columns_.end(); ++i) { | 552 columns_.begin(); i != columns_.end(); ++i) { |
| 567 menu->AppendMenuItem(i->id, i->title, views::Menu::CHECKBOX); | 553 menu->AppendMenuItem(i->id, i->title, views::Menu::CHECKBOX); |
| 568 } | 554 } |
| 569 menu->RunMenuAt(x, y); | 555 menu->RunMenuAt(x, y); |
| 570 } | 556 } |
| 571 | 557 |
| 572 bool TaskManagerViewImpl::IsItemChecked(int id) const { | 558 bool TaskManagerView::IsItemChecked(int id) const { |
| 573 return tab_table_->IsColumnVisible(id); | 559 return tab_table_->IsColumnVisible(id); |
| 574 } | 560 } |
| 575 | 561 |
| 576 void TaskManagerViewImpl::ExecuteCommand(int id) { | 562 void TaskManagerView::ExecuteCommand(int id) { |
| 577 tab_table_->SetColumnVisibility(id, !tab_table_->IsColumnVisible(id)); | 563 tab_table_->SetColumnVisibility(id, !tab_table_->IsColumnVisible(id)); |
| 578 } | 564 } |
| 579 | 565 |
| 580 void TaskManagerViewImpl::InitAlwaysOnTopState() { | 566 void TaskManagerView::InitAlwaysOnTopState() { |
| 581 is_always_on_top_ = false; | 567 is_always_on_top_ = false; |
| 582 if (GetSavedAlwaysOnTopState(&is_always_on_top_)) | 568 if (GetSavedAlwaysOnTopState(&is_always_on_top_)) |
| 583 window()->SetIsAlwaysOnTop(is_always_on_top_); | 569 window()->SetIsAlwaysOnTop(is_always_on_top_); |
| 584 AddAlwaysOnTopSystemMenuItem(); | 570 AddAlwaysOnTopSystemMenuItem(); |
| 585 } | 571 } |
| 586 | 572 |
| 587 void TaskManagerViewImpl::AddAlwaysOnTopSystemMenuItem() { | 573 void TaskManagerView::ActivateFocusedTab() { |
| 574 int row_count = tab_table_->RowCount(); |
| 575 for (int i = 0; i < row_count; ++i) { |
| 576 if (tab_table_->ItemHasTheFocus(i)) { |
| 577 task_manager_->ActivateProcess(i); |
| 578 break; |
| 579 } |
| 580 } |
| 581 } |
| 582 |
| 583 void TaskManagerView::AddAlwaysOnTopSystemMenuItem() { |
| 588 // The Win32 API requires that we own the text. | 584 // The Win32 API requires that we own the text. |
| 589 always_on_top_menu_text_ = l10n_util::GetString(IDS_ALWAYS_ON_TOP); | 585 always_on_top_menu_text_ = l10n_util::GetString(IDS_ALWAYS_ON_TOP); |
| 590 | 586 |
| 591 // Let's insert a menu to the window. | 587 // Let's insert a menu to the window. |
| 592 HMENU system_menu = ::GetSystemMenu(GetWindow()->GetNativeWindow(), FALSE); | 588 HMENU system_menu = ::GetSystemMenu(GetWindow()->GetNativeWindow(), FALSE); |
| 593 int index = ::GetMenuItemCount(system_menu) - 1; | 589 int index = ::GetMenuItemCount(system_menu) - 1; |
| 594 if (index < 0) { | 590 if (index < 0) { |
| 595 // Paranoia check. | 591 // Paranoia check. |
| 596 NOTREACHED(); | 592 NOTREACHED(); |
| 597 index = 0; | 593 index = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 608 menu_info.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE; | 604 menu_info.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE; |
| 609 menu_info.fType = MFT_STRING; | 605 menu_info.fType = MFT_STRING; |
| 610 menu_info.fState = MFS_ENABLED; | 606 menu_info.fState = MFS_ENABLED; |
| 611 if (is_always_on_top_) | 607 if (is_always_on_top_) |
| 612 menu_info.fState |= MFS_CHECKED; | 608 menu_info.fState |= MFS_CHECKED; |
| 613 menu_info.wID = IDC_ALWAYS_ON_TOP; | 609 menu_info.wID = IDC_ALWAYS_ON_TOP; |
| 614 menu_info.dwTypeData = const_cast<wchar_t*>(always_on_top_menu_text_.c_str()); | 610 menu_info.dwTypeData = const_cast<wchar_t*>(always_on_top_menu_text_.c_str()); |
| 615 ::InsertMenuItem(system_menu, index, TRUE, &menu_info); | 611 ::InsertMenuItem(system_menu, index, TRUE, &menu_info); |
| 616 } | 612 } |
| 617 | 613 |
| 618 bool TaskManagerViewImpl::GetSavedAlwaysOnTopState(bool* always_on_top) const { | 614 bool TaskManagerView::GetSavedAlwaysOnTopState(bool* always_on_top) const { |
| 619 if (!g_browser_process->local_state()) | 615 if (!g_browser_process->local_state()) |
| 620 return false; | 616 return false; |
| 621 | 617 |
| 622 const DictionaryValue* dictionary = | 618 const DictionaryValue* dictionary = |
| 623 g_browser_process->local_state()->GetDictionary(GetWindowName().c_str()); | 619 g_browser_process->local_state()->GetDictionary(GetWindowName().c_str()); |
| 624 return dictionary && | 620 return dictionary && |
| 625 dictionary->GetBoolean(L"always_on_top", always_on_top) && always_on_top; | 621 dictionary->GetBoolean(L"always_on_top", always_on_top) && always_on_top; |
| 626 } | 622 } |
| 627 | 623 |
| 628 } // namespace | 624 } // namespace |
| 629 | 625 |
| 630 void TaskManager::CreateView() { | 626 namespace browser { |
| 631 DCHECK(!view_); | 627 |
| 632 view_ = new TaskManagerViewImpl(this, model_.get()); | 628 // Declared in browser_dialogs.h so others don't need to depend on our header. |
| 629 void ShowTaskManager() { |
| 630 TaskManagerView::Show(); |
| 633 } | 631 } |
| 632 |
| 633 } // namespace browser |
| 634 |
| OLD | NEW |