24 @
typedef CPTabViewType
46 - (void)tabViewDidChangeNumberOfTabViewItems:(
CPTabView)tabView;
71 id <CPTabViewDelegate> _delegate;
72 unsigned _delegateSelectors;
75 - (id)initWithFrame:(CGRect)aFrame
77 if (
self = [super initWithFrame:aFrame])
80 _selectedTabViewItem = nil;
90 [_tabs setHitTests:NO];
91 [_tabs setSegments:[CPArray array]];
93 var height = [_tabs valueForThemeAttribute:@"min-size"].height;
94 [_tabs setFrameSize:CGSizeMake(0, height)];
96 _box = [[_CPTabViewBox alloc] initWithFrame:[
self bounds]];
97 [_box setTabView:self];
103 _placeHolderView = nil;
108 return [_tabs segments];
126 - (void)insertTabViewItem:(
CPTabViewItem)aTabViewItem atIndex:(CPUInteger)anIndex
133 [_tabs insertSegments:tabViewItems atIndexes:indexes];
134 [
tabViewItems makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
137 [
self _reverseSetContent];
139 [
self _sendDelegateTabViewDidChangeNumberOfTabViewItems];
148 var idx = [[
self items] indexOfObjectIdenticalTo:aTabViewItem];
154 [aTabViewItem _setTabView:nil];
157 [
self _didRemoveTabViewItem:aTabViewItem atIndex:idx];
158 [
self _reverseSetContent];
160 [
self _sendDelegateTabViewDidChangeNumberOfTabViewItems];
163 - (void)_didRemoveTabViewItem:(
CPTabViewItem)aTabViewItem atIndex:(CPInteger)idx
169 if (_selectedTabViewItem == aTabViewItem)
179 _selectedTabViewItem == nil;
191 return [[
self items] indexOfObjectIdenticalTo:aTabViewItem];
199 - (int)indexOfTabViewItemWithIdentifier:(
CPString)anIdentifier
201 return [[
self items] indexOfObjectPassingTest:function(item, idx, stop)
203 return [[item identifier] isEqual:anIdentifier];
213 return [[
self items] count];
222 return [[
self items] objectAtIndex:anIndex];
231 return [[
self items] copy];
239 - (void)selectFirstTabViewItem:(
id)aSender
251 - (void)selectLastTabViewItem:(
id)aSender
263 - (void)selectNextTabViewItem:(
id)aSender
265 if (_selectedTabViewItem === nil)
281 - (void)selectPreviousTabViewItem:(
id)aSender
283 if (_selectedTabViewItem === nil)
288 if (previousIndex < 0)
307 - (BOOL)selectTabViewItemAtIndex:(CPUInteger)anIndex
309 if (![
self _selectTabViewItemAtIndex:anIndex])
312 [
self _reverseSetSelectedIndex];
318 - (BOOL)_selectTabViewItemAtIndex:(CPUInteger)anIndex
322 if (aTabViewItem == _selectedTabViewItem)
325 if (![
self _sendDelegateShouldSelectTabViewItem:aTabViewItem])
328 [
self _sendDelegateWillSelectTabViewItem:aTabViewItem];
330 [_tabs setSelectedSegment:anIndex];
331 _selectedTabViewItem = aTabViewItem;
332 [
self _displayItemView:[aTabViewItem view]];
334 [
self _sendDelegateDidSelectTabViewItem:aTabViewItem];
345 return _selectedTabViewItem;
368 [_tabs setFont:_font];
376 - (void)setTabViewType:(CPTabViewType)aTabViewType
378 if (_type === aTabViewType)
381 _type = aTabViewType;
384 [_tabs removeFromSuperview];
393 [_box setBorderType:CPBezelBorder];
396 [_box setBorderType:CPLineBorder];
399 [_box setBorderType:CPNoBorder];
409 [_tabs tileWithChangedSegment:segment];
420 [_box setFrame:[
self bounds]];
424 var aFrame = [
self frame],
425 segmentedHeight = CGRectGetHeight([_tabs
frame]),
428 [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame),
429 CGRectGetHeight(aFrame) - segmentedHeight / 2)];
431 [
self _repositionTabs];
459 if (_delegate == aDelegate)
462 _delegate = aDelegate;
464 _delegateSelectors = 0;
466 if ([_delegate respondsToSelector:
@selector(tabView:shouldSelectTabViewItem:)])
469 if ([_delegate respondsToSelector:
@selector(tabView:willSelectTabViewItem:)])
472 if ([_delegate respondsToSelector:
@selector(tabView:didSelectTabViewItem:)])
475 if ([_delegate respondsToSelector:
@selector(tabViewDidChangeNumberOfTabViewItems:)])
481 [_box setBackgroundColor:aColor];
486 return [_box backgroundColor];
491 var segmentIndex = [_tabs testSegment:[_tabs convertPoint:[anEvent
locationInWindow] fromView:nil]];
493 if (segmentIndex !=
CPNotFound && [
self selectTabViewItemAtIndex:segmentIndex])
494 [_tabs trackSegment:anEvent];
497 - (void)_repositionTabs
499 var horizontalCenterOfSelf = CGRectGetWidth([
self bounds]) / 2,
500 verticalCenterOfTabs = CGRectGetHeight([_tabs
bounds]) / 2;
503 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, CGRectGetHeight([
self bounds]) - verticalCenterOfTabs)];
505 [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, verticalCenterOfTabs)];
508 - (void)_displayItemView:(
CPView)aView
510 [_box setContentView:aView];
515 - (BOOL)_sendDelegateShouldSelectTabViewItem:(
CPTabViewItem)aTabViewItem
518 return [_delegate tabView:self shouldSelectTabViewItem:aTabViewItem];
523 - (void)_sendDelegateWillSelectTabViewItem:(
CPTabViewItem)aTabViewItem
526 [_delegate tabView:self willSelectTabViewItem:aTabViewItem];
529 - (void)_sendDelegateDidSelectTabViewItem:(
CPTabViewItem)aTabViewItem
532 [_delegate tabView:self didSelectTabViewItem:aTabViewItem];
535 - (void)_sendDelegateTabViewDidChangeNumberOfTabViewItems
538 [_delegate tabViewDidChangeNumberOfTabViewItems:self];
545 + (Class)_binderClassForBinding:(
CPString)aBinding
548 return [_CPTabViewContentBinder class];
550 return [_CPTabViewSelectionBinder class];
552 return [
super _binderClassForBinding:aBinding];
560 - (void)_reverseSetContent
563 [theBinder reverseSetValueFor:@"items"];
566 - (void)_reverseSetSelectedIndex
570 if (theBinder !== nil)
571 [theBinder reverseSetValueFor:@"selectionIndexes"];
575 [theBinder reverseSetValueFor:@"selectedIndex"];
581 var cls = [[
self class] _binderClassForBinding:aBinding]
582 return [cls getBinding:aBinding forObject:self];
585 - (void)setItems:(CPArray)tabViewItems
590 [[
self items] makeObjectsPerformSelector:@selector(_setTabView:) withObject:nil];
591 [_tabs setSegments:tabViewItems];
592 [
tabViewItems makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
605 [_tabs setSelectedSegment:-1];
606 _selectedTabViewItem = nil;
609 - (void)_displayPlaceholder:(
CPString)aPlaceholder
611 if (_placeHolderView == nil)
613 _placeHolderView = [[
CPView alloc] initWithFrame:CGRectMakeZero()];
614 var textField = [[
CPTextField alloc] initWithFrame:CGRectMakeZero()];
615 [textField setTag:1000];
618 [_placeHolderView addSubview:textField];
621 var textField = [_placeHolderView viewWithTag:1000];
622 [textField setStringValue:aPlaceholder];
623 [textField sizeToFit];
625 var boxBounds = [_box bounds],
626 textFieldBounds = [textField bounds],
627 origin = CGPointMake(CGRectGetWidth(boxBounds)/2 - CGRectGetWidth(textFieldBounds)/2, CGRectGetHeight(boxBounds)/2 - CGRectGetHeight(textFieldBounds));
629 [textField setFrameOrigin:origin];
631 [
self _displayItemView:_placeHolderView];
635 #pragma mark Override 647 var _CPTabViewContentBinderNull =
@"NO CONTENT";
648 @implementation _CPTabViewContentBinder :
CPBinder 653 - (void)_updatePlaceholdersWithOptions:(
CPDictionary)options
655 [
super _updatePlaceholdersWithOptions:options];
656 [
self _setPlaceholder:_CPTabViewContentBinderNull forMarker:CPNullMarker isDefault:YES];
659 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
661 [_source setItems:@[]];
662 [_source _setPlaceholderView:aValue];
665 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
667 [_source setItems:aValue];
670 - (id)valueForBinding:(
CPString)aBinding
672 return [_source items];
677 var _CPTabViewSelectionBinderMultipleValues =
@"Multiple Selection",
678 _CPTabViewSelectionBinderNoSelection =
@"No Selection";
679 @implementation _CPTabViewSelectionBinder :
CPBinder 684 - (void)_updatePlaceholdersWithOptions:(
CPDictionary)options
686 [
super _updatePlaceholdersWithOptions:options];
688 [
self _setPlaceholder:_CPTabViewSelectionBinderMultipleValues forMarker:CPMultipleValuesMarker isDefault:YES];
689 [
self _setPlaceholder:_CPTabViewSelectionBinderNoSelection forMarker:CPNoSelectionMarker isDefault:YES];
692 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
695 [_source _deselectAll];
697 [_source _displayPlaceholder:aValue];
700 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
704 if (aValue == nil || [aValue count] == 0)
706 [_source _deselectAll];
707 [_source _displayPlaceholder:_CPTabViewSelectionBinderNoSelection];
709 else if ([aValue count] > 1)
710 [_source _displayPlaceholder:_CPTabViewSelectionBinderMultipleValues];
712 [_source _selectTabViewItemAtIndex:[aValue firstIndex]];
718 [_source _deselectAll];
719 [_source _displayPlaceholder:_CPTabViewSelectionBinderNoSelection];
722 [_source _selectTabViewItemAtIndex:aValue];
726 - (id)valueForBinding:(
CPString)aBinding
731 idx = [_source indexOfTabViewItem:[_source selectedTabViewItem]];
734 [result addIndex:idx];
739 return [_source indexOfTabViewItem:[_source selectedTabViewItem]];
754 if (
self = [super initWithCoder:aCoder])
758 _font = [aCoder decodeObjectForKey:CPTabViewFontKey];
759 [_tabs setFont:_font];
761 var
items = [aCoder decodeObjectForKey:CPTabViewItemsKey] || [CPArray array];
764 [
self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
766 _selectedTabViewItem = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey];
768 _type = [aCoder decodeIntForKey:CPTabViewTypeKey];
776 [
super awakeFromCib];
781 if (_selectedTabViewItem)
789 _selectedTabViewItem = nil;
808 [_box removeFromSuperview];
812 [aCoder encodeObject:_items forKey:CPTabViewItemsKey];
814 [aCoder encodeConditionalObject:_selectedTabViewItem forKey:CPTabViewSelectedItemKey];
816 [aCoder encodeInt:_type forKey:CPTabViewTypeKey];
817 [aCoder encodeObject:_font forKey:CPTabViewFontKey];
819 [aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey];
824 @implementation _CPTabViewBox :
CPBox 831 #pragma mark Override 833 - (
CPView)hitTest:(CGPoint)aPoint
837 var segmentIndex = [_tabView._tabs testSegment:[_tabView._tabs convertPoint:aPoint fromView:[
self superview]]];
var CPTabViewWillSelectTabViewItemSelector
void addSubview:(CPView aSubview)
A CALayer is similar to a CPView
int indexOfTabViewItem:(CPTabViewItem aTabViewItem)
void setBackgroundColor:(CPColor aColor)
CPFont boldFontWithName:size:italic:(CPString aName, [size] float aSize, [italic] BOOL italic)
CGPoint locationInWindow()
A collection of unique integers.
CPView hitTest:(CGPoint aPoint)
A mutable key-value pair collection.
CPTabViewType CPTopTabsBezelBorder
An immutable string (collection of characters).
CPColor colorWithCalibratedWhite:alpha:(float white, [alpha] float alpha)
CPTabViewItem selectedTabViewItem()
void encodeWithCoder:(CPCoder aCoder)
var CPTabViewDidChangeNumberOfTabViewItemsSelector
void setSubviews:(CPArray newSubviews)
void setTabViewType:(CPTabViewType aTabViewType)
Defines methods for use when archiving & restoring (enc/decoding).
var CPTabViewSelectedItemKey
BOOL selectTabViewItemAtIndex:(CPUInteger anIndex)
CPTabViewType tabViewType()
void tileWithChangedItem:(CPTabViewItem aTabViewItem)
var CPTabViewDidSelectTabViewItemSelector
CPBinder binderForBinding:(CPString aBinding)
void setDelegate:(id< CPTabViewDelegate > aDelegate)
CPColor backgroundColor()
id indexSetWithIndexesInRange:(CPRange aRange)
CPTabViewItem tabViewItemAtIndex:(CPUInteger anIndex)
id indexSetWithIndex:(int anIndex)
void insertTabViewItem:atIndex:(CPTabViewItem aTabViewItem, [atIndex] CPUInteger anIndex)
CPSelectionIndexesBinding
var CPTabViewShouldSelectTabViewItemSelector
unsigned numberOfTabViewItems()