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;
116 BOOL _shouldAutosave;
117 CGSize _shouldRestoreFromAutosaveUnlessFrameSize;
119 BOOL _needsResizeSubviews;
120 int _suppressResizeNotificationsMask;
124 unsigned _implementedDelegateMethods;
135 @"divider-thickness": 1.0,
136 @"pane-divider-thickness": 10.0,
143 - (id)initWithFrame:(CGRect)aFrame
145 if (
self = [super initWithFrame:aFrame])
147 _suppressResizeNotificationsMask = 0;
151 _DOMDividerElements = [];
154 _shouldAutosave = YES;
157 [
self _setVertical:YES];
167 - (float)dividerThickness
169 return [
self currentValueForThemeAttribute:[
self isPaneSplitter] ? @"pane-divider-thickness" : @"divider-thickness"];
185 - (void)setVertical:(BOOL)shouldBeVertical
187 if (![
self _setVertical:shouldBeVertical])
194 [
self _postNotificationWillResize];
196 var eachSize = ROUND((
frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length),
198 count = _subviews.length;
200 if ([
self isVertical])
202 for (; index < count; ++index)
203 [_subviews[index] setFrame:CGRectMake(ROUND((eachSize + dividerThickness) * index), 0, eachSize,
frame.size.height)];
207 for (; index < count; ++index)
208 [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index),
frame.size.width, eachSize)];
211 if (_DOMDividerElements[_drawingDivider])
212 [
self _setupDOMDivider];
215 [
self _postNotificationDidResize];
219 - (BOOL)_setVertical:(BOOL)shouldBeVertical
221 var changed = (_isVertical != shouldBeVertical);
223 _isVertical = shouldBeVertical;
225 _originComponent = [
self isVertical] ?
"x" :
"y";
226 _sizeComponent = [
self isVertical] ?
"width" :
"height";
227 _dividerImagePath = [
self isVertical] ? [[
self valueForThemeAttribute:@"vertical-divider-color"] filename] : [[
self valueForThemeAttribute:@"horizontal-divider-color"] filename];
237 - (BOOL)isPaneSplitter
239 return _isPaneSplitter;
247 - (void)setIsPaneSplitter:(BOOL)shouldBePaneSplitter
249 if (_isPaneSplitter == shouldBePaneSplitter)
252 _isPaneSplitter = shouldBePaneSplitter;
254 if (_DOMDividerElements[_drawingDivider])
255 [
self _setupDOMDivider];
259 _needsResizeSubviews = YES;
265 _needsResizeSubviews = YES;
273 - (BOOL)isSubviewCollapsed:(
CPView)subview
275 return [subview
frame].size[_sizeComponent] < 1 ? YES : NO;
284 - (CGRect)rectOfDividerAtIndex:(
int)aDivider
286 var
frame = [_subviews[aDivider] frame],
287 rect = CGRectMakeZero();
289 rect.size = [
self frame].size;
291 rect.origin[_originComponent] =
frame.origin[_originComponent] +
frame.size[_sizeComponent];
302 - (CGRect)effectiveRectOfDividerAtIndex:(
int)aDivider
307 realRect.size[_sizeComponent] += padding * 2;
308 realRect.origin[_originComponent] -= padding;
313 - (void)drawRect:(CGRect)rect
315 var count = [_subviews count] - 1;
317 while ((count--) > 0)
319 _drawingDivider = count;
332 var dividerToRemove = _DOMDividerElements.pop();
336 CPDOMDisplayServerRemoveChild(_DOMElement, dividerToRemove);
339 _needsResizeSubviews = YES;
344 - (void)layoutSubviews
346 [
self _adjustSubviewsWithCalculatedSize]
353 - (void)drawDividerInRect:(CGRect)aRect
356 if (!_DOMDividerElements[_drawingDivider])
358 _DOMDividerElements[_drawingDivider] = document.createElement(
"div");
360 _DOMDividerElements[_drawingDivider].style.position =
"absolute";
361 _DOMDividerElements[_drawingDivider].style.backgroundRepeat =
"repeat";
363 CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
364 [
self _setupDOMDivider];
367 CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, CGRectGetMinX(aRect), CGRectGetMinY(aRect));
368 CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], CGRectGetWidth(aRect), CGRectGetHeight(aRect));
372 - (void)_setupDOMDivider
376 _DOMDividerElements[_drawingDivider].style.backgroundColor =
"";
377 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"url('"+_dividerImagePath+"')";
381 _DOMDividerElements[_drawingDivider].style.backgroundColor = [[
self currentValueForThemeAttribute:@"pane-divider-color"] cssString];
382 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"";
388 [
self _adjustSubviewsWithCalculatedSize];
391 - (void)_adjustSubviewsWithCalculatedSize
393 if (!_needsResizeSubviews)
396 _needsResizeSubviews = NO;
398 [
self resizeSubviewsWithOldSize:[
self _calculateSize]];
401 - (CGSize)_calculateSize
403 var subviews = [
self subviews],
404 count = subviews.length,
405 size = CGSizeMakeZero();
407 if ([
self isVertical])
409 size.width += [self dividerThickness] * (count - 1);
410 size.height = CGRectGetHeight([
self frame]);
414 size.width = CGRectGetWidth([
self frame]);
415 size.height += [self dividerThickness] * (count - 1);
419 size[_sizeComponent] += [subviews[count]
frame].size[_sizeComponent];
424 - (BOOL)cursorAtPoint:(CGPoint)aPoint hitDividerAtIndex:(
int)anIndex
426 var
frame = [_subviews[anIndex] frame],
427 startPosition =
frame.origin[_originComponent] +
frame.size[_sizeComponent],
429 buttonBar = _buttonBars[anIndex],
430 buttonBarRect = null,
431 additionalRect = null;
433 if (buttonBar != null)
435 buttonBarRect = [buttonBar resizeControlFrame];
439 effectiveRect = [
self _sendDelegateSplitViewEffectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
440 additionalRect = [
self _sendDelegateSplitViewAdditionalEffectiveRectOfDividerAtIndex:anIndex];
442 return CGRectContainsPoint(effectiveRect, aPoint) ||
443 (additionalRect && CGRectContainsPoint(additionalRect, aPoint)) ||
444 (buttonBarRect && CGRectContainsPoint(buttonBarRect, aPoint));
449 if ([
self isHidden] || ![
self hitTests] || !CGRectContainsPoint([
self frame], aPoint))
453 dividerIndex = [
self _dividerAtPoint:point];
461 - (CPInteger)_dividerAtPoint:(CGPoint)aPoint
463 var count = [_subviews count] - 1;
465 for (var i = 0; i < count; i++)
467 if ([
self cursorAtPoint:aPoint hitDividerAtIndex:i])
479 var type = [anEvent
type];
483 if ([anEvent clickCount] == 2 || (_isTracking && _currentDivider !=
CPNotFound))
486 _shouldAutosave = YES;
491 [
self _updateResizeCursor:anEvent];
500 _currentDivider = [
self _dividerAtPoint:point];
502 var
frame = [_subviews[_currentDivider] frame],
503 startPosition =
frame.origin[_originComponent] +
frame.size[_sizeComponent];
505 if ([anEvent clickCount] == 2 &&
506 [
self _delegateRespondsToSplitViewCanCollapseSubview] &&
507 [
self _delegateRespondsToSplitViewshouldCollapseSubviewForDoubleClickOnDividerAtIndex])
511 preCollapsePosition = [_preCollapsePositions objectForKey:"" + _currentDivider] || 0;
513 if ([
self _sendDelegateSplitViewCanCollapseSubview:_subviews[_currentDivider]] && [
self _sendDelegateSplitViewShouldCollapseSubview:_subviews[_currentDivider] forDoubleClickOnDividerAtIndex:_currentDivider])
515 if ([
self isSubviewCollapsed:_subviews[_currentDivider]])
516 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:_currentDivider];
520 else if ([
self _sendDelegateSplitViewCanCollapseSubview:_subviews[_currentDivider + 1]] && [
self _sendDelegateSplitViewShouldCollapseSubview:_subviews[_currentDivider + 1] forDoubleClickOnDividerAtIndex:_currentDivider])
522 if ([
self isSubviewCollapsed:_subviews[_currentDivider + 1]])
523 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:_currentDivider];
530 _initialOffset = startPosition - point[_originComponent];
532 _shouldAutosave = NO;
533 [
self _postNotificationWillResize];
542 _shouldAutosave = NO;
543 [
self _postNotificationWillResize];
552 [
self _updateResizeCursor:anEvent];
555 [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
561 dividerIndex = [
self _dividerAtPoint:point];
567 - (void)viewDidMoveToWindow
573 - (void)_updateResizeCursor:(
CPEvent)anEvent
577 if ([anEvent type] ===
CPLeftMouseUp && ![[
self window] acceptsMouseMovedEvents])
583 for (var i = 0, count = [_subviews count] - 1; i < count; i++)
586 if (_currentDivider === i || (_currentDivider ==
CPNotFound && [
self cursorAtPoint:point hitDividerAtIndex:i]))
588 var frameA = [_subviews[i] frame],
589 sizeA = frameA.size[_sizeComponent],
590 startPosition = frameA.origin[_originComponent] + sizeA,
591 frameB = [_subviews[i + 1]
frame],
592 sizeB = frameB.size[_sizeComponent],
593 canShrink = [self _realPositionForPosition:startPosition - 1 ofDividerAtIndex:i] < startPosition,
594 canGrow = [self _realPositionForPosition:startPosition + 1 ofDividerAtIndex:i] > startPosition,
595 cursor = [CPCursor arrowCursor];
599 else if (!canShrink && [
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i]])
609 else if (!canGrow && [
self _sendDelegateSplitViewCanCollapseSubview:_subviews[i + 1]])
614 if (_isVertical && canShrink && canGrow)
615 cursor = [
CPCursor resizeLeftRightCursor];
616 else if (_isVertical && canShrink)
617 cursor = [
CPCursor resizeLeftCursor];
618 else if (_isVertical && canGrow)
619 cursor = [
CPCursor resizeRightCursor];
620 else if (canShrink && canGrow)
621 cursor = [
CPCursor resizeUpDownCursor];
625 cursor = [
CPCursor resizeDownCursor];
640 - (float)maxPossiblePositionOfDividerAtIndex:(
int)dividerIndex
642 var
frame = [_subviews[dividerIndex + 1] frame];
644 if (dividerIndex + 1 < [_subviews count] - 1)
645 return frame.origin[_originComponent] +
frame.size[_sizeComponent] - [
self dividerThickness];
647 return [
self frame].size[_sizeComponent] - [
self dividerThickness];
655 - (float)minPossiblePositionOfDividerAtIndex:(
int)dividerIndex
657 if (dividerIndex > 0)
659 var
frame = [_subviews[dividerIndex - 1] frame];
667 - (int)_realPositionForPosition:(
float)position ofDividerAtIndex:(
int)dividerIndex
670 var proposedPosition = [
self _sendDelegateSplitViewConstrainSplitPosition:position ofSubviewAt:dividerIndex];
675 if (_IS_NUMERIC(proposedPosition))
678 var proposedMax = [
self maxPossiblePositionOfDividerAtIndex:dividerIndex],
679 proposedMin = [
self minPossiblePositionOfDividerAtIndex:dividerIndex],
680 actualMax = proposedMax,
681 actualMin = proposedMin,
682 proposedActualMin = [
self _sendDelegateSplitViewConstrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex],
683 proposedActualMax = [
self _sendDelegateSplitViewConstrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
685 if (_IS_NUMERIC(proposedActualMin))
686 actualMin = proposedActualMin;
688 if (_IS_NUMERIC(proposedActualMax))
689 actualMax = proposedActualMax;
691 var viewA = _subviews[dividerIndex],
692 viewB = _subviews[dividerIndex + 1],
693 realPosition = MAX(MIN(
position, actualMax), actualMin);
696 if ((
position < proposedMin + (actualMin - proposedMin) / 2) && [
self _sendDelegateSplitViewCanCollapseSubview:viewA])
697 realPosition = proposedMin;
700 if ((
position > proposedMax - (proposedMax - actualMax) / 2) && [
self _sendDelegateSplitViewCanCollapseSubview:viewB])
701 realPosition = proposedMax;
711 - (void)setPosition:(
float)position ofDividerAtIndex:(
int)dividerIndex
715 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
718 [
self _adjustSubviewsWithCalculatedSize];
720 var realPosition = [
self _realPositionForPosition:position ofDividerAtIndex:dividerIndex],
721 viewA = _subviews[dividerIndex],
722 frameA = [viewA frame],
723 viewB = _subviews[dividerIndex + 1],
724 frameB = [viewB frame],
725 preCollapsePosition = 0,
726 preSize = frameA.size[_sizeComponent];
728 frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
730 if (preSize !== 0 && frameA.size[_sizeComponent] === 0)
731 preCollapsePosition = preSize;
733 if (preSize !== frameA.size[_sizeComponent])
736 [_subviews[dividerIndex] setFrame:frameA];
740 preSize = frameB.size[_sizeComponent];
742 var preOrigin = frameB.origin[_originComponent];
743 frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [
self dividerThickness];
745 if (preSize !== 0 && frameB.size[_sizeComponent] === 0)
746 preCollapsePosition = frameB.origin[_originComponent];
750 if (preSize !== frameB.size[_sizeComponent] || preOrigin !== frameB.origin[_originComponent])
753 [_subviews[dividerIndex + 1] setFrame:frameB];
757 if (preCollapsePosition)
758 [_preCollapsePositions setObject:preCollapsePosition forKey:"" + dividerIndex];
763 [
self _postNotificationDidResize];
768 - (void)setFrameSize:(CGSize)aSize
770 if (_shouldRestoreFromAutosaveUnlessFrameSize)
771 _shouldAutosave = NO;
773 [
self _adjustSubviewsWithCalculatedSize];
777 if (_shouldRestoreFromAutosaveUnlessFrameSize)
778 _shouldAutosave = YES;
783 - (void)resizeSubviewsWithOldSize:(CGSize)oldSize
785 if ([
self _delegateRespondsToSplitViewResizeSubviewsWithOldSize])
787 [
self _sendDelegateSplitViewResizeSubviewsWithOldSize:oldSize];
794 - (void)adjustSubviews
796 var count = [_subviews count];
802 [
self _postNotificationWillResize];
806 boundsSize =
bounds.size[_sizeComponent],
807 oldSize = [
self _calculateSize],
809 totalDividers = count - 1,
810 oldFlexibleSpace = 0,
811 totalSizablePanes = 0,
826 for (index = 0; index < count; ++index)
828 var view = _subviews[index],
829 isSizable = [
self _sendDelegateSplitViewShouldAdjustSizeOfSubview:view],
830 size = [view frame].size[_sizeComponent];
832 isSizableMap[index] = isSizable;
833 viewSizes.push(size);
837 oldFlexibleSpace += size;
843 var nonSizableSpace = oldSize[_sizeComponent] - oldFlexibleSpace,
844 newFlexibleSpace = boundsSize - nonSizableSpace,
845 remainingFixedPixelsToRemove = 0;
847 if (newFlexibleSpace < 0)
849 remainingFixedPixelsToRemove = -newFlexibleSpace;
850 newFlexibleSpace = 0;
853 var remainingFixedPanes = count - totalSizablePanes;
855 for (index = 0; index < count; ++index)
857 var view = _subviews[index],
858 viewFrame = CGRectMakeCopy(
bounds),
859 isSizable = isSizableMap[index],
863 if (index + 1 === count)
864 targetSize = boundsSize - viewFrame.origin[_originComponent];
868 var removedFixedPixels = MIN(remainingFixedPixelsToRemove / remainingFixedPanes, viewSizes[index]);
869 targetSize = viewSizes[index] - removedFixedPixels;
870 remainingFixedPixelsToRemove -= removedFixedPixels;
871 remainingFixedPanes--;
874 else if (oldFlexibleSpace > 0)
875 targetSize = newFlexibleSpace * viewSizes[index] / oldFlexibleSpace;
879 targetSize = newFlexibleSpace / totalSizablePanes;
881 targetSize = MAX(0, ROUND(targetSize));
882 viewFrame.size[_sizeComponent] = targetSize;
883 [view setFrame:viewFrame];
884 bounds.origin[_originComponent] += targetSize + dividerThickness;
955 - (void)setDelegate:(
id <CPSplitViewDelegate>)aDelegate
957 if (_delegate === aDelegate)
960 _delegate = aDelegate;
961 _implementedDelegateMethods = 0;
963 if ([_delegate respondsToSelector:
@selector(splitViewWillResizeSubviews:)])
966 if ([_delegate respondsToSelector:
@selector(splitViewDidResizeSubviews:)])
969 if ([_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)])
972 if ([_delegate respondsToSelector:
@selector(splitView:shouldAdjustSizeOfSubview:)])
975 if ([_delegate respondsToSelector:
@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)])
978 if ([_delegate respondsToSelector:
@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
981 if ([_delegate respondsToSelector:
@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)])
984 if ([_delegate respondsToSelector:
@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)])
987 if ([_delegate respondsToSelector:
@selector(splitView:constrainMinCoordinate:ofSubviewAt:)])
990 if ([_delegate respondsToSelector:
@selector(splitView:constrainSplitPosition:ofSubviewAt:)])
993 if ([_delegate respondsToSelector:
@selector(splitView:resizeSubviewsWithOldSize:)])
1014 - (void)setButtonBar:(
CPButtonBar)aButtonBar forDividerAtIndex:(CPUInteger)dividerIndex
1018 _buttonBars[dividerIndex] = nil;
1023 subview = aButtonBar;
1025 while (view && view !==
self)
1028 view = [view superview];
1033 reason:@"CPSplitView button bar must be a subview of the split view."];
1035 var viewIndex = [[
self subviews] indexOfObject:subview];
1040 _buttonBars[dividerIndex] = aButtonBar;
1043 - (void)_postNotificationWillResize
1045 [
self _sendDelegateSplitViewWillResizeSubviews];
1048 - (void)_postNotificationDidResize
1050 [
self _sendDelegateSplitViewDidResizeSubviews];
1064 if (_autosaveName == autosaveName)
1067 _autosaveName = autosaveName;
1077 return _autosaveName;
1085 if (_shouldRestoreFromAutosaveUnlessFrameSize || !_shouldAutosave || !_autosaveName)
1089 autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1090 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1091 count = [_subviews count],
1095 for (var i = 0; i < count; i++)
1097 var
frame = [_subviews[i] frame];
1098 [positions addObject:CGStringFromRect(frame)];
1099 [preCollapseArray addObject:[_preCollapsePositions objectForKey:"" + i]];
1102 [userDefaults setObject:positions forKey:autosaveName];
1103 [userDefaults setObject:preCollapseArray forKey:autosavePrecollapseName];
1112 - (void)_restoreFromAutosaveIfNeeded
1114 if (_shouldRestoreFromAutosaveUnlessFrameSize && !CGSizeEqualToSize([
self frameSize], _shouldRestoreFromAutosaveUnlessFrameSize))
1116 [
self _restoreFromAutosave];
1119 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
1125 - (void)_restoreFromAutosave
1130 var autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1131 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1133 frames = [userDefaults objectForKey:autosaveName],
1134 preCollapseArray = [userDefaults objectForKey:autosavePrecollapseName];
1138 var dividerThickness = [
self dividerThickness],
1141 _shouldAutosave = NO;
1143 for (var i = 0, count = [frames count] - 1; i < count; i++)
1145 var
frame = CGRectFromString(frames[i]);
1148 [
self setPosition:position ofDividerAtIndex:i];
1153 _shouldAutosave = YES;
1156 if (preCollapseArray)
1160 for (var i = 0, count = [preCollapseArray count]; i < count; i++)
1162 var item = preCollapseArray[i];
1165 [_preCollapsePositions removeObjectForKey:String(i)];
1167 [_preCollapsePositions setObject:item forKey:String(i)];
1177 if (!theAutosaveName)
1180 return @"CPSplitView Subview Frames " + theAutosaveName;
1188 if (!theAutosaveName)
1191 return @"CPSplitView Subview Precollapse Positions " + theAutosaveName;
1201 - (void)updateTrackingAreas
1203 if (_splitViewTrackingAreas)
1205 for (var i = 0, count = [_splitViewTrackingAreas count]; i < count; i++)
1206 [
self removeTrackingArea:_splitViewTrackingAreas[i]];
1208 _splitViewTrackingAreas = nil;
1213 _splitViewTrackingAreas = @[];
1215 for (var i = 0; i < _subviews.length - 1; i++)
1231 [
self _updateResizeCursor:anEvent];
1243 - (BOOL)_delegateRespondsToSplitViewResizeSubviewsWithOldSize
1252 - (BOOL)_delegateRespondsToSplitViewCanCollapseSubview
1261 - (BOOL)_delegateRespondsToSplitViewshouldCollapseSubviewForDoubleClickOnDividerAtIndex
1271 - (BOOL)_sendDelegateSplitViewCanCollapseSubview:(
CPView)aView
1276 return [_delegate splitView:self canCollapseSubview:aView];
1283 - (BOOL)_sendDelegateSplitViewShouldAdjustSizeOfSubview:(
CPView)aView
1288 return [_delegate splitView:self shouldAdjustSizeOfSubview:aView];
1295 - (BOOL)_sendDelegateSplitViewShouldCollapseSubview:(
CPView)aView forDoubleClickOnDividerAtIndex:(
int)anIndex
1300 return [_delegate splitView:self shouldCollapseSubview:aView forDoubleClickOnDividerAtIndex:anIndex];
1307 - (CGRect)_sendDelegateSplitViewAdditionalEffectiveRectOfDividerAtIndex:(
int)anIndex
1312 return [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
1319 - (CGRect)_sendDelegateSplitViewEffectiveRect:(CGRect)proposedEffectiveRect forDrawnRect:(CGRect)drawnRect ofDividerAtIndex:(CPInteger)dividerIndex
1322 return proposedEffectiveRect;
1324 return [_delegate splitView:self effectiveRect:proposedEffectiveRect forDrawnRect:drawnRect ofDividerAtIndex:dividerIndex];
1331 - (float)_sendDelegateSplitViewConstrainMaxCoordinate:(
float)proposedMax ofSubviewAt:(CPInteger)dividerIndex
1336 return [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
1343 - (float)_sendDelegateSplitViewConstrainMinCoordinate:(
float)proposedMin ofSubviewAt:(CPInteger)dividerIndex
1348 return [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex];
1355 - (float)_sendDelegateSplitViewConstrainSplitPosition:(
float)proposedMax ofSubviewAt:(CPInteger)dividerIndex
1360 return [_delegate splitView:self constrainSplitPosition:proposedMax ofSubviewAt:dividerIndex];
1367 - (void)_sendDelegateSplitViewResizeSubviewsWithOldSize:(CGSize)oldSize
1372 [_delegate splitView:self resizeSubviewsWithOldSize:oldSize];
1379 - (void)_sendDelegateSplitViewWillResizeSubviews
1384 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1396 - (void)_sendDelegateSplitViewDidResizeSubviews
1401 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1408 [
self updateTrackingAreas];
1429 _autosaveName = [aCoder decodeObjectForKey:CPSplitViewAutosaveNameKey];
1460 _suppressResizeNotificationsMask = 0;
1464 _shouldAutosave = YES;
1467 _DOMDividerElements = [];
1469 _buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || [];
1471 [
self setDelegate:[aCoder decodeObjectForKey:CPSplitViewDelegateKey]];
1473 _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
1474 [
self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
1478 [
self _restoreFromAutosave];
1481 _shouldRestoreFromAutosaveUnlessFrameSize = [
self frameSize];
1499 [aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey];
1501 [aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey];
1502 [aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey];
1504 [aCoder encodeObject:_autosaveName forKey:CPSplitViewAutosaveNameKey];
Used to implement exception handling (creating & raising).
#define SPLIT_VIEW_MAYBE_POST_DID_RESIZE()
void postNotificationName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
An object representation of nil.
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.
CPRunLoop currentRunLoop()
var DidPostWillResizeNotification
var CPSplitViewDelegate_splitView_constrainMinCoordinate_ofSubviewAt_
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
void setNeedsDisplay:(BOOL aFlag)
void encodeWithCoder:(CPCoder aCoder)
float maxPossiblePositionOfDividerAtIndex:(int dividerIndex)
#define SPLIT_VIEW_SUPPRESS_RESIZE_NOTIFICATIONS(shouldSuppress)
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).
void updateTrackingAreas()
Sends messages (CPNotification) between objects.
void drawDividerInRect:(CGRect aRect)
var CPSplitViewDelegate_splitView_constrainSplitPosition_ofSubviewAt_
void addTrackingArea:(CPTrackingArea trackingArea)
void setFrameSize:(CGSize aSize)
float minPossiblePositionOfDividerAtIndex:(int dividerIndex)
CPTrackingArea initWithRect:options:owner:userInfo:(CGRect aRect, [options] CPTrackingAreaOptions options, [owner] id owner, [userInfo] CPDictionary userInfo)
#define SPLIT_VIEW_DID_SUPPRESS_RESIZE_NOTIFICATION()
var CPSplitViewDelegate_splitView_shouldCollapseSubview_forDoubleClickOnDividerAtIndex_
#define SPLIT_VIEW_MAYBE_POST_WILL_RESIZE()
var CPSplitViewDelegate_splitView_canCollapseSubview_
var CPSplitViewDelegate_splitView_constrainMaxCoordinate_ofSubviewAt_
void trackDivider:(CPEvent anEvent)