23 #include "../Foundation/Foundation.h"
29 #define SPLIT_VIEW_MAYBE_POST_WILL_RESIZE() \
30 if ((_suppressResizeNotificationsMask & DidPostWillResizeNotification) === 0) \
32 [self _postNotificationWillResize]; \
33 _suppressResizeNotificationsMask |= DidPostWillResizeNotification; \
36 #define SPLIT_VIEW_MAYBE_POST_DID_RESIZE() \
37 if ((_suppressResizeNotificationsMask & ShouldSuppressResizeNotifications) !== 0) \
38 _suppressResizeNotificationsMask |= DidSuppressResizeNotification; \
40 [self _postNotificationDidResize];
42 #define SPLIT_VIEW_DID_SUPPRESS_RESIZE_NOTIFICATION() \
43 ((_suppressResizeNotificationsMask & DidSuppressResizeNotification) !== 0)
45 #define SPLIT_VIEW_SUPPRESS_RESIZE_NOTIFICATIONS(shouldSuppress) \
47 _suppressResizeNotificationsMask |= ShouldSuppressResizeNotifications; \
49 _suppressResizeNotificationsMask = 0;
51 CPSplitViewDidResizeSubviewsNotification =
@"CPSplitViewDidResizeSubviewsNotification";
52 CPSplitViewWillResizeSubviewsNotification =
@"CPSplitViewWillResizeSubviewsNotification";
54 var ShouldSuppressResizeNotifications = 1,
55 DidPostWillResizeNotification = 1 << 1,
56 DidSuppressResizeNotification = 1 << 2;
83 CPArray _DOMDividerElements;
89 CGSize _shouldRestoreFromAutosaveUnlessFrameSize;
91 BOOL _needsResizeSubviews;
92 int _suppressResizeNotificationsMask;
105 @"divider-thickness": 1.0,
106 @"pane-divider-thickness": 10.0,
113 - (id)initWithFrame:(CGRect)aFrame
115 if (
self = [super initWithFrame:aFrame])
117 _suppressResizeNotificationsMask = 0;
121 _DOMDividerElements = [];
124 _shouldAutosave = YES;
126 [
self _setVertical:YES];
136 - (float)dividerThickness
138 return [
self currentValueForThemeAttribute:[
self isPaneSplitter] ? @"pane-divider-thickness" : @"divider-thickness"];
154 - (void)setVertical:(BOOL)shouldBeVertical
156 if (![
self _setVertical:shouldBeVertical])
160 var
frame = [
self frame],
161 dividerThickness = [
self dividerThickness];
163 [
self _postNotificationWillResize];
165 var eachSize = ROUND((frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length),
167 count = _subviews.length;
169 if ([
self isVertical])
171 for (; index < count; ++index)
172 [_subviews[index] setFrame:CGRectMake(ROUND((eachSize + dividerThickness) * index), 0, eachSize, frame.size.height)];
176 for (; index < count; ++index)
177 [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index), frame.size.width, eachSize)];
180 [
self setNeedsDisplay:YES];
181 [
self _postNotificationDidResize];
185 - (BOOL)_setVertical:(BOOL)shouldBeVertical
187 var changed = (_isVertical != shouldBeVertical);
189 _isVertical = shouldBeVertical;
191 _originComponent = [
self isVertical] ?
"x" :
"y";
192 _sizeComponent = [
self isVertical] ?
"width" :
"height";
193 _dividerImagePath = [
self isVertical] ? [[
self valueForThemeAttribute:@"vertical-divider-color"] filename] : [[
self valueForThemeAttribute:@"horizontal-divider-color"] filename];
203 - (BOOL)isPaneSplitter
205 return _isPaneSplitter;
213 - (void)setIsPaneSplitter:(BOOL)shouldBePaneSplitter
215 if (_isPaneSplitter == shouldBePaneSplitter)
218 _isPaneSplitter = shouldBePaneSplitter;
220 if (_DOMDividerElements[_drawingDivider])
221 [
self _setupDOMDivider];
225 _needsResizeSubviews = YES;
226 [
self setNeedsDisplay:YES];
229 - (void)didAddSubview:(
CPView)aSubview
231 _needsResizeSubviews = YES;
239 - (BOOL)isSubviewCollapsed:(
CPView)subview
241 return [subview frame].size[_sizeComponent] < 1 ? YES : NO;
250 - (CGRect)rectOfDividerAtIndex:(
int)aDivider
252 var frame = [_subviews[aDivider] frame],
253 rect = CGRectMakeZero();
255 rect.size = [
self frame].size;
256 rect.size[_sizeComponent] = [
self dividerThickness];
257 rect.origin[_originComponent] = frame.origin[_originComponent] + frame.size[_sizeComponent];
268 - (CGRect)effectiveRectOfDividerAtIndex:(
int)aDivider
270 var realRect = [
self rectOfDividerAtIndex:aDivider],
273 realRect.size[_sizeComponent] += padding * 2;
274 realRect.origin[_originComponent] -= padding;
279 - (void)drawRect:(CGRect)rect
281 var count = [_subviews count] - 1;
283 while ((count--) > 0)
285 _drawingDivider = count;
286 [
self drawDividerInRect:[
self rectOfDividerAtIndex:count]];
295 - (void)willRemoveSubview:(
CPView)aView
298 var dividerToRemove = _DOMDividerElements.pop();
302 CPDOMDisplayServerRemoveChild(_DOMElement, dividerToRemove);
305 _needsResizeSubviews = YES;
306 [
self setNeedsLayout];
307 [
self setNeedsDisplay:YES];
310 - (void)layoutSubviews
312 [
self _adjustSubviewsWithCalculatedSize]
319 - (void)drawDividerInRect:(CGRect)aRect
322 if (!_DOMDividerElements[_drawingDivider])
324 _DOMDividerElements[_drawingDivider] = document.createElement(
"div");
326 _DOMDividerElements[_drawingDivider].style.position =
"absolute";
327 _DOMDividerElements[_drawingDivider].style.backgroundRepeat =
"repeat";
329 CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
332 [
self _setupDOMDivider];
333 CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, CGRectGetMinX(aRect), CGRectGetMinY(aRect));
334 CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], CGRectGetWidth(aRect), CGRectGetHeight(aRect));
338 - (void)_setupDOMDivider
342 _DOMDividerElements[_drawingDivider].style.backgroundColor =
"";
343 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"url('"+_dividerImagePath+"')";
347 _DOMDividerElements[_drawingDivider].style.backgroundColor = [[
self currentValueForThemeAttribute:@"pane-divider-color"] cssString];
348 _DOMDividerElements[_drawingDivider].style.backgroundImage =
"";
354 [
self _adjustSubviewsWithCalculatedSize];
357 - (void)_adjustSubviewsWithCalculatedSize
359 if (!_needsResizeSubviews)
362 _needsResizeSubviews = NO;
364 [
self resizeSubviewsWithOldSize:[
self _calculateSize]];
367 - (CGSize)_calculateSize
369 var subviews = [
self subviews],
370 count = subviews.length,
371 size = CGSizeMakeZero();
373 if ([
self isVertical])
375 size.width += [self dividerThickness] * (count - 1);
376 size.height = CGRectGetHeight([
self frame]);
380 size.width = CGRectGetWidth([
self frame]);
381 size.height += [self dividerThickness] * (count - 1);
385 size[_sizeComponent] += [subviews[count]
frame].size[_sizeComponent];
390 - (BOOL)cursorAtPoint:(CGPoint)aPoint hitDividerAtIndex:(
int)anIndex
392 var
frame = [_subviews[anIndex] frame],
393 startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent],
394 effectiveRect = [self effectiveRectOfDividerAtIndex:anIndex],
395 buttonBar = _buttonBars[anIndex],
396 buttonBarRect = null,
397 additionalRect = null;
399 if (buttonBar != null)
401 buttonBarRect = [buttonBar resizeControlFrame];
402 buttonBarRect.origin = [
self convertPoint:buttonBarRect.origin fromView:buttonBar];
405 if ([_delegate respondsToSelector:
@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)])
406 effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
408 if ([_delegate respondsToSelector:
@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
409 additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
411 return CGRectContainsPoint(effectiveRect, aPoint) ||
412 (additionalRect && CGRectContainsPoint(additionalRect, aPoint)) ||
413 (buttonBarRect && CGRectContainsPoint(buttonBarRect, aPoint));
416 - (
CPView)hitTest:(CGPoint)aPoint
418 if ([
self isHidden] || ![
self hitTests] || !CGRectContainsPoint([
self frame], aPoint))
421 var point = [
self convertPoint:aPoint fromView:[
self superview]],
422 count = [_subviews count] - 1;
424 for (var i = 0; i < count; i++)
426 if ([
self cursorAtPoint:point hitDividerAtIndex:i])
430 return [
super hitTest:aPoint];
437 - (void)trackDivider:(
CPEvent)anEvent
439 var type = [anEvent type];
444 _shouldAutosave = YES;
450 [
self _updateResizeCursor:anEvent];
458 var point = [
self convertPoint:[anEvent locationInWindow] fromView:nil],
459 count = [_subviews count] - 1;
463 for (var i = 0; i < count; i++)
465 var frame = [_subviews[i] frame],
466 startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent];
468 if ([
self cursorAtPoint:point hitDividerAtIndex:i])
470 if ([anEvent clickCount] == 2 &&
471 [_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)] &&
472 [_delegate respondsToSelector:
@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)])
474 var minPosition = [
self minPossiblePositionOfDividerAtIndex:i],
475 maxPosition = [
self maxPossiblePositionOfDividerAtIndex:i],
476 preCollapsePosition = [_preCollapsePositions objectForKey:"" + i] || 0;
478 if ([_delegate splitView:
self canCollapseSubview:_subviews[i]] && [_delegate splitView:
self shouldCollapseSubview:_subviews[i] forDoubleClickOnDividerAtIndex:i])
480 if ([
self isSubviewCollapsed:_subviews[i]])
481 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i];
483 [
self setPosition:minPosition ofDividerAtIndex:i];
485 else if ([_delegate splitView:
self canCollapseSubview:_subviews[i + 1]] && [_delegate splitView:
self shouldCollapseSubview:_subviews[i + 1] forDoubleClickOnDividerAtIndex:i])
487 if ([
self isSubviewCollapsed:_subviews[i + 1]])
488 [
self setPosition:preCollapsePosition ? preCollapsePosition : (minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i];
490 [
self setPosition:maxPosition ofDividerAtIndex:i];
496 _initialOffset = startPosition - point[_originComponent];
499 _shouldAutosave = NO;
500 [
self _postNotificationWillResize];
511 var point = [
self convertPoint:[anEvent locationInWindow] fromView:nil];
513 [
self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider];
515 [
self _updateResizeCursor:anEvent];
518 [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
521 - (void)mouseDown:(
CPEvent)anEvent
524 [
self trackDivider:anEvent];
527 - (void)viewDidMoveToWindow
533 - (void)mouseEntered:(
CPEvent)anEvent
537 [
self _updateResizeCursor:anEvent];
540 - (void)mouseMoved:(
CPEvent)anEvent
543 [
self _updateResizeCursor:anEvent];
546 - (void)mouseExited:(
CPEvent)anEvent
553 - (void)_updateResizeCursor:(
CPEvent)anEvent
555 var point = [
self convertPoint:[anEvent locationInWindow] fromView:nil];
557 if ([anEvent type] ===
CPLeftMouseUp && ![[
self window] acceptsMouseMovedEvents])
563 for (var i = 0, count = [_subviews count] - 1; i < count; i++)
566 if (_currentDivider === i || (_currentDivider ==
CPNotFound && [
self cursorAtPoint:point hitDividerAtIndex:i]))
568 var frameA = [_subviews[i] frame],
569 sizeA = frameA.size[_sizeComponent],
570 startPosition = frameA.origin[_originComponent] + sizeA,
571 frameB = [_subviews[i + 1] frame],
572 sizeB = frameB.size[_sizeComponent],
573 canShrink = [self _realPositionForPosition:startPosition - 1 ofDividerAtIndex:i] < startPosition,
574 canGrow = [self _realPositionForPosition:startPosition + 1 ofDividerAtIndex:i] > startPosition,
575 cursor = [CPCursor arrowCursor];
579 else if (!canShrink &&
580 [_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)] &&
581 [_delegate splitView:
self canCollapseSubview:_subviews[i]])
594 [_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)] &&
595 [_delegate splitView:
self canCollapseSubview:_subviews[i + 1]])
600 if (_isVertical && canShrink && canGrow)
601 cursor = [
CPCursor resizeLeftRightCursor];
602 else if (_isVertical && canShrink)
603 cursor = [
CPCursor resizeLeftCursor];
604 else if (_isVertical && canGrow)
605 cursor = [
CPCursor resizeRightCursor];
606 else if (canShrink && canGrow)
607 cursor = [
CPCursor resizeUpDownCursor];
611 cursor = [
CPCursor resizeDownCursor];
626 - (float)maxPossiblePositionOfDividerAtIndex:(
int)dividerIndex
628 var frame = [_subviews[dividerIndex + 1] frame];
630 if (dividerIndex + 1 < [_subviews count] - 1)
631 return frame.origin[_originComponent] + frame.size[_sizeComponent] - [
self dividerThickness];
633 return [
self frame].size[_sizeComponent] - [
self dividerThickness];
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 if ([_delegate respondsToSelector:
@selector(splitView:constrainSplitPosition:ofSubviewAt:)])
658 var proposedPosition = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex];
663 if (_IS_NUMERIC(proposedPosition))
664 position = proposedPosition;
667 var proposedMax = [
self maxPossiblePositionOfDividerAtIndex:dividerIndex],
668 proposedMin = [
self minPossiblePositionOfDividerAtIndex:dividerIndex],
669 actualMax = proposedMax,
670 actualMin = proposedMin;
672 if ([_delegate respondsToSelector:
@selector(splitView:constrainMinCoordinate:ofSubviewAt:)])
674 var proposedActualMin = [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex];
676 if (_IS_NUMERIC(proposedActualMin))
677 actualMin = proposedActualMin;
680 if ([_delegate respondsToSelector:
@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)])
682 var proposedActualMax = [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
684 if (_IS_NUMERIC(proposedActualMax))
685 actualMax = proposedActualMax;
688 var viewA = _subviews[dividerIndex],
689 viewB = _subviews[dividerIndex + 1],
690 realPosition = MAX(MIN(position, actualMax), actualMin);
693 if (position < proposedMin + (actualMin - proposedMin) / 2)
694 if ([_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)])
695 if ([_delegate splitView:
self canCollapseSubview:viewA])
696 realPosition = proposedMin;
699 if (position > proposedMax - (proposedMax - actualMax) / 2)
700 if ([_delegate respondsToSelector:
@selector(splitView:canCollapseSubview:)])
701 if ([_delegate splitView:
self canCollapseSubview:viewB])
702 realPosition = proposedMax;
712 - (void)setPosition:(
float)position ofDividerAtIndex:(
int)dividerIndex
716 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
719 [
self _adjustSubviewsWithCalculatedSize];
721 var realPosition = [
self _realPositionForPosition:position ofDividerAtIndex:dividerIndex],
722 viewA = _subviews[dividerIndex],
723 frameA = [viewA frame],
724 viewB = _subviews[dividerIndex + 1],
725 frameB = [viewB frame],
726 preCollapsePosition = 0,
727 preSize = frameA.size[_sizeComponent];
729 frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
731 if (preSize !== 0 && frameA.size[_sizeComponent] === 0)
732 preCollapsePosition = preSize;
734 if (preSize !== frameA.size[_sizeComponent])
737 [_subviews[dividerIndex] setFrame:frameA];
741 preSize = frameB.size[_sizeComponent];
743 var preOrigin = frameB.origin[_originComponent];
744 frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness];
746 if (preSize !== 0 && frameB.size[_sizeComponent] === 0)
747 preCollapsePosition = frameB.origin[_originComponent];
749 frameB.origin[_originComponent] = realPosition + [self dividerThickness];
751 if (preSize !== frameB.size[_sizeComponent] || preOrigin !== frameB.origin[_originComponent])
754 [_subviews[dividerIndex + 1] setFrame:frameB];
758 if (preCollapsePosition)
759 [_preCollapsePositions setObject:preCollapsePosition forKey:"" + dividerIndex];
761 [
self setNeedsDisplay:YES];
764 [
self _postNotificationDidResize];
769 - (void)setFrameSize:(CGSize)aSize
771 if (_shouldRestoreFromAutosaveUnlessFrameSize)
772 _shouldAutosave = NO;
774 [
self _adjustSubviewsWithCalculatedSize];
776 [
super setFrameSize:aSize];
778 if (_shouldRestoreFromAutosaveUnlessFrameSize)
779 _shouldAutosave = YES;
781 [
self setNeedsDisplay:YES];
784 - (void)resizeSubviewsWithOldSize:(CGSize)oldSize
786 if ([_delegate respondsToSelector:
@selector(splitView:resizeSubviewsWithOldSize:)])
788 [_delegate splitView:self resizeSubviewsWithOldSize:oldSize];
792 [
self adjustSubviews];
795 - (void)adjustSubviews
797 var count = [_subviews count];
803 [
self _postNotificationWillResize];
806 bounds = [
self bounds],
807 boundsSize = bounds.size[_sizeComponent],
808 oldSize = [
self _calculateSize],
809 dividerThickness = [
self dividerThickness],
810 totalDividers = count - 1,
811 oldFlexibleSpace = 0,
812 totalSizablePanes = 0,
815 delegateRespondsToShouldAdjust = [_delegate respondsToSelector:@selector(splitView:shouldAdjustSizeOfSubview:)];
828 for (index = 0; index < count; ++index)
830 var view = _subviews[index],
831 isSizable = !delegateRespondsToShouldAdjust || [_delegate splitView:self shouldAdjustSizeOfSubview:view],
832 size = [view frame].size[_sizeComponent];
834 isSizableMap[index] = isSizable;
835 viewSizes.push(size);
839 oldFlexibleSpace += size;
845 var nonSizableSpace = oldSize[_sizeComponent] - oldFlexibleSpace,
846 newFlexibleSpace = boundsSize - nonSizableSpace,
847 remainingFixedPixelsToRemove = 0;
849 if (newFlexibleSpace < 0)
851 remainingFixedPixelsToRemove = -newFlexibleSpace;
852 newFlexibleSpace = 0;
855 var remainingFixedPanes = count - totalSizablePanes;
857 for (index = 0; index < count; ++index)
859 var view = _subviews[index],
860 viewFrame = CGRectMakeCopy(bounds),
861 isSizable = isSizableMap[index],
865 if (index + 1 === count)
866 targetSize = boundsSize - viewFrame.origin[_originComponent];
870 var removedFixedPixels = MIN(remainingFixedPixelsToRemove / remainingFixedPanes, viewSizes[index]);
871 targetSize = viewSizes[index] - removedFixedPixels;
872 remainingFixedPixelsToRemove -= removedFixedPixels;
873 remainingFixedPanes--;
876 else if (oldFlexibleSpace > 0)
877 targetSize = newFlexibleSpace * viewSizes[index] / oldFlexibleSpace;
881 targetSize = newFlexibleSpace / totalSizablePanes;
883 targetSize = MAX(0, ROUND(targetSize));
884 viewFrame.size[_sizeComponent] = targetSize;
885 [view setFrame:viewFrame];
886 bounds.origin[_originComponent] += targetSize + dividerThickness;
957 - (void)setDelegate:(
id)delegate
959 if ([_delegate respondsToSelector:
@selector(splitViewDidResizeSubviews:)])
961 if ([_delegate respondsToSelector:
@selector(splitViewWillResizeSubviews:)])
964 _delegate = delegate;
966 if ([_delegate respondsToSelector:
@selector(splitViewDidResizeSubviews:)])
969 name:CPSplitViewDidResizeSubviewsNotification
971 if ([_delegate respondsToSelector:
@selector(splitViewWillResizeSubviews:)])
974 name:CPSplitViewWillResizeSubviewsNotification
994 - (void)setButtonBar:(
CPButtonBar)aButtonBar forDividerAtIndex:(CPUInteger)dividerIndex
998 _buttonBars[dividerIndex] = nil;
1002 var view = [aButtonBar superview],
1003 subview = aButtonBar;
1005 while (view && view !==
self)
1008 view = [view superview];
1013 reason:@"CPSplitView button bar must be a subview of the split view."];
1015 var viewIndex = [[
self subviews] indexOfObject:subview];
1017 [aButtonBar setHasResizeControl:YES];
1018 [aButtonBar setResizeControlIsLeftAligned:dividerIndex < viewIndex];
1020 _buttonBars[dividerIndex] = aButtonBar;
1023 - (void)_postNotificationWillResize
1028 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1035 - (void)_postNotificationDidResize
1040 userInfo = @{
@"CPSplitViewDividerIndex": _currentDivider };
1057 - (void)setAutosaveName:(
CPString)autosaveName
1059 if (_autosaveName == autosaveName)
1062 _autosaveName = autosaveName;
1072 return _autosaveName;
1080 if (_shouldRestoreFromAutosaveUnlessFrameSize || !_shouldAutosave || !_autosaveName)
1084 autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1085 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1086 count = [_subviews count],
1090 for (var i = 0; i < count; i++)
1092 var frame = [_subviews[i] frame];
1093 [positions addObject:CGStringFromRect(frame)];
1094 [preCollapseArray addObject:[_preCollapsePositions objectForKey:"" + i]];
1097 [userDefaults setObject:positions forKey:autosaveName];
1098 [userDefaults setObject:preCollapseArray forKey:autosavePrecollapseName];
1107 - (void)_restoreFromAutosaveIfNeeded
1109 if (_shouldRestoreFromAutosaveUnlessFrameSize && !CGSizeEqualToSize([
self frameSize], _shouldRestoreFromAutosaveUnlessFrameSize))
1111 [
self _restoreFromAutosave];
1114 _shouldRestoreFromAutosaveUnlessFrameSize = nil;
1120 - (void)_restoreFromAutosave
1125 var autosaveName = [
self _framesKeyForAutosaveName:[
self autosaveName]],
1126 autosavePrecollapseName = [
self _precollapseKeyForAutosaveName:[
self autosaveName]],
1128 frames = [userDefaults objectForKey:autosaveName],
1129 preCollapseArray = [userDefaults objectForKey:autosavePrecollapseName];
1133 var dividerThickness = [
self dividerThickness],
1136 _shouldAutosave = NO;
1138 for (var i = 0, count = [frames count] - 1; i < count; i++)
1140 var frame = CGRectFromString(frames[i]);
1141 position += frame.size[_sizeComponent];
1143 [
self setPosition:position ofDividerAtIndex:i];
1145 position += dividerThickness;
1148 _shouldAutosave = YES;
1151 if (preCollapseArray)
1155 for (var i = 0, count = [preCollapseArray count]; i < count; i++)
1157 var item = preCollapseArray[i];
1160 [_preCollapsePositions removeObjectForKey:String(i)];
1162 [_preCollapsePositions setObject:item forKey:String(i)];
1172 if (!theAutosaveName)
1175 return @"CPSplitView Subview Frames " + theAutosaveName;
1183 if (!theAutosaveName)
1186 return @"CPSplitView Subview Precollapse Positions " + theAutosaveName;
1191 var CPSplitViewDelegateKey =
"CPSplitViewDelegateKey",
1192 CPSplitViewIsVerticalKey =
"CPSplitViewIsVerticalKey",
1193 CPSplitViewIsPaneSplitterKey =
"CPSplitViewIsPaneSplitterKey",
1194 CPSplitViewButtonBarsKey =
"CPSplitViewButtonBarsKey",
1195 CPSplitViewAutosaveNameKey =
"CPSplitViewAutosaveNameKey";
1197 @implementation CPSplitView (CPCoding)
1203 - (id)initWithCoder:(
CPCoder)aCoder
1206 _autosaveName = [aCoder decodeObjectForKey:CPSplitViewAutosaveNameKey];
1233 self = [
super initWithCoder:aCoder];
1237 _suppressResizeNotificationsMask = 0;
1241 _shouldAutosave = YES;
1243 _DOMDividerElements = [];
1245 _buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || [];
1247 [
self setDelegate:[aCoder decodeObjectForKey:CPSplitViewDelegateKey]];
1249 _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
1250 [
self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
1254 [
self _restoreFromAutosave];
1257 _shouldRestoreFromAutosaveUnlessFrameSize = [
self frameSize];
1268 - (void)encodeWithCoder:(
CPCoder)aCoder
1270 [
super encodeWithCoder:aCoder];
1275 [aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey];
1277 [aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey];
1278 [aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey];
1280 [aCoder encodeObject:_autosaveName forKey:CPSplitViewAutosaveNameKey];