From f4cedf5acc860766c83e3db98dfd55bb855a77de Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 23 Sep 2008 00:01:12 -0700 Subject: [PATCH] A number of fixes relating to how CPSplitView divides itself by default, as well as adding CPView-viewWillDraw. Reviewed by Tom. --- AppKit/CPSplitView.j | 121 ++++++++++++++++++++++++++++++------------- AppKit/CPView.j | 6 +++ 2 files changed, 90 insertions(+), 37 deletions(-) diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 41d8faead..b044cbe9a 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -49,6 +49,8 @@ var CPSplitViewHorizontalImage = nil, CPArray _DOMDividerElements; CPString _dividerImagePath; int _drawingDivider; + + BOOL _needsResizeSubviews; } /* @@ -88,20 +90,45 @@ var CPSplitViewHorizontalImage = nil, return _isVertical; } -- (void)setVertical:(BOOL)flag +- (void)setVertical:(BOOL)shouldBeVertical { - [self _setVertical:flag]; + if (![self _setVertical:shouldBeVertical]) + return; - [self adjustSubviews]; + // Just re-adjust evenly. + var frame = [self frame], + dividerThickness = [self dividerThickness]; + + [self _postNotificationWillResize]; + + var eachSize = ROUND((frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length), + index = 0, + count = _subviews.length; + + if ([self isVertical]) + for (; index < count; ++index) + [_subviews[index] setFrame:CGRectMake(ROUND((eachSize + dividerThickness) * index), 0, eachSize, frame.size.height)]; + else + for (; index < count; ++index) + [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index), frame.size.width, eachSize)]; + + [self setNeedsDisplay:YES]; + + [self _postNotificationDidResize]; + } -- (void)_setVertical:(BOOL)flag +- (BOOL)_setVertical:(BOOL)shouldBeVertical { - _isVertical = flag; + var changed = (_isVertical != shouldBeVertical); - _originComponent = [self isVertical] ? "x" : "y"; - _sizeComponent = [self isVertical] ? "width" : "height"; - _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; + _isVertical = shouldBeVertical; + + _originComponent = [self isVertical] ? "x" : "y"; + _sizeComponent = [self isVertical] ? "width" : "height"; + _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; + + return changed; } - (BOOL)isPaneSplitter @@ -123,32 +150,10 @@ var CPSplitViewHorizontalImage = nil, [self setNeedsDisplay:YES]; } -- (void)didAddSubview:(CPView)subview +- (void)didAddSubview:(CPView)aSubview { - [self adjustSubviews]; -} - -- (void)adjustSubviews -{ - var frame = [self frame], - dividerThickness = [self dividerThickness]; - - [self _postNotificationWillResize]; - - var eachSize = ROUND((frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length), - index = 0, - count = _subviews.length; - - if ([self isVertical]) - for (; index < count; ++index) - [_subviews[index] setFrame:CGRectMake(ROUND((eachSize + dividerThickness) * index), 0, eachSize, frame.size.height)]; - else - for (; index < count; ++index) - [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index), frame.size.width, eachSize)]; - - [self setNeedsDisplay:YES]; - - [self _postNotificationDidResize]; + _needsResizeSubviews = YES; +// [self adjustSubviews]; } - (BOOL)isSubviewCollapsed:(CPView)subview @@ -218,6 +223,39 @@ var CPSplitViewHorizontalImage = nil, #endif } +- (void)viewWillDraw +{ + [self _adjustSubviewsWithCalculatedSize]; +} + +- (void)_adjustSubviewsWithCalculatedSize +{ + if (!_needsResizeSubviews) + return; + + _needsResizeSubviews = NO; + + var subviews = [self subviews], + count = subviews.length, + oldSize = CGSizeMakeZero(); + + if ([self isVertical]) + { + oldSize.width += [self dividerThickness] * (count - 1); + oldSize.height = CGRectGetHeight([self frame]); + } + else + { + oldSize.width = CGRectGetWidth([self frame]); + oldSize.height += [self dividerThickness] * (count - 1); + } + + while (count--) + oldSize[_sizeComponent] += [subviews[count] frame].size[_sizeComponent]; + + [self resizeSubviewsWithOldSize:oldSize]; +} + - (BOOL)cursorAtPoint:(CPPoint)aPoint hitDividerAtIndex:(int)anIndex { var frame = [_subviews[anIndex] frame], @@ -353,6 +391,8 @@ var CPSplitViewHorizontalImage = nil, - (void)setPosition:(float)position ofDividerAtIndex:(int)dividerIndex { + [self _adjustSubviewsWithCalculatedSize]; + // not sure where this should override other positions? if ([_delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]) position = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex]; @@ -386,13 +426,22 @@ var CPSplitViewHorizontalImage = nil, frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness]; frameB.origin[_originComponent] = realPosition + [self dividerThickness]; - [_subviews[dividerIndex+1] setFrame:frameB]; + [_subviews[dividerIndex + 1] setFrame:frameB]; + + [self setNeedsDisplay:YES]; +} + +- (void)setFrameSize:(CGSize)aSize +{ + [self _adjustSubviewsWithCalculatedSize]; + + [super setFrameSize:aSize]; [self setNeedsDisplay:YES]; } - (void)resizeSubviewsWithOldSize:(CPSize)oldSize -{ +{ if ([_delegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)]) { [_delegate splitView:self resizeSubviewsWithOldSize:oldSize]; @@ -421,8 +470,6 @@ var CPSplitViewHorizontalImage = nil, [view setFrame:newFrame]; } - - [self setNeedsDisplay:YES]; [self _postNotificationDidResize]; } diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 558cc0082..8451ea6d9 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1435,6 +1435,8 @@ setBoundsOrigin: */ - (void)displayRect:(CPRect)aRect { + [self viewWillDraw]; + [self displayRectIgnoringOpacity:aRect inContext:nil]; _dirtyRect = NULL; @@ -1450,6 +1452,10 @@ setBoundsOrigin: [self unlockFocus]; } +- (void)viewWillDraw +{ +} + /* Locks focus on the receiver, so drawing commands apply to it. */