diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index c6703958a..4c223422d 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -39,6 +39,7 @@ { CPClipView _contentView; CPClipView _headerClipView; + CPView _cornerView; BOOL _hasVerticalScroller; BOOL _hasHorizontalScroller; @@ -140,13 +141,9 @@ - (void)setDocumentView:(CPView)aView { [_contentView setDocumentView:aView]; - [_headerClipView setDocumentView:[self _headerView]]; - - var cornerView = [self _cornerView]; - - if (cornerView) - [self addSubview:cornerView]; + // FIXME: This should be observed. + [self _updateCornerAndHeaderView]; [self reflectScrolledClipView:_contentView]; } @@ -189,7 +186,7 @@ var documentFrame = [documentView frame], // the size of the whole document contentFrame = [self bounds], // assume it takes up the entire size of the scrollview (no scrollers) - headerClipViewFrame = [self headerClipViewFrame], + headerClipViewFrame = [self _headerClipViewFrame], headerClipViewHeight = _CGRectGetHeight(headerClipViewFrame); contentFrame.origin.y += headerClipViewHeight; @@ -238,7 +235,7 @@ if (shouldShowVerticalScroller) { - var verticalScrollerY = MAX(_CGRectGetHeight([self cornerViewFrame]), headerClipViewHeight), + var verticalScrollerY = MAX(_CGRectGetHeight([self _cornerViewFrame]), headerClipViewHeight), verticalScrollerHeight = _CGRectGetHeight([self bounds]) - verticalScrollerY; if (shouldShowHorizontalScroller) @@ -268,7 +265,7 @@ [_contentView setFrame:contentFrame]; [_headerClipView setFrame:headerClipViewFrame]; - [[self _cornerView] setFrame:[self cornerViewFrame]]; + [_cornerView setFrame:[self _cornerViewFrame]]; --_recursionCount; } @@ -423,54 +420,67 @@ return _autohidesScrollers; } +- (void)_updateCornerAndHeaderView +{ + var documentView = [self documentView], + currentHeaderView = [self _headerView], + documentHeaderView = [documentView respondsToSelector:@selector(headerView)] ? [documentView headerView] : nil; + + if (currentHeaderView !== documentHeaderView) + { + [currentHeaderView removeFromSuperview]; + [_headerClipView setDocumentView:documentHeaderView]; + } + + var documentCornerView = [documentView respondsToSelector:@selector(cornerView)] ? [documentView cornerView] : nil; + + if (_cornerView !== documentCornerView) + { + [_cornerView removeFromSuperview]; + + _cornerView = documentCornerView; + + if (_cornerView) + [self addSubview:_cornerView]; + } + + [self reflectScrolledClipView:_contentView]; +} + - (CPView)_headerView { - var documentView = [self documentView]; - - if ([documentView respondsToSelector:@selector(headerView)]) - return [documentView headerView]; + var headerClipViewSubviews = [_headerClipView subviews]; - return nil; + return [headerClipViewSubviews count] ? headerClipViewSubviews[0] : nil; } -- (CPView)_cornerView +- (CGRect)_cornerViewFrame { - var documentView = [self documentView]; - - if ([documentView respondsToSelector:@selector(cornerView)]) - return [documentView cornerView]; -} - -- (CGRect)cornerViewFrame -{ - var cornerView = [self _cornerView], - cornerBounds = [cornerView bounds], - bounds = [self bounds]; - - if (!cornerView) + if (!_cornerView) return _CGRectMakeZero(); - cornerBounds.origin.x = CGRectGetMaxX(bounds) - CGRectGetWidth(cornerBounds); - cornerBounds.origin.y = 0; + var bounds = [self bounds], + frame = [_cornerView frame]; - return cornerBounds; + frame.origin.x = _CGRectGetMaxX(bounds) - _CGRectGetWidth(frame); + frame.origin.y = 0; + + return frame; } -- (CGRect)headerClipViewFrame +- (CGRect)_headerClipViewFrame { - var headerView = [self _headerView], - cornerView = [self _cornerView], - bounds = [self bounds]; + var headerView = [self _headerView]; if (!headerView) return _CGRectMakeZero(); - bounds.size.height = [headerView bounds].size.height; + var frame = [self bounds]; - if (cornerView) - bounds.size.width -= CGRectGetWidth([cornerView bounds]); + frame.size.height = _CGRectGetHeight([headerView frame]); + frame.size.width -= _CGRectGetWidth([self _cornerViewFrame]); - return bounds; + return frame; } /* @ignore */ diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 7b1ebdbb0..84221875c 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -666,7 +666,15 @@ CPTableViewSolidHorizontalGridLineMask = 1 << 1; - (void)setCornerView:(CPView)aView { + if (_cornerView === aView) + return; + _cornerView = aView; + + var scrollView = [[self superview] superview]; + + if ([scrollView isKindOfClass:[CPScrollView class]] && [scrollView documentView] === self) + [scrollView _updateCornerAndHeaderView]; } - (CPView)headerView @@ -676,8 +684,23 @@ CPTableViewSolidHorizontalGridLineMask = 1 << 1; - (void)setHeaderView:(CPView)aHeaderView { + if (_headerView === aHeaderView) + return; + + [_headerView setTableView:nil]; + _headerView = aHeaderView; - [_headerView setTableView:self]; + + if (_headerView) + { + [_headerView setTableView:self]; + [_headerView setFrameSize:_CGSizeMake(aSize.width, [_headerView frame].size.height)]; + } + + var scrollView = [[self superview] superview]; + + if ([scrollView isKindOfClass:[CPScrollView class]] && [scrollView documentView] === self) + [scrollView _updateCornerAndHeaderView]; } //Layout Support @@ -1294,7 +1317,9 @@ _cachedDataViews[dataView.identifier].push(dataView); - (void)setFrameSize:(CGSize)aSize { [super setFrameSize:aSize]; - [_headerView setFrameSize:CGSizeMake(aSize.width, [_headerView frame].size.height)]; + + if (_headerView) + [_headerView setFrameSize:_CGSizeMake(aSize.width, [_headerView frame].size.height)]; } - (CGRect)exposedClipRect