58 unsigned _delegateSelectors;
61 - (id)initWithFrame:(CGRect)aFrame
63 if (
self = [super initWithFrame:aFrame])
65 _items = [CPArray array];
79 [_tabs setHitTests:NO];
81 var height = [_tabs valueForThemeAttribute:@"default-height"];
82 [_tabs setFrameSize:CGSizeMake(0, height)];
84 _box = [[
CPBox alloc] initWithFrame:[
self bounds]];
87 [
self addSubview:_box];
88 [
self addSubview:_tabs];
106 - (void)insertTabViewItem:(
CPTabViewItem)aTabViewItem atIndex:(CPUInteger)anIndex
108 [_items insertObject:aTabViewItem atIndex:anIndex];
111 [
self _repositionTabs];
113 [aTabViewItem _setTabView:self];
116 [_delegate tabViewDidChangeNumberOfTabViewItems:self];
125 var count = [_items count];
126 for (var i = 0; i < count; i++)
128 if ([_items objectAtIndex:i] === aTabViewItem)
130 [_items removeObjectAtIndex:i];
136 [
self _repositionTabs];
138 [aTabViewItem _setTabView:nil];
141 [_delegate tabViewDidChangeNumberOfTabViewItems:self];
152 return [_items indexOfObjectIdenticalTo:aTabViewItem];
160 - (int)indexOfTabViewItemWithIdentifier:(
CPString)anIdentifier
162 for (var index = [_items count]; index >= 0; index--)
163 if ([[_items[index] identifier]
isEqual:anIdentifier])
173 - (unsigned)numberOfTabViewItems
175 return [_items count];
184 return [_items objectAtIndex:anIndex];
191 - (CPArray)tabViewItems
193 return [_items copy];
201 - (void)selectFirstTabViewItem:(
id)aSender
203 if ([_items count] === 0)
213 - (void)selectLastTabViewItem:(
id)aSender
215 if ([_items count] === 0)
225 - (void)selectNextTabViewItem:(
id)aSender
230 var nextIndex = _selectedIndex + 1;
232 if (nextIndex === [_items count])
243 - (void)selectPreviousTabViewItem:(
id)aSender
248 var previousIndex = _selectedIndex - 1;
250 if (previousIndex < 0)
269 - (BOOL)selectTabViewItemAtIndex:(CPUInteger)anIndex
271 if (anIndex === _selectedIndex)
280 [_delegate tabView:self willSelectTabViewItem:aTabViewItem];
282 [_tabs selectSegmentWithTag:anIndex];
283 [
self _setSelectedIndex:anIndex];
286 [_delegate tabView:self didSelectTabViewItem:aTabViewItem];
298 return [_items objectAtIndex:_selectedIndex];
323 [_tabs setFont:_font];
331 - (void)setTabViewType:(CPTabViewType)aTabViewType
333 if (_type === aTabViewType)
336 _type = aTabViewType;
339 [_tabs removeFromSuperview];
341 [
self addSubview:_tabs];
348 [_box setBorderType:CPBezelBorder];
351 [_box setBorderType:CPLineBorder];
354 [_box setBorderType:CPNoBorder];
358 [
self setNeedsLayout];
361 - (void)layoutSubviews
367 [_box setFrame:[
self bounds]];
371 var aFrame = [
self frame],
372 segmentedHeight = CGRectGetHeight([_tabs
frame]),
375 [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame),
376 CGRectGetHeight(aFrame) - segmentedHeight / 2)];
378 [
self _repositionTabs];
386 - (CPTabViewType)tabViewType
404 - (void)setDelegate:(
id)aDelegate
406 if (_delegate == aDelegate)
409 _delegate = aDelegate;
411 _delegateSelectors = 0;
413 if ([_delegate respondsToSelector:
@selector(tabView:shouldSelectTabViewItem:)])
416 if ([_delegate respondsToSelector:
@selector(tabView:willSelectTabViewItem:)])
419 if ([_delegate respondsToSelector:
@selector(tabView:didSelectTabViewItem:)])
422 if ([_delegate respondsToSelector:
@selector(tabViewDidChangeNumberOfTabViewItems:)])
428 [_box setBackgroundColor:aColor];
433 return [_box backgroundColor];
438 var segmentIndex = [_tabs testSegment:[_tabs convertPoint:[anEvent locationInWindow] fromView:nil]];
440 if (segmentIndex !=
CPNotFound && [
self selectTabViewItemAtIndex:segmentIndex])
441 [_tabs trackSegment:anEvent];
444 - (void)_repositionTabs
446 var horizontalCenterOfSelf = CGRectGetWidth([
self bounds]) / 2,
447 verticalCenterOfTabs = CGRectGetHeight([_tabs bounds]) / 2;
450 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, CGRectGetHeight([
self bounds]) - verticalCenterOfTabs)];
452 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, verticalCenterOfTabs)];
455 - (void)_setSelectedIndex:(
CPNumber)index
457 _selectedIndex = index;
458 [
self _setContentViewFromItem:[_items objectAtIndex:_selectedIndex]];
463 [_box setContentView:[anItem
view]];
468 var count = [_items count];
469 [_tabs setSegmentCount:count];
471 for (var i = 0; i < count; i++)
473 [_tabs setLabel:[[_items objectAtIndex:i] label] forSegment:i];
474 [_tabs setTag:i forSegment:i];
478 [
self selectFirstTabViewItem:
self];
493 if (
self = [super initWithCoder:aCoder])
497 _font = [aCoder decodeObjectForKey:CPTabViewFontKey];
498 [_tabs setFont:_font];
500 _items = [aCoder decodeObjectForKey:CPTabViewItemsKey];
501 [_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
503 [
self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
505 self.selectOnAwake = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey];
506 _type = [aCoder decodeIntForKey:CPTabViewTypeKey];
518 if (
self.selectOnAwake)
521 delete self.selectOnAwake;
528 [
self setNeedsLayout];
536 var subviews = [
self subviews];
537 [_box removeFromSuperview];
538 [
super encodeWithCoder:aCoder];
539 [
self setSubviews:subviews];
541 [aCoder encodeObject:_items forKey:CPTabViewItemsKey];
547 [aCoder encodeInt:_type forKey:CPTabViewTypeKey];
548 [aCoder encodeObject:_font forKey:CPTabViewFontKey];
550 [aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey];