diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 25c8ecc6f..b1c3c5646 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -337,7 +337,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, if ([_outlineViewDataSource respondsToSelector:@selector(outlineView:sortDescriptorsDidChange:)]) _implementedOutlineViewDataSourceMethods |= CPOutlineViewDataSource_outlineView_sortDescriptorsDidChange_; - [self _reloadDataViews]; + [self reloadData]; } /*! @@ -630,7 +630,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, _outlineTableColumn = aTableColumn; // FIXME: efficiency. - [self _reloadDataViews]; + [self reloadData]; } /*! @@ -689,7 +689,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, _indentationPerLevel = anIndentationWidth; // FIXME: efficiency!!!! - [self _reloadDataViews]; + [self reloadData]; } /*! @@ -717,7 +717,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, _indentationMarkerFollowsDataView = indentationMarkerShouldFollowDataView; // !!!! - [self _reloadDataViews]; + [self reloadData]; } /*! @@ -1091,7 +1091,13 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, _disclosureControlQueue = []; // FIXME: really? - [self _reloadDataViews]; + [self reloadData]; +} + +- (BOOL)_dataViewsNeedReloadAfterContentChange +{ + // Alternatively, check if the current tree of views mactches the current tree in the data source. + return YES; } /*! diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 235566b28..df658c1fa 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -614,6 +614,7 @@ NOT YET IMPLEMENTED */ - (void)reloadData { + // Empty the data cache. _objectValues = { }; [self reloadDataForRowIndexes:_exposedRows columnIndexes:_exposedColumns]; } @@ -625,20 +626,28 @@ NOT YET IMPLEMENTED */ - (void)reloadDataForRowIndexes:(CPIndexSet)rowIndexes columnIndexes:(CPIndexSet)columnIndexes { - if ([self _numberOfRowsDidChange]) + if ([self _dataViewsNeedReloadAfterContentChange]) [self _reloadDataViewsImmediately]; else - [self _enumerateViewsInRows:rowIndexes columns:columnIndexes usingBlock:function(view, row, column, stop) - { - [self _setObjectValueForTableColumn:_tableColumns[column] row:row forView:view useCache:NO]; - }]; + [self _reloadDataForRowIndexes:rowIndexes columnIndexes:columnIndexes]; } -- (BOOL)_numberOfRowsDidChange +// Reloads the data, not the views +- (void)_reloadDataForRowIndexes:(CPIndexSet)rowIndexes columnIndexes:(CPIndexSet)columnIndexes +{ + [self _enumerateViewsInRows:rowIndexes columns:columnIndexes usingBlock:function(view, row, column, stop) + { + var tableColumn = [_tableColumns objectAtIndex:column]; + [self _setObjectValueForTableColumn:tableColumn row:row forView:view useCache:NO]; + }]; +} + +- (BOOL)_dataViewsNeedReloadAfterContentChange { return (_numberOfRows !== [self _numberOfRows]); } +// Reloads the views AND the data - (void)_reloadDataViews { //if (!_dataSource) @@ -3484,11 +3493,13 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [self setNeedsDisplay:YES]; // if we have any columns to remove do that here - if ([_differedColumnDataToRemove count]) + var removeCount = [_differedColumnDataToRemove count]; + + if (removeCount) { var removeIndexes = [CPIndexSet indexSet]; - for (var i = 0; i < _differedColumnDataToRemove.length; i++) + for (var i = 0; i < removeCount; i++) { var data = _differedColumnDataToRemove[i], tableColumn = data.column, @@ -3497,7 +3508,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (columnIdx !== CPNotFound) [removeIndexes addIndex:columnIdx]; } - + // FIXME: do we also need to remove non exposed rows that may stay in the cache ? [self _unloadDataViewsInRows:_exposedRows columns:removeIndexes]; [_differedColumnDataToRemove removeAllObjects]; } @@ -3592,9 +3603,11 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [self _setObjectValueForTableColumn:tableColumn row:row forView:dataView]; - var applyThemeStateBlock = (_selectionHighlightStyle !== CPTableViewSelectionHighlightStyleNone && (isRowSelected || [self isColumnSelected:column])) ? _BlockSelectView : _BlockDeselectView; - - applyThemeStateBlock(dataView, row, column); + if (_selectionHighlightStyle !== CPTableViewSelectionHighlightStyleNone && + (isRowSelected || [self isColumnSelected:column])) + _BlockSelectView(dataView, row, column); + else + _BlockDeselectView(dataView, row, column); // FIX ME: for performance reasons we might consider diverging from cocoa and moving this to the reloadData method if (_implementedDelegateMethods & CPTableViewDelegate_tableView_isGroupRow_)