Index: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
index 409d5e41c537ac700067376fb782e7685e5dbab3..a2ec7c0b18564436be485f8081d02db36dfef2ec 100644 |
--- a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
+++ b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm |
@@ -315,16 +315,19 @@ void ChooserContentViewController::OnOptionRemoved(size_t index) { |
// selected, if so, deselect it. Also if the removed item is before the |
// currently selected item, the currently selected item's index needs to |
// be adjusted by one. |
- NSInteger idx = static_cast<NSInteger>(index); |
- NSInteger selected_row = [table_view_ selectedRow]; |
- if (selected_row == idx) { |
- [table_view_ deselectRow:idx]; |
- } else if (selected_row > idx) { |
- [table_view_ |
- selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row - 1] |
- byExtendingSelection:NO]; |
+ NSIndexSet* selected_rows = [table_view_ selectedRowIndexes]; |
+ NSMutableIndexSet* updated_selected_rows = [NSMutableIndexSet indexSet]; |
+ NSUInteger row = [selected_rows firstIndex]; |
+ while (row != NSNotFound) { |
+ if (row < index) |
+ [updated_selected_rows addIndex:row]; |
+ else if (row > index) |
+ [updated_selected_rows addIndex:row - 1]; |
+ row = [selected_rows indexGreaterThanIndex:row]; |
} |
+ [table_view_ selectRowIndexes:updated_selected_rows byExtendingSelection:NO]; |
+ |
UpdateTableView(); |
} |
@@ -379,14 +382,11 @@ void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) { |
void ChooserContentViewController::UpdateTableView() { |
[table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; |
// For NSView-based table views, calling reloadData will deselect the |
- // currently selected row, so |selected_row| stores the currently selected |
- // row in order to select it again. |
- NSInteger selected_row = [table_view_ selectedRow]; |
+ // currently selected row, so |selected_rows| stores the currently selected |
+ // rows in order to select them again. |
+ NSIndexSet* selected_rows = [table_view_ selectedRowIndexes]; |
[table_view_ reloadData]; |
- if (selected_row != -1) { |
- [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row] |
- byExtendingSelection:NO]; |
- } |
+ [table_view_ selectRowIndexes:selected_rows byExtendingSelection:NO]; |
} |
@implementation ChooserContentViewCocoa |
@@ -500,6 +500,10 @@ void ChooserContentViewController::UpdateTableView() { |
// Make the column title invisible. |
[tableView_ setHeaderView:nil]; |
[tableView_ setFocusRingType:NSFocusRingTypeNone]; |
+ [tableView_ |
+ setAllowsMultipleSelection:chooserController_->AllowMultipleSelection() |
+ ? YES |
+ : NO]; |
// Spinner. |
// Set the spinner in the center of the scroll view. |
@@ -794,7 +798,14 @@ void ChooserContentViewController::UpdateTableView() { |
} |
- (void)accept { |
- chooserController_->Select([tableView_ selectedRow]); |
+ NSIndexSet* selectedRows = [tableView_ selectedRowIndexes]; |
+ NSUInteger index = [selectedRows firstIndex]; |
+ std::vector<size_t> indices; |
+ while (index != NSNotFound) { |
+ indices.push_back(index); |
+ index = [selectedRows indexGreaterThanIndex:index]; |
+ } |
+ chooserController_->Select(indices); |
} |
- (void)cancel { |
@@ -818,15 +829,16 @@ void ChooserContentViewController::UpdateTableView() { |
} |
- (void)updateContentRowColor { |
- NSInteger selectedRow = [tableView_ selectedRow]; |
+ NSIndexSet* selectedRows = [tableView_ selectedRowIndexes]; |
NSInteger numOptions = |
base::checked_cast<NSInteger>(chooserController_->NumOptions()); |
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
for (NSInteger rowIndex = 0; rowIndex < numOptions; ++rowIndex) { |
+ BOOL isSelected = [selectedRows containsIndex:rowIndex]; |
// Update the color of the text. |
[[self tableRowViewText:rowIndex] |
- setTextColor:(rowIndex == selectedRow ? [NSColor whiteColor] |
- : [NSColor blackColor])]; |
+ setTextColor:(isSelected ? [NSColor whiteColor] |
+ : [NSColor blackColor])]; |
// Update the color of the image. |
if (chooserController_->ShouldShowIconBeforeText()) { |
@@ -834,14 +846,13 @@ void ChooserContentViewController::UpdateTableView() { |
[[self tableRowViewImage:rowIndex] |
setImage:gfx::NSImageFromImageSkia(gfx::CreateVectorIcon( |
gfx::VectorIconId::BLUETOOTH_CONNECTED, |
- rowIndex == selectedRow ? SK_ColorWHITE |
- : gfx::kChromeIconGrey))]; |
+ isSelected ? SK_ColorWHITE : gfx::kChromeIconGrey))]; |
} else { |
int signalStrengthLevel = |
chooserController_->GetSignalStrengthLevel(rowIndex); |
if (signalStrengthLevel != -1) { |
int imageId = |
- rowIndex == selectedRow |
+ isSelected |
? kSignalStrengthLevelImageSelectedIds[signalStrengthLevel] |
: kSignalStrengthLevelImageIds[signalStrengthLevel]; |
[[self tableRowViewImage:rowIndex] |
@@ -853,10 +864,9 @@ void ChooserContentViewController::UpdateTableView() { |
// Update the color of paired status. |
NSTextField* pairedStatusText = [self tableRowViewPairedStatus:rowIndex]; |
if (pairedStatusText) { |
- [pairedStatusText |
- setTextColor:(skia::SkColorToCalibratedNSColor( |
- rowIndex == selectedRow ? gfx::kGoogleGreen300 |
- : gfx::kGoogleGreen700))]; |
+ [pairedStatusText setTextColor:(skia::SkColorToCalibratedNSColor( |
+ isSelected ? gfx::kGoogleGreen300 |
+ : gfx::kGoogleGreen700))]; |
} |
} |
} |