From 9d7b822409ec77af3dba7a2b8ecc4dc8c2e4ee66 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 27 Jan 2012 17:04:04 +0000 Subject: [PATCH] Add support for split view `shouldAdjustSizeOfSubview:` delegate method. --- AppKit/CPSplitView.j | 11 +++++++---- Tests/AppKit/CPSplitViewTest.j | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index f1dfcc0f2..67340919e 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -785,12 +785,16 @@ var CPSplitViewHorizontalImage = nil, nonSizableSpace = 0, lastSizableIndex = -1, totalSizablePanes = 0, - isVertical = [self isVertical]; + isVertical = [self isVertical], + isSizableMap = {}, + delegateRespondsToShouldAdjust = [_delegate respondsToSelector:@selector(splitView:shouldAdjustSizeOfSubview:)]; for (index = 0; index < count; ++index) { var view = _subviews[index], - isSizable = isVertical ? [view autoresizingMask] & CPViewWidthSizable : [view autoresizingMask] & CPViewHeightSizable; + isSizable = !delegateRespondsToShouldAdjust || [_delegate splitView:self shouldAdjustSizeOfSubview:view]; + + isSizableMap[index] = isSizable; if (isSizable) { @@ -812,7 +816,7 @@ var CPSplitViewHorizontalImage = nil, { var view = _subviews[index], viewFrame = CGRectMakeCopy(bounds), - isSizable = isVertical ? [view autoresizingMask] & CPViewWidthSizable : [view autoresizingMask] & CPViewHeightSizable; + isSizable = isSizableMap[index]; if (index + 1 === count) viewFrame.size[_sizeComponent] = bounds.size[_sizeComponent] - viewFrame.origin[_originComponent]; @@ -832,7 +836,6 @@ var CPSplitViewHorizontalImage = nil, bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness; [view setFrame:viewFrame]; - } SPLIT_VIEW_MAYBE_POST_DID_RESIZE(); diff --git a/Tests/AppKit/CPSplitViewTest.j b/Tests/AppKit/CPSplitViewTest.j index a7dcf5096..20ed444da 100644 --- a/Tests/AppKit/CPSplitViewTest.j +++ b/Tests/AppKit/CPSplitViewTest.j @@ -42,6 +42,28 @@ [self assert:(120 - dividerThickness) equals:[viewB frameSize].height]; } +- (void)testSplitView_shouldAdjustSizeOfSubview_ +{ + var dividerThickness = [splitView dividerThickness], + delegate = [CPSplitViewDontResizeTopView new]; + + [splitView setDelegate:delegate]; + [splitView setFrame:CGRectMake(0, 0, 200, 200)]; + + // All the extra height should have gone to the bottom view. + [self assert:50 equals:[viewA frameSize].height]; + [self assert:(150 - dividerThickness) equals:[viewB frameSize].height]; + + var viewC = [[CPView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; + [splitView addSubview:viewC]; + [splitView setPosition:66 ofDividerAtIndex:0]; + [splitView setPosition:(132 + dividerThickness) ofDividerAtIndex:1]; + + [self assert:66 equals:[viewA frameSize].height]; + [self assert:66 equals:[viewB frameSize].height]; + [self assert:66 equals:[viewC frameSize].height]; +} + - (void)testAutosave { // Verify that the split view does not attempt to auto save without an auto save name. @@ -55,6 +77,17 @@ @end +@implementation CPSplitViewDontResizeTopView : CPObject +{ +} + +- (BOOL)splitView:(CPSplitView)splitView shouldAdjustSizeOfSubview:(CPView)subview +{ + var subviews = [splitView subviews]; + return (subview !== [subviews firstObject]); +} + +@end /*! This store always fails. */