23 #include "../Foundation/Foundation.h" 32 - (BOOL)splitView:(
CPSplitView)splitView shouldAdjustSizeOfSubview:(
CPView)subview;
33 - (BOOL)splitView:(
CPSplitView)splitView shouldCollapseSubview:(
CPView)subview forDoubleClickOnDividerAtIndex:(CPInteger)dividerIndex;
34 - (CGRect)splitView:(
CPSplitView)splitView additionalEffectiveRectOfDividerAtIndex:(CPInteger)dividerIndex;
35 - (CGRect)splitView:(
CPSplitView)splitView effectiveRect:(CGRect)proposedEffectiveRect forDrawnRect:(CGRect)drawnRect ofDividerAtIndex:(CPInteger)dividerIndex;
36 - (float)splitView:(
CPSplitView)splitView constrainMaxCoordinate:(
float)proposedMax ofSubviewAt:(CPInteger)dividerIndex;
37 - (float)splitView:(
CPSplitView)splitView constrainMinCoordinate:(
float)proposedMin ofSubviewAt:(CPInteger)dividerIndex;
38 - (float)splitView:(
CPSplitView)splitView constrainSplitPosition:(
float)proposedPosition ofSubviewAt:(CPInteger)dividerIndex;
39 - (void)splitView:(
CPSplitView)splitView resizeSubviewsWithOldSize:(CGSize)oldSize;
57 #define SPLIT_VIEW_MAYBE_POST_WILL_RESIZE() \ 58 if ((_suppressResizeNotificationsMask & DidPostWillResizeNotification) === 0) \ 60 [self _postNotificationWillResize]; \ 61 _suppressResizeNotificationsMask |= DidPostWillResizeNotification; \ 64 #define SPLIT_VIEW_MAYBE_POST_DID_RESIZE() \ 65 if ((_suppressResizeNotificationsMask & ShouldSuppressResizeNotifications) !== 0) \ 66 _suppressResizeNotificationsMask |= DidSuppressResizeNotification; \ 68 [self _postNotificationDidResize]; 70 #define SPLIT_VIEW_DID_SUPPRESS_RESIZE_NOTIFICATION() \ 71 ((_suppressResizeNotificationsMask & DidSuppressResizeNotification) !== 0) 73 #define SPLIT_VIEW_SUPPRESS_RESIZE_NOTIFICATIONS(shouldSuppress) \ 75 _suppressResizeNotificationsMask |= ShouldSuppressResizeNotifications; \ 77 _suppressResizeNotificationsMask = 0; 99 id <CPSplitViewDelegate> _delegate;
101 BOOL _isPaneSplitter;
104 float _initialOffset;
110 CPArray _DOMDividerElements;
115 BOOL _shouldAutosave;
116 CGSize _shouldRestoreFromAutosaveUnlessFrameSize;
118 BOOL _needsResizeSubviews;
119 int _suppressResizeNotificationsMask;
123 unsigned _implementedDelegateMethods;
134 @"divider-thickness": 1.0,
135 @"pane-divider-thickness": 10.0,
142 - (id)initWithFrame:(CGRect)aFrame
144 if (
self = [super initWithFrame:aFrame])
146 _suppressResizeNotificationsMask = 0;
150 _DOMDividerElements = [];
153 _shouldAutosave = YES;
155 [
self _setVertical:YES];
167 return [
self currentValueForThemeAttribute:[
self isPaneSplitter] ? @"pane-divider-thickness" : @"divider-thickness"];
183 - (void)setVertical:(BOOL)shouldBeVertical
185 if (![
self _setVertical:shouldBeVertical])
192 [
self _postNotificationWillResize];
194 var eachSize = ROUND((
frame.size[_sizeComponent] -
dividerThickness * (_subviews.length - 1)) / _subviews.length),
196 count = _subviews.length;
200 for (; index < count; ++index)
201 [_subviews[index] setFrame:CGRectMake(ROUND((eachSize +
dividerThickness) * index), 0, eachSize,
frame.size.height)];
205 for (; index < count; ++index)
206 [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize +
dividerThickness) * index),
frame.size.width, eachSize)];
210 [
self _postNotificationDidResize];
214 - (BOOL)_setVertical:(BOOL)shouldBeVertical
216 var changed = (_isVertical != shouldBeVertical);
218 _isVertical = shouldBeVertical;
220 _originComponent = [
self isVertical] ?
"x" :
"y";
221 _sizeComponent = [
self isVertical] ?
"width" :
"height";
222 _dividerImagePath = [
self isVertical] ? [[
self valueForThemeAttribute:@"vertical-divider-color"] filename] : [[
self valueForThemeAttribute:@"horizontal-divider-color"] filename];
234 return _isPaneSplitter;
242 - (void)setIsPaneSplitter:(BOOL)shouldBePaneSplitter
244 if (_isPaneSplitter == shouldBePaneSplitter)
247 _isPaneSplitter = shouldBePaneSplitter;
249 if (_DOMDividerElements[_drawingDivider])
250 [
self _setupDOMDivider];
254 _needsResizeSubviews = YES;
260 _needsResizeSubviews = YES;
268 - (BOOL)isSubviewCollapsed:(
CPView)subview
270 return [subview
frame].size[_sizeComponent] < 1 ? YES : NO;
279 - (CGRect)rectOfDividerAtIndex:(
int)aDivider
281 var
frame = [_subviews[aDivider] frame],
282 rect = CGRectMakeZero();
284 rect.size = [
self frame].size;
286 rect.origin[_originComponent] =
frame.origin[_originComponent] +
frame.size[_sizeComponent];
297 - (CGRect)effectiveRectOfDividerAtIndex:(
int)aDivider
302 realRect.size[_sizeComponent] += padding * 2;
303 realRect.origin[_originComponent] -= padding;
308 - (void)drawRect:(CGRect)rect
310 var count = [_subviews count] - 1;
312 while ((count--) > 0)
314 _drawingDivider = count;
327 var dividerToRemove = _DOMDividerElements.pop();
331 CPDOMDisplayServerRemoveChild(_DOMElement, dividerToRemove);
334 _needsResizeSubviews = YES;
341 [
self _adjustSubviewsWithCalculatedSize]
348 - (void)drawDividerInRect:(CGRect)aRect
351 if (!_DOMDividerElements[_drawingDivider])
353 _DOMDividerElements[_drawingDivider] = document.createElement(
"div");
355 _DOMDividerElements[_drawingDivider].style.position =
"absolute";
356 _DOMDividerElements[_drawingDivider].style.backgroundRepeat =
"repeat";
358 CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
361 [
self _setupDOMDivider];
362 CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, CGRectGetMinX(aRect), CGRectGetMinY(aRect));
363 CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], CGRectGetWidth(aRect), CGRectGetHeight(aRect));
367 - (void)_setupDOMDivider
371 _DOMDividerElements[_drawingDivider].style.backgroundColor =
"";
372 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"url('"+_dividerImagePath+
"')";
376 _DOMDividerElements[_drawingDivider].style.backgroundColor = [[
self currentValueForThemeAttribute:@"pane-divider-color"] cssString];
377 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"";
383 [
self _adjustSubviewsWithCalculatedSize];
386 - (void)_adjustSubviewsWithCalculatedSize
388 if (!_needsResizeSubviews)
391 _needsResizeSubviews = NO;
396 - (CGSize)_calculateSize
399 count = subviews.length,
400 size = CGSizeMakeZero();
405 size.height = CGRectGetHeight([
self frame]);
409 size.width = CGRectGetWidth([
self frame]);
414 size[_sizeComponent] += [subviews[count] frame].size[_sizeComponent];
419 - (BOOL)cursorAtPoint:(CGPoint)aPoint hitDividerAtIndex:(
int)anIndex
421 var
frame = [_subviews[anIndex] frame],
422 startPosition =
frame.origin[_originComponent] +
frame.size[_sizeComponent],
424 buttonBar = _buttonBars[anIndex],
425 buttonBarRect = null,
426 additionalRect = null;
428 if (buttonBar != null)
430 buttonBarRect = [buttonBar resizeControlFrame];
434 effectiveRect = [
self _sendDelegateSplitViewEffectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
435 additionalRect = [
self _sendDelegateSplitViewAdditionalEffectiveRectOfDividerAtIndex:anIndex];
437 return CGRectContainsPoint(effectiveRect, aPoint) ||
438 (additionalRect && CGRectContainsPoint(additionalRect, aPoint)) ||
439 (buttonBarRect && CGRectContainsPoint(buttonBarRect, aPoint));
448 count = [_subviews count] - 1;
450 for (var i = 0; i < count; i++)
452 if ([
self cursorAtPoint:point hitDividerAtIndex:i])
465 var type = [anEvent
type];
470 _shouldAutosave = YES;
476 [
self _updateResizeCursor:anEvent];
485 count = [_subviews count] - 1;
489 for (var i = 0; i < count; i++)
491 var
frame = [_subviews[i] frame],
492 startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent];
494 if ([
self cursorAtPoint:point hitDividerAtIndex:i])
496 if ([anEvent clickCount] == 2 &&
497 [
self _delegateRespondsToSplitViewCanCollapseSubview] &&
498 [
self _delegateRespondsToSplitViewshouldCollapseSubviewForDoubleClickOnDividerAtIndex])
502 preCollapsePosition = [_preCollapsePositions objectForKey:"" + i] || 0;
504 if ([
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i]] && [
self _sendDelegateSplitViewShouldCollapseSubview:_subviews[i] forDoubleClickOnDividerAtIndex:i])
506 if ([
self isSubviewCollapsed:_subviews[i]])
507 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i];
511 else if ([
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i + 1]] && [
self _sendDelegateSplitViewShouldCollapseSubview:_subviews[i + 1] forDoubleClickOnDividerAtIndex:i])
513 if ([
self isSubviewCollapsed:_subviews[i + 1]])
514 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i];
522 _initialOffset = startPosition - point[_originComponent];
525 _shouldAutosave = NO;
526 [
self _postNotificationWillResize];
541 [
self _updateResizeCursor:anEvent];
544 [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
559 - (void)_updateResizeCursor:(
CPEvent)anEvent
569 for (var i = 0, count = [_subviews count] - 1; i < count; i++)
572 if (_currentDivider === i || (_currentDivider ==
CPNotFound && [
self cursorAtPoint:point hitDividerAtIndex:i]))
574 var frameA = [_subviews[i] frame],
575 sizeA = frameA.size[_sizeComponent],
576 startPosition = frameA.origin[_originComponent] + sizeA,
577 frameB = [_subviews[i + 1] frame],
578 sizeB = frameB.size[_sizeComponent],
579 canShrink = [
self _realPositionForPosition:startPosition - 1 ofDividerAtIndex:i] < startPosition,
580 canGrow = [
self _realPositionForPosition:startPosition + 1 ofDividerAtIndex:i] > startPosition,
585 else if (!canShrink && [
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i]])
595 else if (!canGrow && [
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i + 1]])
600 if (_isVertical && canShrink && canGrow)
602 else if (_isVertical && canShrink)
604 else if (_isVertical && canGrow)
606 else if (canShrink && canGrow)
626 - (float)maxPossiblePositionOfDividerAtIndex:(
int)dividerIndex
628 var
frame = [_subviews[dividerIndex + 1] frame];
630 if (dividerIndex + 1 < [_subviews count] - 1)
641 - (float)minPossiblePositionOfDividerAtIndex:(
int)dividerIndex
643 if (dividerIndex > 0)
645 var
frame = [_subviews[dividerIndex - 1] frame];
647 return frame.origin[_originComponent] + frame.size[_sizeComponent] + [
self dividerThickness];
653 - (int)_realPositionForPosition:(
float)
position ofDividerAtIndex:(int)dividerIndex
656 var proposedPosition = [
self _sendDelegateSplitViewConstrainSplitPosition:position ofSubviewAt:dividerIndex];
661 if (_IS_NUMERIC(proposedPosition))
666 actualMax = proposedMax,
667 actualMin = proposedMin,
668 proposedActualMin = [
self _sendDelegateSplitViewConstrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex],
669 proposedActualMax = [
self _sendDelegateSplitViewConstrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
671 if (_IS_NUMERIC(proposedActualMin))
672 actualMin = proposedActualMin;
674 if (_IS_NUMERIC(proposedActualMax))
675 actualMax = proposedActualMax;
677 var viewA = _subviews[dividerIndex],
678 viewB = _subviews[dividerIndex + 1],
679 realPosition = MAX(MIN(
position, actualMax), actualMin);
682 if ((
position < proposedMin + (actualMin - proposedMin) / 2) && [
self _sendDelegateSplitViewCanCollapseSubview:viewA])
683 realPosition = proposedMin;
686 if ((
position > proposedMax - (proposedMax - actualMax) / 2) && [
self _sendDelegateSplitViewCanCollapseSubview:viewB])
687 realPosition = proposedMax;
697 - (void)setPosition:(
float)position ofDividerAtIndex:(
int)dividerIndex
701 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
704 [
self _adjustSubviewsWithCalculatedSize];
706 var realPosition = [
self _realPositionForPosition:position ofDividerAtIndex:dividerIndex],
707 viewA = _subviews[dividerIndex],
708 frameA = [viewA frame],
709 viewB = _subviews[dividerIndex + 1],
710 frameB = [viewB frame],
711 preCollapsePosition = 0,
712 preSize = frameA.size[_sizeComponent];
714 frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
716 if (preSize !== 0 && frameA.size[_sizeComponent] === 0)
717 preCollapsePosition = preSize;
719 if (preSize !== frameA.size[_sizeComponent])
722 [_subviews[dividerIndex] setFrame:frameA];
726 preSize = frameB.size[_sizeComponent];
728 var preOrigin = frameB.origin[_originComponent];
729 frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [
self dividerThickness];
731 if (preSize !== 0 && frameB.size[_sizeComponent] === 0)
732 preCollapsePosition = frameB.origin[_originComponent];
736 if (preSize !== frameB.size[_sizeComponent] || preOrigin !== frameB.origin[_originComponent])
739 [_subviews[dividerIndex + 1] setFrame:frameB];
743 if (preCollapsePosition)
744 [_preCollapsePositions setObject:preCollapsePosition forKey:"" + dividerIndex];
749 [
self _postNotificationDidResize];
754 - (void)setFrameSize:(CGSize)aSize
756 if (_shouldRestoreFromAutosaveUnlessFrameSize)
757 _shouldAutosave = NO;
759 [
self _adjustSubviewsWithCalculatedSize];
763 if (_shouldRestoreFromAutosaveUnlessFrameSize)
764 _shouldAutosave = YES;
769 - (void)resizeSubviewsWithOldSize:(CGSize)oldSize
771 if ([
self _delegateRespondsToSplitViewResizeSubviewsWithOldSize])
773 [
self _sendDelegateSplitViewResizeSubviewsWithOldSize:oldSize];
782 var count = [_subviews count];
788 [
self _postNotificationWillResize];
793 oldSize = [
self _calculateSize],
795 totalDividers = count - 1,
796 oldFlexibleSpace = 0,
797 totalSizablePanes = 0,
812 for (index = 0; index < count; ++index)
814 var view = _subviews[index],
815 isSizable = [
self _sendDelegateSplitViewShouldAdjustSizeOfSubview:view],
816 size = [view frame].size[_sizeComponent];
818 isSizableMap[index] = isSizable;
819 viewSizes.push(size);
823 oldFlexibleSpace += size;
829 var nonSizableSpace = oldSize[_sizeComponent] - oldFlexibleSpace,
830 newFlexibleSpace =
boundsSize - nonSizableSpace,
831 remainingFixedPixelsToRemove = 0;
833 if (newFlexibleSpace < 0)
835 remainingFixedPixelsToRemove = -newFlexibleSpace;
836 newFlexibleSpace = 0;
839 var remainingFixedPanes = count - totalSizablePanes;
841 for (index = 0; index < count; ++index)
843 var view = _subviews[index],
844 viewFrame = CGRectMakeCopy(
bounds),
845 isSizable = isSizableMap[index],
849 if (index + 1 === count)
850 targetSize =
boundsSize - viewFrame.origin[_originComponent];
854 var removedFixedPixels = MIN(remainingFixedPixelsToRemove / remainingFixedPanes, viewSizes[index]);
855 targetSize = viewSizes[index] - removedFixedPixels;
856 remainingFixedPixelsToRemove -= removedFixedPixels;
857 remainingFixedPanes--;
860 else if (oldFlexibleSpace > 0)
861 targetSize = newFlexibleSpace * viewSizes[index] / oldFlexibleSpace;
865 targetSize = newFlexibleSpace / totalSizablePanes;
867 targetSize = MAX(0, ROUND(targetSize));
868 viewFrame.size[_sizeComponent] = targetSize;
869 [view setFrame:viewFrame];
941 - (void)setDelegate:(
id <CPSplitViewDelegate>)aDelegate
943 if (_delegate === aDelegate)
946 _delegate = aDelegate;
947 _implementedDelegateMethods = 0;
949 if ([_delegate respondsToSelector:
@selector(splitViewWillResizeSubviews:)])
952 if ([_delegate respondsToSelector:
@selector(splitViewDidResizeSubviews:)])
955 if ([_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)])
958 if ([_delegate respondsToSelector:
@selector(splitView:shouldAdjustSizeOfSubview:)])
961 if ([_delegate respondsToSelector:
@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)])
964 if ([_delegate respondsToSelector:
@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
967 if ([_delegate respondsToSelector:
@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)])
970 if ([_delegate respondsToSelector:
@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)])
973 if ([_delegate respondsToSelector:
@selector(splitView:constrainMinCoordinate:ofSubviewAt:)])
976 if ([_delegate respondsToSelector:
@selector(splitView:constrainSplitPosition:ofSubviewAt:)])
979 if ([_delegate respondsToSelector:
@selector(splitView:resizeSubviewsWithOldSize:)])
1000 - (void)setButtonBar:(
CPButtonBar)aButtonBar forDividerAtIndex:(CPUInteger)dividerIndex
1004 _buttonBars[dividerIndex] = nil;
1009 subview = aButtonBar;
1011 while (view && view !==
self)
1014 view = [view superview];
1019 reason:@"CPSplitView button bar must be a subview of the split view."];
1021 var viewIndex = [[
self subviews] indexOfObject:subview];
1026 _buttonBars[dividerIndex] = aButtonBar;
1029 - (void)_postNotificationWillResize
1031 [
self _sendDelegateSplitViewWillResizeSubviews];
1034 - (void)_postNotificationDidResize
1036 [
self _sendDelegateSplitViewDidResizeSubviews];
1050 if (_autosaveName == autosaveName)
1063 return _autosaveName;
1071 if (_shouldRestoreFromAutosaveUnlessFrameSize || !_shouldAutosave || !_autosaveName)
1075 autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1076 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1077 count = [_subviews count],
1081 for (var i = 0; i < count; i++)
1083 var
frame = [_subviews[i] frame];
1084 [positions addObject:CGStringFromRect(frame)];
1085 [preCollapseArray addObject:[_preCollapsePositions objectForKey:"" + i]];
1088 [userDefaults setObject:positions forKey:autosaveName];
1089 [userDefaults setObject:preCollapseArray forKey:autosavePrecollapseName];
1098 - (void)_restoreFromAutosaveIfNeeded
1100 if (_shouldRestoreFromAutosaveUnlessFrameSize && !CGSizeEqualToSize([
self frameSize], _shouldRestoreFromAutosaveUnlessFrameSize))
1102 [
self _restoreFromAutosave];
1105 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
1111 - (void)_restoreFromAutosave
1116 var autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1117 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1119 frames = [userDefaults objectForKey:autosaveName],
1120 preCollapseArray = [userDefaults objectForKey:autosavePrecollapseName];
1127 _shouldAutosave = NO;
1129 for (var i = 0, count = [frames count] - 1; i < count; i++)
1131 var
frame = CGRectFromString(frames[i]);
1132 position += frame.size[_sizeComponent];
1139 _shouldAutosave = YES;
1142 if (preCollapseArray)
1146 for (var i = 0, count = [preCollapseArray count]; i < count; i++)
1148 var item = preCollapseArray[i];
1151 [_preCollapsePositions removeObjectForKey:String(i)];
1153 [_preCollapsePositions setObject:item forKey:String(i)];
1163 if (!theAutosaveName)
1166 return @"CPSplitView Subview Frames " + theAutosaveName;
1174 if (!theAutosaveName)
1177 return @"CPSplitView Subview Precollapse Positions " + theAutosaveName;
1190 for (var i = 0; i < _subviews.length - 1; i++)
1191 [
self addTrackingArea:[[
CPTrackingArea alloc] initWithRect:[
self effectiveRectOfDividerAtIndex:i]
1200 [
self _updateResizeCursor:anEvent];
1212 - (BOOL)_delegateRespondsToSplitViewResizeSubviewsWithOldSize
1221 - (BOOL)_delegateRespondsToSplitViewCanCollapseSubview
1230 - (BOOL)_delegateRespondsToSplitViewshouldCollapseSubviewForDoubleClickOnDividerAtIndex
1240 - (BOOL)_sendDelegateSplitViewCanCollapseSubview:(
CPView)aView
1245 return [_delegate splitView:self canCollapseSubview:aView];
1252 - (BOOL)_sendDelegateSplitViewShouldAdjustSizeOfSubview:(
CPView)aView
1257 return [_delegate splitView:self shouldAdjustSizeOfSubview:aView];
1264 - (BOOL)_sendDelegateSplitViewShouldCollapseSubview:(
CPView)aView forDoubleClickOnDividerAtIndex:(int)anIndex
1269 return [_delegate splitView:self shouldCollapseSubview:aView forDoubleClickOnDividerAtIndex:anIndex];
1276 - (CGRect)_sendDelegateSplitViewAdditionalEffectiveRectOfDividerAtIndex:(
int)anIndex
1281 return [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
1288 - (CGRect)_sendDelegateSplitViewEffectiveRect:(CGRect)proposedEffectiveRect forDrawnRect:(CGRect)drawnRect ofDividerAtIndex:(CPInteger)dividerIndex
1291 return proposedEffectiveRect;
1293 return [_delegate splitView:self effectiveRect:proposedEffectiveRect forDrawnRect:drawnRect ofDividerAtIndex:dividerIndex];
1300 - (float)_sendDelegateSplitViewConstrainMaxCoordinate:(
float)proposedMax ofSubviewAt:(CPInteger)dividerIndex
1305 return [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
1312 - (float)_sendDelegateSplitViewConstrainMinCoordinate:(
float)proposedMin ofSubviewAt:(CPInteger)dividerIndex
1317 return [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex];
1324 - (float)_sendDelegateSplitViewConstrainSplitPosition:(
float)proposedMax ofSubviewAt:(CPInteger)dividerIndex
1329 return [_delegate splitView:self constrainSplitPosition:proposedMax ofSubviewAt:dividerIndex];
1336 - (void)_sendDelegateSplitViewResizeSubviewsWithOldSize:(CGSize)oldSize
1341 [_delegate splitView:self resizeSubviewsWithOldSize:oldSize];
1348 - (void)_sendDelegateSplitViewWillResizeSubviews
1353 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1365 - (void)_sendDelegateSplitViewDidResizeSubviews
1370 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1398 _autosaveName = [aCoder decodeObjectForKey:CPSplitViewAutosaveNameKey];
1429 _suppressResizeNotificationsMask = 0;
1433 _shouldAutosave = YES;
1435 _DOMDividerElements = [];
1437 _buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || [];
1439 [
self setDelegate:[aCoder decodeObjectForKey:CPSplitViewDelegateKey]];
1441 _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
1442 [
self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
1446 [
self _restoreFromAutosave];
1449 _shouldRestoreFromAutosaveUnlessFrameSize = [
self frameSize];
1467 [aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey];
1469 [aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey];
1470 [aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey];
1472 [aCoder encodeObject:_autosaveName forKey:CPSplitViewAutosaveNameKey];
Used to implement exception handling (creating & raising).
void updateTrackingAreas()
#define SPLIT_VIEW_MAYBE_POST_DID_RESIZE()
void postNotificationName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
An object representation of nil.
CPCursor resizeRightCursor()
id initWithCoder:(CPCoder aCoder)
var CPSplitViewDelegate_splitViewWillResizeSubviews_
The main run loop for the application.
var DidSuppressResizeNotification
void performSelector:target:argument:order:modes:(SEL aSelector, [target] id aTarget, [argument] id anArgument, [order] int anOrder, [modes] CPArray modes)
CGPoint locationInWindow()
void raise:reason:(CPString aName, [reason] CPString aReason)
CPTrackingActiveInKeyWindow
CPView hitTest:(CGPoint aPoint)
CGRect effectiveRectOfDividerAtIndex:(int aDivider)
CPNotificationCenter defaultCenter()
var CPSplitViewDelegate_splitViewDidResizeSubviews_
A mutable key-value pair collection.
id standardUserDefaults()
CPRunLoop currentRunLoop()
var DidPostWillResizeNotification
var CPSplitViewDelegate_splitView_constrainMinCoordinate_ofSubviewAt_
CPDictionary themeAttributes()
id initWithName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
An immutable string (collection of characters).
var CPSplitViewDelegate_splitView_additionalEffectiveRectOfDividerAtIndex_
CGPoint convertPoint:fromView:(CGPoint aPoint, [fromView] CPView aView)
var CPSplitViewIsVerticalKey
var CPSplitViewDelegate_splitView_effectiveRect_forDrawnRect_ofDividerAtIndex_
var CPSplitViewDelegate_splitView_shouldAdjustSizeOfSubview_
var CPSplitViewAutosaveNameKey
var CPSplitViewDelegateKey
var CPSplitViewIsPaneSplitterKey
CPCursor resizeLeftRightCursor()
void viewDidMoveToWindow()
void setNeedsDisplay:(BOOL aFlag)
void encodeWithCoder:(CPCoder aCoder)
float maxPossiblePositionOfDividerAtIndex:(int dividerIndex)
#define SPLIT_VIEW_SUPPRESS_RESIZE_NOTIFICATIONS(shouldSuppress)
CPCursor resizeUpCursor()
CGRect rectOfDividerAtIndex:(int aDivider)
A notification that can be posted to a CPNotificationCenter.
CPSplitViewDidResizeSubviewsNotification
CPSplitViewWillResizeSubviewsNotification
var CPSplitViewDelegate_splitView_resizeSubviewsWithOldSize_
void setDelegate:(id< CPSplitViewDelegate > aDelegate)
void setPosition:ofDividerAtIndex:(float position, [ofDividerAtIndex] int dividerIndex)
var ShouldSuppressResizeNotifications
var CPSplitViewButtonBarsKey
Defines methods for use when archiving & restoring (enc/decoding).
CPCursor resizeDownCursor()
Sends messages (CPNotification) between objects.
void drawDividerInRect:(CGRect aRect)
var CPSplitViewDelegate_splitView_constrainSplitPosition_ofSubviewAt_
void setFrameSize:(CGSize aSize)
float minPossiblePositionOfDividerAtIndex:(int dividerIndex)
CPString defaultThemeClass()
#define SPLIT_VIEW_DID_SUPPRESS_RESIZE_NOTIFICATION()
void removeAllTrackingAreas()
void updateTrackingAreas()
CPCursor resizeLeftCursor()
var CPSplitViewDelegate_splitView_shouldCollapseSubview_forDoubleClickOnDividerAtIndex_
CPCursor resizeUpDownCursor()
#define SPLIT_VIEW_MAYBE_POST_WILL_RESIZE()
void resizeSubviewsWithOldSize:(CGSize oldSize)
var CPSplitViewDelegate_splitView_canCollapseSubview_
var CPSplitViewDelegate_splitView_constrainMaxCoordinate_ofSubviewAt_
void trackDivider:(CPEvent anEvent)