diff options
-rw-r--r-- | chrome/app/nibs/TaskManager.xib | 94 | ||||
-rw-r--r-- | chrome/browser/cocoa/task_manager_mac.h | 8 | ||||
-rw-r--r-- | chrome/browser/cocoa/task_manager_mac.mm | 167 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.cc | 2 |
4 files changed, 211 insertions, 60 deletions
diff --git a/chrome/app/nibs/TaskManager.xib b/chrome/app/nibs/TaskManager.xib index 375598e..ec1dd9e 100644 --- a/chrome/app/nibs/TaskManager.xib +++ b/chrome/app/nibs/TaskManager.xib @@ -8,7 +8,7 @@ <string key="IBDocument.HIToolboxVersion">353.00</string> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="2"/> + <integer value="3"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -50,7 +50,7 @@ <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSScrollView" id="69694332"> <reference key="NSNextResponder" ref="1006"/> - <int key="NSvFlags">268</int> + <int key="NSvFlags">274</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSClipView" id="591559926"> @@ -87,16 +87,16 @@ <int key="NSCellFlags">75628032</int> <int key="NSCellFlags2">0</int> <string key="NSContents"/> - <object class="NSFont" key="NSSupport" id="26"> + <object class="NSFont" key="NSSupport"> <string key="NSName">LucidaGrande</string> <double key="NSSize">1.100000e+01</double> <int key="NSfFlags">3100</int> </object> - <object class="NSColor" key="NSBackgroundColor" id="685047776"> + <object class="NSColor" key="NSBackgroundColor"> <int key="NSColorSpace">3</int> <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes> </object> - <object class="NSColor" key="NSTextColor" id="990616000"> + <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">6</int> <string key="NSCatalogName">System</string> <string key="NSColorName">headerTextColor</string> @@ -137,32 +137,6 @@ <bool key="NSIsEditable">YES</bool> <reference key="NSTableView" ref="573715149"/> </object> - <object class="NSTableColumn" id="95821798"> - <double key="NSWidth">3.160000e+02</double> - <double key="NSMinWidth">4.000000e+01</double> - <double key="NSMaxWidth">1.000000e+03</double> - <object class="NSTableHeaderCell" key="NSHeaderCell"> - <int key="NSCellFlags">75628032</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="26"/> - <reference key="NSBackgroundColor" ref="685047776"/> - <reference key="NSTextColor" ref="990616000"/> - </object> - <object class="NSTextFieldCell" key="NSDataCell" id="137828506"> - <int key="NSCellFlags">337772096</int> - <int key="NSCellFlags2">2048</int> - <string key="NSContents">Text Cell</string> - <reference key="NSSupport" ref="746983650"/> - <reference key="NSControlView" ref="573715149"/> - <reference key="NSBackgroundColor" ref="456292161"/> - <reference key="NSTextColor" ref="1040882968"/> - </object> - <int key="NSResizingMask">3</int> - <bool key="NSIsResizeable">YES</bool> - <bool key="NSIsEditable">YES</bool> - <reference key="NSTableView" ref="573715149"/> - </object> </object> <double key="NSIntercellSpacingWidth">3.000000e+00</double> <double key="NSIntercellSpacingHeight">2.000000e+00</double> @@ -180,7 +154,7 @@ </object> </object> <double key="NSRowHeight">1.700000e+01</double> - <int key="NSTvFlags">-700448768</int> + <int key="NSTvFlags">1388314624</int> <int key="NSColumnAutoresizingStyle">4</int> <int key="NSDraggingSourceMaskForLocal">15</int> <int key="NSDraggingSourceMaskForNonLocal">0</int> @@ -243,7 +217,7 @@ </object> <object class="NSTextField" id="976181670"> <reference key="NSNextResponder" ref="1006"/> - <int key="NSvFlags">268</int> + <int key="NSvFlags">292</int> <string key="NSFrame">{{17, 22}, {77, 17}}</string> <reference key="NSSuperview" ref="1006"/> <bool key="NSEnabled">YES</bool> @@ -274,7 +248,7 @@ <reference key="NSSuperview" ref="369147393"/> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="1069566772"> - <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags">604110336</int> <int key="NSCellFlags2">134217728</int> <string key="NSContents">^IDS_TASK_MANAGER_KILL</string> <reference key="NSSupport" ref="746983650"/> @@ -333,6 +307,22 @@ </object> <int key="connectionID">21</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">tableView_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="573715149"/> + </object> + <int key="connectionID">22</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">dataSource</string> + <reference key="source" ref="573715149"/> + <reference key="destination" ref="1001"/> + </object> + <int key="connectionID">23</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -411,7 +401,6 @@ <object class="NSMutableArray" key="children"> <bool key="EncodedWithXMLCoder">YES</bool> <reference ref="694001717"/> - <reference ref="95821798"/> </object> <reference key="parent" ref="69694332"/> </object> @@ -430,20 +419,6 @@ <reference key="parent" ref="573715149"/> </object> <object class="IBObjectRecord"> - <int key="objectID">9</int> - <reference key="object" ref="95821798"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="137828506"/> - </object> - <reference key="parent" ref="573715149"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">10</int> - <reference key="object" ref="137828506"/> - <reference key="parent" ref="95821798"/> - </object> - <object class="IBObjectRecord"> <int key="objectID">11</int> <reference key="object" ref="517523641"/> <reference key="parent" ref="694001717"/> @@ -510,7 +485,6 @@ <string>1.NSWindowTemplate.visibleAtLaunch</string> <string>1.WindowOrigin</string> <string>1.editorWindowContentRectSynchronizationRect</string> - <string>10.IBPluginDependency</string> <string>11.IBPluginDependency</string> <string>12.IBPluginDependency</string> <string>13.IBPluginDependency</string> @@ -525,16 +499,15 @@ <string>6.IBPluginDependency</string> <string>7.IBPluginDependency</string> <string>8.IBPluginDependency</string> - <string>9.IBPluginDependency</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{63, 495}, {480, 270}}</string> + <string>{{363, 406}, {480, 270}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{63, 495}, {480, 270}}</string> + <string>{{363, 406}, {480, 270}}</string> <integer value="1"/> <string>{196, 240}</string> <string>{{357, 418}, {480, 270}}</string> @@ -552,8 +525,6 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> </object> </object> <object class="NSMutableDictionary" key="unlocalizedProperties"> @@ -576,7 +547,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">21</int> + <int key="maxID">23</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -670,8 +641,19 @@ </object> </object> <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/nswindow_local_state.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> <string key="className">TaskManagerWindowController</string> <string key="superclassName">NSWindowController</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">tableView_</string> + <string key="NS.object.0">NSTableView</string> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> <string key="minorKey">browser/cocoa/task_manager_mac.h</string> diff --git a/chrome/browser/cocoa/task_manager_mac.h b/chrome/browser/cocoa/task_manager_mac.h index dbf34f9..46d0455 100644 --- a/chrome/browser/cocoa/task_manager_mac.h +++ b/chrome/browser/cocoa/task_manager_mac.h @@ -12,10 +12,16 @@ // This class is responsible for loading the task manager window and for // managing it. @interface TaskManagerWindowController : NSWindowController { + @private + IBOutlet NSTableView* tableView_; + TaskManagerModel* model_; // weak } // Creates and shows the task manager's window. -- (id)init; +- (id)initWithModel:(TaskManagerModel*)model; + +// Refreshes all data in the task manager table. +- (void)reloadData; @end // This class listens to task changed events sent by chrome. diff --git a/chrome/browser/cocoa/task_manager_mac.mm b/chrome/browser/cocoa/task_manager_mac.mm index b282dad..1016f97 100644 --- a/chrome/browser/cocoa/task_manager_mac.mm +++ b/chrome/browser/cocoa/task_manager_mac.mm @@ -7,23 +7,180 @@ #include <algorithm> #include <vector> +#include "app/l10n_util_mac.h" #include "base/mac_util.h" +#include "base/sys_string_conversions.h" +#include "grit/generated_resources.h" + +// TODO(thakis): Autoremember window size/pos (and selected columns?) +// TODO(thakis): Link that opens about:memory +// TODO(thakis): Activate button iff something is selected, hook it up +// TODO(thakis): Column sort comparator +// TODO(thakis): Clicking column header doesn't sort +// TODO(thakis): Double-clicking a row seems to do something on win/linux +// TODO(thakis): On window close, stop updating +// TODO(thakis): Favicons in rows +// TODO(thakis): Default sort column +// TODO(thakis): Metrics are all wrong (some fixed when about:memory lands?) + +@interface TaskManagerWindowController (Private) +- (void)addColumnWithId:(int)columnId visible:(BOOL)isVisible; +- (void)setUpTableColumns; +- (void)setUpTableHeaderContextMenu; +- (void)toggleColumn:(id)sender; +@end //////////////////////////////////////////////////////////////////////////////// // TaskManagerWindowController implementation: @implementation TaskManagerWindowController -- (id)init { +- (id)initWithModel:(TaskManagerModel*)model { NSString* nibpath = [mac_util::MainAppBundle() pathForResource:@"TaskManager" ofType:@"nib"]; if ((self = [super initWithWindowNibPath:nibpath owner:self])) { + model_ = model; [[self window] makeKeyAndOrderFront:self]; } return self; } +- (void)reloadData { + [tableView_ reloadData]; +} + +- (void)awakeFromNib { + [self setUpTableColumns]; + [self setUpTableHeaderContextMenu]; +} + +// Adds a column which has the given string id as title. |isVisible| specifies +// if the column is initially visible. +- (void)addColumnWithId:(int)columnId visible:(BOOL)isVisible { + scoped_nsobject<NSTableColumn> column([[NSTableColumn alloc] + initWithIdentifier:[NSNumber numberWithInt:columnId]]); + + NSTextAlignment textAlignment = columnId == IDS_TASK_MANAGER_PAGE_COLUMN ? + NSLeftTextAlignment : NSRightTextAlignment; + + [[column.get() headerCell] + setStringValue:l10n_util::GetNSStringWithFixup(columnId)]; + [[column.get() headerCell] setAlignment:textAlignment]; + [[column.get() dataCell] setAlignment:textAlignment]; + + [column.get() setHidden:!isVisible]; + [column.get() setEditable:NO]; + [tableView_ addTableColumn:column.get()]; +} + +// Adds all the task manager's columns to the table. +- (void)setUpTableColumns { + for (NSTableColumn* column in [tableView_ tableColumns]) + [tableView_ removeTableColumn:column]; + [self addColumnWithId:IDS_TASK_MANAGER_PAGE_COLUMN visible:YES]; + [self addColumnWithId:IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN visible:YES]; + [self addColumnWithId:IDS_TASK_MANAGER_SHARED_MEM_COLUMN visible:NO]; + [self addColumnWithId:IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN visible:NO]; + [self addColumnWithId:IDS_TASK_MANAGER_CPU_COLUMN visible:YES]; + [self addColumnWithId:IDS_TASK_MANAGER_NET_COLUMN visible:YES]; + [self addColumnWithId:IDS_TASK_MANAGER_PROCESS_ID_COLUMN visible:NO]; + [self addColumnWithId:IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN visible:NO]; +} + +// Creates a context menu for the table header that allows the user to toggle +// which columns should be shown and which should be hidden (like e.g. +// Task Manager.app's table header context menu). +- (void)setUpTableHeaderContextMenu { + scoped_nsobject<NSMenu> contextMenu( + [[NSMenu alloc] initWithTitle:@"Task Manager context menu"]); + for (NSTableColumn* column in [tableView_ tableColumns]) { + NSMenuItem* item = [contextMenu.get() + addItemWithTitle:[[column headerCell] stringValue] + action:@selector(toggleColumn:) + keyEquivalent:@""]; + [item setTarget:self]; + [item setRepresentedObject:column]; + [item setState:[column isHidden] ? NSOffState : NSOnState]; + } + [[tableView_ headerView] setMenu:contextMenu.get()]; +} + +// Callback for the table header context menu. Toggles visibility of the table +// column associated with the clicked menu item. +- (void)toggleColumn:(id)item { + DCHECK([item isKindOfClass:[NSMenuItem class]]); + if (![item isKindOfClass:[NSMenuItem class]]) + return; + + NSTableColumn* column = [item representedObject]; + DCHECK(column); + NSInteger oldState = [item state]; + NSInteger newState = oldState == NSOnState ? NSOffState : NSOnState; + [column setHidden:newState == NSOffState]; + [item setState:newState]; + [tableView_ sizeToFit]; + [tableView_ setNeedsDisplay]; +} + +@end + +@implementation TaskManagerWindowController (NSTableDataSource) + +- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { + DCHECK(tableView == tableView_ || tableView_ == nil); + return model_->ResourceCount(); +} + +- (NSString*)modelTextForRow:(int)row column:(int)columnId { + switch (columnId) { + case IDS_TASK_MANAGER_PAGE_COLUMN: // Process + return base::SysWideToNSString(model_->GetResourceTitle(row)); + + case IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN: // Memory + if (!model_->IsResourceFirstInGroup(row)) + return @""; + return base::SysWideToNSString(model_->GetResourcePrivateMemory(row)); + + case IDS_TASK_MANAGER_SHARED_MEM_COLUMN: // Memory + if (!model_->IsResourceFirstInGroup(row)) + return @""; + return base::SysWideToNSString(model_->GetResourceSharedMemory(row)); + + case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN: // Memory + if (!model_->IsResourceFirstInGroup(row)) + return @""; + return base::SysWideToNSString(model_->GetResourcePhysicalMemory(row)); + + case IDS_TASK_MANAGER_CPU_COLUMN: // CPU + if (!model_->IsResourceFirstInGroup(row)) + return @""; + return base::SysWideToNSString(model_->GetResourceCPUUsage(row)); + + case IDS_TASK_MANAGER_NET_COLUMN: // Net + return base::SysWideToNSString(model_->GetResourceNetworkUsage(row)); + + case IDS_TASK_MANAGER_PROCESS_ID_COLUMN: // Process ID + if (!model_->IsResourceFirstInGroup(row)) + return @""; + return base::SysWideToNSString(model_->GetResourceProcessId(row)); + + case IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN: // Goats Teleported! + return base::SysWideToNSString(model_->GetResourceGoatsTeleported(row)); + + default: + return base::SysWideToNSString( + model_->GetResourceStatsValue(row, columnId)); + } +} + +- (id)tableView:(NSTableView*)tableView + objectValueForTableColumn:(NSTableColumn*)tableColumn + row:(NSInteger)rowIndex { + return [self modelTextForRow:rowIndex + column:[[tableColumn identifier] intValue]]; +} + @end //////////////////////////////////////////////////////////////////////////////// @@ -32,7 +189,9 @@ TaskManagerMac::TaskManagerMac() : task_manager_(TaskManager::GetInstance()), model_(TaskManager::GetInstance()->model()) { - window_controller_.reset([[TaskManagerWindowController alloc] init]); + window_controller_.reset( + [[TaskManagerWindowController alloc] initWithModel:model_]); + model_->AddObserver(this); } // static @@ -47,15 +206,19 @@ TaskManagerMac::~TaskManagerMac() { // TaskManagerMac, TaskManagerModelObserver implementation: void TaskManagerMac::OnModelChanged() { + [window_controller_.get() reloadData]; } void TaskManagerMac::OnItemsChanged(int start, int length) { + [window_controller_.get() reloadData]; } void TaskManagerMac::OnItemsAdded(int start, int length) { + [window_controller_.get() reloadData]; } void TaskManagerMac::OnItemsRemoved(int start, int length) { + [window_controller_.get() reloadData]; } //////////////////////////////////////////////////////////////////////////////// diff --git a/chrome/browser/gtk/task_manager_gtk.cc b/chrome/browser/gtk/task_manager_gtk.cc index 4532a03..d0a29c0 100644 --- a/chrome/browser/gtk/task_manager_gtk.cc +++ b/chrome/browser/gtk/task_manager_gtk.cc @@ -348,7 +348,7 @@ void TaskManagerGtk::Init() { gtk_window_set_type_hint(GTK_WINDOW(dialog_), GDK_WINDOW_TYPE_HINT_NORMAL); // The response button should not be sensitive when the dialog is first opened - // because the selecetion is initially empty. + // because the selection is initially empty. gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog_), kTaskManagerResponseKill, FALSE); |