100 #define NUMBER_OF_COLUMNS() (_tableColumns.length) 101 #define UPDATE_COLUMN_RANGES_IF_NECESSARY() \ 102 if (_dirtyTableColumnRangeIndex !== CPNotFound) \ 103 [self _recalculateTableColumnRanges]; 104 #define FULL_ROW_HEIGHT() (_rowHeight + _intercellSpacing.height) 105 #define ROW_BOTTOM(__heightInfo) (__heightInfo.y + __heightInfo.height + _intercellSpacing.height) 106 #define HAS_VARIABLE_ROW_HEIGHTS() (_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_) 115 - (CPDragOperation)
tableView:(
CPTableView)aTableView validateDrop:(
id <
CPDraggingInfo>)info proposedRow:(CPInteger)aRowIndex proposedDropOperation:(CPTableViewDropOperation)anOperation;
116 - (CPInteger)numberOfRowsInTableView:(
CPTableView)aTableView;
126 - (BOOL)selectionShouldChangeInTableView:(
CPTableView)aTableView;
129 - (BOOL)
tableView:(
CPTableView)aTableView shouldReorderColumn:(CPInteger)columnIndex toColumn:(NSInteger)newColumnIndex;
136 - (CPInteger)
tableView:(
CPTableView)aTableView nextTypeSelectMatchFromRow:(CPInteger)startRow toRow:(CPInteger)endRow forString:(
CPString)searchString;
137 - (
CPMenu)tableViewMenuForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex;
148 - (void)tableViewSelectionDidChange:(
CPNotification)aNotification;
149 - (void)tableViewSelectionIsChanging:(
CPNotification)aNotification;
153 @implementation _CPTableDrawView :
CPView 163 _tableView = aTableView;
168 - (void)drawRect:(CGRect)aRect
170 var
frame = [
self frame],
175 [_tableView _drawRect:aRect];
204 id <CPTableViewDataSource> _dataSource;
205 CPInteger _implementedDataSourceMethods;
207 id <CPTableViewDelegate> _delegate;
208 CPInteger _implementedDelegateMethods;
210 CPArray _tableColumns;
211 CPArray _tableColumnRanges;
212 CPInteger _dirtyTableColumnRangeIndex;
213 CPInteger _numberOfHiddenColumns;
216 BOOL _invalidateObjectValuesCache;
217 Object _objectValues;
223 Object _dataViewsForRows;
224 Object _cachedDataViews;
226 Object _unavailable_custom_cibs;
229 BOOL _allowsColumnReordering;
230 BOOL _allowsColumnResizing;
231 BOOL _allowsColumnSelection;
232 BOOL _allowsMultipleSelection;
233 BOOL _allowsEmptySelection;
235 CPArray _sortDescriptors;
238 CGSize _intercellSpacing;
241 BOOL _usesAlternatingRowBackgroundColors;
242 CPArray _alternatingRowBackgroundColors;
244 unsigned _selectionHighlightStyle;
245 CPColor _unfocusedSelectionHighlightColor;
248 unsigned _gridStyleMask;
250 unsigned _numberOfRows;
253 CPArray _cachedRowHeights;
257 BOOL _autosaveTableColumns;
260 _CPCornerView _cornerView;
264 CPInteger _selectionAnchorRow;
265 CPInteger _lastSelectedRow;
267 CGPoint _startTrackingPoint;
268 CPDate _startTrackingTimestamp;
269 BOOL _trackingPointMovedOutOfClickSlop;
270 CPInteger _editingRow;
271 CPInteger _editingColumn;
273 _CPTableDrawView _tableDrawView;
276 CPInteger _clickedRow;
277 CPInteger _clickedColumn;
278 unsigned _columnAutoResizingStyle;
280 int _lastTrackedRowIndex;
281 CGPoint _originalMouseDownPoint;
282 BOOL _verticalMotionCanDrag;
283 unsigned _destinationDragStyle;
284 BOOL _isSelectingSession;
286 BOOL _wasSelectionBroken;
288 _CPDropOperationDrawingView _dropOperationFeedbackView;
289 CPDragOperation _dragOperationDefaultMask;
290 int _retargetedDropRow;
291 CPDragOperation _retargetedDropOperation;
293 BOOL _disableAutomaticResizing;
294 BOOL _lastColumnShouldSnap;
295 BOOL _implementsCustomDrawRow;
297 BOOL _contentBindingExplicitlySet;
299 SEL _viewForTableColumnRowSelector;
301 CPInteger _draggedColumnIndex;
302 BOOL _draggedColumnIsSelected;
303 BOOL _needsDifferedTableColumnRemove;
304 CPArray _differedColumnDataToRemove;
306 Function _BlockDeselectView;
307 Function _BlockSelectView;
328 @"grid-line-thickness": 1.0,
336 @"default-row-height": 25.0,
337 @"dropview-on-background-color": [
CPNull null],
341 @"dropview-on-selected-background-color": [
CPNull null],
342 @"dropview-on-selected-border-color": [
CPNull null],
343 @"dropview-on-selected-border-width": [
CPNull null],
344 @"dropview-on-selected-border-radius": [
CPNull null],
345 @"dropview-above-border-color": [
CPNull null],
346 @"dropview-above-border-width": [
CPNull null],
347 @"dropview-above-selected-border-color": [
CPNull null],
348 @"dropview-above-selected-border-width": [
CPNull null],
349 @"header-view-height": 25.0
353 - (id)initWithFrame:(CGRect)aFrame
360 _allowsColumnReordering = YES;
361 _allowsColumnResizing = YES;
362 _allowsMultipleSelection = NO;
363 _allowsEmptySelection = YES;
364 _allowsColumnSelection = NO;
365 _disableAutomaticResizing = NO;
374 _tableColumnRanges = [];
376 _numberOfHiddenColumns = 0;
378 _intercellSpacing = CGSizeMake(3.0, 2.0);
379 _rowHeight = [
self valueForThemeAttribute:@"default-row-height"];
381 [
self setGridColor:[
self valueForThemeAttribute:@"grid-color"]];
387 _currentHighlightedTableColumn = nil;
390 _verticalMotionCanDrag = YES;
391 _isSelectingSession = NO;
392 _retargetedDropRow = nil;
393 _retargetedDropOperation = nil;
394 _dragOperationDefaultMask = nil;
396 _contentBindingExplicitlySet = NO;
413 _lastSelectedRow = _clickedColumn = _clickedRow = -1;
418 _dropOperationFeedbackView = [[_CPDropOperationDrawingView alloc] initWithFrame:CGRectMakeZero()];
419 [_dropOperationFeedbackView setTableView:self];
421 _lastColumnShouldSnap = NO;
423 if (!_alternatingRowBackgroundColors)
426 _tableColumnRanges = [];
427 _dirtyTableColumnRangeIndex = 0;
428 _numberOfHiddenColumns = 0;
431 _invalidateObjectValuesCache = NO;
432 _dataViewsForRows = { };
436 _cachedDataViews = { };
437 _archivedDataViews = nil;
438 _viewForTableColumnRowSelector = nil;
439 _unavailable_custom_cibs = { };
440 _cachedRowHeights = [];
444 _tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
446 [
self addSubview:_tableDrawView];
448 _draggedColumnIndex = -1;
449 _draggedColumnIsSelected = NO;
459 _differedColumnDataToRemove = [];
460 _needsDifferedTableColumnRemove = NO;
461 _implementsCustomDrawRow = [
self implementsSelector:@selector(drawRow:clipRect:)];
463 if (!_sortDescriptors)
464 _sortDescriptors = [];
466 [
self _initSubclass];
469 - (void)_initSubclass
471 _BlockDeselectView =
function(view, row, column)
473 [view unsetThemeState:CPThemeStateSelectedDataView];
476 _BlockSelectView =
function(view, row, column)
478 [view setThemeState:CPThemeStateSelectedDataView];
547 - (void)setDataSource:(
id <CPTableViewDataSource>)aDataSource
549 if (_dataSource === aDataSource)
552 _dataSource = aDataSource;
553 _implementedDataSourceMethods = 0;
558 var hasContentBinding = !![
self infoForBinding:@"content"];
560 if ([_dataSource respondsToSelector:
@selector(numberOfRowsInTableView:)])
563 if ([_dataSource respondsToSelector:
@selector(
tableView:objectValueForTableColumn:row:)])
566 if ([_dataSource respondsToSelector:
@selector(
tableView:setObjectValue:forTableColumn:row:)])
569 if ([_dataSource respondsToSelector:
@selector(
tableView:acceptDrop:row:dropOperation:)])
572 if ([_dataSource respondsToSelector:
@selector(
tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:)])
575 if ([_dataSource respondsToSelector:
@selector(
tableView:validateDrop:proposedRow:proposedDropOperation:)])
578 if ([_dataSource respondsToSelector:
@selector(
tableView:writeRowsWithIndexes:toPasteboard:)])
581 if ([_dataSource respondsToSelector:
@selector(
tableView:sortDescriptorsDidChange:)])
584 [
self _reloadDataViews];
601 [
self _reloadDataViews];
617 [
self _enumerateViewsInRows:rowIndexes columns:columnIndexes usingBlock:function(view, row, column, stop)
619 var tableColumn = [_tableColumns objectAtIndex:column];
620 [
self _setObjectValueForTableColumn:tableColumn row:row forView:view useCache:NO];
626 _reloadAllRows = YES;
628 _cachedRowHeights = [];
633 [_groupRows removeAllIndexes];
636 [
self noteNumberOfRowsChanged];
640 - (void)_reloadDataViews
643 [
self setNeedsLayout];
644 [
self setNeedsDisplay:YES];
648 - (void)_reloadDataViewsSynchronously
662 - (void)setDoubleAction:(
SEL)anAction
664 _doubleAction = anAction;
672 return _doubleAction;
678 - (CPInteger)clickedColumn
680 return _clickedColumn;
686 - (CPInteger)clickedRow
696 - (void)setAllowsColumnReordering:(BOOL)shouldAllowColumnReordering
698 _allowsColumnReordering = !!shouldAllowColumnReordering;
704 - (BOOL)allowsColumnReordering
706 return _allowsColumnReordering;
713 - (void)setAllowsColumnResizing:(BOOL)shouldAllowColumnResizing
715 _allowsColumnResizing = !!shouldAllowColumnResizing;
721 - (BOOL)allowsColumnResizing
723 return _allowsColumnResizing;
730 - (void)setAllowsMultipleSelection:(BOOL)shouldAllowMultipleSelection
732 _allowsMultipleSelection = !!shouldAllowMultipleSelection;
740 - (BOOL)allowsMultipleSelection
742 return _allowsMultipleSelection;
749 - (void)setAllowsEmptySelection:(BOOL)shouldAllowEmptySelection
751 _allowsEmptySelection = !!shouldAllowEmptySelection;
757 - (BOOL)allowsEmptySelection
759 return _allowsEmptySelection;
767 - (void)setAllowsColumnSelection:(BOOL)shouldAllowColumnSelection
769 _allowsColumnSelection = !!shouldAllowColumnSelection;
776 - (BOOL)allowsColumnSelection
778 return _allowsColumnSelection;
788 - (void)setIntercellSpacing:(CGSize)aSize
790 if (CGSizeEqualToSize(_intercellSpacing, aSize))
793 _intercellSpacing = CGSizeMakeCopy(aSize);
795 _dirtyTableColumnRangeIndex = 0;
796 [
self _recalculateTableColumnRanges];
798 [_headerView setNeedsDisplay:YES];
799 [_headerView setNeedsLayout];
801 [
self _reloadDataViews];
807 - (CGSize)intercellSpacing
809 return CGSizeMakeCopy(_intercellSpacing);
818 - (void)setRowHeight:(
unsigned)aRowHeight
821 aRowHeight = +aRowHeight;
823 if (_rowHeight === aRowHeight)
826 _rowHeight = MAX(0.0, aRowHeight);
834 - (unsigned)rowHeight
844 - (void)setUsesAlternatingRowBackgroundColors:(BOOL)shouldUseAlternatingRowBackgroundColors
846 _usesAlternatingRowBackgroundColors = shouldUseAlternatingRowBackgroundColors;
852 - (BOOL)usesAlternatingRowBackgroundColors
854 return _usesAlternatingRowBackgroundColors;
862 - (void)setAlternatingRowBackgroundColors:(CPArray)alternatingRowBackgroundColors
872 - (CPArray)alternatingRowBackgroundColors
874 return [
self currentValueForThemeAttribute:@"alternating-row-colors"];
888 - (unsigned)selectionHighlightStyle
890 return _selectionHighlightStyle;
904 - (void)setSelectionHighlightStyle:(
unsigned)aSelectionHighlightStyle
906 _selectionHighlightStyle = aSelectionHighlightStyle;
914 [
self _updateHighlightWithOldColumns:[
CPIndexSet indexSet] newColumns:_selectedColumnIndexes];
923 - (void)setSelectionHighlightColor:(
CPColor)aColor
925 if ([[
self selectionHighlightColor]
isEqual:aColor])
937 return [
self currentValueForThemeAttribute:@"selection-color"];
945 if (!_unfocusedSelectionHighlightColor)
946 _unfocusedSelectionHighlightColor = [
self _unfocusedSelectionColorFromColor:[
self selectionHighlightColor] saturation:0];
948 return _unfocusedSelectionHighlightColor;
978 return [
self currentValueForThemeAttribute:@"sourcelist-selection-color"];
992 if (!_unfocusedSourceListSelectionColor)
996 _unfocusedSourceListSelectionColor = @{
997 CPSourceListGradient: [
self _unfocusedGradientFromGradient:[sourceListColors objectForKey:CPSourceListGradient]],
998 CPSourceListTopLineColor: [
self _unfocusedSelectionColorFromColor:[sourceListColors objectForKey:CPSourceListTopLineColor] saturation:0.2],
999 CPSourceListBottomLineColor: [
self _unfocusedSelectionColorFromColor:[sourceListColors objectForKey:CPSourceListBottomLineColor] saturation:0.2]
1003 return _unfocusedSourceListSelectionColor;
1006 - (
CPColor)_unfocusedSelectionColorFromColor:(
CPColor)aColor saturation:(
float)saturation
1013 - (CGGradient)_unfocusedGradientFromGradient:(CGGradient)aGradient
1015 var colors = [aGradient.colors copy],
1016 count = [colors count];
1023 colors[count] =
CGColorCreate(aGradient.colorspace, [[hsb components] copy]);
1045 return [
self currentValueForThemeAttribute:@"grid-color"];;
1053 - (void)setGridStyleMask:(
unsigned)aGrideStyleMask
1055 if (_gridStyleMask === aGrideStyleMask)
1058 _gridStyleMask = aGrideStyleMask;
1066 - (unsigned)gridStyleMask
1068 return _gridStyleMask;
1079 [_tableColumns addObject:aTableColumn];
1082 if (_dirtyTableColumnRangeIndex < 0)
1085 _dirtyTableColumnRangeIndex = MIN(
NUMBER_OF_COLUMNS() - 1, _dirtyTableColumnRangeIndex);
1087 if ([[
self sortDescriptors] count] > 0)
1091 if (aTableColumn === [
self _tableColumnForSortDescriptor:mainSortDescriptor])
1093 var image = [mainSortDescriptor ascending] ? [
self _tableHeaderSortImage] : [
self _tableHeaderReverseSortImage];
1111 var index = [_tableColumns indexOfObjectIdenticalTo:aTableColumn];
1117 [_differedColumnDataToRemove addObject:{"column":aTableColumn, "shouldBeHidden": [aTableColumn
isHidden]}];
1118 _needsDifferedTableColumnRemove = YES;
1123 var tableColumnUID = [aTableColumn
UID];
1125 if (_objectValues[tableColumnUID])
1126 _objectValues[tableColumnUID] = nil;
1128 if (_dirtyTableColumnRangeIndex < 0)
1129 _dirtyTableColumnRangeIndex = index;
1131 _dirtyTableColumnRangeIndex = MIN(index, _dirtyTableColumnRangeIndex);
1141 - (void)_setDraggedColumn:(CPInteger)columnIndex
1147 if (
columnIndex === -1 && _draggedColumnIsSelected)
1148 [_selectedColumnIndexes addIndex:_draggedColumnIndex];
1157 - (void)_moveColumn:(
unsigned)fromIndex toColumn:(
unsigned)toIndex
1160 fromIndex = +fromIndex;
1163 if (fromIndex === toIndex)
1166 if (_dirtyTableColumnRangeIndex < 0)
1167 _dirtyTableColumnRangeIndex = MIN(fromIndex, toIndex);
1169 _dirtyTableColumnRangeIndex = MIN(fromIndex, toIndex, _dirtyTableColumnRangeIndex);
1171 var tableColumn = _tableColumns[fromIndex],
1172 selectedTableColumns = [_tableColumns objectsAtIndexes:_selectedColumnIndexes];
1174 [_tableColumns removeObjectAtIndex:fromIndex];
1175 [_tableColumns insertObject:tableColumn atIndex:toIndex];
1177 [[
self headerView] setNeedsLayout];
1178 [[
self headerView] setNeedsDisplay:YES];
1180 var range =
CPMakeRange(MIN(fromIndex, toIndex), ABS(fromIndex - toIndex) + 1),
1184 [_tableColumns enumerateObjectsUsingBlock:function(tableColumn, idx, stop)
1186 if ([selectedTableColumns containsObjectIdenticalTo:tableColumn])
1187 [selectedColumnIndexes addIndex:idx];
1190 if ([_selectedColumnIndexes containsIndex:fromIndex])
1191 [selectedColumnIndexes addIndex:toIndex];
1193 if (_draggedColumnIndex !== -1)
1194 [layoutColumnIndexes removeIndex:toIndex];
1196 [
self _layoutViewsForRowIndexes:_exposedRows columnIndexes:layoutColumnIndexes];
1197 [
self selectColumnIndexes:selectedColumnIndexes byExtendingSelection:NO];
1198 [
self setNeedsDisplay:YES];
1204 userInfo:@{ @"CPOldColumn": fromIndex, @"CPNewColumn": toIndex }];
1215 - (void)moveColumn:(CPInteger)theColumnIndex toColumn:(CPInteger)theToIndex
1217 [
self _moveColumn:theColumnIndex toColumn:theToIndex];
1225 - (void)_tableColumnVisibilityDidChange:(
CPTableColumn)aColumn
1227 var
columnIndex = [[
self tableColumns] indexOfObjectIdenticalTo:aColumn];
1229 if (_dirtyTableColumnRangeIndex < 0)
1232 _dirtyTableColumnRangeIndex = MIN(
columnIndex, _dirtyTableColumnRangeIndex);
1234 [[
self headerView] setNeedsLayout];
1235 [[
self headerView] setNeedsDisplay:YES];
1244 - (CPArray)tableColumns
1246 return _tableColumns;
1255 - (CPInteger)columnWithIdentifier:(
CPString)anIdentifier
1260 for (; index < count; ++index)
1261 if ([_tableColumns[index]
identifier] === anIdentifier)
1280 return _tableColumns[index];
1286 - (void)_didResizeTableColumn:(
CPTableColumn)theColumn oldWidth:(
int)oldWidth
1293 userInfo:@{ @"CPTableColumn": theColumn, @"CPOldWidth": oldWidth }];
1307 - (void)selectColumnIndexes:(
CPIndexSet)columns byExtendingSelection:(BOOL)shouldExtendSelection
1310 if (([columns firstIndex] !=
CPNotFound && [columns firstIndex] < 0) || [columns lastIndex] >= [
self numberOfColumns] || (!shouldExtendSelection && [columns isEqualToIndexSet:_selectedColumnIndexes]) || (shouldExtendSelection && [columns count] === 0))
1314 if ([_selectedRowIndexes count] > 0)
1316 [
self _updateHighlightWithOldRows:_selectedRowIndexes newRows:[
CPIndexSet indexSet]];
1320 var previousSelectedIndexes = [_selectedColumnIndexes copy];
1322 if (shouldExtendSelection)
1323 [_selectedColumnIndexes addIndexes:columns];
1325 _selectedColumnIndexes = [columns
copy];
1327 [
self _updateHighlightWithOldColumns:previousSelectedIndexes newColumns:_selectedColumnIndexes];
1331 [_headerView setNeedsDisplay:YES];
1333 [
self _noteSelectionDidChange];
1339 - (void)_setSelectedRowIndexes:(
CPIndexSet)rows
1341 if ([_selectedRowIndexes isEqualToIndexSet:rows])
1344 var previousSelectedIndexes = _selectedRowIndexes;
1346 _lastSelectedRow = ([rows count] > 0) ? [rows lastIndex] : -1;
1347 _selectedRowIndexes = [rows copy];
1349 [
self _updateHighlightWithOldRows:previousSelectedIndexes newRows:_selectedRowIndexes];
1350 [
self setNeedsDisplay:YES];
1353 var binderClass = [[
self class] _binderClassForBinding:@"selectionIndexes"];
1354 [[binderClass getBinding:@"selectionIndexes" forObject:self] reverseSetValueFor:@"selectedRowIndexes"];
1356 [
self _noteSelectionDidChange];
1365 - (void)selectRowIndexes:(
CPIndexSet)rows byExtendingSelection:(BOOL)shouldExtendSelection
1367 if ([rows isEqualToIndexSet:_selectedRowIndexes] ||
1368 (([rows firstIndex] !=
CPNotFound && [rows firstIndex] < 0) || [rows lastIndex] >= [
self numberOfRows]) ||
1373 if ([_selectedColumnIndexes count] > 0)
1375 [
self _updateHighlightWithOldColumns:_selectedColumnIndexes newColumns:[
CPIndexSet indexSet]];
1378 [_headerView setNeedsDisplay:YES];
1381 var newSelectedIndexes;
1382 if (shouldExtendSelection)
1384 newSelectedIndexes = [_selectedRowIndexes copy];
1385 [newSelectedIndexes addIndexes:rows];
1388 newSelectedIndexes = [rows
copy];
1390 [
self _setSelectedRowIndexes:newSelectedIndexes];
1400 if ([
self _delegateRespondsToSelectionIndexesForProposedSelection])
1402 return [
self _sendDelegateSelectionIndexesForProposedSelection:anIndexSet];
1404 else if ([
self _delegateRespondsToShouldSelectRow])
1411 if (![
self _sendDelegateShouldSelectRow:currentIndex])
1412 [indexesToRemove addIndex:currentIndex];
1430 [
self _enumerateViewsInRows:oldRows columns:_exposedColumns usingBlock:_BlockDeselectView];
1433 [
self _enumerateViewsInRows:newRows columns:_exposedColumns usingBlock:_BlockSelectView];
1439 - (void)_updateHighlightWithOldColumns:(
CPIndexSet)oldColumns newColumns:(
CPIndexSet)newColumns
1441 var blockDeselectHeader =
function(column,
stop)
1443 var headerView = [_tableColumns[column] headerView];
1444 [headerView unsetThemeState:CPThemeStateSelected];
1449 [
self _enumerateViewsInRows:_exposedRows columns:oldColumns usingBlock:_BlockDeselectView];
1454 [
self _enumerateViewsInRows:_exposedRows columns:newColumns usingBlock:_BlockSelectView];
1457 var headerView = [_tableColumns[column] headerView];
1458 [headerView setThemeState:CPThemeStateSelected];
1466 - (int)selectedColumn
1468 return [_selectedColumnIndexes lastIndex];
1476 return _selectedColumnIndexes;
1484 return _lastSelectedRow;
1492 return [_selectedRowIndexes copy];
1500 - (void)deselectColumn:(CPInteger)anIndex
1502 var selectedColumnIndexes = [_selectedColumnIndexes copy];
1505 [
self _noteSelectionDidChange];
1513 - (void)deselectRow:(CPInteger)aRow
1515 var selectedRowIndexes = [_selectedRowIndexes copy];
1518 [
self _noteSelectionDidChange];
1524 - (CPInteger)numberOfSelectedColumns
1526 return [_selectedColumnIndexes count];
1532 - (CPInteger)numberOfSelectedRows
1534 return [_selectedRowIndexes count];
1543 - (BOOL)isColumnSelected:(CPInteger)anIndex
1545 return [_selectedColumnIndexes containsIndex:anIndex];
1554 - (BOOL)isRowSelected:(CPInteger)aRow
1556 return [_selectedRowIndexes containsIndex:aRow];
1570 - (void)selectAll:(
id)sender
1572 if (_allowsMultipleSelection)
1574 if (![
self _sendDelegateSelectionShouldChangeInTableView])
1577 if ([[
self selectedColumnIndexes] count])
1587 - (void)deselectAll:(
id)sender
1589 if ([
self allowsEmptySelection])
1591 if (![
self _sendDelegateSelectionShouldChangeInTableView])
1601 - (int)numberOfColumns
1611 return _numberOfRows;
1614 - (int)_numberOfRows
1617 contentBindingInfo = [
self infoForBinding:@"content"];
1619 if (contentBindingInfo)
1621 var destination = [contentBindingInfo objectForKey:CPObservedObjectKey],
1622 keyPath = [contentBindingInfo objectForKey:CPObservedKeyPathKey];
1624 numberOfRows = [[destination valueForKeyPath:keyPath] count];
1627 numberOfRows = [_dataSource numberOfRowsInTableView:self] || 0;
1631 CPLog(
@"no content binding established and data source " + [_dataSource
description] +
" does not implement numberOfRowsInTableView:");
1635 return numberOfRows;
1652 if (_cornerView === aView)
1655 _cornerView = aView;
1659 if ([scrollView isKindOfClass:[
CPScrollView class]] && [scrollView documentView] ===
self)
1660 [scrollView _updateCornerAndHeaderView];
1681 if (_headerView === aHeaderView)
1684 [_headerView setTableView:nil];
1686 _headerView = aHeaderView;
1690 [_headerView setTableView:self];
1691 [_headerView setFrameSize:CGSizeMake(CGRectGetWidth([
self frame]), CGRectGetHeight([_headerView frame]))];
1696 [_cornerView removeFromSuperview];
1702 if ([scrollView isKindOfClass:[
CPScrollView class]] && [scrollView documentView] ===
self)
1703 [scrollView _updateCornerAndHeaderView];
1711 - (void)_recalculateTableColumnRanges
1716 if (_dirtyTableColumnRangeIndex < 0)
1719 _numberOfHiddenColumns = 0;
1721 var index = _dirtyTableColumnRangeIndex,
1723 x = index === 0 ? 0.0 :
CPMaxRange(_tableColumnRanges[index - 1]);
1725 for (; index < count; ++index)
1727 var tableColumn = _tableColumns[index];
1731 _numberOfHiddenColumns += 1;
1736 var
width = [_tableColumns[index] width] + _intercellSpacing.
width;
1744 _tableColumnRanges.length = count;
1754 - (CGRect)rectOfColumn:(CPInteger)aColumnIndex
1760 aColumnIndex = +aColumnIndex;
1763 return CGRectMakeZero();
1765 if ([[_tableColumns objectAtIndex:aColumnIndex]
isHidden])
1766 return CGRectMakeZero();
1770 var range = _tableColumnRanges[aColumnIndex];
1772 return CGRectMake(range.location, 0.0, range.length, CGRectGetHeight([
self bounds]));
1782 - (CGRect)_rectOfRow:(CPInteger)aRowIndex checkRange:(BOOL)checkRange
1787 var lastIndex = [
self numberOfRows] - 1,
1788 validIndex = aRowIndex >= 0 && aRowIndex <= lastIndex;
1790 if (checkRange && !validIndex)
1791 return CGRectMakeZero();
1795 fixedHeightRows = 0;
1799 [
self _populateRowHeightCacheIfNeeded];
1807 heightInfo = _cachedRowHeights[aRowIndex];
1809 height = heightInfo.height + _intercellSpacing.height;
1815 if (_numberOfRows > 0)
1817 heightInfo = _cachedRowHeights[lastIndex];
1822 fixedHeightRows = aRowIndex - _numberOfRows;
1828 fixedHeightRows = aRowIndex;
1834 return CGRectMake(0.0, y, CGRectGetWidth([
self bounds]), height);
1842 - (CGRect)rectOfRow:(CPInteger)aRowIndex
1844 return [
self _rectOfRow:aRowIndex checkRange:YES];
1852 - (CPRange)rowsInRect:(CGRect)aRect
1858 if (_numberOfRows <= 0)
1864 if (!CGRectIntersectsRect(aRect,
bounds))
1867 var firstRow = [
self rowAtPoint:aRect.origin];
1873 var lastRow = [
self rowAtPoint:CGPointMake(0.0, CGRectGetMaxY(aRect))];
1877 lastRow = _numberOfRows - 1;
1879 return CPMakeRange(firstRow, lastRow - firstRow + 1);
1887 - (CPRange)_exposedRowsInRect:(CGRect)aRect
1889 var rowRange = [
self rowsInRect:aRect],
1891 rectOfLastRealRow = [self _rectOfRow:lastRealRow checkRange:NO],
1892 bottomOfRealRows = CGRectGetMaxY(rectOfLastRealRow),
1893 rectBottom = CGRectGetMaxY(aRect);
1896 if (bottomOfRealRows >= rectBottom)
1899 var numberOfSynthesizedRows = CEIL((rectBottom - bottomOfRealRows) /
FULL_ROW_HEIGHT());
1901 rowRange.length += numberOfSynthesizedRows;
1917 var column = MAX(0, [
self columnAtPoint:CGPointMake(aRect.origin.x, 0.0)]),
1918 lastColumn = [
self columnAtPoint:CGPointMake(CGRectGetMaxX(aRect), 0.0)];
1924 if (_numberOfHiddenColumns <= 0)
1929 for (; column <= lastColumn; ++column)
1931 var tableColumn = _tableColumns[column];
1934 [indexSet addIndex:column];
1945 - (CPInteger)columnAtPoint:(CGPoint)aPoint
1953 if (!CGRectContainsPoint(
bounds, aPoint))
1960 high = _tableColumnRanges.length - 1;
1964 var middle = FLOOR(low + (high - low) / 2),
1965 range = _tableColumnRanges[middle];
1967 if (x < range.location)
1975 var numberOfColumns = _tableColumnRanges.length;
1977 while (middle < numberOfColumns && [_tableColumns[middle]
isHidden])
1980 if (middle < numberOfColumns)
1995 - (CPInteger)rowAtPoint:(CGPoint)aPoint
2004 if (aPoint.x < CGRectGetMinX(
bounds) || aPoint.x >= CGRectGetMaxX(
bounds))
2013 var heightInfo = [_cachedRowHeights lastObject];
2015 if (!heightInfo || aPoint.y >=
ROW_BOTTOM(heightInfo))
2018 return [_cachedRowHeights indexOfObject:aPoint
2021 usingComparator:function(aPoint, heightInfo)
2023 if (aPoint.y < heightInfo.y)
2024 return CPOrderedAscending;
2026 if (aPoint.y > ROW_BOTTOM(heightInfo))
2027 return CPOrderedDescending;
2029 return CPOrderedSame;
2036 return row >= _numberOfRows ? -1 : row;
2077 - (void)getColumn:(Function)columnRef row:(Function)rowRef forView:(
CPView)aView
2079 var columnResult = -1,
2082 if (aView && [aView isKindOfClass:[
CPView class]] && ![aView isKindOfClass:[
CPTableView class]])
2084 var cellView = aView,
2091 if (!cellView || cellView === contentView)
2098 var superview = [cellView superview];
2100 if ([superview isKindOfClass:[
CPTableView class]])
2106 cellView = superview;
2112 [
self _enumerateViewsInRows:_exposedRows columns:_exposedColumns usingBlock:function(view, row, column, stop)
2115 if (view === cellView)
2117 columnResult = column;
2126 columnRef(columnResult);
2139 - (CGRect)frameOfDataViewAtColumn:(CPInteger)aColumn row:(CPInteger)aRow
2143 if (aColumn > [
self numberOfColumns] || aRow > [
self numberOfRows])
2144 return CGRectMakeZero();
2146 var tableColumnRange = _tableColumnRanges[aColumn],
2148 leftInset = FLOOR(_intercellSpacing.width / 2.0),
2149 topInset = FLOOR(_intercellSpacing.height / 2.0);
2151 return CGRectMake(tableColumnRange.location + leftInset, CGRectGetMinY(rectOfRow) + topInset, tableColumnRange.length - _intercellSpacing.width, CGRectGetHeight(rectOfRow) - _intercellSpacing.height);
2157 - (void)resizeWithOldSuperviewSize:(CGSize)aSize
2161 if (_disableAutomaticResizing)
2164 var mask = _columnAutoResizingStyle;
2167 if (!_lastColumnShouldSnap)
2172 if (!superview || ![superview isKindOfClass:[
CPClipView class]])
2175 var superviewWidth = [superview bounds].size.width,
2176 lastColumnMaxX = CGRectGetMaxX([
self rectOfColumn:[
self numberOfColumns] -1]);
2179 if (lastColumnMaxX >= superviewWidth && lastColumnMaxX <= aSize.width || lastColumnMaxX <= superviewWidth && lastColumnMaxX >= aSize.width)
2180 _lastColumnShouldSnap = YES;
2186 [
self _resizeAllColumnUniformlyWithOldSize:aSize];
2190 [
self _autoResizeFirstColumn];
2196 - (void)_autoResizeFirstColumn
2198 var superview = [
self superview];
2206 columnToResize = nil,
2210 for (; i < count; i++)
2212 var column = _tableColumns[i];
2216 if (!columnToResize)
2217 columnToResize = column;
2218 totalWidth += [column
width] + _intercellSpacing.
width;
2225 var superviewSize = [superview bounds].size,
2226 newWidth = superviewSize.width - totalWidth;
2228 newWidth += [columnToResize
width];
2229 [columnToResize _tryToResizeToWidth:newWidth];
2232 [
self setNeedsLayout];
2240 - (void)_resizeAllColumnUniformlyWithOldSize:(CGSize)oldSize
2244 var superview = [
self superview];
2246 if (!superview || ![superview isKindOfClass:[
CPClipView class]])
2251 var superviewWidth = [superview bounds].size.width,
2254 remainingSpace = 0.0,
2259 for (; i < count; i++)
2261 var tableColumn = _tableColumns[i];
2263 [resizableColumns addIndex:i];
2266 var maxXofColumns = CGRectGetMaxX([
self rectOfColumn:[resizableColumns lastIndex]]),
2267 remainingSpace = superviewWidth - maxXofColumns,
2268 resizeableColumnsCount = [resizableColumns count],
2271 while (remainingSpace && resizeableColumnsCount)
2274 proportionate += remainingSpace / resizeableColumnsCount;
2277 remainingSpace = 0.0;
2281 while ((index = [resizableColumns indexGreaterThanIndex:index]) !==
CPNotFound)
2283 var item = _tableColumns[index],
2284 proposedWidth = [item width] + proportionate,
2285 resizeLeftovers = [item _tryToResizeToWidth:proposedWidth];
2287 if (resizeLeftovers)
2289 [resizableColumns removeIndex:index];
2291 remainingSpace += resizeLeftovers;
2300 while (count-- && [_tableColumns[count]
isHidden]);
2303 var delta = superviewWidth - CGRectGetMaxX([self rectOfColumn:count]) - ([self intercellSpacing].
width || 1),
2304 newSize = [item width] + delta;
2306 [item _tryToResizeToWidth:newSize];
2320 - (void)setColumnAutoresizingStyle:(
unsigned)style
2323 _columnAutoResizingStyle = style;
2329 - (unsigned)columnAutoresizingStyle
2331 return _columnAutoResizingStyle;
2337 - (void)sizeLastColumnToFit
2339 _lastColumnShouldSnap = YES;
2346 var superviewSize = [superview bounds].size;
2353 while (count-- && [_tableColumns[count]
isHidden]);
2358 var columnToResize = _tableColumns[count],
2359 newSize = MAX(0.0, superviewSize.width - CGRectGetMinX([
self rectOfColumn:count]) - _intercellSpacing.width);
2361 [columnToResize _tryToResizeToWidth:newSize];
2370 - (void)noteNumberOfRowsChanged
2372 var oldNumberOfRows = _numberOfRows;
2374 _numberOfRows = [
self _numberOfRows];
2376 _cachedRowHeights = [];
2384 var hangingSelections = oldNumberOfRows - _numberOfRows;
2386 if (hangingSelections > 0)
2388 var previousSelectionCount = [_selectedRowIndexes count];
2389 [_selectedRowIndexes removeIndexesInRange:CPMakeRange(_numberOfRows, hangingSelections)];
2391 if (![_selectedRowIndexes containsIndex:[
self selectedRow]])
2395 if (previousSelectionCount > [_selectedRowIndexes count])
2396 [
self _noteSelectionDidChange];
2405 - (void)_populateRowHeightCacheIfNeeded
2407 if ([
self numberOfRows] !== _cachedRowHeights.length)
2416 - (void)_noteHeightOfRowsWithIndexesChanged:(
CPIndexSet)anIndexSet
2428 var y = i < _cachedRowHeights.length ? _cachedRowHeights[i].y : 0;
2430 for (var count = [
self numberOfRows]; i < count; ++i)
2434 if ([anIndexSet containsIndex:i])
2435 height = [
self _sendDelegateHeightOfRow:i];
2437 height = _cachedRowHeights[i].height || _rowHeight;
2439 _cachedRowHeights[i] = {y:y, height:height};
2440 y += height + _intercellSpacing.height;
2449 - (void)noteHeightOfRowsWithIndexesChanged:(
CPIndexSet)anIndexSet
2451 [
self _noteHeightOfRowsWithIndexesChanged:anIndexSet];
2452 [
self _reloadDataViews];
2462 var
width = _tableColumnRanges.length > 0 ?
CPMaxRange([_tableColumnRanges lastObject]) : 0.0,
2468 else if (_numberOfRows > 0)
2470 [
self _populateRowHeightCacheIfNeeded];
2472 var heightInfo = _cachedRowHeights[_cachedRowHeights.length - 1];
2477 if ([superview isKindOfClass:[
CPClipView class]])
2479 var superviewSize = [superview bounds].size;
2482 height = MAX(superviewSize.height, height);
2497 - (void)scrollRowToVisible:(
int)rowIndex
2502 visible.origin.y = rowRect.origin.y;
2503 visible.size.height = rowRect.size.height;
2513 - (void)scrollColumnToVisible:(
int)columnIndex
2518 visible.origin.x = colRect.origin.x;
2519 visible.size.width = colRect.size.width;
2522 [_headerView scrollRectToVisible:colRect];
2533 if (_autosaveName === theAutosaveName)
2536 _autosaveName = theAutosaveName;
2539 [
self _restoreFromAutosave];
2547 return _autosaveName;
2556 - (void)setAutosaveTableColumns:(BOOL)shouldAutosave
2558 _autosaveTableColumns = shouldAutosave;
2564 - (BOOL)autosaveTableColumns
2566 return _autosaveTableColumns;
2574 return @"CPTableView Columns " + theAutosaveName;
2580 - (BOOL)_autosaveEnabled
2582 return [
self autosaveName] && [
self autosaveTableColumns];
2593 if (![
self _autosaveEnabled])
2597 autosaveName = [
self autosaveName];
2599 var columns = [
self tableColumns],
2602 for (var i = 0; i < [columns count]; i++)
2604 var column = [columns objectAtIndex:i],
2606 @"identifier": [column identifier],
2607 @"width": [column width]
2610 [columnsSetup addObject:metaData];
2613 [userDefaults setObject:columnsSetup forKey:[
self _columnsKeyForAutosaveName:autosaveName]];
2619 - (void)_restoreFromAutosave
2621 if (![
self _autosaveEnabled])
2625 autosaveName = [
self autosaveName],
2626 tableColumns = [userDefaults objectForKey:[
self _columnsKeyForAutosaveName:autosaveName]];
2628 if ([tableColumns count] != [[
self tableColumns] count])
2631 for (var i = 0; i < [tableColumns count]; i++)
2633 var metaData = [tableColumns objectAtIndex:i],
2634 columnIdentifier = [metaData objectForKey:@"identifier"],
2635 column = [
self columnWithIdentifier:columnIdentifier],
2636 tableColumn = [
self tableColumnWithIdentifier:columnIdentifier];
2640 [
self _moveColumn:column toColumn:i];
2641 [tableColumn setWidth:[metaData objectForKey:@"width"]];
2793 - (void)setDelegate:(
id <CPTableViewDelegate>)aDelegate
2795 if (_delegate === aDelegate)
2798 _delegate = aDelegate;
2799 _implementedDelegateMethods = 0;
2801 if ([_delegate respondsToSelector:
@selector(selectionShouldChangeInTableView:)])
2804 if ([_delegate respondsToSelector:
@selector(
tableView:viewForTableColumn:row:)])
2806 else if ([_delegate respondsToSelector:
@selector(
tableView:dataViewForTableColumn:row:)])
2809 CPLog.warn(
"tableView:dataViewForTableColumn: is deprecated. You should use -tableView:viewForTableColumn: where you can request the view with -makeViewWithIdentifier:owner:");
2812 [
self _updateIsViewBased];
2814 if ([_delegate respondsToSelector:
@selector(
tableView:didClickTableColumn:)])
2817 if ([_delegate respondsToSelector:
@selector(
tableView:didDragTableColumn:)])
2820 if ([_delegate respondsToSelector:
@selector(
tableView:heightOfRow:)])
2823 if ([_delegate respondsToSelector:
@selector(
tableView:isGroupRow:)])
2826 if ([_delegate respondsToSelector:
@selector(
tableView:mouseDownInHeaderOfTableColumn:)])
2829 if ([_delegate respondsToSelector:
@selector(
tableView:nextTypeSelectMatchFromRow:toRow:forString:)])
2832 if ([_delegate respondsToSelector:
@selector(
tableView:selectionIndexesForProposedSelection:)])
2835 if ([_delegate respondsToSelector:
@selector(
tableView:shouldEditTableColumn:row:)])
2838 if ([_delegate respondsToSelector:
@selector(
tableView:shouldSelectRow:)])
2841 if ([_delegate respondsToSelector:
@selector(
tableView:shouldSelectTableColumn:)])
2844 if ([_delegate respondsToSelector:
@selector(
tableView:shouldShowViewExpansionForTableColumn:row:)])
2847 if ([_delegate respondsToSelector:
@selector(
tableView:shouldTrackView:forTableColumn:row:)])
2850 if ([_delegate respondsToSelector:
@selector(
tableView:shouldTypeSelectForEvent:withCurrentSearchString:)])
2853 if ([_delegate respondsToSelector:
@selector(
tableView:toolTipForView:rect:tableColumn:row:mouseLocation:)])
2856 if ([_delegate respondsToSelector:
@selector(
tableView:typeSelectStringForTableColumn:row:)])
2859 if ([_delegate respondsToSelector:
@selector(
tableView:willDisplayView:forTableColumn:row:)])
2862 if ([_delegate respondsToSelector:
@selector(
tableView:willRemoveView:forTableColumn:row:)])
2865 if ([_delegate respondsToSelector:
@selector(
tableView:menuForTableColumn:row:)])
2868 if ([_delegate respondsToSelector:
@selector(
tableView:shouldReorderColumn:toColumn:)])
2871 if ([_delegate respondsToSelector:
@selector(tableViewColumnDidMove:)])
2874 if ([_delegate respondsToSelector:
@selector(tableViewColumnDidResize:)])
2877 if ([_delegate respondsToSelector:
@selector(tableViewSelectionDidChange:)])
2880 if ([_delegate respondsToSelector:
@selector(tableViewSelectionIsChanging:)])
2895 - (void)_didClickTableColumn:(CPInteger)clickedColumn modifierFlags:(
unsigned)modifierFlags
2897 [
self _changeSortDescriptorsForClickOnColumn:clickedColumn];
2899 if (_allowsColumnSelection)
2901 if ([
self _sendDelegateSelectionShouldChangeInTableView] && [
self _sendDelegateShouldSelectTableColumn:clickedColumn])
2903 [
self _noteSelectionIsChanging];
2906 if ([
self isColumnSelected:clickedColumn])
2907 [
self deselectColumn:clickedColumn];
2908 else if ([
self allowsMultipleSelection] == YES)
2916 var startColumn = MIN(clickedColumn, [_selectedColumnIndexes lastIndex]),
2917 endColumn = MAX(clickedColumn, [_selectedColumnIndexes firstIndex]);
2929 [
self _sendDelegateDidClickTableColumn:clickedColumn];
2937 - (void)_changeSortDescriptorsForClickOnColumn:(CPInteger)column
2939 var tableColumn = [_tableColumns objectAtIndex:column],
2940 newMainSortDescriptor = [tableColumn sortDescriptorPrototype];
2942 if (!newMainSortDescriptor)
2945 var oldMainSortDescriptor = nil,
2946 oldSortDescriptors = [
self sortDescriptors],
2947 newSortDescriptors = [CPArray arrayWithArray:oldSortDescriptors],
2949 e = [newSortDescriptors objectEnumerator],
2951 outdatedDescriptors = [CPArray array];
2953 if ([_sortDescriptors count] > 0)
2954 oldMainSortDescriptor = [[
self sortDescriptors] objectAtIndex: 0];
2957 while ((descriptor = [e nextObject]) !== nil)
2959 if ([[descriptor key]
isEqual: [newMainSortDescriptor key]])
2960 [outdatedDescriptors addObject:descriptor];
2964 if ([[newMainSortDescriptor key]
isEqual:[oldMainSortDescriptor key]])
2965 newMainSortDescriptor = [oldMainSortDescriptor reversedSortDescriptor];
2967 [newSortDescriptors removeObjectsInArray:outdatedDescriptors];
2968 [newSortDescriptors insertObject:newMainSortDescriptor atIndex:0];
2970 [
self setHighlightedTableColumn:tableColumn];
2971 [
self setSortDescriptors:newSortDescriptors];
2987 if ([headerView respondsToSelector:
@selector(_setIndicatorImage:)])
2988 [headerView _setIndicatorImage:anImage];
2995 - (
CPImage)_tableHeaderSortImage
2997 return [
self currentValueForThemeAttribute:@"sort-image"];
3003 - (
CPImage)_tableHeaderReverseSortImage
3005 return [
self currentValueForThemeAttribute:@"sort-image-reversed"];
3013 return _currentHighlightedTableColumn;
3021 if (_currentHighlightedTableColumn == aTableColumn)
3026 if (_currentHighlightedTableColumn != nil)
3027 [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelected];
3029 if (aTableColumn != nil)
3033 _currentHighlightedTableColumn = aTableColumn;
3042 - (BOOL)canDragRowsWithIndexes:(
CPIndexSet)rowIndexes atPoint:(CGPoint)mouseDownPoint
3057 - (
CPImage)dragImageForRowsWithIndexes:(
CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(
CPEvent)dragEvent offset:(CGPoint)dragImageOffset
3059 return [
self valueForThemeAttribute:@"image-generic-file"];
3074 - (
CPView)dragViewForRowsWithIndexes:(
CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(
CPEvent)theDragEvent offset:(CGPoint)dragViewOffset
3078 dragViewHeight = CGRectGetMaxY(lastRowFrame) - CGRectGetMinY(firstRowFrame);
3080 var
bounds = CGRectMake(0, 0, CGRectGetWidth([
self bounds]), dragViewHeight),
3081 dragView = [[
CPView alloc] initWithFrame:bounds];
3083 [dragView setAlphaValue:0.7];
3089 [
self _enumerateViewsInRows:theDraggedRows tableColumns:theTableColumns usingBlock:function(v, row, tableColumn, stop)
3091 var column = [_tableColumns indexOfObjectIdenticalTo:tableColumn],
3093 origin = [newDataView frame].origin;
3095 origin.y -= CGRectGetMinY(firstRowFrame);
3096 [newDataView setFrameOrigin:origin];
3098 [dragView addSubview:newDataView];
3102 dragViewOffset.x = CGRectGetWidth(
bounds) / 2 - dragPoint.x;
3103 dragViewOffset.y = CGRectGetHeight(
bounds) / 2 - dragPoint.y;
3108 - (
CPView)_dragViewForColumn:(CPInteger)columnIndex
3110 var headerFrame = [_headerView frame],
3111 visibleRect = [
self visibleRect],
3112 visibleRows = [
self rowsInRect:visibleRect],
3113 columnRect = [
self rectOfColumn:columnIndex],
3114 tableColumn = [[
self tableColumns] objectAtIndex:columnIndex],
3115 tableColumnUID = [tableColumn UID],
3116 columnHeaderView = [tableColumn headerView],
3117 columnHeaderFrame = [columnHeaderView frame],
3118 frame = CGRectMake(MAX(CGRectGetMinX(columnRect) - CGRectGetMinX(visibleRect), 0.0),
3120 CGRectGetWidth(columnHeaderFrame),
3121 CGRectGetHeight(visibleRect) + CGRectGetHeight(headerFrame));
3124 var dragView = [[_CPColumnDragDrawingView alloc] initWithFrame:frame];
3126 [dragView setTableView:self];
3127 [dragView setColumnIndex:columnIndex];
3129 [dragView setAlphaValue:0.6];
3132 var columnVisRect = CGRectIntersection(columnRect, visibleRect);
3134 frame = CGRectMake(0.0, CGRectGetHeight(headerFrame), CGRectGetWidth(columnRect), CGRectGetHeight(columnVisRect));
3138 [dragView addSubview:columnClipView];
3139 [dragView setColumnClipView:columnClipView];
3140 _draggedColumnIsSelected = [
self isColumnSelected:columnIndex];
3142 var columnLeft = CGRectGetMinX(columnRect),
3143 offset = CGPointMake(columnLeft, CGRectGetMinY(visibleRect));
3145 [
self _enumerateViewsInRows:_exposedRows columns:[
CPIndexSet indexSetWithIndex:columnIndex] usingBlock:function(dataView, row, column, stop)
3147 [
self _addDraggedDataView:dataView toView:columnClipView forColumn:column row:row offset:offset];
3149 delete (_dataViewsForRows[row][tableColumnUID]);
3153 columnHeaderFrame.origin = CGPointMakeZero();
3155 var dragColumnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:columnHeaderFrame],
3156 image = [columnHeaderView _indicatorImage];
3158 [dragColumnHeaderView setStringValue:[columnHeaderView stringValue]];
3159 [dragColumnHeaderView setThemeState:[columnHeaderView themeState]];
3160 [dragColumnHeaderView _setIndicatorImage:image];
3163 [dragColumnHeaderView setTag:1];
3165 [dragView addSubview:dragColumnHeaderView];
3168 [_selectedColumnIndexes removeIndex:columnIndex];
3169 [
self setNeedsDisplay:YES];
3174 - (void)_addDraggedDataView:(
CPView)aDataView toView:(
CPView)aSuperview forColumn:(CPInteger)column row:(CPInteger)row offset:(CGPoint)offset
3176 var dataViewFrame = [
self frameOfDataViewAtColumn:column row:row];
3178 dataViewFrame.origin.x -= offset.x;
3180 dataViewFrame.origin.y -= offset.y;
3182 [aDataView
setFrame:dataViewFrame];
3191 - (void)setDraggingSourceOperationMask:(CPDragOperation)mask forLocal:(BOOL)isLocal
3194 _dragOperationDefaultMask = mask;
3202 - (void)setDropRow:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation
3207 reason =
@"Attempt to set dropRow=" + row +
3208 " dropOperation=CPTableViewDropOn when [0 - " + numberOfRows +
"] is valid range of rows.";
3213 _retargetedDropRow = row;
3214 _retargetedDropOperation = operation;
3228 - (void)setDraggingDestinationFeedbackStyle:(CPTableViewDraggingDestinationFeedbackStyle)aStyle
3231 _destinationDragStyle = aStyle;
3244 - (CPTableViewDraggingDestinationFeedbackStyle)draggingDestinationFeedbackStyle
3246 return _destinationDragStyle;
3254 - (void)setVerticalMotionCanBeginDrag:(BOOL)aFlag
3256 _verticalMotionCanDrag = aFlag;
3262 - (BOOL)verticalMotionCanBeginDrag
3264 return _verticalMotionCanDrag;
3269 var tableColumns = [
self tableColumns];
3271 for (var i = 0; i < [tableColumns count]; i++)
3273 var tableColumn = [tableColumns objectAtIndex:i],
3274 sortDescriptorPrototype = [tableColumn sortDescriptorPrototype];
3276 if (!sortDescriptorPrototype)
3279 if ([sortDescriptorPrototype key] === [theSortDescriptor key]
3280 && [sortDescriptorPrototype selector] === [theSortDescriptor selector])
3294 - (void)setSortDescriptors:(CPArray)sortDescriptors
3297 newSortDescriptors = [CPArray array];
3299 if (sortDescriptors !== nil)
3300 [newSortDescriptors addObjectsFromArray:sortDescriptors];
3302 if ([newSortDescriptors
isEqual:oldSortDescriptors])
3305 _sortDescriptors = newSortDescriptors;
3307 var oldColumn = nil,
3310 if ([newSortDescriptors count] > 0)
3312 var newMainSortDescriptor = [newSortDescriptors objectAtIndex:0];
3313 newColumn = [
self _tableColumnForSortDescriptor:newMainSortDescriptor];
3316 if ([oldSortDescriptors count] > 0)
3318 var oldMainSortDescriptor = [oldSortDescriptors objectAtIndex:0];
3319 oldColumn = [
self _tableColumnForSortDescriptor:oldMainSortDescriptor];
3322 var image = [newMainSortDescriptor ascending] ? [
self _tableHeaderSortImage] : [
self _tableHeaderReverseSortImage];
3326 [
self _sendDataSourceSortDescriptorsDidChange:oldSortDescriptors];
3328 var binderClass = [[
self class] _binderClassForBinding:@"sortDescriptors"];
3329 [[binderClass getBinding:@"sortDescriptors" forObject:self] reverseSetValueFor:@"sortDescriptors"];
3335 - (CPArray)sortDescriptors
3337 return _sortDescriptors;
3343 - (id)_objectValueForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex useCache:(BOOL)useCache
3347 var tableColumnUID = [aTableColumn
UID],
3348 tableColumnObjectValues = _objectValues[tableColumnUID];
3350 if (!tableColumnObjectValues)
3352 tableColumnObjectValues = [];
3353 _objectValues[tableColumnUID] = tableColumnObjectValues;
3357 objectValue = tableColumnObjectValues[aRowIndex];
3360 if (objectValue === undefined)
3362 if ([
self _dataSourceRespondsToObjectValueForTableColumn])
3364 objectValue = [
self _sendDataSourceObjectValueForTableColumn:aTableColumn row:aRowIndex];
3365 tableColumnObjectValues[aRowIndex] = objectValue;
3367 else if (!_isViewBased && ![
self infoForBinding:
@"content"])
3369 CPLog.warn(
@"no content binding established and data source " + [_dataSource
description] +
" does not implement tableView:objectValueForTableColumn:row:");
3380 - (CGRect)exposedRect
3388 if ([superview isKindOfClass:[
CPClipView class]])
3389 _exposedRect = [superview bounds];
3391 _exposedRect = [
self bounds];
3394 return _exposedRect;
3404 [
self _unloadDataViewsInRows:_exposedRows columns:_exposedColumns];
3409 _reloadAllRows = NO;
3415 obscuredRows = [_exposedRows copy],
3416 obscuredColumns = [_exposedColumns copy];
3418 [obscuredRows removeIndexes:exposedRows];
3419 [obscuredColumns removeIndexes:exposedColumns];
3421 var newlyExposedRows = [exposedRows copy],
3422 newlyExposedColumns = [exposedColumns copy];
3424 [newlyExposedRows removeIndexes:_exposedRows];
3425 [newlyExposedColumns removeIndexes:_exposedColumns];
3427 var previouslyExposedRows = [exposedRows copy],
3428 previouslyExposedColumns = [exposedColumns copy];
3430 [previouslyExposedRows removeIndexes:newlyExposedRows];
3431 [previouslyExposedColumns removeIndexes:newlyExposedColumns];
3433 [
self _unloadDataViewsInRows:previouslyExposedRows columns:obscuredColumns];
3434 [
self _unloadDataViewsInRows:obscuredRows columns:previouslyExposedColumns];
3435 [
self _unloadDataViewsInRows:obscuredRows columns:obscuredColumns];
3436 [
self _unloadDataViewsInRows:newlyExposedRows columns:newlyExposedColumns];
3438 [
self _loadDataViewsInRows:previouslyExposedRows columns:newlyExposedColumns];
3439 [
self _loadDataViewsInRows:newlyExposedRows columns:previouslyExposedColumns];
3440 [
self _loadDataViewsInRows:newlyExposedRows columns:newlyExposedColumns];
3442 _exposedRows = exposedRows;
3443 _exposedColumns = exposedColumns;
3445 [_tableDrawView setFrame:exposedRect];
3451 if (_needsDifferedTableColumnRemove)
3453 var removeCount = [_differedColumnDataToRemove count],
3456 for (var i = 0; i < removeCount; i++)
3458 var data = _differedColumnDataToRemove[i],
3459 tableColumn = data.column,
3460 columnIdx = [_tableColumns indexOfObject:tableColumn];
3463 [removeIndexes addIndex:columnIdx];
3467 [
self _unloadDataViewsInRows:rowIndexes columns:removeIndexes];
3469 [_tableColumns removeObjectsAtIndexes:removeIndexes];
3471 _dirtyTableColumnRangeIndex = 0;
3472 [
self _recalculateTableColumnRanges];
3474 [_differedColumnDataToRemove removeAllObjects];
3475 _needsDifferedTableColumnRemove = NO;
3482 var dataViews = _cachedDataViews[identifier],
3483 count = dataViews.length;
3486 [dataViews[count] removeFromSuperview];
3495 if (![rowIndexes count] || ![columnIndexes count] || [columnIndexes lastIndex] >= [_tableColumns count])
3499 if ([columnIndexes containsIndex:_editingColumn] && [rowIndexes containsIndex:_editingRow])
3500 [
self _resignEditedView];
3502 var tableColumns = [_tableColumns objectsAtIndexes:columnIndexes];
3504 [
self _enumerateViewsInRows:rowIndexes tableColumns:tableColumns usingBlock:function(dataView, row, tableColumn, stop)
3506 var dataViewsForRows = _dataViewsForRows[row],
3507 tableColumnUID = [tableColumn UID];
3509 delete (dataViewsForRows[tableColumnUID]);
3511 [
self _sendDelegateWillRemoveView:dataView forTableColumn:tableColumn row:row];
3512 [
self _enqueueReusableDataView:dataView];
3521 if (![rowIndexes count] || ![columnIndexes count])
3526 if (_numberOfHiddenColumns > 0)
3529 return ![_tableColumns[idx] isHidden];
3534 if (!_dataViewsForRows[rowIndex])
3535 _dataViewsForRows[rowIndex] = {};
3537 var dataViewsForRow = _dataViewsForRows[rowIndex],
3538 isRowSelected = [
self isRowSelected:rowIndex],
3543 var tableColumn = _tableColumns[columnIndex],
3544 tableColumnUID = [tableColumn UID],
3545 dataView = [
self _preparedViewAtColumn:columnIndex row:row isRowSelected:isRowSelected];
3547 if ([dataView superview] !== self)
3548 [
self addSubview:dataView];
3550 dataViewsForRow[tableColumnUID] = dataView;
3555 - (
CPView)preparedViewAtColumn:(CPInteger)column row:(CPInteger)row
3557 return [
self _preparedViewAtColumn:column row:row isRowSelected:[
self isRowSelected:row]];
3560 - (
CPView)_preparedViewAtColumn:(CPInteger)column row:(CPInteger)row isRowSelected:(BOOL)isRowSelected
3562 var tableColumn = _tableColumns[column],
3563 tableColumnUID = [tableColumn UID],
3564 dataView = [
self _newDataViewForRow:row tableColumn:tableColumn];
3566 [dataView setFrame:[
self frameOfDataViewAtColumn:column row:row]];
3568 [
self _setObjectValueForTableColumn:tableColumn row:row forView:dataView];
3571 _BlockSelectView(dataView, row, column);
3573 _BlockDeselectView(dataView, row, column);
3578 if ([_delegate
tableView:
self isGroupRow:row])
3580 [_groupRows addIndex:row];
3581 [dataView setThemeState:CPThemeStateGroupRow];
3585 [_groupRows removeIndexesInRange:CPMakeRange(row, 1)];
3586 [dataView unsetThemeState:CPThemeStateGroupRow];
3589 [
self setNeedsDisplay:YES];
3593 [
self _setEditingState:NO forView:dataView];
3595 [
self _sendDelegateWillDisplayView:dataView forTableColumn:tableColumn row:row];
3600 - (void)_setObjectValueForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRow forView:(
CPView)aDataView
3602 [
self _setObjectValueForTableColumn:aTableColumn row:aRow forView:aDataView useCache:!_invalidateObjectValuesCache];
3605 - (void)_setObjectValueForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRow forView:(
CPView)aDataView useCache:(BOOL)useCache
3608 [aDataView setObjectValue:[
self _objectValueForTableColumn:aTableColumn row:aRow useCache:useCache]];
3613 if (_contentBindingExplicitlySet)
3614 [
self _prepareContentBindedDataView:aDataView forRow:aRow];
3617 [aTableColumn _prepareDataView:aDataView forRow:aRow];
3620 - (void)_prepareContentBindedDataView:(
CPView)dataView forRow:(CPInteger)aRow
3623 content = [binder content],
3624 rowContent = [content objectAtIndex:aRow];
3626 [dataView setObjectValue:rowContent];
3632 - (void)_layoutViewsForRowIndexes:(
CPIndexSet)rowIndexes columnIndexes:(
CPIndexSet)columnIndexes
3634 [
self _enumerateViewsInRows:rowIndexes columns:columnIndexes usingBlock:function(view, row, column, stop)
3636 [view setFrame:[
self frameOfDataViewAtColumn:column row:row]];
3647 if (_viewForTableColumnRowSelector)
3648 view =
self.isa.objj_msgSend2(
self, _viewForTableColumnRowSelector, aTableColumn, aRow);
3660 view = [
self makeViewWithIdentifier:identifier owner:_delegate];
3665 view = [
self makeViewWithIdentifier:identifier owner:_delegate];
3668 view = [aTableColumn _newDataView];
3671 [view setIdentifier:identifier];
3689 - (id)makeViewWithIdentifier:(
CPString)anIdentifier owner:(
id)anOwner
3696 reusableViews = _cachedDataViews[anIdentifier];
3698 if (reusableViews && reusableViews.length)
3699 view = reusableViews.pop();
3701 else if (_isViewBased)
3702 view = [
self _unarchiveViewWithIdentifier:anIdentifier owner:anOwner];
3719 - (id)viewAtColumn:(CPInteger)column row:(CPInteger)row makeIfNecessary:(BOOL)makeIfNecessary
3721 if (row > (_numberOfRows - 1))
3723 reason:@"Row " + row + " out of row range [0-" + (_numberOfRows - 1) + "] for rowViewAtRow:createIfNeeded:"];
3727 reason:@"Column " + column + " out of row range [0-" + (NUMBER_OF_COLUMNS ()- 1) + "] for rowViewAtRow:createIfNeeded:"];
3729 var dataViewsForRow = _dataViewsForRows[row],
3730 tableColumn = _tableColumns[column],
3731 tableColumnUID = [tableColumn UID],
3732 view = dataViewsForRow ? dataViewsForRow[tableColumnUID] : nil;
3734 if (!makeIfNecessary)
3739 if (!dataViewsForRow)
3741 dataViewsForRow = {};
3742 _dataViewsForRows[row] = dataViewsForRow;
3750 if ([view superview] !==
self)
3753 dataViewsForRow[tableColumnUID] = view;
3755 [_exposedRows addIndex:row];
3756 [_exposedColumns addIndex:column];
3768 - (
CPView)_unarchiveViewWithIdentifier:(
CPString)anIdentifier owner:(
id)anOwner
3770 var cib = [_archivedDataViews objectForKey:anIdentifier];
3772 if (!cib && !_unavailable_custom_cibs[anIdentifier])
3780 _unavailable_custom_cibs[anIdentifier] = YES;
3785 load = [cib instantiateCibWithOwner:anOwner topLevelObjects:objects];
3790 var count = objects.length;
3794 var obj = objects[count];
3796 if ([obj isKindOfClass:[
CPView class]])
3798 [obj setIdentifier:anIdentifier];
3799 [obj setAutoresizingMask:CPViewNotSizable];
3808 - (void)_updateIsViewBased
3810 if ([
self _delegateRespondsToViewForTableColumn])
3811 _viewForTableColumnRowSelector =
@selector(_sendDelegateViewForTableColumn:row:);
3812 else if ([
self _delegateRespondsToDataViewForTableColumn])
3813 _viewForTableColumnRowSelector =
@selector(_sendDelegateDataViewForTableColumn:row:);
3815 _isViewBased = (_viewForTableColumnRowSelector !== nil || _archivedDataViews !== nil);
3833 - (void)enumerateAvailableViewsUsingBlock:(Function)handler
3839 [
self _enumerateViewsInRows:_exposedRows columns:_exposedColumns usingBlock:handler];
3846 - (void)_enumerateViewsInRows:(
CPIndexSet)rowIndexes columns:(
CPIndexSet)columnIndexes usingBlock:(Function)handler
3852 var dataViewsForRow = _dataViewsForRows[rowIndex];
3854 if (!dataViewsForRow)
3861 var tableColumnUID = [_tableColumns[columnIndex] UID],
3862 view = dataViewsForRow[tableColumnUID];
3865 handler(view, row, columnIndex, stopCol);
3873 - (void)_enumerateViewsInRows:(
CPIndexSet)rowIndexes tableColumns:(CPArray)tableColumns usingBlock:(Function)handler
3879 var dataViewsForRow = _dataViewsForRows[rowIndex];
3881 if (!dataViewsForRow)
3886 [tableColumns enumerateObjectsUsingBlock:function(tableColumn, idx, stopCol)
3888 var tableColumnUID = [tableColumn UID],
3889 view = dataViewsForRow[tableColumnUID];
3892 handler(view, row, tableColumn, stopCol);
3903 - (void)_enqueueReusableDataView:(
CPView)aDataView
3915 _cachedDataViews[identifier] = [aDataView];
3917 _cachedDataViews[identifier].push(aDataView);
3924 - (void)setFrameSize:(CGSize)aSize
3929 [_headerView setFrameSize:CGSizeMake(CGRectGetWidth([
self frame]), CGRectGetHeight([_headerView frame]))];
3937 - (void)setFrameOrigin:(CGPoint)aPoint
3947 - (void)setBoundsOrigin:(CGPoint)aPoint
3957 - (void)setBoundsSize:(CGSize)aSize
3970 [_tableDrawView setNeedsDisplay:aFlag];
3978 - (void)setNeedsLayout
3989 return [[
self window] isKeyWindow] && ([[
self window] firstResponder] ===
self || _editingRow !==
CPNotFound);
3995 - (void)_drawRect:(CGRect)aRect
4000 var exposedRect = [
self exposedRect];
4002 [
self drawBackgroundInClipRect:exposedRect];
4003 [
self highlightSelectionInClipRect:exposedRect];
4004 [
self drawGridInClipRect:exposedRect];
4006 if (_implementsCustomDrawRow)
4007 [
self _drawRows:_exposedRows clipRect:exposedRect];
4015 - (void)drawBackgroundInClipRect:(CGRect)aRect
4017 if (!_usesAlternatingRowBackgroundColors)
4021 colorCount = [rowColors count];
4023 if (colorCount === 0)
4028 if (colorCount === 1)
4036 var exposedRows = [
self _exposedRowsInRect:aRect],
4037 firstRow = FLOOR(exposedRows.location / colorCount) * colorCount,
4043 while (colorIndex < colorCount)
4047 for (var row = firstRow + colorIndex; row <= lastRow; row += colorCount)
4050 if (![_groupRows containsIndex:row])
4051 CGContextAddRect(context, CGRectIntersection(aRect, [
self _rectOfRow:row checkRange:NO]));
4053 groupRowRects.push(CGRectIntersection(aRect, [
self _rectOfRow:row checkRange:NO]));
4064 [
self _drawGroupRowsForRects:groupRowRects];
4071 - (void)drawGridInClipRect:(CGRect)aRect
4075 lineThickness = [
self currentValueForThemeAttribute:@"grid-line-thickness"];
4084 var exposedRows = [
self _exposedRowsInRect:aRect],
4085 row = exposedRows.location,
4087 rowY = -lineThickness / 2,
4088 minX = CGRectGetMinX(aRect),
4089 maxX = CGRectGetMaxX(aRect);
4091 for (; row <= lastRow; ++row)
4094 var rowRect = [
self _rectOfRow:row checkRange:NO],
4095 rowY = CGRectGetMaxY(rowRect) - lineThickness / 2;
4101 if (_rowHeight > 0.0)
4104 totalHeight = CGRectGetMaxY(aRect) - lineThickness / 2;
4106 while (rowY < totalHeight)
4121 [exposedColumnIndexes getIndexes:columnsArray maxCount:-1 inIndexRange:nil];
4123 var columnArrayIndex = 0,
4124 columnArrayCount = columnsArray.length,
4125 minY = CGRectGetMinY(aRect),
4126 maxY = CGRectGetMaxY(aRect);
4128 for (; columnArrayIndex < columnArrayCount; ++columnArrayIndex)
4130 var columnRect = [
self rectOfColumn:columnsArray[columnArrayIndex]],
4131 columnX = CGRectGetMaxX(columnRect) - lineThickness / 2;
4149 - (void)highlightSelectionInClipRect:(CGRect)aRect
4156 rectSelector =
@selector(rectOfRow:);
4158 if ([_selectedRowIndexes count] >= 1)
4161 firstRow = [exposedRows firstIndex],
4162 exposedRange =
CPMakeRange(firstRow, [exposedRows lastIndex] - firstRow + 1);
4164 [_selectedRowIndexes getIndexes:indexes maxCount:-1 inIndexRange:exposedRange];
4166 else if ([_selectedColumnIndexes count] >= 1)
4168 rectSelector =
@selector(rectOfColumn:);
4171 firstColumn = [exposedColumns firstIndex],
4172 exposedRange =
CPMakeRange(firstColumn, [exposedColumns lastIndex] - firstColumn + 1);
4174 [_selectedColumnIndexes getIndexes:indexes maxCount:-1 inIndexRange:exposedRange];
4178 count2 = count = [indexes count];
4185 focused = [
self _isFocused];
4192 topLineColor = [gradientCache objectForKey:CPSourceListTopLineColor],
4193 bottomLineColor = [gradientCache objectForKey:CPSourceListBottomLineColor],
4194 gradientColor = [gradientCache objectForKey:CPSourceListGradient];
4200 if ([_groupRows count])
4204 gradientGroupColor =
CGGradientCreateWithColorComponents(
CGColorSpaceCreateDeviceRGB(), [212.0 / 255.0, 212.0 / 255.0, 212.0 / 255.0, 1.0, 197.0 / 255.0, 197.0 / 255.0, 197.0 / 255.0, 1.0], [0, 1], 2);
4209 var currentIndex = indexes[count],
4210 rowRect = CGRectIntersection(
self.
isa.objj_msgSend1(
self, rectSelector, currentIndex), aRect);
4214 var shouldUseGroupGradient = [_groupRows containsIndex:currentIndex];
4216 if (drawGradient || shouldUseGroupGradient)
4218 var minX = CGRectGetMinX(rowRect),
4219 minY = CGRectGetMinY(rowRect),
4220 maxX = CGRectGetMaxX(rowRect),
4221 maxY = CGRectGetMaxY(rowRect) - deltaHeight;
4226 [normalSelectionHighlightColor setFill];
4234 CGContextDrawLinearGradient(context, (shouldUseGroupGradient) ? gradientGroupColor : gradientColor, rowRect.origin, CGPointMake(minX, maxY), 0);
4250 var radius = [
self currentValueForThemeAttribute:@"selection-radius"];
4254 var minX = CGRectGetMinX(rowRect),
4255 maxX = CGRectGetMaxX(rowRect),
4256 minY = CGRectGetMinY(rowRect),
4257 maxY = CGRectGetMaxY(rowRect);
4274 [normalSelectionHighlightColor setFill];
4282 for (var i = 0; i < count2; i++)
4284 var rect =
self.isa.objj_msgSend1(
self, rectSelector, indexes[i]),
4285 minX = CGRectGetMinX(rect) - 0.5,
4286 maxX = CGRectGetMaxX(rect) - 0.5,
4287 minY = CGRectGetMinY(rect) - 0.5,
4288 maxY = CGRectGetMaxY(rect) - 0.5;
4293 exposedColumnIndexes = [],
4294 firstExposedColumn = [exposedColumns firstIndex],
4295 exposedRange =
CPMakeRange(firstExposedColumn, [exposedColumns lastIndex] - firstExposedColumn + 1);
4297 [exposedColumns getIndexes:exposedColumnIndexes maxCount:-1 inIndexRange:exposedRange];
4299 var exposedColumnCount = [exposedColumnIndexes count];
4301 for (var c = firstExposedColumn; c < exposedColumnCount; c++)
4303 var colRect = [
self rectOfColumn:exposedColumnIndexes[c]],
4304 colX = CGRectGetMaxX(colRect) + 0.5;
4312 if ([indexes containsObject:indexes[i] + 1])
4329 - (void)_drawGroupRowsForRects:(CPArray)rects
4339 var gradientCache = [
self selectionGradientColors],
4343 199.0 / 255.0, 199.0 / 255.0, 199.0 / 255.0, 1.0], [0, 1], 2),
4348 var rowRect = rects[i];
4354 var minX = CGRectGetMinX(rowRect),
4355 minY = CGRectGetMinY(rowRect),
4356 maxX = CGRectGetMaxX(rowRect),
4357 maxY = CGRectGetMaxY(rowRect);
4379 - (void)_drawRows:(
CPIndexSet)rowsIndexes clipRect:(CGRect)clipRect
4385 [
self drawRow:row clipRect:CGRectIntersection(clipRect, [
self rectOfRow:row])];
4396 - (void)drawRow:(CPInteger)row clipRect:(CGRect)rect
4405 - (void)layoutSubviews
4413 - (void)viewWillMoveToSuperview:(
CPView)aView
4415 if ([aView isKindOfClass:[
CPClipView class]])
4417 _observedClipView = aView;
4421 [
self _stopObservingClipView];
4422 _observedClipView = nil;
4452 - (BOOL)tracksMouseOutsideOfFrame
4460 - (BOOL)startTrackingAt:(CGPoint)aPoint
4471 if (row < 0 && _allowsEmptySelection)
4473 if ([
self _sendDelegateSelectionShouldChangeInTableView])
4475 var indexSet = [
self _sendDelegateSelectionIndexesForProposedSelection:[
CPIndexSet indexSet]];
4477 [
self _noteSelectionIsChanging];
4483 _selectionAnchorRow = (ABS([_selectedRowIndexes firstIndex] - row) < ABS([_selectedRowIndexes lastIndex] - row)) ?
4484 [_selectedRowIndexes firstIndex] : [_selectedRowIndexes lastIndex];
4486 _selectionAnchorRow = row;
4489 _startTrackingPoint = aPoint;
4490 _startTrackingTimestamp =
new Date();
4492 if ([
self _dataSourceRespondsToSetObjectValueForTableColumnRow])
4493 _trackingPointMovedOutOfClickSlop = NO;
4497 if (row >= 0 && !([
self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard]))
4498 [
self _updateSelectionWithMouseAtRow:row];
4508 if (!([
self _delegateRespondsToMenuForTableColumnRow]))
4514 tableColumn = [[
self tableColumns] objectAtIndex:column];
4516 return [
self _sendDelegateMenuForTableColumn:tableColumn row:row];
4525 if (![_draggedRowIndexes count])
4531 [CPApp sendEvent:anEvent];
4543 - (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint
4552 if (!_isSelectingSession && [
self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard])
4554 if (row >= 0 && (ABS(_startTrackingPoint.x - aPoint.x) > 3 || (_verticalMotionCanDrag && ABS(_startTrackingPoint.y - aPoint.y) > 3)) ||
4555 ([_selectedRowIndexes containsIndex:row]))
4557 if ([_selectedRowIndexes containsIndex:row])
4565 if ([
self canDragRowsWithIndexes:_draggedRowIndexes atPoint:aPoint] && [
self _sendDataSourceWriteRowsWithIndexes:_draggedRowIndexes toPasteboard:pboard])
4567 var currentEvent = [CPApp currentEvent],
4568 offset = CGPointMakeZero(),
4569 tableColumns = [_tableColumns objectsAtIndexes:_exposedColumns];
4585 view = [[
CPImageView alloc] initWithFrame:CGRectMake(0, 0, [image size].width, [image size].height)];
4586 [view setImage:image];
4589 var
bounds = [view bounds],
4591 viewLocation = CGPointMake(aPoint.x - CGRectGetWidth(
bounds) / 2 + offset.x, aPoint.y - CGRectGetHeight(
bounds) / 2 + offset.y + CGRectGetMinY(firstRowFrame));
4594 _startTrackingPoint = nil;
4602 else if (ABS(_startTrackingPoint.x - aPoint.x) < 5 && ABS(_startTrackingPoint.y - aPoint.y) < 5)
4606 _isSelectingSession = YES;
4607 if (row >= 0 && row !== _lastTrackedRowIndex)
4609 _lastTrackedRowIndex = row;
4610 [
self _updateSelectionWithMouseAtRow:row];
4613 if ([
self _dataSourceRespondsToSetObjectValueForTableColumnRow]
4614 && !_trackingPointMovedOutOfClickSlop)
4616 var CLICK_SPACE_DELTA = 5.0;
4617 if (ABS(aPoint.x - _startTrackingPoint.x) > CLICK_SPACE_DELTA
4618 || ABS(aPoint.y - _startTrackingPoint.y) > CLICK_SPACE_DELTA)
4620 _trackingPointMovedOutOfClickSlop = YES;
4630 - (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
4632 _isSelectingSession = NO;
4634 var CLICK_TIME_DELTA = 1000,
4643 if ([
self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard])
4645 rowIndex = _clickedRow;
4647 if (rowIndex !== -1)
4649 if ([_draggedRowIndexes count] > 0)
4655 _previouslySelectedRowIndexes = [_selectedRowIndexes copy];
4656 [
self _updateSelectionWithMouseAtRow:rowIndex];
4661 if (!_isViewBased && mouseIsUp
4662 && !_trackingPointMovedOutOfClickSlop
4663 && ([[
CPApp currentEvent] clickCount] > 1)
4664 && ([
self _dataSourceRespondsToSetObjectValueForTableColumnRow]
4665 || [
self infoForBinding:
@"content"]))
4671 column = _tableColumns[columnIndex];
4673 if ([column isEditable])
4677 if (rowIndex !== -1)
4679 if ([
self _sendDelegateShouldEditTableColumn:column row:rowIndex])
4691 if ([[
CPApp currentEvent] clickCount] === 2 && _doubleAction)
4698 - (CPDragOperation)draggingEntered:(
id)sender
4701 dropOperation = [
self _proposedDropOperationAtPoint:location],
4702 row = [
self _proposedRowAtPoint:location];
4704 if (_retargetedDropRow !== nil)
4705 row = _retargetedDropRow;
4708 count = [draggedTypes count],
4711 for (; i < count; i++)
4713 if ([[[sender draggingPasteboard] types] containsObject:[draggedTypes objectAtIndex: i]])
4714 return [
self _sendDataSourceValidateDrop:sender proposedRow:row proposedDropOperation:dropOperation];
4723 - (void)draggingExited:(
id)sender
4725 [_dropOperationFeedbackView removeFromSuperview];
4731 - (void)draggingEnded:(
id)sender
4733 [
self _draggingEnded];
4739 - (void)_draggingEnded
4741 _retargetedDropOperation = nil;
4742 _retargetedDropRow = nil;
4744 [_dropOperationFeedbackView removeFromSuperview];
4750 - (BOOL)wantsPeriodicDraggingUpdates
4758 - (CPTableViewDropOperation)_proposedDropOperationAtPoint:(CGPoint)theDragPoint
4760 if (_retargetedDropOperation !== nil)
4761 return _retargetedDropOperation;
4763 var row = [
self _proposedRowAtPoint:theDragPoint],
4764 rowRect = [
self rectOfRow:row];
4768 if ([
self intercellSpacing].height < 5.0)
4769 rowRect = CGRectInset(rowRect, 0.0, 5.0 - [
self intercellSpacing].height);
4774 if (CGRectContainsPoint(rowRect, theDragPoint) && row < _numberOfRows)
4783 - (CPInteger)_proposedRowAtPoint:(CGPoint)dragPoint
4785 var row = [
self rowAtPoint:dragPoint],
4788 rect = [self rectOfRow:row],
4789 bottomPoint = CGRectGetMaxY(rect),
4790 bottomThirty = bottomPoint - ((bottomPoint - CGRectGetMinY(rect)) * 0.3),
4791 numberOfRows = [self numberOfRows];
4794 row = (CGRectGetMaxY(rect) < dragPoint.y) ? numberOfRows : row;
4795 else if (dragPoint.y > MAX(bottomThirty, bottomPoint - 6))
4798 row = MIN(numberOfRows, row);
4806 - (CGRect)_rectForDropHighlightViewOnRow:(CPInteger)theRowIndex
4808 if (theRowIndex >= [
self numberOfRows])
4809 theRowIndex = [
self numberOfRows] - 1;
4811 return [
self _rectOfRow:theRowIndex checkRange:NO];
4817 - (CGRect)_rectForDropHighlightViewBetweenUpperRow:(CPInteger)theUpperRowIndex andLowerRow:(CPInteger)theLowerRowIndex offset:(CGPoint)theOffset
4819 if (theLowerRowIndex > [
self numberOfRows])
4820 theLowerRowIndex = [
self numberOfRows];
4822 return [
self _rectOfRow:theLowerRowIndex checkRange:NO];
4828 - (CPDragOperation)draggingUpdated:(
id)sender
4830 _retargetedDropRow = nil;
4831 _retargetedDropOperation = nil;
4834 dropOperation = [
self _proposedDropOperationAtPoint:location],
4836 row = [
self _proposedRowAtPoint:location],
4837 dragOperation = [
self _sendDataSourceValidateDrop:sender proposedRow:row proposedDropOperation:dropOperation];
4839 if (_retargetedDropRow !== nil)
4840 row = _retargetedDropRow;
4842 if (_retargetedDropOperation !== nil)
4843 dropOperation = _retargetedDropOperation;
4846 row = numberOfRows - 1;
4848 var rect = CGRectMakeZero();
4853 rect = [
self _rectForDropHighlightViewBetweenUpperRow:row - 1 andLowerRow:row offset:location];
4855 rect = [
self _rectForDropHighlightViewOnRow:row];
4857 [_dropOperationFeedbackView setDropOperation:row !== -1 ? dropOperation : CPDragOperationNone];
4858 [_dropOperationFeedbackView setHidden:(dragOperation == CPDragOperationNone)];
4859 [_dropOperationFeedbackView setFrame:rect];
4860 [_dropOperationFeedbackView setCurrentRow:row];
4861 [
self addSubview:_dropOperationFeedbackView];
4863 return dragOperation;
4869 - (BOOL)prepareForDragOperation:(
id)sender
4873 [_dropOperationFeedbackView removeFromSuperview];
4875 return [
self _dataSourceRespondsToValidateDropProposedRowProposedDropOperation];
4881 - (BOOL)performDragOperation:(
id)sender
4884 operation = [
self _proposedDropOperationAtPoint:location],
4885 row = _retargetedDropRow;
4888 row = [
self _proposedRowAtPoint:location];
4890 return [
self _sendDataSourceAcceptDrop:sender row:row dropOperation:operation];
4896 - (void)concludeDragOperation:(
id)sender
4898 [
self _reloadDataViews];
4905 - (void)draggedView:(
CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
4907 [
self _draggingEnded];
4914 - (void)_updateSelectionWithMouseAtRow:(CPInteger)aRow
4921 shouldExtendSelection = NO;
4926 if ([_selectedRowIndexes containsIndex:aRow])
4928 newSelection = [_selectedRowIndexes copy];
4930 [newSelection removeIndex:aRow];
4932 else if (_allowsMultipleSelection)
4934 newSelection = [_selectedRowIndexes copy];
4936 [newSelection addIndex:aRow];
4941 else if (_allowsMultipleSelection)
4944 _selectionAnchorRow = [
self numberOfRows] - 1;
4947 shouldExtendSelection = [
self mouseDownFlags] &
CPShiftKeyMask &&
4948 ((_lastSelectedRow == [_selectedRowIndexes lastIndex] && aRow > _lastSelectedRow) ||
4949 (_lastSelectedRow == [_selectedRowIndexes firstIndex] && aRow < _lastSelectedRow));
4951 else if (aRow >= 0 && aRow < _numberOfRows)
4956 if ([newSelection isEqualToIndexSet:_selectedRowIndexes])
4959 if (![
self _sendDelegateSelectionShouldChangeInTableView])
4962 newSelection = [
self _sendDelegateSelectionIndexesForProposedSelection:newSelection];
4964 if (![
self _delegateRespondsToSelectionIndexesForProposedSelection] && [
self _delegateRespondsToShouldSelectRow])
4966 var indexArray = [];
4968 [newSelection getIndexes:indexArray maxCount:-1 inIndexRange:nil];
4970 var indexCount = indexArray.length;
4972 while (indexCount--)
4974 var index = indexArray[indexCount];
4976 if (![
self _sendDelegateShouldSelectRow:index])
4977 [newSelection removeIndex:index];
4981 if ([newSelection count] === 0)
4986 if (!_allowsEmptySelection && [newSelection count] === 0)
4989 if ([newSelection isEqualToIndexSet:_selectedRowIndexes])
4992 [
self _noteSelectionIsChanging];
4993 [
self selectRowIndexes:newSelection byExtendingSelection:shouldExtendSelection];
4995 _lastSelectedRow = [newSelection containsIndex:aRow] ? aRow : [newSelection lastIndex];
5001 - (void)_noteSelectionIsChanging
5015 - (void)_noteSelectionDidChange
5029 - (void)becomeKeyWindow
5037 - (void)resignKeyWindow
5045 - (BOOL)acceptsFirstResponder
5053 - (BOOL)needsPanelToBecomeKey
5063 var hit = [
super hitTest:aPoint];
5068 return [
self _hitTest:hit];
5071 - (id)_hitTest:(
CPView)aView
5076 if ([aView acceptsFirstResponder])
5078 [
self getColumn:@ref(column) row:@ref(row) forView:aView];
5080 if (![
self isRowSelected:row])
5088 else if (!_isViewBased && [aView isKindOfClass:[
CPControl class]] && ![aView isKindOfClass:[
CPTextField class]])
5089 [aView addObserver:self forKeyPath:@"objectValue" options:CPKeyValueObservingOptionOld | CPKeyValueObservingOptionNew context:"editing"];
5094 - (void)_removeObservers
5099 [
self _stopObservingClipView];
5100 [
super _removeObservers];
5103 - (void)_addObservers
5108 [
self _startObservingClipView];
5109 [
super _addObservers];
5120 [
self _stopObservingFirstResponderForWindow:[
self window]];
5123 [
self _startObservingFirstResponderForWindow:aWindow];
5126 - (void)_startObservingClipView
5128 if (!_observedClipView)
5133 [_observedClipView setPostsFrameChangedNotifications:YES];
5134 [_observedClipView setPostsBoundsChangedNotifications:YES];
5136 [defaultCenter addObserver:self
5137 selector:@selector(superviewFrameChanged:)
5138 name:CPViewFrameDidChangeNotification
5139 object:_observedClipView];
5141 [defaultCenter addObserver:self
5142 selector:@selector(superviewBoundsChanged:)
5143 name:CPViewBoundsDidChangeNotification
5144 object:_observedClipView];
5147 - (void)_stopObservingClipView
5149 if (!_observedClipView)
5154 [defaultCenter removeObserver:self
5155 name:CPViewFrameDidChangeNotification
5156 object:_observedClipView];
5158 [defaultCenter removeObserver:self
5159 name:CPViewBoundsDidChangeNotification
5160 object:_observedClipView];
5163 - (void)_startObservingFirstResponderForWindow:(
CPWindow)aWindow
5168 - (void)_stopObservingFirstResponderForWindow:(
CPWindow)aWindow
5175 var responder = [[
self window] firstResponder],
5179 [
self getColumn:@ref(column) row:@ref(row) forView:responder];
5182 _editingColumn = column;
5188 [
self _notifyViewDidResignFirstResponder];
5190 [
self _notifyViewDidBecomeFirstResponder];
5193 if (!_isViewBased && _editingRow !==
CPNotFound && [responder isKindOfClass:[
CPTextField class]] && [responder isEditable] && [responder superview] ==
self)
5195 [responder setBezeled:YES];
5196 [
self _registerForEndEditingNote:responder];
5200 - (void)_registerForEndEditingNote:(
CPView)aTextField
5205 - (void)_unregisterForEndEditingNote:(
CPView)aTextField
5214 var textField = [aNote
object];
5216 [
self _unregisterForEndEditingNote:textField];
5220 [
self _setEditingState:NO forView:textField];
5221 [
self _commitDataViewObjectValue:textField forColumn:_editingColumn andRow:_editingRow];
5224 [textField setBezeled:NO];
5226 [
self _resignFirstResponderWithoutSendingAction:textField];
5229 - (void)_resignFirstResponderWithoutSendingAction:(
CPView)aView
5231 var action = [
self _disableActionIfExists:aView];
5233 [[
self window] makeFirstResponder:self];
5236 [aView setAction:action];
5239 - (void)_resignEditedView
5241 var view = [[
self window] firstResponder];
5243 if ([view respondsToSelector:
@selector(selectText:)])
5244 [view selectText:nil];
5248 [
self _unregisterForEndEditingNote:view];
5249 [
self _setEditingState:NO forView:view];
5252 [
self _resignFirstResponderWithoutSendingAction:view];
5255 - (SEL)_disableActionIfExists:(
CPView)aView
5260 if ([aView respondsToSelector:
@selector(action)] && (action = [aView action]))
5261 [aView setAction:nil];
5271 - (void)_commitDataViewObjectValue:(
id)aDataView forColumn:(CPInteger)column andRow:(CPInteger)row
5273 var editingTableColumn = _tableColumns[column];
5276 [_dataSource tableView:self setObjectValue:[aDataView objectValue] forTableColumn:editingTableColumn row:row];
5280 [editingTableColumn _reverseSetDataView:aDataView forRow:row];
5286 - (void)_setEditingState:(BOOL)editingState forView:(
CPView)aView
5288 if ([aView respondsToSelector:
@selector(setEditable:)])
5289 [aView setEditable:editingState];
5291 if ([aView respondsToSelector:
@selector(setSelectable:)])
5292 [aView setSelectable:editingState];
5295 [aView setBezeled:editingState];
5307 - (void)editColumn:(CPInteger)columnIndex row:(CPInteger)rowIndex withEvent:(
CPEvent)theEvent select:(BOOL)flag
5309 if (![
self isRowSelected:rowIndex])
5312 [
self _reloadDataViewsSynchronously];
5318 _editingRow = rowIndex;
5321 var editingTableColumnUID = [_tableColumns[_editingColumn] UID],
5322 editingView = _dataViewsForRows[_editingRow][editingTableColumnUID];
5324 [
self _setEditingState:YES forView:editingView];
5328 - (void)observeValueForKeyPath:(
CPString)keyPath ofObject:(
id)object change:(
CPDictionary)change context:(
void)context
5330 if (context ===
"editing" && [
object superview] ===
self)
5332 [object removeObserver:self forKeyPath:keyPath];
5338 [
self _commitDataViewObjectValue:object forColumn:column andRow:row];
5345 - (CPInteger)editedColumn
5347 return _editingColumn;
5353 - (CPInteger)editedRow
5373 if ([
self numberOfRows] !== 0)
5375 [
self _moveSelectionWithEvent:anEvent upward:(character === CPUpArrowFunctionKey)];
5383 if ([
self _sendDelegateDeleteKeyPressed])
5387 [
super keyDown:anEvent];
5395 - (BOOL)_selectionIsBroken
5397 return [
self selectedRowIndexes]._ranges.length !== 1;
5405 - (void)_moveSelectionWithEvent:(
CPEvent)theEvent upward:(BOOL)shouldGoUpward
5407 if (![
self _sendDelegateSelectionShouldChangeInTableView])
5410 var selectedIndexes = [
self selectedRowIndexes];
5412 if ([selectedIndexes count] > 0)
5415 i = [
self selectedRow];
5417 if ([
self _selectionIsBroken])
5419 while ([selectedIndexes containsIndex:i])
5421 shouldGoUpward ? i-- : i++;
5423 _wasSelectionBroken =
true;
5425 else if (_wasSelectionBroken && ((shouldGoUpward && i !== [selectedIndexes firstIndex]) || (!shouldGoUpward && i !== [selectedIndexes lastIndex])))
5427 shouldGoUpward ? i = [selectedIndexes firstIndex] - 1 : i = [selectedIndexes lastIndex];
5428 _wasSelectionBroken =
false;
5432 shouldGoUpward ? i-- : i++;
5439 if ([
self numberOfRows] > 0)
5440 var i = shouldGoUpward ? [
self numberOfRows] - 1 : 0;
5443 if (i >= [
self numberOfRows] || i < 0)
5446 if ([
self _delegateRespondsToSelectionIndexesForProposedSelection] || [
self _delegateRespondsToShouldSelectRow])
5454 while (!shouldSelect && (i < [
self numberOfRows] && i > 0))
5456 shouldGoUpward ? --i : ++i;
5465 if (extend && [selectedIndexes containsIndex:i])
5468 var differedLastSelectedRow = i;
5471 shouldGoUpward ? i++ : i--;
5473 [selectedIndexes removeIndex:i];
5480 if ([selectedIndexes containsIndex:i])
5482 i = shouldGoUpward ? [selectedIndexes firstIndex] -1 : [selectedIndexes lastIndex] + 1;
5483 i = MIN(MAX(i, 0), [
self numberOfRows] - 1);
5486 [selectedIndexes addIndex:i];
5487 var differedLastSelectedRow = i;
5492 var differedLastSelectedRow = i;
5495 selectedIndexes = [
self _sendDelegateSelectionIndexesForProposedSelection:selectedIndexes];
5497 [
self selectRowIndexes:selectedIndexes byExtendingSelection:extend];
5500 _lastSelectedRow = differedLastSelectedRow;
5503 [
self scrollRowToVisible:i];
5515 - (BOOL)_dataSourceRespondsToObjectValueForTableColumn
5524 - (BOOL)_dataSourceRespondsToWriteRowsWithIndexesToPasteboard
5533 - (BOOL)_dataSourceRespondsToSetObjectValueForTableColumnRow
5542 - (BOOL)_dataSourceRespondsToValidateDropProposedRowProposedDropOperation
5551 - (BOOL)_dataSourceRespondsToNumberOfRowsinTableView
5561 - (int)_sendDataSourceNumberOfRowsInTableView
5566 return [_dataSource numberOfRowsInTableView:self];
5574 - (id)_sendDataSourceObjectValueForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5579 return [_dataSource tableView:self objectValueForTableColumn:aTableColumn row:aRowIndex];
5586 - (void)_sendDataSourceSetObjectValue:(
id)anObject forTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5591 [_dataSource tableView:self setObjectValue:anObject forTableColumn:aTableColumn row:aRowIndex];
5598 - (void)_sendDataSourceSortDescriptorsDidChange:(CPArray)descriptors
5603 [_dataSource tableView:self sortDescriptorsDidChange:descriptors];
5610 - (BOOL)_sendDataSourceAcceptDrop:(
id)info row:(CPInteger)aRowIndex dropOperation:(CPTableViewDropOperation)operation
5615 return [_dataSource tableView:self acceptDrop:info row:aRowIndex dropOperation:operation];
5622 - (CPDragOperation)_sendDataSourceValidateDrop:(
id)info proposedRow:(CPInteger)aRowIndex proposedDropOperation:(CPTableViewDropOperation)operation
5627 return [_dataSource tableView:self validateDrop:info proposedRow:aRowIndex proposedDropOperation:operation];
5639 return [_dataSource tableView:self writeRowsWithIndexes:rowIndexes toPasteboard:pboard];
5645 - (void)draggedImage:(
CPImage)anImage endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
5647 if ([_dataSource respondsToSelector:
@selector(
tableView:didEndDraggedImage:atPosition:operation:)])
5648 [_dataSource tableView:self didEndDraggedImage:anImage atPosition:aLocation operation:anOperation];
5653 #pragma mark DataSource methods to implement 5659 - (CPArray)_sendDataSourceNamesOfPromisedFilesDroppedAtDestination:(
CPURL)dropDestination forDraggedRowsWithIndexes:(
CPIndexSet)indexSet
5664 return [_dataSource tableView:self namesOfPromisedFilesDroppedAtDestination:dropDestination forDraggedRowsWithIndexes:indexSet];
5676 - (BOOL)_delegateRespondsToDataViewForTableColumn
5685 - (BOOL)_delegateRespondsToViewForTableColumn
5694 - (BOOL)_delegateRespondsToShouldSelectRow
5703 - (BOOL)_delegateRespondsToSelectionShouldChangeInTableView
5712 - (BOOL)_delegateRespondsToSelectionIndexesForProposedSelection
5721 - (BOOL)_delegateRespondsToMenuForTableColumnRow
5730 - (void)_sendDelegateDidClickTableColumn:(CPInteger)column
5733 [_delegate tableView:self didClickTableColumn:_tableColumns[column]];
5740 - (void)_sendDelegateDidDragTableColumn:(
CPTableColumn)aTableColumn
5743 [_delegate tableView:self didDragTableColumn:aTableColumn];
5750 - (void)_sendDelegateMouseDownInHeaderOfTableColumn:(CPInteger)column
5753 [_delegate tableView:self mouseDownInHeaderOfTableColumn:_tableColumns[column]];
5760 - (BOOL)_sendDelegateDeleteKeyPressed
5762 if ([_delegate respondsToSelector:
@selector(tableViewDeleteKeyPressed:)])
5764 [_delegate tableViewDeleteKeyPressed:self];
5775 - (BOOL)_sendDelegateSelectionShouldChangeInTableView
5780 return [_delegate selectionShouldChangeInTableView:self];
5787 - (BOOL)_sendDelegateIsGroupRow:(CPInteger)anIndex
5792 return [_delegate tableView:self isGroupRow:anIndex];
5799 - (BOOL)_sendDelegateShouldSelectRow:(CPInteger)anIndex
5804 return [_delegate tableView:self shouldSelectRow:anIndex];
5811 - (void)_sendDelegateWillDisplayView:(
id)aCell forTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5816 [_delegate tableView:self willDisplayView:aCell forTableColumn:aTableColumn row:aRowIndex];
5823 - (void)_sendDelegateWillRemoveView:(
id)aCell forTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5828 [_delegate tableView:self willRemoveView:aCell forTableColumn:aTableColumn row:aRowIndex];
5840 return [_delegate tableView:self menuForTableColumn:aTableColumn row:aRowIndex];
5849 - (BOOL)_sendDelegateShouldReorderColumn:(CPInteger)columnIndex toColumn:(CPInteger)newColumnIndex
5851 if ([
self allowsColumnReordering] &&
5854 return [_delegate tableView:self shouldReorderColumn:columnIndex toColumn:newColumnIndex];
5857 return [
self allowsColumnReordering];
5864 - (float)_sendDelegateHeightOfRow:(CPInteger)anIndex
5867 return [
self rowHeight];
5869 return [_delegate tableView:self heightOfRow:anIndex];
5876 - (BOOL)_sendDelegateShouldEditTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5881 return [_delegate tableView:self shouldEditTableColumn:aTableColumn row:aRowIndex];
5893 return [_delegate tableView:self selectionIndexesForProposedSelection:anIndexSet];
5900 - (
CPView)_sendDelegateViewForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5905 return [_delegate tableView:self viewForTableColumn:aTableColumn row:aRowIndex];
5912 - (
CPView)_sendDelegateDataViewForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5917 return [_delegate tableView:self dataViewForTableColumn:aTableColumn row:aRowIndex];
5922 #pragma mark Delegate methods to implement 5928 - (BOOL)_sendDelegateShouldSelectTableColumn:(
CPTableColumn)aTableColumn
5933 return [_delegate tableView:self shouldSelectTableColumn:aTableColumn];
5940 - (
CPString)_sendDelegateToolTipForView:(
id)aView rect:(CGRect)aRect tableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex mouseLocation:(CGPoint)aPoint
5945 return [_delegate tableView:self toolTipForView:aView rect:aRect tableColumn:aTableColumn row:aRowIndex mouseLocation:aPoint];
5952 - (BOOL)_sendDelegateShouldTrackView:(
id)aView forTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5957 return [_delegate tableView:self shouldTrackView:aView forTableColumn:aTableColumn row:aRowIndex];
5964 - (BOOL)_sendDelegateShouldShowViewExpansionForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5969 return [_delegate tableView:self shouldShowViewExpansionForTableColumn:aTableColumn row:aRowIndex];
5976 - (BOOL)_sendDelegateShouldTypeSelectForEvent:(
CPEvent)anEvent withCurrentSearchString:(
CPString)aString
5981 return [_delegate tableView:self shouldTypeSelectForEvent:anEvent withCurrentSearchString:aString];
5988 - (
CPString)_sendDelegateTypeSelectStringForTableColumn:(
CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
5993 return [_delegate tableView:self typeSelectStringForTableColumn:aTableColumn row:aRowIndex];
6000 - (int)_sendDelegateNextTypeSelectMatchFromRow:(CPInteger)aRowIndex toRow:(CPInteger)aSecondRowIndex forString:(
CPString)aString
6005 return [_delegate tableView:self nextTypeSelectMatchFromRow:aRowIndex toRow:aSecondRowIndex forString:aString];
6012 + (Class)_binderClassForBinding:(
CPString)aBinding
6014 if (aBinding ==
@"content")
6017 return [
super _binderClassForBinding:aBinding];
6025 if (aBinding ===
@"selectionIndexes")
6026 return @"selectedRowIndexes";
6028 return [
super _replacementKeyPathForBinding:aBinding];
6034 - (void)_establishBindingsIfUnbound:(
id)destination
6038 [
super bind:@"content" toObject:destination withKeyPath:@"arrangedObjects" options:nil];
6039 _contentBindingExplicitlySet = NO;
6043 if (!_contentBindingExplicitlySet)
6045 if ([[
self infoForBinding:
@"selectionIndexes"] objectForKey:
CPObservedObjectKey] !== destination)
6046 [
self bind:@"selectionIndexes" toObject:destination withKeyPath:@"selectionIndexes" options:nil];
6048 if ([[
self infoForBinding:
@"sortDescriptors"] objectForKey:
CPObservedObjectKey] !== destination)
6049 [
self bind:@"sortDescriptors" toObject:destination withKeyPath:@"sortDescriptors" options:nil];
6055 if (aBinding ==
@"content")
6056 _contentBindingExplicitlySet = YES;
6058 [
super bind:aBinding toObject:anObject withKeyPath:aKeyPath options:options];
6071 var destination = [_info objectForKey:CPObservedObjectKey],
6072 keyPath = [_info objectForKey:CPObservedKeyPathKey];
6074 _content = [destination valueForKey:keyPath];
6076 [_source _reloadDataViews];
6112 _allowsColumnReordering = [aCoder decodeBoolForKey:CPTableViewColumnReorderingKey];
6113 _allowsColumnResizing = [aCoder decodeBoolForKey:CPTableViewColumnResizingKey];
6114 _allowsMultipleSelection = [aCoder decodeBoolForKey:CPTableViewMultipleSelectionKey];
6115 _allowsEmptySelection = [aCoder decodeBoolForKey:CPTableViewEmptySelectionKey];
6116 _allowsColumnSelection = [aCoder decodeBoolForKey:CPTableViewColumnSelectionKey];
6119 _selectionHighlightStyle = [aCoder decodeIntForKey:CPTableViewSelectionHighlightStyleKey];
6120 _columnAutoResizingStyle = [aCoder decodeIntForKey:CPTableViewColumnAutoresizingStyleKey];
6122 _tableColumns = [aCoder decodeObjectForKey:CPTableViewTableColumnsKey] || [];
6123 [_tableColumns makeObjectsPerformSelector:@selector(setTableView:) withObject:self];
6125 _rowHeight = [aCoder decodeFloatForKey:CPTableViewRowHeightKey] || [
self valueForThemeAttribute:@"default-row-height"];
6126 _intercellSpacing = [aCoder decodeSizeForKey:CPTableViewIntercellSpacingKey];
6128 if (CGSizeEqualToSize(_intercellSpacing, CGSizeMakeZero()))
6129 _intercellSpacing = CGSizeMake(3.0, 2.0);
6131 [
self setGridColor:[aCoder decodeObjectForKey:CPTableViewGridColorKey]];
6132 _gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey];
6134 _usesAlternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewUsesAlternatingBackgroundKey];
6137 _headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey];
6138 _cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey];
6140 [
self setDataSource:[aCoder decodeObjectForKey:CPTableViewDataSourceKey]];
6141 [
self setDelegate:[aCoder decodeObjectForKey:CPTableViewDelegateKey]];
6146 _archivedDataViews = [aCoder decodeObjectForKey:CPTableViewArchivedReusableViewsKey];
6148 [
self _updateIsViewBased];
6153 [
self setAutosaveName:[aCoder decodeObjectForKey:CPTableViewAutosaveNameKey]];
6166 [_tableDrawView removeFromSuperview];
6168 [aCoder encodeObject:_dataSource forKey:CPTableViewDataSourceKey];
6169 [aCoder encodeObject:_delegate forKey:CPTableViewDelegateKey];
6171 [aCoder encodeFloat:_rowHeight forKey:CPTableViewRowHeightKey];
6172 [aCoder encodeSize:_intercellSpacing forKey:CPTableViewIntercellSpacingKey];
6174 [aCoder encodeInt:_selectionHighlightStyle forKey:CPTableViewSelectionHighlightStyleKey];
6175 [aCoder encodeInt:_columnAutoResizingStyle forKey:CPTableViewColumnAutoresizingStyleKey];
6177 [aCoder encodeBool:_allowsMultipleSelection forKey:CPTableViewMultipleSelectionKey];
6178 [aCoder encodeBool:_allowsEmptySelection forKey:CPTableViewEmptySelectionKey];
6179 [aCoder encodeBool:_allowsColumnReordering forKey:CPTableViewColumnReorderingKey];
6180 [aCoder encodeBool:_allowsColumnResizing forKey:CPTableViewColumnResizingKey];
6181 [aCoder encodeBool:_allowsColumnSelection forKey:CPTableViewColumnSelectionKey];
6183 [aCoder encodeObject:_tableColumns forKey:CPTableViewTableColumnsKey];
6185 [aCoder encodeObject:[
self gridColor] forKey:CPTableViewGridColorKey];
6186 [aCoder encodeInt:_gridStyleMask forKey:CPTableViewGridStyleMaskKey];
6188 [aCoder encodeBool:_usesAlternatingRowBackgroundColors forKey:CPTableViewUsesAlternatingBackgroundKey];
6191 [aCoder encodeObject:_cornerView forKey:CPTableViewCornerViewKey];
6192 [aCoder encodeObject:_headerView forKey:CPTableViewHeaderViewKey];
6194 [aCoder encodeObject:_autosaveName forKey:CPTableViewAutosaveNameKey];
6196 if (_archivedDataViews)
6197 [aCoder encodeObject:_archivedDataViews forKey:CPTableViewArchivedReusableViewsKey];
6202 @implementation _CPDropOperationDrawingView :
CPView 6204 unsigned dropOperation;
6210 - (void)drawRect:(CGRect)aRect
6223 borderColor = [tableView valueForThemeAttribute:@"dropview-on-border-color"];
6224 borderWidth = [tableView valueForThemeAttribute:@"dropview-on-border-width"];
6234 var selectedRows = [tableView selectedRowIndexes],
6235 newRect = CGRectMake(aRect.origin.x + 2, aRect.origin.y + 2, aRect.size.width - 4, aRect.size.height - 5);
6239 borderRadius = [tableView valueForThemeAttribute:@"dropview-on-selected-border-radius"];
6240 borderColor = [tableView valueForThemeAttribute:@"dropview-on-selected-border-color"];
6241 borderWidth = [tableView valueForThemeAttribute:@"dropview-on-selected-border-width"];
6242 backgroundColor = [tableView valueForThemeAttribute:@"dropview-on-selected-background-color"];
6246 borderRadius = [tableView valueForThemeAttribute:@"dropview-on-border-radius"];
6247 borderColor = [tableView valueForThemeAttribute:@"dropview-on-border-color"];
6248 borderWidth = [tableView valueForThemeAttribute:@"dropview-on-border-width"];
6249 backgroundColor = [tableView valueForThemeAttribute:@"dropview-on-background-color"];
6262 [
self setFrameOrigin:CGPointMake(_frame.origin.x, _frame.origin.y - 8)];
6264 var selectedRows = [tableView selectedRowIndexes];
6268 borderColor = [tableView valueForThemeAttribute:@"dropview-above-selected-border-color"];
6269 borderWidth = [tableView valueForThemeAttribute:@"dropview-above-selected-border-width"];
6273 borderColor = [tableView valueForThemeAttribute:@"dropview-above-border-color"];
6274 borderWidth = [tableView valueForThemeAttribute:@"dropview-above-border-width"];
6295 var showCallback =
function()
6297 [
self setHidden: NO];
6301 var hideCallback =
function()
6303 [
self setHidden: YES];
6307 [
self setHidden: YES];
6316 @implementation _CPColumnDragDrawingView :
CPView 6323 - (void)drawRect:(CGRect)dirtyRect
6326 columnRect = [tableView rectOfColumn:columnIndex],
6328 bounds = [columnClipView bounds],
6329 visibleRect = [tableView visibleRect],
6330 xScroll = CGRectGetMinX(visibleRect),
6331 yScroll = CGRectGetMinY(visibleRect);
6339 bounds.origin.x = CGRectGetMinX(columnRect) - xScroll;
6340 bounds.size.height += yScroll;
6353 [tableView highlightSelectionInClipRect:bounds];
6357 var minX = CGRectGetMinX(
bounds) + 0.5,
6358 maxX = CGRectGetMaxX(
bounds) - 0.5;
6385 - (void)awakeFromCib
6387 [
super awakeFromCib];
6403 - (void)recursivelyPerformSelector:(
SEL)selector withObject:(
id)anObject startingFrom:(
id)aView
6405 [[aView subviews] enumerateObjectsUsingBlock:function(view, idx)
6407 [view performSelector:selector withObject:anObject];
6409 if (![view isKindOfClass:[
self class]])
6416 return "<" + [
self className] +
" 0x" + [
CPString stringWithHash:[
self UID]] +
" identifier=" + [
self identifier] +
">";
6426 - (BOOL)disableAutomaticResizing
6428 return _disableAutomaticResizing;
6434 - (void)setDisableAutomaticResizing:(BOOL)aValue
6436 _disableAutomaticResizing = aValue;
6454 - (void)setContent:(
id)aValue
6468 return _objectValue;
6474 - (void)setObjectValue:(
id)aValue
6476 _objectValue = aValue;
6492 _textField = aValue;
6508 _imageView = aValue;
CPColor selectionHighlightColor()
CPColor unfocusedSelectionHighlightColor()
var CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_
Used to implement exception handling (creating & raising).
var CPTableViewDelegate_tableView_shouldEditTableColumn_row_
function CGContextTranslateCTM(aContext, tx, ty)
CPTableViewSolidHorizontalGridLineMask
global CPApp CPTableViewColumnDidMoveNotification
BOOL makeFirstResponder:(CPResponder aResponder)
#define FULL_ROW_HEIGHT()
void getColumn:row:forView:(Function columnRef, [row] Function rowRef, [forView] CPView aView)
function CGGradientCreateWithColorComponents(aColorSpace, components, locations, count)
function CGContextStrokeEllipseInRect(aContext, aRect)
function CGColorSpaceCreateDeviceRGB()
var CPTableViewDataSource_numberOfRowsInTableView_
CPIndexSet selectedRowIndexes()
void addSubview:(CPView aSubview)
void dragView:at:offset:event:pasteboard:source:slideBack:(CPView aView, [at] CGPoint aLocation, [offset] CGSize mouseOffset, [event] CPEvent anEvent, [pasteboard] CPPasteboard aPasteboard, [source] id aSourceObject, [slideBack] BOOL slideBack)
var CPTableViewDelegate_tableView_shouldSelectRow_
CPColor colorWithHexString:(string hex)
void setAutosaveTableColumns:(BOOL shouldAutosave)
BOOL setThemeState:(ThemeState aState)
FrameUpdater prototype identifier
var CPTableViewDataSource_tableView_sortDescriptorsDidChange_
var CPTableViewDelegate_tableView_dataViewForTableColumn_row_
CGRect frameOfDataViewAtColumn:row:(CPInteger aColumn, [row] CPInteger aRow)
void setGridColor:(CPColor aColor)
void setAutosaveName:(CPString theAutosaveName)
void trackMouse:(CPEvent anEvent)
var CPTableViewCornerViewKey
function CGContextAddArcToPoint(aContext, x1, y1, x2, y2, radius)
A representation of a single point in time.
CPGraphicsContext currentContext()
void postNotificationName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
An object representation of nil.
CPArray sortDescriptors()
CPInteger columnWithIdentifier:(CPString anIdentifier)
void setGridStyleMask:(unsigned aGrideStyleMask)
var CPTableViewDelegate_tableView_didClickTableColumn_
CPDragOperation CPDragOperationNone
var CPTableViewGridColorKey
BOOL setThemeState:(ThemeState aState)
CPTableViewFirstColumnOnlyAutoresizingStyle
function CGContextDrawLinearGradient(aContext, aGradient, aStartPoint, anEndPoint, options)
BOOL autoscroll:(CPEvent anEvent)
#define ROW_BOTTOM(__heightInfo)
The main run loop for the application.
function CGContextSetStrokeColor(aContext, aColor)
void recursivelyPerformSelector:withObject:startingFrom:(SEL selector, [withObject] id anObject, [startingFrom] id aView)
var CPTableViewMultipleSelectionKey
void addObserver:selector:name:object:(id anObserver, [selector] SEL aSelector, [name] CPString aNotificationName, [object] id anObject)
var CPTableViewSelectionHighlightStyleKey
void setFrame:(CGRect aFrame)
CGPoint locationInWindow()
CPInteger indexGreaterThanOrEqualToIndex:(CPInteger anIndex)
var CPTableViewColumnResizingKey
id initWithFrame:(CGRect aFrame)
var CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_
void raise:reason:(CPString aName, [reason] CPString aReason)
var CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_
var CPTableViewDelegate_tableView_shouldSelectTableColumn_
CPArray registeredDraggedTypes()
#define NUMBER_OF_COLUMNS()
A collection of unique integers.
CPString charactersIgnoringModifiers()
void setHidden:(BOOL shouldBeHidden)
void viewWillMoveToWindow:(CPWindow aWindow)
CPTimer scheduledTimerWithTimeInterval:callback:repeats:(CPTimeInterval seconds, [callback] Function aFunction, [repeats] BOOL shouldRepeat)
CPView hitTest:(CGPoint aPoint)
CPColor unfocusedSelectionGradientColors()
function CGContextAddLineToPoint(aContext, x, y)
var CPTableViewIntercellSpacingKey
var CPTableViewTableColumnsKey
void setValue:forThemeAttribute:(id aValue, [forThemeAttribute] CPString aName)
var CPTableViewDataSourceKey
function CGContextStrokePath(aContext)
var CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_
CPTableViewSelectionIsChangingNotification
CPNotificationCenter defaultCenter()
A mutable key-value pair collection.
CPScrollView enclosingScrollView()
var CPTableViewDelegate_tableViewColumnDidMove_
function ThemeState(stateNames)
function CGContextSetLineWidth(aContext, aLineWidth)
void setUsesAlternatingRowBackgroundColors:(BOOL shouldUseAlternatingRowBackgroundColors)
CPRunLoop currentRunLoop()
function CGContextClosePath(aContext)
CPTableViewDraggingDestinationFeedbackStyleSourceList
var CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_
void setBoundsOrigin:(CGPoint aPoint)
function CGColorCreate(aColorSpace, components)
var CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_
id initWithIndexSet:(CPIndexSet anIndexSet)
CGRect rectOfColumn:(CPInteger aColumnIndex)
void selectRowIndexes:byExtendingSelection:(CPIndexSet rows, [byExtendingSelection] BOOL shouldExtendSelection)
var CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_
void setNeedsDisplay:(BOOL aFlag)
var CPTableViewDelegate_tableView_willRemoveView_forTableColumn_row_
void viewWillMoveToSuperview:(CPView aView)
void viewWillMoveToSuperview:(CPView aView)
FrameUpdater prototype stop
var CPTableViewRowHeightKey
CPTableViewSequentialColumnAutoresizingStyle
CPTableViewSelectionHighlightStyleRegular
void resizeWithOldSuperviewSize:(CGSize aSize)
var CPTableViewDelegate_tableView_didDragTableColumn_
id initWithName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
function CPMaxRange(aRange)
An immutable string (collection of characters).
CGPoint convertPoint:fromView:(CGPoint aPoint, [fromView] CPView aView)
void setTableView:(CPTableView aTableView)
BOOL isRowSelected:(CPInteger aRow)
void setFrameSize:(CGSize aSize)
CPInteger indexGreaterThanIndex:(CPInteger anIndex)
CPDictionary selectionGradientColors()
var CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_
CPInteger columnAtPoint:(CGPoint aPoint)
function CGContextSetAlpha(aContext, anAlpha)
BOOL sendAction:to:(SEL anAction, [to] id anObject)
function CPFeatureIsCompatible(aFeature)
CPColor colorWithCalibratedWhite:alpha:(float white, [alpha] float alpha)
id initWithCoder:(CPCoder aCoder)
CPIndexSet indexesPassingTest:(Function/*(int anIndex) */aPredicate)
CPColor colorWithRed:green:blue:alpha:(float red, [green] float green, [blue] float blue, [alpha] float alpha)
Holds attributes necessary to describe how to sort a set of objects.
var CPTableViewDelegate_tableView_isGroupRow_
function CGContextSetFillColor(aContext, aColor)
CPBinder getBinding:forObject:(CPString aBinding, [forObject] id anObject)
CPTableColumnAutoresizingMask
void setNeedsDisplay:(BOOL aFlag)
CPView dragViewForRowsWithIndexes:tableColumns:event:offset:(CPIndexSet theDraggedRows, [tableColumns] CPArray theTableColumns, [event] CPEvent theDragEvent, [offset] CGPoint dragViewOffset)
CPMenu menuForEvent:(CPEvent anEvent)
CPTableViewNoColumnAutoresizing
CPInteger rowAtPoint:(CGPoint aPoint)
var CPTableViewDataSource_tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes_
var CPTableViewEmptySelectionKey
function CGContextStrokeRoundedRectangleInRect(aContext, aRect, aRadius, ne, se, sw, nw)
function CGContextBeginPath(aContext)
id stringWithHash:(unsigned aHash)
CPView preparedViewAtColumn:row:(CPInteger column, [row] CPInteger row)
void setDelegate:(id< CPTableViewDelegate > aDelegate)
CPColor backgroundColor()
CPThemeStateSelectedDataView
A notification that can be posted to a CPNotificationCenter.
var CPTableViewArchivedReusableViewsKey
void selectColumnIndexes:byExtendingSelection:(CPIndexSet columns, [byExtendingSelection] BOOL shouldExtendSelection)
CPDate limitDateForMode:(CPString aMode)
CPTableViewLastColumnOnlyAutoresizingStyle
var CPTableViewDelegateKey
var CPTableViewDataSource_tableView_objectValueForTableColumn_row_
var CPTableViewGridStyleMaskKey
CPColor colorWithHue:saturation:brightness:(float hue, [saturation] float saturation, [brightness] float brightness)
var CPTableViewDelegate_tableViewSelectionIsChanging_
CPTableViewSelectionDidChangeNotification
var CPTableViewDelegate_tableViewColumnDidResize_
var CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_
A timer object that can send a message after the given time interval.
Defines methods for use when archiving & restoring (enc/decoding).
void editColumn:row:withEvent:select:(CPInteger columnIndex, [row] CPInteger rowIndex, [withEvent] CPEvent theEvent, [select] BOOL flag)
function CGContextStrokeRect(aContext, aRect)
BOOL unsetThemeState:(ThemeState aState)
Sends messages (CPNotification) between objects.
CPIndexSet selectedColumnIndexes()
#define HAS_VARIABLE_ROW_HEIGHTS()
var CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_
void setIndicatorImage:inTableColumn:(CPImage anImage, [inTableColumn] CPTableColumn aTableColumn)
CPImage dragImageForRowsWithIndexes:tableColumns:event:offset:(CPIndexSet dragRows, [tableColumns] CPArray theTableColumns, [event] CPEvent dragEvent, [offset] CGPoint dragImageOffset)
var CPTableViewDelegate_tableViewSelectionDidChange_
#define UPDATE_COLUMN_RANGES_IF_NECESSARY()
var CPTableViewAutosaveNameKey
void setBackgroundColor:(CPColor aColor)
var CPTableViewDelegate_selectionShouldChangeInTableView_
void setBoundsSize:(CGSize aSize)
function CGContextFillRoundedRectangleInRect(aContext, aRect, aRadius, ne, se, sw, nw)
void scrollColumnToVisible:(int columnIndex)
CPBundle bundleForClass:(Class aClass)
void setFrameSize:(CGSize aSize)
var CPTableViewColumnSelectionKey
void sizeLastColumnToFit()
function CGContextFillRect(aContext, aRect)
var CPTableViewColumnReorderingKey
CPTableViewSelectionHighlightStyleNone
var CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_
var CPTableViewHeaderViewKey
var CPTableViewDataSource_tableView_acceptDrop_row_dropOperation_
void removeObserver:name:object:(id anObserver, [name] CPString aNotificationName, [object] id anObject)
id indexSetWithIndexesInRange:(CPRange aRange)
CPTableViewUniformColumnAutoresizingStyle
var CPTableViewUsesAlternatingBackgroundKey
var CPTableViewDelegate_tableView_heightOfRow_
CPTableViewSelectionHighlightStyleSourceList
CGRect rectOfRow:(CPInteger aRowIndex)
void enumerateIndexesUsingBlock:(Function/*(int idx, @ref BOOL stop) */aFunction)
CPArray alternatingRowBackgroundColors()
var CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_
void draggedImage:endedAt:operation:(CPImage anImage, [endedAt] CGPoint aLocation, [operation] CPDragOperation anOperation)
var CPTableViewDelegate_tableViewMenuForTableColumn_row_
void removeIndexes:(CPIndexSet anIndexSet)
void setAlternatingRowBackgroundColors:(CPArray alternatingRowBackgroundColors)
CPRange rowsInRect:(CGRect aRect)
void scrollRowToVisible:(int rowIndex)
CPIndexSet columnIndexesInRect:(CGRect aRect)
void removeIndex:(CPInteger anIndex)
BOOL scrollRectToVisible:(CGRect aRect)
function CGContextFillPath(aContext)
void setCornerView:(CPView aView)
void setDataSource:(id< CPTableViewDataSource > aDataSource)
id indexSetWithIndex:(int anIndex)
var CPTableViewAlternatingRowColorsKey
var CPTableViewDelegate_tableView_viewForTableColumn_row_
function CGContextMoveToPoint(aContext, x, y)
void encodeWithCoder:(CPCoder aCoder)
void setFrameOrigin:(CGPoint aPoint)
void setHeaderView:(CPView aHeaderView)
CPTableViewReverseSequentialColumnAutoresizingStyle
CPRange function CPMakeRange(location, length)
id initWithCibNamed:bundle:(CPString aName, [bundle] CPBundle aBundle)
function CGContextAddRect(aContext, aRect)
var CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_
id pasteboardWithName:(CPString aName)
CPException exceptionWithName:reason:userInfo:(CPString aName, [reason] CPString aReason, [userInfo] CPDictionary aUserInfo)
CPTableViewColumnDidResizeNotification
CPTableViewDraggingDestinationFeedbackStyleNone
CPSourceListBottomLineColor
var CPTableViewColumnAutoresizingStyleKey
CPTableViewSolidVerticalGridLineMask
CPTableViewDraggingDestinationFeedbackStyleRegular
function CGGradientCreateWithColors(aColorSpace, colors, locations)
FrameUpdater prototype description