diff options
author | mhm@chromium.org <mhm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-11 02:42:42 +0000 |
---|---|---|
committer | mhm@chromium.org <mhm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-11 02:42:42 +0000 |
commit | 8f0bcb9f2381746bfc8f234fe1fcf831321adbf5 (patch) | |
tree | 72445ad8515bd7613858acc406e722e9b07f811d /chrome | |
parent | ee9be6939302cb196a05c39ba17e150a678651e9 (diff) | |
download | chromium_src-8f0bcb9f2381746bfc8f234fe1fcf831321adbf5.zip chromium_src-8f0bcb9f2381746bfc8f234fe1fcf831321adbf5.tar.gz chromium_src-8f0bcb9f2381746bfc8f234fe1fcf831321adbf5.tar.bz2 |
Gtk: Allow all columns in task manager to be sortable.
BUG=21048
TEST=Open task manager and sort any column
Review URL: http://codereview.chromium.org/196040
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25964 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/generated_resources.grd | 3 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.cc | 83 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.h | 62 | ||||
-rw-r--r-- | chrome/browser/views/task_manager_view.cc | 16 |
4 files changed, 127 insertions, 37 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 53acf52..470f39b 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -2059,6 +2059,9 @@ each locale. aa1 --> <message name="IDS_TASK_MANAGER_SHARED_MEM_COLUMN" desc="Task manager process shared memory column. Shows the size of the memory used by the process which is shared with other processes"> Shared Memory </message> + <message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column"> + Goats Teleported + </message> <message name="IDS_TASK_MANAGER_MEM_CELL_TEXT" desc="The value displayed in the memory usage cells."> <ph name="NUM_KILOBYTES">$1<ex>5,000</ex></ph>K </message> diff --git a/chrome/browser/gtk/task_manager_gtk.cc b/chrome/browser/gtk/task_manager_gtk.cc index 832c4de..4563e2d 100644 --- a/chrome/browser/gtk/task_manager_gtk.cc +++ b/chrome/browser/gtk/task_manager_gtk.cc @@ -26,7 +26,6 @@ #include "chrome/common/pref_service.h" #include "grit/app_resources.h" #include "grit/chromium_strings.h" -#include "grit/generated_resources.h" namespace { @@ -69,6 +68,8 @@ TaskManagerColumn TaskManagerResourceIDToColumnID(int id) { return kTaskManagerNetwork; case IDS_TASK_MANAGER_PROCESS_ID_COLUMN: return kTaskManagerProcessID; + case IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN: + return kTaskManagerGoatsTeleported; default: NOTREACHED(); return static_cast<TaskManagerColumn>(-1); @@ -91,6 +92,8 @@ int TaskManagerColumnIDToResourceID(int id) { return IDS_TASK_MANAGER_NET_COLUMN; case kTaskManagerProcessID: return IDS_TASK_MANAGER_PROCESS_ID_COLUMN; + case kTaskManagerGoatsTeleported: + return IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN; default: NOTREACHED(); return -1; @@ -138,6 +141,7 @@ void TreeViewInsertColumnWithPixbuf(GtkWidget* treeview, int resid) { // This is temporary: we'll turn expanding off after getting the size. gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_column_set_sort_column_id(column, colid); } // Inserts a column with a column id of |colid| and |name|. @@ -151,6 +155,7 @@ void TreeViewInsertColumnWithName(GtkWidget* treeview, GtkTreeViewColumn* column = gtk_tree_view_get_column( GTK_TREE_VIEW(treeview), TreeViewColumnIndexFromID(colid)); gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sort_column_id(column, colid); } // Loads the column name from |resid| and uses the corresponding @@ -178,13 +183,10 @@ class TaskManagerGtk::ContextMenuController : public MenuGtk::Delegate { explicit ContextMenuController(TaskManagerGtk* task_manager) : task_manager_(task_manager) { menu_.reset(new MenuGtk(this, false)); - for (int i = kTaskManagerPage; i < kTaskManagerColumnCount - 1; i++) { + for (int i = kTaskManagerPage; i < kTaskManagerColumnCount; i++) { menu_->AppendCheckMenuItemWithLabel( i, l10n_util::GetStringUTF8(TaskManagerColumnIDToResourceID(i))); } - - menu_->AppendCheckMenuItemWithLabel(kTaskManagerGoatsTeleported, - "Goats Teleported"); } virtual ~ContextMenuController() {} @@ -388,12 +390,6 @@ void TaskManagerGtk::Init() { gtk_widget_add_events(treeview_, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - // Hide some columns by default - TreeViewColumnSetVisible(treeview_, kTaskManagerSharedMem, false); - TreeViewColumnSetVisible(treeview_, kTaskManagerPrivateMem, false); - TreeViewColumnSetVisible(treeview_, kTaskManagerProcessID, false); - TreeViewColumnSetVisible(treeview_, kTaskManagerGoatsTeleported, false); - // |selection| is owned by |treeview_|. GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(treeview_)); @@ -449,8 +445,41 @@ void TaskManagerGtk::ConnectAccelerators() { } void TaskManagerGtk::CreateTaskManagerTreeview() { - treeview_ = gtk_tree_view_new(); + process_list_ = gtk_list_store_new(kTaskManagerColumnCount, + GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING); + // Support sorting on all columns. + process_list_sort_ = gtk_tree_model_sort_new_with_model( + GTK_TREE_MODEL(process_list_)); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerPage, + ComparePage, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerPhysicalMem, + ComparePhysicalMemory, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerSharedMem, + CompareSharedMemory, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerPrivateMem, + ComparePrivateMemory, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerCPU, + CompareCPU, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerNetwork, + CompareNetwork, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerProcessID, + CompareProcessID, this, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(process_list_sort_), + kTaskManagerGoatsTeleported, + CompareGoatsTeleported, this, NULL); + treeview_ = gtk_tree_view_new_with_model(process_list_sort_); + + // Insert all the columns. TreeViewInsertColumnWithPixbuf(treeview_, IDS_TASK_MANAGER_PAGE_COLUMN); TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN); TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_SHARED_MEM_COLUMN); @@ -458,18 +487,16 @@ void TaskManagerGtk::CreateTaskManagerTreeview() { TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_CPU_COLUMN); TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_NET_COLUMN); TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_PROCESS_ID_COLUMN); + TreeViewInsertColumn(treeview_, IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN); - TreeViewInsertColumnWithName(treeview_, kTaskManagerGoatsTeleported, - "Goats Teleported"); - - process_list_ = gtk_list_store_new(kTaskManagerColumnCount, - GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING); - - gtk_tree_view_set_model(GTK_TREE_VIEW(treeview_), - GTK_TREE_MODEL(process_list_)); + // Hide some columns by default. + TreeViewColumnSetVisible(treeview_, kTaskManagerSharedMem, false); + TreeViewColumnSetVisible(treeview_, kTaskManagerPrivateMem, false); + TreeViewColumnSetVisible(treeview_, kTaskManagerProcessID, false); + TreeViewColumnSetVisible(treeview_, kTaskManagerGoatsTeleported, false); + g_object_unref(process_list_); + g_object_unref(process_list_sort_); } std::string TaskManagerGtk::GetModelText(int row, int col_id) { @@ -505,7 +532,7 @@ std::string TaskManagerGtk::GetModelText(int row, int col_id) { return std::string(); return WideToUTF8(model_->GetResourceProcessId(row)); - case kTaskManagerGoatsTeleported: // Goats Teleported! + case IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN: // Goats Teleported! return WideToUTF8(model_->GetResourceGoatsTeleported(row)); default: @@ -536,7 +563,8 @@ void TaskManagerGtk::SetRowDataFromModel(int row, GtkTreeIter* iter) { std::string cpu = GetModelText(row, IDS_TASK_MANAGER_CPU_COLUMN); std::string net = GetModelText(row, IDS_TASK_MANAGER_NET_COLUMN); std::string procid = GetModelText(row, IDS_TASK_MANAGER_PROCESS_ID_COLUMN); - std::string goats = GetModelText(row, kTaskManagerGoatsTeleported); + std::string goats = GetModelText( + row, IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN); gtk_list_store_set(process_list_, iter, kTaskManagerIcon, icon, kTaskManagerPage, page.c_str(), @@ -603,6 +631,13 @@ void TaskManagerGtk::OnLinkActivated() { browser->window()->Show(); } +gint TaskManagerGtk::CompareImpl(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, int id) { + int row1 = gtk_tree::GetRowNumForIter(model, a); + int row2 = gtk_tree::GetRowNumForIter(model, b); + return model_->CompareValues(row1, row2, id); +} + // static void TaskManagerGtk::OnResponse(GtkDialog* dialog, gint response_id, TaskManagerGtk* task_manager) { diff --git a/chrome/browser/gtk/task_manager_gtk.h b/chrome/browser/gtk/task_manager_gtk.h index 50f813c..05e77ab 100644 --- a/chrome/browser/gtk/task_manager_gtk.h +++ b/chrome/browser/gtk/task_manager_gtk.h @@ -10,6 +10,7 @@ #include <string> #include "chrome/browser/task_manager.h" +#include "grit/generated_resources.h" class TaskManagerGtk : public TaskManagerModelObserver { public: @@ -64,6 +65,10 @@ class TaskManagerGtk : public TaskManagerModelObserver { // Opens about:memory in a new foreground tab. void OnLinkActivated(); + // Compare implementation used for sorting columns. + gint CompareImpl(GtkTreeModel* tree_model, GtkTreeIter* a, + GtkTreeIter* b, int id); + // response signal handler that notifies us of dialog responses. static void OnResponse(GtkDialog* dialog, gint response_id, TaskManagerGtk* task_manager); @@ -91,6 +96,62 @@ class TaskManagerGtk : public TaskManagerModelObserver { GdkModifierType modifier, TaskManagerGtk* task_manager); + // Page sorting callback. + static gint ComparePage(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_PAGE_COLUMN); + } + + // Physical memory sorting callback. + static gint ComparePhysicalMemory(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN); + } + + // Shared memory sorting callback. + static gint CompareSharedMemory(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_SHARED_MEM_COLUMN); + } + + // Private memory sorting callback. + static gint ComparePrivateMemory(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN); + } + + // CPU sorting callback. + static gint CompareCPU(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_CPU_COLUMN); + } + + // Network sorting callback. + static gint CompareNetwork(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_NET_COLUMN); + } + + // Process ID sorting callback. + static gint CompareProcessID(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_PROCESS_ID_COLUMN); + } + + // Goats Teleported sorting callback. + static gint CompareGoatsTeleported(GtkTreeModel* model, GtkTreeIter* a, + GtkTreeIter* b, gpointer task_manager) { + return reinterpret_cast<TaskManagerGtk*>(task_manager)-> + CompareImpl(model, a, b, IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN); + } + // The task manager. TaskManager* task_manager_; @@ -105,6 +166,7 @@ class TaskManagerGtk : public TaskManagerModelObserver { // The list of processes. GtkListStore* process_list_; + GtkTreeModel* process_list_sort_; // The number of processes in |process_list_|. int process_count_; diff --git a/chrome/browser/views/task_manager_view.cc b/chrome/browser/views/task_manager_view.cc index d449a92..b305a96 100644 --- a/chrome/browser/views/task_manager_view.cc +++ b/chrome/browser/views/task_manager_view.cc @@ -33,13 +33,6 @@ static const int kDefaultWidth = 460; static const int kDefaultHeight = 270; -// An id for the most important column, made sufficiently large so as not to -// collide with anything else. -static const int64 kNuthMagicNumber = 1737350766; -static const int kBitMask = 0x7FFFFFFF; -static const int kGoatsTeleportedColumn = - (94024 * kNuthMagicNumber) & kBitMask; - namespace { //////////////////////////////////////////////////////////////////////////////// @@ -115,7 +108,7 @@ std::wstring TaskManagerTableModel::GetText(int row, int col_id) { return std::wstring(); return model_->GetResourceProcessId(row); - case kGoatsTeleportedColumn: // Goats Teleported! + case IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN: // Goats Teleported! return model_->GetResourceGoatsTeleported(row); default: @@ -308,13 +301,10 @@ void TaskManagerView::Init() { tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, false); tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); + tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN, + false); UpdateStatsCounters(); - TableColumn col(kGoatsTeleportedColumn, L"Goats Teleported", - TableColumn::RIGHT, -1, 0); - col.sortable = true; - columns_.push_back(col); - tab_table_->AddColumn(col); tab_table_->SetObserver(this); SetContextMenuController(this); kill_button_ = new views::NativeButton( |