Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1014)

Unified Diff: chrome/browser/cocoa/task_manager_mac.mm

Issue 3047055: Mac: Fix kill button and selection in task manager (Closed)
Patch Set: find-replace fail Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/cocoa/task_manager_mac.h ('k') | chrome/browser/cocoa/task_manager_mac_unittest.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/cocoa/task_manager_mac.mm
diff --git a/chrome/browser/cocoa/task_manager_mac.mm b/chrome/browser/cocoa/task_manager_mac.mm
index 7fd8c1e16051d0165c8dcced0b1941ebf92c7cf2..526be0185d3170df28667f8addeb7f4f0966c7a1 100644
--- a/chrome/browser/cocoa/task_manager_mac.mm
+++ b/chrome/browser/cocoa/task_manager_mac.mm
@@ -89,6 +89,7 @@ class SortHelper {
- (void)setUpTableHeaderContextMenu;
- (void)toggleColumn:(id)sender;
- (void)adjustSelectionAndEndProcessButton;
+- (void)deselectRows;
@end
////////////////////////////////////////////////////////////////////////////////
@@ -118,16 +119,41 @@ class SortHelper {
}
- (void)sortShuffleArray {
- indexShuffle_.resize(model_->ResourceCount());
- for (size_t i = 0; i < indexShuffle_.size(); ++i)
- indexShuffle_[i] = i;
+ viewToModelMap_.resize(model_->ResourceCount());
+ for (size_t i = 0; i < viewToModelMap_.size(); ++i)
+ viewToModelMap_[i] = i;
- std::sort(indexShuffle_.begin(), indexShuffle_.end(),
+ std::sort(viewToModelMap_.begin(), viewToModelMap_.end(),
SortHelper(model_, currentSortDescriptor_.get()));
+
+ modelToViewMap_.resize(viewToModelMap_.size());
+ for (size_t i = 0; i < viewToModelMap_.size(); ++i)
+ modelToViewMap_[viewToModelMap_[i]] = i;
}
- (void)reloadData {
+ // Store old view indices, and the model indices they map to.
+ NSIndexSet* viewSelection = [tableView_ selectedRowIndexes];
+ std::vector<int> modelSelection;
+ for (NSUInteger i = [viewSelection lastIndex];
+ i != NSNotFound;
+ i = [viewSelection indexLessThanIndex:i]) {
+ modelSelection.push_back(viewToModelMap_[i]);
+ }
+
+ // Sort.
[self sortShuffleArray];
+
+ // Use the model indices to get the new view indices of the selection, and
+ // set selection to that. This assumes that no rows were added or removed
+ // (in that case, the selection is cleared before -reloadData is called).
+ if (modelSelection.size() > 0)
+ DCHECK_EQ([tableView_ numberOfRows], model_->ResourceCount());
+ NSMutableIndexSet* indexSet = [NSMutableIndexSet indexSet];
+ for (size_t i = 0; i < modelSelection.size(); ++i)
+ [indexSet addIndex:modelToViewMap_[modelSelection[i]]];
+ [tableView_ selectRowIndexes:indexSet byExtendingSelection:NO];
+
[tableView_ reloadData];
[self adjustSelectionAndEndProcessButton];
}
@@ -141,7 +167,7 @@ class SortHelper {
for (NSUInteger i = [selection lastIndex];
i != NSNotFound;
i = [selection indexLessThanIndex:i]) {
- taskManager_->KillProcess(i);
+ taskManager_->KillProcess(viewToModelMap_[i]);
}
}
@@ -298,19 +324,26 @@ class SortHelper {
for (NSUInteger i = [selection lastIndex];
i != NSNotFound;
i = [selection indexLessThanIndex:i]) {
- if (taskManager_->IsBrowserProcess(i))
+ int modelIndex = viewToModelMap_[i];
+ if (taskManager_->IsBrowserProcess(modelIndex))
selectionContainsBrowserProcess = true;
- std::pair<int, int> rangePair = model_->GetGroupRangeForResource(i);
- NSRange range = NSMakeRange(rangePair.first, rangePair.second);
- NSIndexSet* rangeIndexSet = [NSIndexSet indexSetWithIndexesInRange:range];
- [tableView_ selectRowIndexes:rangeIndexSet byExtendingSelection:YES];
+ std::pair<int, int> rangePair =
+ model_->GetGroupRangeForResource(modelIndex);
+ NSMutableIndexSet* indexSet = [NSMutableIndexSet indexSet];
+ for (int j = 0; j < rangePair.second; ++j)
+ [indexSet addIndex:modelToViewMap_[rangePair.first + j]];
+ [tableView_ selectRowIndexes:indexSet byExtendingSelection:YES];
}
bool enabled = [selection count] > 0 && !selectionContainsBrowserProcess;
[endProcessButton_ setEnabled:enabled];
}
+- (void)deselectRows {
+ [tableView_ deselectAll:self];
+}
+
// Table view delegate method.
- (void)tableViewSelectionIsChanging:(NSNotification*)aNotification {
[self adjustSelectionAndEndProcessButton];
@@ -334,8 +367,8 @@ class SortHelper {
}
- (NSString*)modelTextForRow:(int)row column:(int)columnId {
- DCHECK_LT(static_cast<size_t>(row), indexShuffle_.size());
- row = indexShuffle_[row];
+ DCHECK_LT(static_cast<size_t>(row), viewToModelMap_.size());
+ row = viewToModelMap_[row];
switch (columnId) {
case IDS_TASK_MANAGER_PAGE_COLUMN: // Process
return base::SysWideToNSString(model_->GetResourceTitle(row));
@@ -421,7 +454,7 @@ class SortHelper {
column:[[tableColumn identifier] intValue]];
[buttonCell setTitle:title];
[buttonCell setImage:
- taskManagerObserver_->GetImageForRow(indexShuffle_[rowIndex])];
+ taskManagerObserver_->GetImageForRow(viewToModelMap_[rowIndex])];
[buttonCell setRefusesFirstResponder:YES]; // Don't push in like a button.
[buttonCell setHighlightsBy:NSNoCellMask];
}
@@ -470,6 +503,7 @@ TaskManagerMac::~TaskManagerMac() {
void TaskManagerMac::OnModelChanged() {
icon_cache_.OnModelChanged();
+ [window_controller_ deselectRows];
[window_controller_ reloadData];
}
@@ -480,11 +514,13 @@ void TaskManagerMac::OnItemsChanged(int start, int length) {
void TaskManagerMac::OnItemsAdded(int start, int length) {
icon_cache_.OnItemsAdded(start, length);
+ [window_controller_ deselectRows];
[window_controller_ reloadData];
}
void TaskManagerMac::OnItemsRemoved(int start, int length) {
icon_cache_.OnItemsRemoved(start, length);
+ [window_controller_ deselectRows];
[window_controller_ reloadData];
}
« no previous file with comments | « chrome/browser/cocoa/task_manager_mac.h ('k') | chrome/browser/cocoa/task_manager_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698