Index: chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm |
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm |
index 9000941c26cea3536cdcc0166a58e9597d9a4aa9..1c3601ec52369d51c202db544a559f39b2dd90bf 100644 |
--- a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm |
+++ b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm |
@@ -14,41 +14,100 @@ const NSInteger kMiddleButtonNumber = 2; |
} // namespace |
-@interface OmniboxPopupMatrix() |
+@implementation OmniboxPopupTableController |
+ |
+- (id)init { |
+ if ((self = [super init])) { |
+ array_ = [[NSMutableArray alloc] init]; |
+ } |
+ return self; |
+} |
+ |
+- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
+ if (!array_) |
dschuyler
2015/04/24 18:43:08
Checking whether the member is initialized comes f
groby-ooo-7-16
2015/04/24 20:11:16
I'm confused. If the member is not initialized, th
dschuyler
2015/04/25 01:05:42
Ah, so I was trying to do right by the 'Important'
|
+ return 0; |
+ return [array_ count]; |
+} |
+ |
+- (id)tableView:(NSTableView*)aTableView |
+ objectValueForTableColumn:(NSTableColumn*)aTableColumn |
+ row:(NSInteger)rowIndex { |
+ // Returning the cell allows selection highlighting to work properly. |
+ return [array_ objectAtIndex:rowIndex]; |
+} |
+ |
+- (NSCell*)tableView:(NSTableView*)tableView |
+ dataCellForTableColumn:(NSTableColumn*)tableColumn |
+ row:(NSInteger)row { |
+ // Returning the cell populates data in the table. |
+ return [array_ objectAtIndex:row]; |
+} |
+ |
+- (void)setCellCount:(NSInteger)count { |
+ // Add more. |
+ while (count >= (NSInteger)[array_ count]) { |
+ [array_ addObject:[[OmniboxPopupCell alloc] init]]; |
groby-ooo-7-16
2015/04/24 20:11:16
This leaks. (addObject retains, alloc retains)
dschuyler
2015/04/25 01:05:43
Is autorelease the right thing to do here?
Done.
groby-ooo-7-16
2015/04/25 01:31:11
Yes, it is :)
Normal pattern for classes is to h
dschuyler
2015/05/01 21:50:53
Acknowledged.
|
+ } |
+ // Remove excess. |
+ while (count < (NSInteger)[array_ count]) { |
groby-ooo-7-16
2015/04/24 20:11:16
Why the cast?
Also, why not
if (count < [array_ c
dschuyler
2015/04/25 01:05:43
It's a compile error to compare signed and unsigne
groby-ooo-7-16
2015/04/25 01:31:11
Excellent. Also, when you cast: Please always use
dschuyler
2015/05/01 21:50:53
Acknowledged.
|
+ [array_ removeLastObject]; |
+ } |
+ DCHECK_EQ(count, (NSInteger)[array_ count]); |
+ // Setup defaults. |
groby-ooo-7-16
2015/04/24 20:11:16
That comment is rather meaningless - what defaults
dschuyler
2015/04/25 01:05:42
Done.
|
+ if (count) |
+ [[array_ objectAtIndex:0] setState:NSOnState]; |
+} |
+ |
+- (NSArray*)getCellArray { |
+ return array_; |
+} |
+ |
+- (CGFloat)tableView:(NSTableView*)tableView heightOfRow:(NSInteger)row { |
+ return [[array_ objectAtIndex:row] cellSize].height; |
+} |
+ |
+@end |
+ |
+@interface OmniboxPopupTableView () |
- (void)resetTrackingArea; |
- (void)highlightRowAt:(NSInteger)rowIndex; |
- (void)highlightRowUnder:(NSEvent*)theEvent; |
- (BOOL)selectCellForEvent:(NSEvent*)theEvent; |
@end |
-@implementation OmniboxPopupMatrix |
+@implementation OmniboxPopupTableView |
-- (id)initWithDelegate:(OmniboxPopupMatrixDelegate*)delegate { |
+- (id)initWithDelegate:(OmniboxPopupTableDelegate*)delegate { |
if ((self = [super initWithFrame:NSZeroRect])) { |
delegate_ = delegate; |
- [self setCellClass:[OmniboxPopupCell class]]; |
+ controller_ = [[OmniboxPopupTableController alloc] init]; |
+ |
+ NSTableColumn* column = |
+ [[NSTableColumn alloc] initWithIdentifier:@"MainCell"]; |
+ [self addTableColumn:column]; |
+ |
+ [self setDelegate:controller_]; |
+ [self setDataSource:controller_]; |
// Cells pack with no spacing. |
[self setIntercellSpacing:NSMakeSize(0.0, 0.0)]; |
- [self setDrawsBackground:YES]; |
[self setBackgroundColor:[NSColor controlBackgroundColor]]; |
- [self renewRows:0 columns:1]; |
dschuyler
2015/04/24 18:43:08
The initial column is now added in a different fun
|
[self setAllowsEmptySelection:YES]; |
- [self setMode:NSRadioModeMatrix]; |
dschuyler
2015/04/24 18:43:08
There doesn't seem to be an equivalent for this co
|
- [self deselectAllCells]; |
+ [self deselectAll:self]; |
+ [self setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; |
[self resetTrackingArea]; |
} |
return self; |
} |
-- (void)setDelegate:(OmniboxPopupMatrixDelegate*)delegate { |
+- (void)setCppDelegate:(OmniboxPopupTableDelegate*)delegate { |
delegate_ = delegate; |
} |
- (NSInteger)highlightedRow { |
- NSArray* cells = [self cells]; |
+ NSArray* cells = [controller_ getCellArray]; |
const NSUInteger count = [cells count]; |
for(NSUInteger i = 0; i < count; ++i) { |
if ([[cells objectAtIndex:i] isHighlighted]) { |
@@ -106,7 +165,7 @@ const NSInteger kMiddleButtonNumber = 2; |
const NSInteger highlightedRow = [self highlightedRow]; |
if (highlightedRow != -1) { |
DCHECK(delegate_); |
- delegate_->OnMatrixRowMiddleClicked(self, highlightedRow); |
+ delegate_->OnTableRowMiddleClicked(self, highlightedRow); |
} |
} |
@@ -141,10 +200,21 @@ const NSInteger kMiddleButtonNumber = 2; |
} |
DCHECK(delegate_); |
- delegate_->OnMatrixRowClicked(self, selectedRow); |
+ delegate_->OnTableRowClicked(self, selectedRow); |
} |
} |
+- (void)setCellCount:(NSInteger)count { |
+ return [controller_ setCellCount:count]; |
dschuyler
2015/04/24 18:43:08
I'm torn on whether a wrapper call like this is go
groby-ooo-7-16
2015/04/24 20:11:17
It is :) (Long-form argument at http://en.wikipedi
dschuyler
2015/04/25 01:05:43
Acknowledged.
|
+} |
+ |
+- (OmniboxPopupCell*)cellAtRow:(NSInteger)row { |
+ NSArray* array = [controller_ getCellArray]; |
+ if (row < 0 || row >= (NSInteger)[array count]) |
dschuyler
2015/04/24 18:43:08
row == -1 does happen normally. The high guard is
groby-ooo-7-16
2015/04/24 20:11:17
That kind of screams for an NSUInteger
dschuyler
2015/04/25 01:05:43
I heard that screaming as well, though I thought I
groby-ooo-7-16
2015/04/25 01:31:11
Sigh. It's my old habits. We actually *shouldn't*
|
+ return nil; |
+ return [array objectAtIndex:row]; |
+} |
+ |
- (void)resetTrackingArea { |
if (trackingArea_.get()) |
[self removeTrackingArea:trackingArea_.get()]; |
@@ -163,32 +233,30 @@ const NSInteger kMiddleButtonNumber = 2; |
- (void)highlightRowAt:(NSInteger)rowIndex { |
// highlightCell will be nil if rowIndex is out of range, so no cell will be |
// highlighted. |
- NSCell* highlightCell = [self cellAtRow:rowIndex column:0]; |
+ OmniboxPopupCell* highlightCell = [self cellAtRow:rowIndex]; |
groby-ooo-7-16
2015/04/24 20:11:16
Why check that here? Why not just tell the control
dschuyler
2015/04/25 01:05:43
It comes from a presumption that the prior Googler
groby-ooo-7-16
2015/04/25 01:31:11
Yeah, probably. I'd ping the Googler in Question (
|
+ if ([highlightCell isHighlighted]) |
+ return; |
- for (NSCell* cell in [self cells]) { |
- [cell setHighlighted:(cell == highlightCell)]; |
+ for (OmniboxPopupCell* cell in controller_.getCellArray) { |
+ if ([cell isHighlighted] || cell == highlightCell) { |
+ [cell highlight:(cell == highlightCell) withFrame:_bounds inView:self]; |
+ } |
} |
} |
- (void)highlightRowUnder:(NSEvent*)theEvent { |
NSPoint point = [self convertPoint:[theEvent locationInWindow] fromView:nil]; |
- NSInteger row, column; |
- if ([self getRow:&row column:&column forPoint:point]) { |
- [self highlightRowAt:row]; |
- } else { |
- [self highlightRowAt:-1]; |
- } |
+ [self highlightRowAt:[self rowAtPoint:point]]; |
} |
// Select cell under |theEvent|, returning YES if a selection is made. |
- (BOOL)selectCellForEvent:(NSEvent*)theEvent { |
NSPoint point = [self convertPoint:[theEvent locationInWindow] fromView:nil]; |
- NSInteger row, column; |
- if ([self getRow:&row column:&column forPoint:point]) { |
- DCHECK_EQ(column, 0); |
+ NSInteger row = [self rowAtPoint:point]; |
+ if (row != -1) { |
DCHECK(delegate_); |
- delegate_->OnMatrixRowSelected(self, row); |
+ delegate_->OnTableRowSelected(self, row); |
return YES; |
} |
return NO; |