48 - (id)initWithIdentifier:(
CPString)anIdentifier
81 CPInteger _dirtyItemIndex;
82 CPView _itemHeaderPrototype;
92 - (id)initWithFrame:(CGRect)aFrame
108 - (void)setItemHeaderPrototype:(
CPView)aView
110 _itemHeaderPrototype = aView;
115 return _itemHeaderPrototype;
135 [_expandedItemIndexes addIndex:anIndex];
137 var itemView = [[_CPAccordionItemView alloc] initWithAccordionView:self];
139 [itemView setIndex:anIndex];
140 [itemView setLabel:[anItem
label]];
141 [itemView setContentView:[anItem
view]];
145 [_items insertObject:anItem atIndex:anIndex];
146 [_itemViews insertObject:itemView atIndex:anIndex];
148 [
self _invalidateItemsStartingAtIndex:anIndex];
158 - (void)removeItemAtIndex:(CPInteger)anIndex
161 [_expandedItemIndexes removeIndex:anIndex];
163 [_itemViews[anIndex] removeFromSuperview];
165 [_items removeObjectAtIndex:anIndex];
166 [_itemViews removeObjectAtIndex:anIndex];
168 [
self _invalidateItemsStartingAtIndex:anIndex];
173 - (void)removeAllItems
175 var count = _items.length;
181 - (void)expandItemAtIndex:(CPInteger)anIndex
183 if (![_itemViews[anIndex] isCollapsed])
186 [_expandedItemIndexes addIndex:anIndex];
187 [_itemViews[anIndex] setCollapsed:NO];
189 [
self _invalidateItemsStartingAtIndex:anIndex];
192 - (void)collapseItemAtIndex:(CPInteger)anIndex
194 if ([_itemViews[anIndex] isCollapsed])
197 [_expandedItemIndexes removeIndex:anIndex];
198 [_itemViews[anIndex] setCollapsed:YES];
200 [
self _invalidateItemsStartingAtIndex:anIndex];
203 - (void)toggleItemAtIndex:(CPInteger)anIndex
205 var itemView = _itemViews[anIndex];
207 if ([itemView isCollapsed])
216 return _expandedItemIndexes;
223 [indexSet removeIndexes:_expandedIndexes];
228 - (void)setEnabled:(BOOL)isEnabled forItemAtIndex:(CPInteger)anIndex
230 var itemView = _itemViews[anIndex];
239 [itemView setEnabled:isEnabled];
242 - (void)_invalidateItemsStartingAtIndex:(CPInteger)anIndex
245 _dirtyItemIndex = anIndex;
247 _dirtyItemIndex = MIN(_dirtyItemIndex, anIndex);
249 [
self setNeedsLayout];
252 - (void)setFrameSize:(CGSize)aSize
259 [
self _invalidateItemsStartingAtIndex:0];
262 - (void)layoutSubviews
264 if (_items.length <= 0)
270 _dirtyItemIndex = MIN(_dirtyItemIndex, _items.length - 1);
272 var index = _dirtyItemIndex,
273 count = _itemViews.length,
274 width = _CGRectGetWidth([
self bounds]),
275 y = index > 0 ? CGRectGetMaxY([_itemViews[index - 1]
frame]) : 0.0;
280 for (; index < count; ++index)
282 var itemView = _itemViews[index];
284 [itemView setFrameY:y width:width];
286 y = CGRectGetMaxY([itemView
frame]);
294 @implementation _CPAccordionItemView :
CPView
306 self = [
super initWithFrame:_CGRectMakeZero()];
310 _accordionView = anAccordionView;
313 var bounds = [
self bounds];
317 if ([_headerView respondsToSelector:
@selector(setTarget:)] && [_headerView respondsToSelector:
@selector(setAction:)])
319 [_headerView setTarget:self];
320 [_headerView setAction:@selector(toggle:)];
323 [
self addSubview:_headerView];
329 - (void)toggle:(
id)aSender
331 [_accordionView toggleItemAtIndex:[
self index]];
336 if ([_headerView respondsToSelector:
@selector(setTitle:)])
337 [_headerView setTitle:aLabel];
339 else if ([_headerView respondsToSelector:
@selector(setLabel:)])
340 [_headerView setLabel:aLabel];
342 else if ([_headerView respondsToSelector:
@selector(setStringValue:)])
343 [_headerView setStringValue:aLabel];
346 - (void)setEnabled:(BOOL)isEnabled
348 if ([_headerView respondsToSelector:
@selector(setEnabled:)])
349 [_headerView setEnabled:isEnabled];
352 - (void)setContentView:(
CPView)aView
354 if (_contentView === aView)
357 [_contentView removeObserver:self forKeyPath:@"frame"];
359 [_contentView removeFromSuperview];
361 _contentView = aView;
363 [_contentView addObserver:self forKeyPath:@"frame" options:CPKeyValueObservingOptionOld | CPKeyValueObservingOptionNew context:NULL];
365 [
self addSubview:_contentView];
367 [_accordionView _invalidateItemsStartingAtIndex:[
self index]];
370 - (void)setFrameY:(
float)aY width:(
float)aWidth
372 var headerHeight = _CGRectGetHeight([_headerView
frame]);
375 [_headerView setFrameSize:_CGSizeMake(aWidth, headerHeight)];
376 [_contentView setFrameOrigin:_CGPointMake(0.0, headerHeight)];
378 if ([
self isCollapsed])
379 [
self setFrame:_CGRectMake(0.0, aY, aWidth, headerHeight)];
383 var contentHeight = _CGRectGetHeight([_contentView
frame]);
385 [_contentView setFrameSize:_CGSizeMake(aWidth, contentHeight)];
386 [
self setFrame:_CGRectMake(0.0, aY, aWidth, contentHeight + headerHeight)];
390 - (void)resizeSubviewsWithOldSize:(CGSize)aSize
394 - (void)observeValueForKeyPath:(
CPString)aKeyPath
395 ofObject:(
id)anObject
400 [_accordionView _invalidateItemsStartingAtIndex:[
self index]];
426 _identifier = aValue;