From 4ef9202e920fee277f9231ccef9700e17207e133 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 29 Apr 2010 14:22:46 +0200 Subject: [PATCH] made the tableview handle hiding and showing of columns properly --- AppKit/CPTableColumn.j | 7 +++++++ AppKit/CPTableHeaderView.j | 18 +++++------------ AppKit/CPTableView.j | 40 ++++++++++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index ccd24e9f8..5c6b91cea 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -348,7 +348,14 @@ CPTableColumnUserResizingMask = 1 << 1; - (void)setHidden:(BOOL)shouldBeHidden { + shouldBeHidden = !!shouldBeHidden + if (_isHidden === shouldBeHidden) + return; + _isHidden = shouldBeHidden; + + [[self headerView] setHidden:shouldBeHidden]; + [[self tableView] _tableColumnVisibilityDidChange:self]; } - (BOOL)isHidden diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 8d8d3b9ec..534b24da1 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -187,21 +187,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal - (CGRect)headerRectOfColumn:(int)aColumnIndex { - var tableColumns = [_tableView tableColumns]; - - if (aColumnIndex < 0 || aColumnIndex > [tableColumns count]) - [CPException raise:"invalid" reason:"tried to get headerRectOfColumn: on invalid column"]; - - // UPDATE COLUMN RANGES ? + var headerRect = [self bounds], + columnRect = [[self tableView] rectOfColumn:aColumnIndex]; - var tableRange = _tableView._tableColumnRanges[aColumnIndex], - bounds = [self bounds]; - - var rMinX = ROUND(tableRange.location); - bounds.origin.x = rMinX; - bounds.size.width = FLOOR(tableRange.length + tableRange.location - rMinX); + headerRect.origin.x = CPRectGetMinX(columnRect); + headerRect.size.width = CPRectGetWidth(columnRect); - return bounds; + return headerRect; } - (CGRect)_cursorRectForColumn:(int)column diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 1a3e727c4..75041a838 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -690,6 +690,24 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; [self setNeedsLayout]; } +/*! + @ignore +*/ +- (void)_tableColumnVisibilityDidChange:(CPTableColumn)aColumn +{ + var columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:aColumn]; + + if (_dirtyTableColumnRangeIndex < 0) + _dirtyTableColumnRangeIndex = columnIndex; + else + _dirtyTableColumnRangeIndex = MIN(columnIndex, _dirtyTableColumnRangeIndex); + + [[self headerView] setNeedsLayout]; + [[self headerView] setNeedsDisplay:YES]; + + [self reloadData]; +} + - (CPArray)tableColumns { return _tableColumns; @@ -1044,6 +1062,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (_dirtyTableColumnRangeIndex < 0) return; + _numberOfHiddenColumns = 0; + var index = _dirtyTableColumnRangeIndex, count = NUMBER_OF_COLUMNS(), x = index === 0 ? 0.0 : CPMaxRange(_tableColumnRanges[index - 1]); @@ -1053,7 +1073,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; var tableColumn = _tableColumns[index]; if ([tableColumn isHidden]) + { + _numberOfHiddenColumns += 1; _tableColumnRanges[index] = CPMakeRange(x, 0.0); + } else { @@ -1074,8 +1097,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; - (CGRect)rectOfColumn:(CPInteger)aColumnIndex { aColumnIndex = +aColumnIndex; + + var column = [[self tableColumns] objectAtIndex:aColumnIndex]; - if (aColumnIndex < 0 || aColumnIndex >= NUMBER_OF_COLUMNS()) + if ([column isHidden] || aColumnIndex < 0 || aColumnIndex >= NUMBER_OF_COLUMNS()) return _CGRectMakeZero(); UPDATE_COLUMN_RANGES_IF_NECESSARY(); @@ -2042,10 +2067,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; columnsCount = columnArray.length; for (; columnIndex < columnsCount; ++columnIndex) - { + { var column = columnArray[columnIndex], - tableColumn = _tableColumns[column], - tableColumnUID = [tableColumn UID]; + tableColumn = _tableColumns[column]; + + if ([tableColumn isHidden]) + continue; + + var tableColumnUID = [tableColumn UID]; if (!_dataViewsForTableColumns[tableColumnUID]) _dataViewsForTableColumns[tableColumnUID] = []; @@ -2158,6 +2187,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; - (void)_enqueueReusableDataView:(CPView)aDataView { + if (!aDataView) + return; + // FIXME: yuck! var identifier = aDataView.identifier;