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/browser/gtk | |
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/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.cc | 83 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.h | 62 |
2 files changed, 121 insertions, 24 deletions
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_; |