summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authormhm@chromium.org <mhm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 02:42:42 +0000
committermhm@chromium.org <mhm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 02:42:42 +0000
commit8f0bcb9f2381746bfc8f234fe1fcf831321adbf5 (patch)
tree72445ad8515bd7613858acc406e722e9b07f811d /chrome/browser/gtk
parentee9be6939302cb196a05c39ba17e150a678651e9 (diff)
downloadchromium_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.cc83
-rw-r--r--chrome/browser/gtk/task_manager_gtk.h62
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_;