Index: chrome/browser/gtk/task_manager_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/task_manager_gtk.cc (revision 19850) |
+++ chrome/browser/gtk/task_manager_gtk.cc (working copy) |
@@ -9,6 +9,7 @@ |
#include "app/l10n_util.h" |
#include "base/gfx/gtk_util.h" |
#include "base/logging.h" |
+#include "chrome/browser/gtk/menu_gtk.h" |
#include "chrome/common/gtk_util.h" |
#include "grit/chromium_strings.h" |
#include "grit/generated_resources.h" |
@@ -57,6 +58,29 @@ |
} |
} |
+int TaskManagerColumnIDToResourceID(int id) { |
+ printf("id: %d\n", id); |
+ switch (id) { |
+ case kTaskManagerPage: |
+ return IDS_TASK_MANAGER_PAGE_COLUMN; |
+ case kTaskManagerPhysicalMem: |
+ return IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN; |
+ case kTaskManagerSharedMem: |
+ return IDS_TASK_MANAGER_SHARED_MEM_COLUMN; |
+ case kTaskManagerPrivateMem: |
+ return IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN; |
+ case kTaskManagerCPU: |
+ return IDS_TASK_MANAGER_CPU_COLUMN; |
+ case kTaskManagerNetwork: |
+ return IDS_TASK_MANAGER_NET_COLUMN; |
+ case kTaskManagerProcessID: |
+ return IDS_TASK_MANAGER_PROCESS_ID_COLUMN; |
+ default: |
+ NOTREACHED(); |
+ return -1; |
+ } |
+} |
+ |
// Should be used for all gtk_tree_view functions that require a column index on |
// input. |
// |
@@ -76,6 +100,12 @@ |
gtk_tree_view_column_set_visible(column, visible); |
} |
+bool TreeViewColumnIsVisible(GtkWidget* treeview, TaskManagerColumn colid) { |
+ GtkTreeViewColumn* column = gtk_tree_view_get_column( |
+ GTK_TREE_VIEW(treeview), TreeViewColumnIndexFromID(colid)); |
+ return gtk_tree_view_column_get_visible(column); |
+} |
+ |
void TreeViewInsertColumnWithPixbuf(GtkWidget* treeview, int resid) { |
int colid = TaskManagerResourceIDToColumnID(resid); |
GtkTreeViewColumn* column = gtk_tree_view_column_new(); |
@@ -124,6 +154,67 @@ |
} // namespace |
+class TaskManagerGtk::ContextMenuController : public MenuGtk::Delegate { |
+ public: |
+ explicit ContextMenuController(TaskManagerGtk* task_manager) |
+ : task_manager_(task_manager) { |
+ menu_.reset(new MenuGtk(this, false)); |
+ for (int i = kTaskManagerPage; i < kTaskManagerColumnCount - 1; i++) { |
+ menu_->AppendCheckMenuItemWithLabel( |
+ i, l10n_util::GetStringUTF8(TaskManagerColumnIDToResourceID(i))); |
+ } |
+ |
+ menu_->AppendCheckMenuItemWithLabel(kTaskManagerGoatsTeleported, |
+ "Goats Teleported"); |
+ } |
+ |
+ virtual ~ContextMenuController() {} |
+ |
+ void RunMenu() { |
+ menu_->PopupAsContext(gtk_get_current_event_time()); |
+ } |
+ |
+ void Cancel() { |
+ task_manager_ = NULL; |
+ menu_->Cancel(); |
+ } |
+ |
+ private: |
+ // MenuGtk::Delegate implementation: |
+ virtual bool IsCommandEnabled(int command_id) const { |
+ if (!task_manager_) |
+ return false; |
+ |
+ return true; |
+ } |
+ |
+ virtual bool IsItemChecked(int command_id) const { |
+ if (!task_manager_) |
+ return false; |
+ |
+ TaskManagerColumn colid = static_cast<TaskManagerColumn>(command_id); |
+ return TreeViewColumnIsVisible(task_manager_->treeview_, colid); |
+ } |
+ |
+ virtual void ExecuteCommand(int command_id) { |
+ if (!task_manager_) |
+ return; |
+ |
+ TaskManagerColumn colid = static_cast<TaskManagerColumn>(command_id); |
+ bool visible = !TreeViewColumnIsVisible(task_manager_->treeview_, colid); |
+ TreeViewColumnSetVisible(task_manager_->treeview_, colid, visible); |
+ } |
+ |
+ // The context menu. |
+ scoped_ptr<MenuGtk> menu_; |
+ |
+ // The TaskManager the context menu was brought up for. Set to NULL when the |
+ // menu is canceled. |
+ TaskManagerGtk* task_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ContextMenuController); |
+}; |
+ |
TaskManagerGtk::TaskManagerGtk() |
: task_manager_(TaskManager::GetInstance()), |
model_(TaskManager::GetInstance()->model()), |
@@ -226,11 +317,19 @@ |
gtk_util::kContentAreaSpacing); |
g_signal_connect(G_OBJECT(dialog_), "response", G_CALLBACK(OnResponse), this); |
+ g_signal_connect(G_OBJECT(dialog_), "button-release-event", |
+ G_CALLBACK(OnButtonReleaseEvent), this); |
+ gtk_widget_add_events(dialog_, |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); |
CreateTaskManagerTreeview(); |
gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview_), TRUE); |
gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview_), |
GTK_TREE_VIEW_GRID_LINES_HORIZONTAL); |
+ g_signal_connect(G_OBJECT(treeview_), "button-release-event", |
+ G_CALLBACK(OnButtonReleaseEvent), this); |
+ gtk_widget_add_events(treeview_, |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); |
// Hide some columns by default |
TreeViewColumnSetVisible(treeview_, kTaskManagerSharedMem, false); |
@@ -362,6 +461,13 @@ |
g_list_free(paths); |
} |
+void TaskManagerGtk::ShowContextMenu() { |
+ if (!menu_controller_.get()) |
+ menu_controller_.reset(new ContextMenuController(this)); |
+ |
+ menu_controller_->RunMenu(); |
+} |
+ |
// static |
void TaskManagerGtk::OnResponse(GtkDialog* dialog, gint response_id, |
TaskManagerGtk* task_manager) { |
@@ -393,3 +499,17 @@ |
gtk_dialog_set_response_sensitive(GTK_DIALOG(task_manager->dialog_), |
kTaskManagerResponseKill, sensitive); |
} |
+ |
+// static |
+gboolean TaskManagerGtk::OnButtonReleaseEvent(GtkWidget* widget, |
+ GdkEventButton* event, |
+ TaskManagerGtk* task_manager) { |
+ // We don't want to open the context menu in the treeview. |
+ if (widget == task_manager->treeview_) |
+ return TRUE; |
+ |
+ if (event->button == 3) |
+ task_manager->ShowContextMenu(); |
+ |
+ return FALSE; |
+} |