24 @
typedef CPTabViewType
45 - (void)tabViewDidChangeNumberOfTabViewItems:(
CPTabView)tabView;
69 id <CPTabViewDelegate> _delegate;
70 unsigned _delegateSelectors;
73 - (id)initWithFrame:(CGRect)aFrame
75 if (
self = [super initWithFrame:aFrame])
77 _items = [CPArray array];
91 [_tabs setHitTests:NO];
93 var height = [_tabs valueForThemeAttribute:@"min-size"].height;
94 [_tabs setFrameSize:CGSizeMake(0, height)];
96 _box = [[
CPBox alloc] initWithFrame:[
self bounds]];
99 [
self addSubview:_box];
100 [
self addSubview:_tabs];
118 - (void)insertTabViewItem:(
CPTabViewItem)aTabViewItem atIndex:(CPUInteger)anIndex
120 [_items insertObject:aTabViewItem atIndex:anIndex];
123 [
self _repositionTabs];
125 [aTabViewItem _setTabView:self];
128 [_delegate tabViewDidChangeNumberOfTabViewItems:self];
137 var count = [_items count];
138 for (var i = 0; i < count; i++)
140 if ([_items objectAtIndex:i] === aTabViewItem)
142 [_items removeObjectAtIndex:i];
148 [
self _repositionTabs];
150 [aTabViewItem _setTabView:nil];
153 [_delegate tabViewDidChangeNumberOfTabViewItems:self];
164 return [_items indexOfObjectIdenticalTo:aTabViewItem];
172 - (int)indexOfTabViewItemWithIdentifier:(
CPString)anIdentifier
174 for (var index = [_items count]; index >= 0; index--)
175 if ([[_items[index] identifier]
isEqual:anIdentifier])
185 - (unsigned)numberOfTabViewItems
187 return [_items count];
196 return [_items objectAtIndex:anIndex];
203 - (CPArray)tabViewItems
205 return [_items copy];
213 - (void)selectFirstTabViewItem:(
id)aSender
215 if ([_items count] === 0)
225 - (void)selectLastTabViewItem:(
id)aSender
227 if ([_items count] === 0)
237 - (void)selectNextTabViewItem:(
id)aSender
242 var nextIndex = _selectedIndex + 1;
244 if (nextIndex === [_items count])
255 - (void)selectPreviousTabViewItem:(
id)aSender
260 var previousIndex = _selectedIndex - 1;
262 if (previousIndex < 0)
281 - (BOOL)selectTabViewItemAtIndex:(CPUInteger)anIndex
283 if (anIndex === _selectedIndex)
292 [_delegate tabView:self willSelectTabViewItem:aTabViewItem];
294 [_tabs selectSegmentWithTag:anIndex];
295 [
self _setSelectedIndex:anIndex];
298 [_delegate tabView:self didSelectTabViewItem:aTabViewItem];
310 return [_items objectAtIndex:_selectedIndex];
335 [_tabs setFont:_font];
343 - (void)setTabViewType:(CPTabViewType)aTabViewType
345 if (_type === aTabViewType)
348 _type = aTabViewType;
351 [_tabs removeFromSuperview];
360 [_box setBorderType:CPBezelBorder];
363 [_box setBorderType:CPLineBorder];
366 [_box setBorderType:CPNoBorder];
373 - (void)layoutSubviews
379 [_box setFrame:[
self bounds]];
383 var aFrame = [
self frame],
384 segmentedHeight = CGRectGetHeight([_tabs
frame]),
387 [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame),
388 CGRectGetHeight(aFrame) - segmentedHeight / 2)];
391 [
self _repositionTabs];
399 - (CPTabViewType)tabViewType
419 if (_delegate == aDelegate)
422 _delegate = aDelegate;
424 _delegateSelectors = 0;
426 if ([_delegate respondsToSelector:
@selector(tabView:shouldSelectTabViewItem:)])
429 if ([_delegate respondsToSelector:
@selector(tabView:willSelectTabViewItem:)])
432 if ([_delegate respondsToSelector:
@selector(tabView:didSelectTabViewItem:)])
435 if ([_delegate respondsToSelector:
@selector(tabViewDidChangeNumberOfTabViewItems:)])
441 [_box setBackgroundColor:aColor];
446 return [_box backgroundColor];
451 var segmentIndex = [_tabs testSegment:[_tabs convertPoint:[anEvent
locationInWindow] fromView:nil]];
453 if (segmentIndex !=
CPNotFound && [
self selectTabViewItemAtIndex:segmentIndex])
454 [_tabs trackSegment:anEvent];
457 - (void)_repositionTabs
459 var horizontalCenterOfSelf = CGRectGetWidth([
self bounds]) / 2,
460 verticalCenterOfTabs = CGRectGetHeight([_tabs
bounds]) / 2;
463 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, CGRectGetHeight([
self bounds]) - verticalCenterOfTabs)];
465 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, verticalCenterOfTabs)];
468 - (void)_setSelectedIndex:(
CPNumber)index
470 _selectedIndex = index;
471 [
self _setContentViewFromItem:[_items objectAtIndex:_selectedIndex]];
476 [_box setContentView:[anItem
view]];
481 var count = [_items count];
482 [_tabs setSegmentCount:count];
484 for (var i = 0; i < count; i++)
486 [_tabs setLabel:[[_items objectAtIndex:i] label] forSegment:i];
487 [_tabs setTag:i forSegment:i];
491 [
self selectFirstTabViewItem:
self];
506 if (
self = [super initWithCoder:aCoder])
510 _font = [aCoder decodeObjectForKey:CPTabViewFontKey];
511 [_tabs setFont:_font];
513 _items = [aCoder decodeObjectForKey:CPTabViewItemsKey];
514 [_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
516 [
self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
518 self.selectOnAwake = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey];
519 _type = [aCoder decodeIntForKey:CPTabViewTypeKey];
531 if (
self.selectOnAwake)
534 delete self.selectOnAwake;
550 [_box removeFromSuperview];
554 [aCoder encodeObject:_items forKey:CPTabViewItemsKey];
560 [aCoder encodeInt:_type forKey:CPTabViewTypeKey];
561 [aCoder encodeObject:_font forKey:CPTabViewFontKey];
563 [aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey];