47 - (id)initWithIdentifier:(
CPString)anIdentifier
79 CPInteger _dirtyItemIndex;
80 CPView _itemHeaderPrototype;
90 - (id)initWithFrame:(CGRect)aFrame
106 - (void)setItemHeaderPrototype:(
CPView)aView
108 _itemHeaderPrototype = aView;
113 return _itemHeaderPrototype;
133 [_expandedItemIndexes addIndex:anIndex];
135 var itemView = [[_CPAccordionItemView alloc] initWithAccordionView:self];
137 [itemView setIndex:anIndex];
138 [itemView setLabel:[anItem
label]];
139 [itemView setContentView:[anItem
view]];
143 [_items insertObject:anItem atIndex:anIndex];
144 [_itemViews insertObject:itemView atIndex:anIndex];
146 [
self _invalidateItemsStartingAtIndex:anIndex];
156 - (void)removeItemAtIndex:(CPInteger)anIndex
159 [_expandedItemIndexes removeIndex:anIndex];
161 [_itemViews[anIndex] removeFromSuperview];
163 [_items removeObjectAtIndex:anIndex];
164 [_itemViews removeObjectAtIndex:anIndex];
166 [
self _invalidateItemsStartingAtIndex:anIndex];
171 - (void)removeAllItems
173 var count = _items.length;
179 - (void)expandItemAtIndex:(CPInteger)anIndex
181 if (![_itemViews[anIndex] isCollapsed])
184 [_expandedItemIndexes addIndex:anIndex];
185 [_itemViews[anIndex] setCollapsed:NO];
187 [
self _invalidateItemsStartingAtIndex:anIndex];
190 - (void)collapseItemAtIndex:(CPInteger)anIndex
192 if ([_itemViews[anIndex] isCollapsed])
195 [_expandedItemIndexes removeIndex:anIndex];
196 [_itemViews[anIndex] setCollapsed:YES];
198 [
self _invalidateItemsStartingAtIndex:anIndex];
201 - (void)toggleItemAtIndex:(CPInteger)anIndex
203 var itemView = _itemViews[anIndex];
205 if ([itemView isCollapsed])
214 return _expandedItemIndexes;
221 [indexSet removeIndexes:_expandedItemIndexes];
226 - (void)setEnabled:(BOOL)isEnabled forItemAtIndex:(CPInteger)anIndex
228 var itemView = _itemViews[anIndex];
237 [itemView setEnabled:isEnabled];
240 - (void)_invalidateItemsStartingAtIndex:(CPInteger)anIndex
243 _dirtyItemIndex = anIndex;
245 _dirtyItemIndex = MIN(_dirtyItemIndex, anIndex);
247 [
self setNeedsLayout];
250 - (void)setFrameSize:(CGSize)aSize
257 [
self _invalidateItemsStartingAtIndex:0];
260 - (void)layoutSubviews
262 if (_items.length <= 0)
268 _dirtyItemIndex = MIN(_dirtyItemIndex, _items.length - 1);
270 var index = _dirtyItemIndex,
271 count = _itemViews.length,
273 y = index > 0 ? CGRectGetMaxY([_itemViews[index - 1]
frame]) : 0.0;
278 for (; index < count; ++index)
280 var itemView = _itemViews[index];
282 [itemView setFrameY:y width:width];
284 y = CGRectGetMaxY([itemView
frame]);
292 @implementation _CPAccordionItemView :
CPView 304 self = [
super initWithFrame:CGRectMakeZero()];
308 _accordionView = anAccordionView;
311 var
bounds = [
self bounds];
315 if ([_headerView respondsToSelector:
@selector(setTarget:)] && [_headerView respondsToSelector:
@selector(setAction:)])
317 [_headerView setTarget:self];
318 [_headerView setAction:@selector(toggle:)];
321 [
self addSubview:_headerView];
327 - (void)toggle:(
id)aSender
329 [_accordionView toggleItemAtIndex:[
self index]];
334 if ([_headerView respondsToSelector:
@selector(setTitle:)])
335 [_headerView setTitle:aLabel];
337 else if ([_headerView respondsToSelector:
@selector(setLabel:)])
338 [_headerView setLabel:aLabel];
340 else if ([_headerView respondsToSelector:
@selector(setStringValue:)])
341 [_headerView setStringValue:aLabel];
344 - (void)setEnabled:(BOOL)isEnabled
346 if ([_headerView respondsToSelector:
@selector(setEnabled:)])
347 [_headerView setEnabled:isEnabled];
350 - (void)setContentView:(
CPView)aView
352 if (_contentView === aView)
355 [_contentView removeObserver:self forKeyPath:@"frame"];
357 [_contentView removeFromSuperview];
359 _contentView = aView;
361 [_contentView addObserver:self forKeyPath:@"frame" options:CPKeyValueObservingOptionOld | CPKeyValueObservingOptionNew context:NULL];
363 [
self addSubview:_contentView];
365 [_accordionView _invalidateItemsStartingAtIndex:[
self index]];
368 - (void)setFrameY:(
float)aY width:(
float)aWidth
370 var headerHeight = CGRectGetHeight([_headerView
frame]);
373 [_headerView setFrameSize:CGSizeMake(aWidth, headerHeight)];
374 [_contentView setFrameOrigin:CGPointMake(0.0, headerHeight)];
376 if ([
self isCollapsed])
377 [
self setFrame:CGRectMake(0.0, aY, aWidth, headerHeight)];
381 var contentHeight = CGRectGetHeight([_contentView
frame]);
383 [_contentView setFrameSize:CGSizeMake(aWidth, contentHeight)];
384 [
self setFrame:CGRectMake(0.0, aY, aWidth, contentHeight + headerHeight)];
388 - (void)resizeSubviewsWithOldSize:(CGSize)aSize
392 - (void)observeValueForKeyPath:(
CPString)aKeyPath
393 ofObject:(
id)anObject
398 [_accordionView _invalidateItemsStartingAtIndex:[
self index]];
424 _identifier = aValue;
id initWithFrame:(CGRect aFrame)
void addSubview:(CPView aSubview)
FrameUpdater prototype identifier
void setItemHeaderPrototype:(CPView aView)
void collapseItemAtIndex:(CPInteger anIndex)
void insertItem:atIndex:(CPAccordionViewItem anItem, [atIndex] CPInteger anIndex)
A collection of unique integers.
Unarchives objects created using CPKeyedArchiver.
void removeItemAtIndex:(CPInteger anIndex)
A mutable key-value pair collection.
Implements keyed archiving of object graphs (e.g. for storing data).
An immutable string (collection of characters).
void expandItemAtIndex:(CPInteger anIndex)
void setIdentifier:(CPString aValue)
void setFrameSize:(CGSize aSize)
id unarchiveObjectWithData:(CPData aData)
void setFrameSize:(CGSize aSize)
id indexSetWithIndexesInRange:(CPRange aRange)
id initWithIdentifier:(CPString anIdentifier)
CPData archivedDataWithRootObject:(id anObject)