OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/task_manager.h" | 5 #include "chrome/browser/task_manager/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/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/metrics/stats_table.h" | 10 #include "base/metrics/stats_table.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "views/controls/table/table_view_observer.h" | 30 #include "views/controls/table/table_view_observer.h" |
31 #include "views/standard_layout.h" | 31 #include "views/standard_layout.h" |
32 #include "views/widget/widget.h" | 32 #include "views/widget/widget.h" |
33 #include "views/window/dialog_delegate.h" | 33 #include "views/window/dialog_delegate.h" |
34 #include "views/window/window.h" | 34 #include "views/window/window.h" |
35 | 35 |
36 // The task manager window default size. | 36 // The task manager window default size. |
37 static const int kDefaultWidth = 460; | 37 static const int kDefaultWidth = 460; |
38 static const int kDefaultHeight = 270; | 38 static const int kDefaultHeight = 270; |
39 | 39 |
| 40 // The group IDs used to separate background pages from foreground tabs. |
| 41 static const int kBackgroundGroupId = 0; |
| 42 static const int kForegroundGroupId = 1; |
| 43 |
40 namespace { | 44 namespace { |
41 | 45 |
42 //////////////////////////////////////////////////////////////////////////////// | 46 //////////////////////////////////////////////////////////////////////////////// |
43 // TaskManagerTableModel class | 47 // TaskManagerTableModel class |
44 //////////////////////////////////////////////////////////////////////////////// | 48 //////////////////////////////////////////////////////////////////////////////// |
45 | 49 |
46 class TaskManagerTableModel : public views::GroupTableModel, | 50 class TaskManagerTableModel : public views::GroupTableModel, |
47 public TaskManagerModelObserver { | 51 public TaskManagerModelObserver { |
48 public: | 52 public: |
49 explicit TaskManagerTableModel(TaskManagerModel* model) | 53 explicit TaskManagerTableModel(TaskManagerModel* model) |
50 : model_(model), | 54 : model_(model), |
51 observer_(NULL) { | 55 observer_(NULL) { |
52 model_->AddObserver(this); | 56 model_->AddObserver(this); |
53 } | 57 } |
54 | 58 |
55 ~TaskManagerTableModel() { | 59 ~TaskManagerTableModel() { |
56 model_->RemoveObserver(this); | 60 model_->RemoveObserver(this); |
57 } | 61 } |
58 | 62 |
59 // GroupTableModel. | 63 // GroupTableModel. |
60 int RowCount(); | 64 int RowCount(); |
61 std::wstring GetText(int row, int column); | 65 std::wstring GetText(int row, int column); |
62 SkBitmap GetIcon(int row); | 66 SkBitmap GetIcon(int row); |
| 67 bool ShouldIndent(int row); |
63 void GetGroupRangeForItem(int item, views::GroupRange* range); | 68 void GetGroupRangeForItem(int item, views::GroupRange* range); |
64 void SetObserver(TableModelObserver* observer); | 69 void SetObserver(TableModelObserver* observer); |
65 virtual int CompareValues(int row1, int row2, int column_id); | 70 virtual int CompareValues(int row1, int row2, int column_id); |
| 71 virtual Groups GetGroups(); |
| 72 virtual bool HasGroups(); |
| 73 virtual int GetGroupID(int row); |
66 | 74 |
67 // TaskManagerModelObserver. | 75 // TaskManagerModelObserver. |
68 virtual void OnModelChanged(); | 76 virtual void OnModelChanged(); |
69 virtual void OnItemsChanged(int start, int length); | 77 virtual void OnItemsChanged(int start, int length); |
70 virtual void OnItemsAdded(int start, int length); | 78 virtual void OnItemsAdded(int start, int length); |
71 virtual void OnItemsRemoved(int start, int length); | 79 virtual void OnItemsRemoved(int start, int length); |
72 | 80 |
73 private: | 81 private: |
74 TaskManagerModel* model_; | 82 TaskManagerModel* model_; |
75 TableModelObserver* observer_; | 83 TableModelObserver* observer_; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 default: | 151 default: |
144 NOTREACHED(); | 152 NOTREACHED(); |
145 return std::wstring(); | 153 return std::wstring(); |
146 } | 154 } |
147 } | 155 } |
148 | 156 |
149 SkBitmap TaskManagerTableModel::GetIcon(int row) { | 157 SkBitmap TaskManagerTableModel::GetIcon(int row) { |
150 return model_->GetResourceIcon(row); | 158 return model_->GetResourceIcon(row); |
151 } | 159 } |
152 | 160 |
| 161 bool TaskManagerTableModel::ShouldIndent(int row) { |
| 162 return !model_->IsResourceFirstInGroup(row); |
| 163 } |
| 164 |
153 void TaskManagerTableModel::GetGroupRangeForItem(int item, | 165 void TaskManagerTableModel::GetGroupRangeForItem(int item, |
154 views::GroupRange* range) { | 166 views::GroupRange* range) { |
155 std::pair<int, int> range_pair = model_->GetGroupRangeForResource(item); | 167 std::pair<int, int> range_pair = model_->GetGroupRangeForResource(item); |
156 range->start = range_pair.first; | 168 range->start = range_pair.first; |
157 range->length = range_pair.second; | 169 range->length = range_pair.second; |
158 } | 170 } |
159 | 171 |
160 void TaskManagerTableModel::SetObserver(TableModelObserver* observer) { | 172 void TaskManagerTableModel::SetObserver(TableModelObserver* observer) { |
161 observer_ = observer; | 173 observer_ = observer; |
162 } | 174 } |
163 | 175 |
164 int TaskManagerTableModel::CompareValues(int row1, int row2, int column_id) { | 176 int TaskManagerTableModel::CompareValues(int row1, int row2, int column_id) { |
165 return model_->CompareValues(row1, row2, column_id); | 177 return model_->CompareValues(row1, row2, column_id); |
166 } | 178 } |
167 | 179 |
| 180 bool TaskManagerTableModel::HasGroups() { |
| 181 return true; |
| 182 } |
| 183 |
| 184 int TaskManagerTableModel::GetGroupID(int row) { |
| 185 // If there are any background resources in the group range, put the whole |
| 186 // range in the background group. |
| 187 std::pair<int, int> range_pair = model_->GetGroupRangeForResource(row); |
| 188 for (int i = range_pair.first; |
| 189 i < range_pair.first + range_pair.second; |
| 190 ++i) { |
| 191 if (model_->IsBackgroundResource(i)) |
| 192 return kBackgroundGroupId; |
| 193 } |
| 194 return kForegroundGroupId; |
| 195 } |
| 196 |
| 197 TableModel::Groups TaskManagerTableModel::GetGroups() { |
| 198 Groups groups; |
| 199 |
| 200 Group background_group; |
| 201 background_group.title = |
| 202 l10n_util::GetString(IDS_TASK_MANAGER_BACKGROUND_SEPARATOR); |
| 203 background_group.id = kBackgroundGroupId; |
| 204 groups.push_back(background_group); |
| 205 |
| 206 Group foreground_group; |
| 207 foreground_group.title = |
| 208 l10n_util::GetString(IDS_TASK_MANAGER_FOREGROUND_SEPARATOR); |
| 209 foreground_group.id = kForegroundGroupId; |
| 210 groups.push_back(foreground_group); |
| 211 |
| 212 return groups; |
| 213 } |
| 214 |
168 void TaskManagerTableModel::OnModelChanged() { | 215 void TaskManagerTableModel::OnModelChanged() { |
169 if (observer_) | 216 if (observer_) |
170 observer_->OnModelChanged(); | 217 observer_->OnModelChanged(); |
171 } | 218 } |
172 | 219 |
173 void TaskManagerTableModel::OnItemsChanged(int start, int length) { | 220 void TaskManagerTableModel::OnItemsChanged(int start, int length) { |
174 if (observer_) | 221 if (observer_) |
175 observer_->OnItemsChanged(start, length); | 222 observer_->OnItemsChanged(start, length); |
176 } | 223 } |
177 | 224 |
178 void TaskManagerTableModel::OnItemsAdded(int start, int length) { | 225 void TaskManagerTableModel::OnItemsAdded(int start, int length) { |
179 if (observer_) | 226 if (observer_) |
180 observer_->OnItemsAdded(start, length); | 227 observer_->OnItemsAdded(start, length); |
| 228 // There's a bug in the Windows ListView where inserting items with groups |
| 229 // enabled puts them in the wrong position, so we just rebuild the list view |
| 230 // in this case. |
| 231 // (see: http://connect.microsoft.com/VisualStudio/feedback/details/115345/) |
| 232 OnModelChanged(); |
181 } | 233 } |
182 | 234 |
183 void TaskManagerTableModel::OnItemsRemoved(int start, int length) { | 235 void TaskManagerTableModel::OnItemsRemoved(int start, int length) { |
184 if (observer_) | 236 if (observer_) |
185 observer_->OnItemsRemoved(start, length); | 237 observer_->OnItemsRemoved(start, length); |
186 } | 238 } |
187 | 239 |
188 // The Task manager UI container. | 240 // The Task manager UI container. |
189 class TaskManagerView : public views::View, | 241 class TaskManagerView : public views::View, |
190 public views::ButtonListener, | 242 public views::ButtonListener, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 } | 346 } |
295 | 347 |
296 TaskManagerView::~TaskManagerView() { | 348 TaskManagerView::~TaskManagerView() { |
297 // Delete child views now, while our table model still exists. | 349 // Delete child views now, while our table model still exists. |
298 RemoveAllChildViews(true); | 350 RemoveAllChildViews(true); |
299 } | 351 } |
300 | 352 |
301 void TaskManagerView::Init() { | 353 void TaskManagerView::Init() { |
302 table_model_.reset(new TaskManagerTableModel(model_)); | 354 table_model_.reset(new TaskManagerTableModel(model_)); |
303 | 355 |
304 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PAGE_COLUMN, | 356 // Page column has no header label. |
| 357 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PAGE_COLUMN, L"", |
305 TableColumn::LEFT, -1, 1)); | 358 TableColumn::LEFT, -1, 1)); |
306 columns_.back().sortable = true; | 359 columns_.back().sortable = true; |
307 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, | 360 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, |
308 TableColumn::RIGHT, -1, 0)); | 361 TableColumn::RIGHT, -1, 0)); |
309 columns_.back().sortable = true; | 362 columns_.back().sortable = true; |
310 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, | 363 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, |
311 TableColumn::RIGHT, -1, 0)); | 364 TableColumn::RIGHT, -1, 0)); |
312 columns_.back().sortable = true; | 365 columns_.back().sortable = true; |
313 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, | 366 columns_.push_back(TableColumn(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, |
314 TableColumn::RIGHT, -1, 0)); | 367 TableColumn::RIGHT, -1, 0)); |
(...skipping 19 matching lines...) Expand all Loading... |
334 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN, | 387 columns_.push_back(TableColumn(IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN, |
335 TableColumn::RIGHT, -1, 0)); | 388 TableColumn::RIGHT, -1, 0)); |
336 columns_.back().sortable = true; | 389 columns_.back().sortable = true; |
337 columns_.push_back( | 390 columns_.push_back( |
338 TableColumn(IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN, | 391 TableColumn(IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN, |
339 TableColumn::RIGHT, -1, 0)); | 392 TableColumn::RIGHT, -1, 0)); |
340 columns_.back().sortable = true; | 393 columns_.back().sortable = true; |
341 | 394 |
342 tab_table_ = new views::GroupTableView(table_model_.get(), columns_, | 395 tab_table_ = new views::GroupTableView(table_model_.get(), columns_, |
343 views::ICON_AND_TEXT, false, true, | 396 views::ICON_AND_TEXT, false, true, |
344 true); | 397 true, false); |
345 | 398 |
346 // Hide some columns by default | 399 // Hide some columns by default |
347 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, false); | 400 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, false); |
348 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); | 401 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); |
349 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); | 402 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); |
350 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN, | 403 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN, |
351 false); | 404 false); |
352 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN, | 405 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN, |
353 false); | 406 false); |
354 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, | 407 tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 } // namespace | 735 } // namespace |
683 | 736 |
684 namespace browser { | 737 namespace browser { |
685 | 738 |
686 // Declared in browser_dialogs.h so others don't need to depend on our header. | 739 // Declared in browser_dialogs.h so others don't need to depend on our header. |
687 void ShowTaskManager() { | 740 void ShowTaskManager() { |
688 TaskManagerView::Show(); | 741 TaskManagerView::Show(); |
689 } | 742 } |
690 | 743 |
691 } // namespace browser | 744 } // namespace browser |
OLD | NEW |