70 unsigned _maxNumberOfRows;
71 unsigned _maxNumberOfColumns;
76 CPArray _backgroundColors;
81 BOOL _allowsMultipleSelection;
82 BOOL _allowsEmptySelection;
87 float _horizontalMargin;
88 float _verticalMargin;
90 unsigned _numberOfRows;
91 unsigned _numberOfColumns;
97 BOOL _needsMinMaxItemSizeUpdate;
98 CGSize _storedFrameSize;
100 BOOL _uniformSubviewsResizing;
103 CPInteger _currentDropIndex;
104 CPDragOperation _currentDragOperation;
106 _CPCollectionViewDropIndicator _dropView;
109 - (id)initWithFrame:(CGRect)aFrame
111 self = [
super initWithFrame:aFrame];
115 _maxNumberOfRows = 0;
116 _maxNumberOfColumns = 0;
118 _minItemSize = CGSizeMakeZero();
119 _maxItemSize = CGSizeMakeZero();
123 _verticalMargin = 5.0;
125 _allowsEmptySelection = YES;
143 _itemSize = CGSizeMakeZero();
147 _storedFrameSize = CGSizeMakeZero();
149 _needsMinMaxItemSizeUpdate = YES;
150 _uniformSubviewsResizing = NO;
153 _currentDropIndex = -1;
157 [
self setAutoresizesSubviews:NO];
158 [
self setAutoresizingMask:0];
209 _itemForDragging = nil;
210 _itemPrototype = anItem;
212 [
self _reloadContentCachingRemovedItems:NO];
220 return _itemPrototype;
231 if (_cachedItems.length)
232 item = _cachedItems.pop();
235 item = [_itemPrototype copy];
237 [item setRepresentedObject:anObject];
238 [[item view] setFrameSize:_itemSize];
247 - (BOOL)acceptsFirstResponder
255 - (BOOL)isFirstResponder
257 return [[
self window] firstResponder] ===
self;
272 - (void)setContent:(CPArray)anArray
300 - (void)setSelectable:(BOOL)isSelectable
302 if (_isSelectable == isSelectable)
305 _isSelectable = isSelectable;
310 itemCount = [_items count];
313 while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !=
CPNotFound && index < itemCount)
314 [_items[index] setSelected:NO];
324 return _isSelectable;
331 - (void)setAllowsEmptySelection:(BOOL)shouldAllowEmptySelection
333 _allowsEmptySelection = shouldAllowEmptySelection;
339 - (BOOL)allowsEmptySelection
341 return _allowsEmptySelection;
348 - (void)setAllowsMultipleSelection:(BOOL)shouldAllowMultipleSelection
350 _allowsMultipleSelection = shouldAllowMultipleSelection;
356 - (BOOL)allowsMultipleSelection
358 return _allowsMultipleSelection;
369 if (!_isSelectable || [_selectionIndexes
isEqual:anIndexSet])
373 itemCount = [_items count];
376 while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !==
CPNotFound && index < itemCount)
377 [_items[index] setSelected:NO];
379 _selectionIndexes = anIndexSet;
383 while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !==
CPNotFound)
384 [_items[index] setSelected:YES];
386 var binderClass = [[
self class] _binderClassForBinding:@"selectionIndexes"];
387 [[binderClass getBinding:@"selectionIndexes" forObject:self] reverseSetValueFor:@"selectionIndexes"];
389 if ([_delegate respondsToSelector:
@selector(collectionViewDidChangeSelection:)])
391 CPLog.warn(
"The delegate method collectionViewDidChangeSelection: is deprecated and will be removed in a future version, please bind to selectionIndexes instead.");
392 [_delegate collectionViewDidChangeSelection:self];
401 return [_selectionIndexes copy];
404 - (void)reloadContent
406 [
self _reloadContentCachingRemovedItems:YES];
410 - (void)_reloadContentCachingRemovedItems:(BOOL)shouldCache
413 var count = _items.length;
417 [[_items[count] view] removeFromSuperview];
418 [_items[count] setSelected:NO];
421 _cachedItems.push(_items[count]);
431 count = _content.length;
433 for (; index < count; ++index)
435 _items.push([
self newItemForRepresentedObject:_content[index]]);
437 [
self addSubview:[_items[index] view]];
442 while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !=
CPNotFound && index < count)
443 [_items[index] setSelected:YES];
445 [
self tileIfNeeded:NO];
448 - (void)resizeSubviewsWithOldSize:(CGSize)oldBoundsSize
453 - (void)resizeWithOldSuperviewSize:(CGSize)oldBoundsSize
470 - (void)tileIfNeeded:(BOOL)lazyFlag
472 var frameSize = [[
self superview] frameSize],
473 count = _items.length,
474 oldNumberOfColumns = _numberOfColumns,
475 oldNumberOfRows = _numberOfRows,
476 oldItemSize = _itemSize,
477 storedFrameSize = _storedFrameSize;
483 [
self _updateMinMaxItemSizeIfNeeded];
485 [
self _computeGridWithSize:frameSize count:@ref(count)];
489 [
self setFrameSize:_storedFrameSize];
493 _numberOfColumns !== oldNumberOfColumns ||
494 _numberOfRows !== oldNumberOfRows ||
495 !CGSizeEqualToSize(_itemSize, oldItemSize))
500 - (void)_computeGridWithSize:(CGSize)aSuperviewSize count:(Function)countRef
502 var
width = aSuperviewSize.width,
503 height = aSuperviewSize.height,
504 itemSize = CGSizeMakeCopy(_minItemSize),
505 maxItemSizeWidth = _maxItemSize.width,
506 maxItemSizeHeight = _maxItemSize.height,
507 itemsCount = [_items count],
511 numberOfColumns = FLOOR(width / itemSize.width);
513 if (maxItemSizeWidth == 0)
514 numberOfColumns = MIN(numberOfColumns, _maxNumberOfColumns);
516 if (_maxNumberOfColumns > 0)
517 numberOfColumns = MIN(MIN(_maxNumberOfColumns, itemsCount), numberOfColumns);
519 numberOfColumns = MAX(1.0, numberOfColumns);
521 itemSize.width = FLOOR(width / numberOfColumns);
523 if (maxItemSizeWidth > 0)
525 itemSize.width = MIN(maxItemSizeWidth, itemSize.width);
527 if (numberOfColumns == 1)
528 itemSize.width = MIN(maxItemSizeWidth, width);
531 numberOfRows = CEIL(itemsCount / numberOfColumns);
533 if (_maxNumberOfRows > 0)
534 numberOfRows = MIN(numberOfRows, _maxNumberOfRows);
536 height = MAX(height, numberOfRows * (_minItemSize.height + _verticalMargin));
538 var itemSizeHeight = FLOOR(height / numberOfRows);
540 if (maxItemSizeHeight > 0)
541 itemSizeHeight = MIN(itemSizeHeight, maxItemSizeHeight);
543 _itemSize = CGSizeMake(MAX(_minItemSize.width, itemSize.width), MAX(_minItemSize.height, itemSizeHeight));
544 _storedFrameSize = CGSizeMake(MAX(width, _minItemSize.width), height);
545 _numberOfColumns = numberOfColumns;
546 _numberOfRows = numberOfRows;
547 countRef(MIN(itemsCount, numberOfColumns * numberOfRows));
550 - (void)displayItems:(CPArray)displayItems frameSize:(CGSize)aFrameSize itemSize:(CGSize)anItemSize columns:(CPInteger)numberOfColumns rows:(CPInteger)numberOfRows count:(CPInteger)displayCount
554 _horizontalMargin = _uniformSubviewsResizing ? FLOOR((aFrameSize.width - numberOfColumns * anItemSize.width) / (numberOfColumns + 1)) :
HORIZONTAL_MARGIN;
556 var x = _horizontalMargin,
557 y = -anItemSize.height;
559 [displayItems enumerateObjectsUsingBlock:function(item, idx, stop)
561 var view = [item view];
563 if (idx >= displayCount)
565 [view setFrameOrigin:CGPointMake(-anItemSize.width, -anItemSize.height)];
569 if (idx % numberOfColumns == 0)
571 x = _horizontalMargin;
572 y += _verticalMargin + anItemSize.height;
575 [view setFrameOrigin:CGPointMake(x, y)];
576 [view setFrameSize:anItemSize];
578 x += anItemSize.width + _horizontalMargin;
582 - (void)_updateMinMaxItemSizeIfNeeded
584 if (!_needsMinMaxItemSizeUpdate)
589 if (_itemPrototype && (prototypeView = [_itemPrototype view]))
591 if (_minItemSize.width == 0)
592 _minItemSize.width = [prototypeView frameSize].width;
594 if (_minItemSize.height == 0)
595 _minItemSize.height = [prototypeView frameSize].height;
597 if (_maxItemSize.height == 0 && !([prototypeView autoresizingMask] & CPViewHeightSizable))
598 _maxItemSize.height = [prototypeView frameSize].height;
600 if (_maxItemSize.width == 0 && !([prototypeView autoresizingMask] & CPViewWidthSizable))
601 _maxItemSize.width = [prototypeView frameSize].width;
603 _needsMinMaxItemSizeUpdate = NO;
612 - (void)setMaxNumberOfRows:(
unsigned)aMaxNumberOfRows
614 if (_maxNumberOfRows == aMaxNumberOfRows)
617 _maxNumberOfRows = aMaxNumberOfRows;
625 - (unsigned)maxNumberOfRows
627 return _maxNumberOfRows;
634 - (void)setMaxNumberOfColumns:(
unsigned)aMaxNumberOfColumns
636 if (_maxNumberOfColumns == aMaxNumberOfColumns)
639 _maxNumberOfColumns = aMaxNumberOfColumns;
647 - (unsigned)maxNumberOfColumns
649 return _maxNumberOfColumns;
655 - (unsigned)numberOfRows
657 return _numberOfRows;
664 - (unsigned)numberOfColumns
666 return _numberOfColumns;
673 - (void)setMinItemSize:(CGSize)aSize
675 if (aSize === nil || aSize === undefined)
678 if (CGSizeEqualToSize(_minItemSize, aSize))
681 _minItemSize = CGSizeMakeCopy(aSize);
683 if (CGSizeEqualToSize(_minItemSize, CGSizeMakeZero()))
684 _needsMinMaxItemSizeUpdate = YES;
692 - (CGSize)minItemSize
701 - (void)setMaxItemSize:(CGSize)aSize
703 if (CGSizeEqualToSize(_maxItemSize, aSize))
706 _maxItemSize = CGSizeMakeCopy(aSize);
717 - (CGSize)maxItemSize
722 - (void)setBackgroundColors:(CPArray)backgroundColors
724 if (_backgroundColors === backgroundColors)
727 _backgroundColors = backgroundColors;
729 if (!_backgroundColors)
732 if ([_backgroundColors count] === 1)
733 [
self setBackgroundColor:_backgroundColors[0]];
736 [
self setBackgroundColor:nil];
738 [
self setNeedsDisplay:YES];
741 - (CPArray)backgroundColors
743 return _backgroundColors;
748 if ([_selectionIndexes count] && [anEvent clickCount] == 2 && [_delegate respondsToSelector:
@selector(collectionView:didDoubleClickOnItemAtIndex:)])
749 [_delegate collectionView:self didDoubleClickOnItemAtIndex:[_selectionIndexes firstIndex]];
754 _mouseDownEvent = anEvent;
756 var location = [
self convertPoint:[anEvent locationInWindow] fromView:nil],
757 index = [
self _indexAtPoint:location];
759 if (index >= 0 && index < _items.length)
765 var indexes = [_selectionIndexes copy];
767 if ([indexes containsIndex:index])
768 [indexes removeIndex:index];
770 [indexes addIndex:index];
772 else if ([anEvent modifierFlags] & CPShiftKeyMask)
775 newSelectedRange = nil;
779 firstSelectedIndex = index;
781 if (index < firstSelectedIndex)
782 newSelectedRange =
CPMakeRange(index, (firstSelectedIndex - index) + 1);
784 newSelectedRange =
CPMakeRange(firstSelectedIndex, (index - firstSelectedIndex) + 1);
787 [indexes addIndexesInRange:newSelectedRange];
800 [[
self window] makeFirstResponder:self];
802 else if (_allowsEmptySelection)
813 - (void)setVerticalMargin:(
float)aVerticalMargin
815 if (_verticalMargin == aVerticalMargin)
818 _verticalMargin = aVerticalMargin;
823 - (void)setUniformSubviewsResizing:(BOOL)flag
825 _uniformSubviewsResizing = flag;
834 - (float)verticalMargin
836 return _verticalMargin;
843 - (void)setDelegate:(
id)aDelegate
845 _delegate = aDelegate;
861 if (![[
self delegate] respondsToSelector:
@selector(collectionView:menuForItemAtIndex:)])
862 return [
super menuForEvent:theEvent];
864 var location = [
self convertPoint:[theEvent locationInWindow] fromView:nil],
865 index = [
self _indexAtPoint:location];
867 return [_delegate collectionView:self menuForItemAtIndex:index];
870 - (int)_indexAtPoint:(CGPoint)thePoint
872 var column = FLOOR(thePoint.x / (_itemSize.width + _horizontalMargin));
874 if (column < _numberOfColumns)
876 var row = FLOOR(thePoint.y / (_itemSize.height + _verticalMargin));
878 if (row < _numberOfRows)
879 return (row * _numberOfColumns + column);
887 return [_items objectAtIndex:anIndex];
890 - (CGRect)frameForItemAtIndex:(CPUInteger)anIndex
903 count = [indexArray count];
905 for (; index < count; ++index)
906 frame = CGRectUnion(
frame, [
self frameForItemAtIndex:indexArray[index]]);
925 [aPasteboard
setData:[_delegate collectionView:self dataForItemsAtIndexes:_selectionIndexes forType:aType]
forType:aType];
928 - (void)_createDropIndicatorIfNeeded
933 _dropView = [[_CPCollectionViewDropIndicator alloc] initWithFrame:CGRectMake(-8, -8, 0, 0)];
935 [_dropView setFrameSize:CGSizeMake(10, _itemSize.height + _verticalMargin)];
936 [
self addSubview:_dropView];
942 if (!_mouseDownEvent)
945 [
self _createDropIndicatorIfNeeded];
947 var locationInWindow = [anEvent locationInWindow],
948 mouseDownLocationInWindow = [_mouseDownEvent locationInWindow];
951 if ((ABS(locationInWindow.x - mouseDownLocationInWindow.x) < 3) &&
952 (ABS(locationInWindow.y - mouseDownLocationInWindow.y) < 3))
955 if (![_delegate respondsToSelector:
@selector(collectionView:dragTypesForItemsAtIndexes:)])
959 if (![_selectionIndexes count])
962 if ([_delegate respondsToSelector:
@selector(collectionView:canDragItemsAtIndexes:withEvent:)] &&
963 ![_delegate collectionView:
self canDragItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent])
967 var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes];
971 var dragImageOffset = CGSizeMakeZero(),
972 view = [
self _draggingViewForItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent offset:dragImageOffset];
974 [view setFrameSize:_itemSize];
975 [view setAlphaValue:0.7];
977 var dragLocation = [
self convertPoint:locationInWindow fromView:nil],
978 dragPoint = CGPointMake(dragLocation.x - _itemSize.width / 2 , dragLocation.y - _itemSize.height / 2);
982 offset:dragImageOffset
983 event:_mouseDownEvent
991 if ([_delegate respondsToSelector:
@selector(collectionView:draggingViewForItemsAtIndexes:withEvent:offset:)])
992 return [_delegate collectionView:self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:offset];
994 return [
self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:offset];
1001 if (!_itemForDragging)
1004 [_itemForDragging setRepresentedObject:idx];
1006 return [_itemForDragging view];
1011 if ([
self respondsToSelector:
@selector(collectionView:canDragItemsAtIndexes:withEvent:)])
1012 return [_delegate collectionView:self canDragItemsAtIndexes:indexes withEvent:anEvent];
1017 - (CPDragOperation)draggingEntered:(
id)draggingInfo
1020 dropIndexRef = @ref(dropIndex),
1021 dragOp = [
self _validateDragWithInfo:draggingInfo dropIndex:dropIndexRef dropOperation:1];
1023 dropIndex = dropIndexRef();
1025 [
self _createDropIndicatorIfNeeded];
1027 [
self _updateDragAndDropStateWithDraggingInfo:draggingInfo newDragOperation:dragOp newDropIndex:dropIndex newDropOperation:1];
1029 return _currentDragOperation;
1032 - (CPDragOperation)draggingUpdated:(
id)draggingInfo
1034 if (![
self _dropIndexDidChange:draggingInfo])
1035 return _currentDragOperation;
1038 dropIndexRef = @ref(dropIndex);
1040 var dragOperation = [
self _validateDragWithInfo:draggingInfo dropIndex:dropIndexRef dropOperation:1];
1042 dropIndex = dropIndexRef();
1044 [
self _updateDragAndDropStateWithDraggingInfo:draggingInfo newDragOperation:dragOperation newDropIndex:dropIndex newDropOperation:1];
1046 return dragOperation;
1049 - (CPDragOperation)_validateDragWithInfo:(
id)draggingInfo dropIndex:(Function)dropIndexRef dropOperation:(
int)dropOperation
1052 dropIndex = [
self _dropIndexForDraggingInfo:draggingInfo proposedDropOperation:dropOperation];
1054 if ([_delegate respondsToSelector:
@selector(collectionView:validateDrop:proposedIndex:dropOperation:)])
1056 var dropIndexRef2 = @ref(dropIndex);
1058 result = [_delegate collectionView:self validateDrop:draggingInfo proposedIndex:dropIndexRef2 dropOperation:dropOperation];
1062 dropIndex = dropIndexRef2();
1066 dropIndexRef(dropIndex);
1071 - (void)draggingExited:(
id)draggingInfo
1073 [
self _updateDragAndDropStateWithDraggingInfo:draggingInfo newDragOperation:0 newDropIndex:-1 newDropOperation:1];
1076 - (void)draggingEnded:(
id)draggingInfo
1078 [
self _updateDragAndDropStateWithDraggingInfo:draggingInfo newDragOperation:0 newDropIndex:-1 newDropOperation:1];
1092 - (BOOL)performDragOperation:(
id)draggingInfo
1096 if (_currentDragOperation && _currentDropIndex !== -1)
1097 result = [_delegate collectionView:self acceptDrop:draggingInfo index:_currentDropIndex dropOperation:1];
1104 - (void)_updateDragAndDropStateWithDraggingInfo:(
id)draggingInfo newDragOperation:(CPDragOperation)dragOperation newDropIndex:(CPInteger)dropIndex newDropOperation:(CPInteger)dropOperation
1106 _currentDropIndex = dropIndex;
1107 _currentDragOperation = dragOperation;
1110 dropviewFrameWidth = CGRectGetWidth([_dropView
frame]);
1113 frameOrigin = CGPointMake(-dropviewFrameWidth, 0);
1114 else if (_currentDropIndex == 0)
1115 frameOrigin = CGPointMake(0, 0);
1120 if ((_currentDropIndex % _numberOfColumns) !== 0 || _currentDropIndex == [_items count])
1122 dropIndex = _currentDropIndex - 1;
1123 offset = (_horizontalMargin - dropviewFrameWidth) / 2;
1127 offset = - _itemSize.
width - dropviewFrameWidth - (_horizontalMargin - dropviewFrameWidth) / 2;
1130 var rect = [
self frameForItemAtIndex:dropIndex];
1132 frameOrigin = CGPointMake(CGRectGetMaxX(rect) + offset, rect.origin.y - _verticalMargin);
1135 [_dropView setFrameOrigin:frameOrigin];
1138 - (BOOL)_dropIndexDidChange:(
id)draggingInfo
1140 var dropIndex = [
self _dropIndexForDraggingInfo:draggingInfo proposedDropOperation:1];
1143 dropIndex = [[
self content] count];
1145 return (_currentDropIndex !== dropIndex)
1148 - (CPInteger)_dropIndexForDraggingInfo:(
id)draggingInfo proposedDropOperation:(
int)dropOperation
1150 var location = [
self convertPoint:[draggingInfo draggingLocation] fromView:nil],
1151 locationX = location.x + _itemSize.
width / 2;
1153 var column = MIN(FLOOR(locationX / (_itemSize.width + _horizontalMargin)), _numberOfColumns),
1154 row = FLOOR(location.y / (_itemSize.height + _verticalMargin));
1156 if (row >= _numberOfRows - 1)
1158 if (row >= _numberOfRows)
1160 row = _numberOfRows - 1;
1161 column = _numberOfColumns;
1164 return MIN((row * _numberOfColumns + column), [_items count]);
1167 return (row * _numberOfColumns + column);
1171 @implementation _CPCollectionViewDropIndicator :
CPView
1176 - (void)drawRect:(CGRect)aRect
1179 width = CGRectGetWidth(aRect),
1180 circleRect = CGRectMake(1, 1,
width - 2,
width - 2);
1203 - (void)_modifySelectionWithNewIndex:(
int)anIndex direction:(
int)aDirection expand:(BOOL)shouldExpand
1205 var count = [[
self items] count];
1210 anIndex = MIN(MAX(anIndex, 0), count - 1);
1212 if (_allowsMultipleSelection && shouldExpand)
1214 var indexes = [_selectionIndexes copy],
1215 bottomAnchor = [indexes firstIndex],
1216 topAnchor = [indexes lastIndex];
1219 if (aDirection === -1)
1220 [indexes addIndexesInRange:CPMakeRange(anIndex, bottomAnchor - anIndex + 1)];
1222 [indexes addIndexesInRange:CPMakeRange(topAnchor, anIndex - topAnchor + 1)];
1228 [
self _scrollToSelection];
1231 - (void)_scrollToSelection
1233 var
frame = [
self frameForItemsAtIndexes:[
self selectionIndexes]];
1235 if (!CGRectIsEmpty(frame))
1236 [
self scrollRectToVisible:frame];
1239 - (void)moveLeft:(
id)sender
1243 index = [[
self items] count];
1245 [
self _modifySelectionWithNewIndex:index - 1 direction:-1 expand:NO];
1248 - (void)moveLeftAndModifySelection:(
id)sender
1252 index = [[
self items] count];
1254 [
self _modifySelectionWithNewIndex:index - 1 direction:-1 expand:YES];
1257 - (void)moveRight:(
id)sender
1262 - (void)moveRightAndModifySelection:(
id)sender
1267 - (void)moveDown:(
id)sender
1272 - (void)moveDownAndModifySelection:(
id)sender
1277 - (void)moveUp:(
id)sender
1281 index = [[
self items] count];
1283 [
self _modifySelectionWithNewIndex:index - [
self numberOfColumns] direction:-1 expand:NO];
1286 - (void)moveUpAndModifySelection:(
id)sender
1290 index = [[
self items] count];
1292 [
self _modifySelectionWithNewIndex:index - [
self numberOfColumns] direction:-1 expand:YES];
1295 - (void)deleteBackward:(
id)sender
1297 if ([[
self delegate] respondsToSelector:
@selector(collectionView:shouldDeleteItemsAtIndexes:)])
1302 if (index > [[
self content] count] - 1)
1305 [
self _scrollToSelection];
1306 [
self setNeedsDisplay:YES];
1312 [
self interpretKeyEvents:[anEvent]];
1315 - (void)setAutoresizingMask:(
unsigned)aMask
1317 [
super setAutoresizingMask:0];
1324 - (CGRect)rectForItemAtIndex:(
int)anIndex
1326 _CPReportLenientDeprecation([
self class], _cmd,
@selector(frameForItemAtIndex:));
1335 _CPReportLenientDeprecation([
self class], _cmd,
@selector(frameForItemsAtIndexes:));
1356 self = [
super initWithCoder:aCoder];
1360 _minItemSize = [aCoder decodeSizeForKey:CPCollectionViewMinItemSizeKey];
1361 _maxItemSize = [aCoder decodeSizeForKey:CPCollectionViewMaxItemSizeKey];
1363 _maxNumberOfRows = [aCoder decodeIntForKey:CPCollectionViewMaxNumberOfRowsKey];
1364 _maxNumberOfColumns = [aCoder decodeIntForKey:CPCollectionViewMaxNumberOfColumnsKey];
1366 _verticalMargin = [aCoder decodeFloatForKey:CPCollectionViewVerticalMarginKey];
1368 _isSelectable = [aCoder decodeBoolForKey:CPCollectionViewSelectableKey];
1369 _allowsMultipleSelection = [aCoder decodeBoolForKey:CPCollectionViewAllowsMultipleSelectionKey];
1371 [
self setBackgroundColors:[aCoder decodeObjectForKey:CPCollectionViewBackgroundColorsKey]];
1381 [
super encodeWithCoder:aCoder];
1383 if (!CGSizeEqualToSize(_minItemSize, CGSizeMakeZero()))
1384 [aCoder encodeSize:_minItemSize forKey:CPCollectionViewMinItemSizeKey];
1386 if (!CGSizeEqualToSize(_maxItemSize, CGSizeMakeZero()))
1387 [aCoder encodeSize:_maxItemSize forKey:CPCollectionViewMaxItemSizeKey];
1389 [aCoder encodeInt:_maxNumberOfRows forKey:CPCollectionViewMaxNumberOfRowsKey];
1390 [aCoder encodeInt:_maxNumberOfColumns forKey:CPCollectionViewMaxNumberOfColumnsKey];
1392 [aCoder encodeBool:_isSelectable forKey:CPCollectionViewSelectableKey];
1393 [aCoder encodeBool:_allowsMultipleSelection forKey:CPCollectionViewAllowsMultipleSelectionKey];
1395 [aCoder encodeFloat:_verticalMargin forKey:CPCollectionViewVerticalMarginKey];
1397 [aCoder encodeObject:_backgroundColors forKey:CPCollectionViewBackgroundColorsKey];
1407 - (BOOL)uniformSubviewsResizing
1409 return _uniformSubviewsResizing;
1415 - (void)setUniformSubviewsResizing:(BOOL)aValue
1417 _uniformSubviewsResizing = aValue;