00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import <Foundation/CPArray.j>
00024
00025 @import "CPControl.j"
00026
00027 #include "CoreGraphics/CGGeometry.h"
00028
00029
00030
00031
00032
00033 CPSegmentSwitchTrackingSelectOne = 0;
00034
00035
00036
00037
00038 CPSegmentSwitchTrackingSelectAny = 1;
00039
00040
00041
00042
00043 CPSegmentSwitchTrackingMomentary = 2;
00044
00051 @implementation CPSegmentedControl : CPControl
00052 {
00053 CPArray _segments;
00054 CPArray _themeStates;
00055
00056 int _selectedSegment;
00057 int _segmentStyle;
00058 CPSegmentSwitchTracking _trackingMode;
00059
00060 unsigned _trackingSegment;
00061 BOOL _trackingHighlighted;
00062 }
00063
00064 + (CPString)themeClass
00065 {
00066 return "segmented-control";
00067 }
00068
00069 + (id)themeAttributes
00070 {
00071 return [CPDictionary dictionaryWithObjects:[CPCenterTextAlignment, CPCenterVerticalTextAlignment, CPImageLeft, CPScaleNone, _CGInsetMakeZero(), _CGInsetMakeZero(), nil, nil, nil, nil, 1.0, 24.0]
00072 forKeys:[@"alignment", @"vertical-alignment", @"image-position", @"image-scaling", @"bezel-inset", @"content-inset", @"left-segment-bezel-color", @"right-segment-bezel-color", @"center-segment-bezel-color", @"divider-bezel-color", @"divider-thickness", @"default-height"]];
00073 }
00074
00075 - (id)initWithFrame:(CGRect)aRect
00076 {
00077 _segments = [];
00078 _themeStates = [];
00079
00080 self = [super initWithFrame:aRect];
00081
00082 if (self)
00083 {
00084 _selectedSegment = -1;
00085
00086 _trackingMode = CPSegmentSwitchTrackingSelectOne;
00087 }
00088
00089 return self;
00090 }
00091
00095 - (int)selectedTag
00096 {
00097 return _segments[_selectedSegment].tag;
00098 }
00099
00100
00105 - (void)setSegmentCount:(unsigned)aCount
00106 {
00107 if (_segments.length == aCount)
00108 return;
00109
00110 var height = CGRectGetHeight([self bounds]);
00111
00112 if (_segments.length < aCount)
00113 {
00114 for (var index = _segments.length; index < aCount; ++index)
00115 {
00116 _segments[index] = [[_CPSegmentItem alloc] init];
00117 _themeStates[index] = CPThemeStateNormal;
00118 }
00119 }
00120 else if (aCount < _segments.length)
00121 {
00122 for (var index = aCount; index < _segments.length; ++index)
00123 _segments[index] = nil;
00124 }
00125
00126 if (_selectedSegment < _segments.length)
00127 _selectedSegment = -1;
00128
00129 [self tileWithChangedSegment:0];
00130 }
00131
00135 - (unsigned)segmentCount
00136 {
00137 return _segments.length;
00138 }
00139
00140
00146 - (void)setSelectedSegment:(unsigned)aSegment
00147 {
00148
00149 [self setSelected:YES forSegment:aSegment];
00150 }
00151
00155 - (unsigned)selectedSegment
00156 {
00157 return _selectedSegment;
00158 }
00159
00163 - (BOOL)selectSegmentWithTag:(int)aTag
00164 {
00165 var index = 0;
00166
00167 for (; index < _segments.length; ++index)
00168 if (_segments[index].tag == aTag)
00169 {
00170 [self setSelectedSegment:index];
00171
00172 return YES;
00173 }
00174
00175 return NO;
00176 }
00177
00178
00179
00180 - (BOOL)isTracking
00181 {
00182
00183 }
00184
00185 - (void)setTrackingMode:(CPSegmentSwitchTracking)aTrackingMode
00186 {
00187 if (_trackingMode == aTrackingMode)
00188 return;
00189
00190 _trackingMode = aTrackingMode;
00191
00192 if (_trackingMode == CPSegmentSwitchTrackingSelectOne)
00193 {
00194 var index = 0,
00195 selected = NO;
00196
00197 for (; index < _segments.length; ++index)
00198 if (_segments[index].selected)
00199 if (selected)
00200 [self setSelected:NO forSegment:index];
00201 else
00202 selected = YES;
00203 }
00204
00205 else if (_trackingMode == CPSegmentSwitchTrackingMomentary)
00206 {
00207 var index = 0;
00208
00209 for (; index < _segments.length; ++index)
00210 if (_segments[index].selected)
00211 [self setSelected:NO forSegment:index];
00212 }
00213 }
00214
00218 - (CPSegmentSwitchTracking)trackingMode
00219 {
00220 return _trackingMode;
00221 }
00222
00223
00230 - (void)setWidth:(float)aWidth forSegment:(unsigned)aSegment
00231 {
00232 _segments[aSegment].width = aWidth;
00233
00234 [self tileWithChangedSegment:aSegment];
00235 }
00236
00242 - (float)widthForSegment:(unsigned)aSegment
00243 {
00244 return _segments[aSegment].width;
00245 }
00246
00253 - (void)setImage:(CPImage)anImage forSegment:(unsigned)aSegment
00254 {
00255 var segment = _segments[aSegment];
00256
00257 segment.image = anImage;
00258
00259 [self tileWithChangedSegment:aSegment];
00260 }
00261
00267 - (CPImage)imageForSegment:(unsigned)aSegment
00268 {
00269 return _segments[aSegment].image;
00270 }
00271
00278 - (void)setLabel:(CPString)aLabel forSegment:(unsigned)aSegment
00279 {
00280 var segment = _segments[aSegment];
00281
00282 _segments[aSegment].label = aLabel;
00283
00284 [self tileWithChangedSegment:aSegment];
00285 }
00286
00292 - (CPString)labelForSegment:(unsigned)aSegment
00293 {
00294 return _segments[aSegment].label;
00295 }
00296
00303 - (void)setMenu:(CPMenu)aMenu forSegment:(unsigned)aSegment
00304 {
00305 _segments[aSegment].menu = aMenu;
00306 }
00307
00313 - (CPMenu)menuForSegment:(unsigned)aSegment
00314 {
00315 return _segments[aSegment].menu;
00316 }
00317
00325 - (void)setSelected:(BOOL)isSelected forSegment:(unsigned)aSegment
00326 {
00327 var segment = _segments[aSegment];
00328
00329
00330 if (segment.selected == isSelected)
00331 return;
00332
00333 segment.selected = isSelected;
00334
00335 _themeStates[aSegment] = isSelected ? CPThemeStateSelected : CPThemeStateNormal;
00336
00337
00338 if (isSelected)
00339 {
00340 var oldSelectedSegment = _selectedSegment;
00341
00342 _selectedSegment = aSegment;
00343
00344 if (_trackingMode == CPSegmentSwitchTrackingSelectOne && oldSelectedSegment != aSegment && oldSelectedSegment != -1)
00345 {
00346 _segments[oldSelectedSegment].selected = NO;
00347 _themeStates[oldSelectedSegment] = CPThemeStateNormal;
00348
00349 [self drawSegmentBezel:oldSelectedSegment highlight:NO];
00350 }
00351 }
00352
00353 if (_trackingMode != CPSegmentSwitchTrackingMomentary)
00354 [self drawSegmentBezel:aSegment highlight:NO];
00355
00356 [self setNeedsLayout];
00357 [self setNeedsDisplay:YES];
00358 }
00359
00365 - (BOOL)isSelectedForSegment:(unsigned)aSegment
00366 {
00367 return _segments[aSegment].selected;
00368 }
00369
00376 - (void)setEnabled:(BOOL)isEnabled forSegment:(unsigned)aSegment
00377 {
00378 _segments[aSegment].enabled = isEnabled;
00379
00380 [self setNeedsLayout];
00381 [self setNeedsDisplay:YES];
00382 }
00383
00389 - (BOOL)isEnabledForSegment:(unsigned)aSegment
00390 {
00391 return _segments[aSegment].enabled;
00392 }
00393
00399 - (void)setTag:(int)aTag forSegment:(unsigned)aSegment
00400 {
00401 _segments[aSegment].tag = aTag;
00402 }
00403
00408 - (int)tagForSegment:(unsigned)aSegment
00409 {
00410 return _segments[aSegment].tag;
00411 }
00412
00413
00419 - (void)drawSegmentBezel:(int)aSegment highlight:(BOOL)shouldHighlight
00420 {
00421 if (shouldHighlight)
00422 _themeStates[aSegment] |= CPThemeStateHighlighted;
00423 else
00424 _themeStates[aSegment] &= ~CPThemeStateHighlighted;
00425
00426 [self setNeedsLayout];
00427 [self setNeedsDisplay:YES];
00428 }
00429
00430 - (float)_leftOffsetForSegment:(unsigned)segment
00431 {
00432 var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"];
00433
00434 if (segment == 0)
00435 return bezelInset.left;
00436
00437 var thickness = [self currentValueForThemeAttribute:@"divider-thickness"];
00438
00439 return [self _leftOffsetForSegment:segment - 1] + [self widthForSegment:segment - 1] + thickness;
00440 }
00441
00442 - (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
00443 {
00444 var height = [self currentValueForThemeAttribute:@"default-height"],
00445 contentInset = [self currentValueForThemeAttribute:@"content-inset"],
00446 bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"],
00447 bounds = [self bounds];
00448
00449 if (aName === "left-segment-bezel")
00450 {
00451 return CGRectMake(bezelInset.left, bezelInset.top, contentInset.left, height);
00452 }
00453 else if (aName === "right-segment-bezel")
00454 {
00455 return CGRectMake(CGRectGetMaxX(bounds) - contentInset.right - bezelInset.right, bezelInset.top, contentInset.right, height);
00456 }
00457 else if (aName.substring(0, "segment-bezel".length) == "segment-bezel")
00458 {
00459 var segment = parseInt(aName.substring("segment-bezel-".length), 10),
00460 frame = CGRectCreateCopy(_segments[segment].frame);
00461
00462 if (segment == 0)
00463 {
00464 frame.origin.x += contentInset.left;
00465 frame.size.width -= contentInset.left;
00466 }
00467
00468 if (segment == _segments.length - 1)
00469 frame.size.width -= contentInset.right;
00470
00471 return frame;
00472 }
00473 else if (aName.substring(0, "divider-bezel".length) == "divider-bezel")
00474 {
00475 var segment = parseInt(aName.substring("divider-bezel-".length), 10),
00476 width = [self widthForSegment:segment],
00477 left = [self _leftOffsetForSegment:segment],
00478 thickness = [self currentValueForThemeAttribute:@"divider-thickness"];
00479
00480 return CGRectMake(left + width, bezelInset.top, thickness, height);
00481 }
00482 else if (aName.substring(0, "segment-content".length) == "segment-content")
00483 {
00484 var segment = parseInt(aName.substring("segment-content-".length), 10);
00485
00486 return [self contentFrameForSegment:segment];
00487 }
00488
00489 return [super rectForEphemeralSubviewNamed:aName];
00490 }
00491
00492 - (CPView)createEphemeralSubviewNamed:(CPString)aName
00493 {
00494 if (aName.substring(0, "segment-content".length) == "segment-content")
00495 return [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()];
00496
00497 return [[CPView alloc] initWithFrame:_CGRectMakeZero()];
00498 }
00499
00500 - (void)layoutSubviews
00501 {
00502 var leftCapColor = [self valueForThemeAttribute:@"left-segment-bezel-color"
00503 inState:_themeStates[0]];
00504
00505 var leftBezelView = [self layoutEphemeralSubviewNamed:@"left-segment-bezel"
00506 positioned:CPWindowBelow
00507 relativeToEphemeralSubviewNamed:nil];
00508
00509 [leftBezelView setBackgroundColor:leftCapColor];
00510
00511 var rightCapColor = [self valueForThemeAttribute:@"right-segment-bezel-color"
00512 inState:_themeStates[_themeStates.length - 1]];
00513
00514 var rightBezelView = [self layoutEphemeralSubviewNamed:@"right-segment-bezel"
00515 positioned:CPWindowBelow
00516 relativeToEphemeralSubviewNamed:nil];
00517
00518 [rightBezelView setBackgroundColor:rightCapColor];
00519
00520 for (var i=0, count = _themeStates.length; i<count; i++)
00521 {
00522 var themeState = _themeStates[i];
00523
00524 themeState |= _themeState & CPThemeStateDisabled;
00525
00526 var bezelColor = [self valueForThemeAttribute:@"center-segment-bezel-color"
00527 inState:themeState];
00528
00529 var bezelView = [self layoutEphemeralSubviewNamed:"segment-bezel-"+i
00530 positioned:CPWindowBelow
00531 relativeToEphemeralSubviewNamed:nil];
00532
00533 [bezelView setBackgroundColor:bezelColor];
00534
00535
00536
00537 var segment = _segments[i];
00538
00539
00540 var contentView = [self layoutEphemeralSubviewNamed:@"segment-content-"+i
00541 positioned:CPWindowAbove
00542 relativeToEphemeralSubviewNamed:@"segment-bezel-"+i];
00543
00544 [contentView setText:segment.label];
00545 [contentView setImage:segment.image];
00546
00547 [contentView setFont:[self valueForThemeAttribute:@"font" inState:themeState]];
00548 [contentView setTextColor:[self valueForThemeAttribute:@"text-color" inState:themeState]];
00549 [contentView setAlignment:[self valueForThemeAttribute:@"alignment" inState:themeState]];
00550 [contentView setVerticalAlignment:[self valueForThemeAttribute:@"vertical-alignment" inState:themeState]];
00551 [contentView setLineBreakMode:[self valueForThemeAttribute:@"line-break-mode" inState:themeState]];
00552 [contentView setTextShadowColor:[self valueForThemeAttribute:@"text-shadow-color" inState:themeState]];
00553 [contentView setTextShadowOffset:[self valueForThemeAttribute:@"text-shadow-offset" inState:themeState]];
00554 [contentView setImageScaling:[self valueForThemeAttribute:@"image-scaling" inState:themeState]];
00555
00556 if (segment.image && segment.label)
00557 [contentView setImagePosition:[self valueForThemeAttribute:@"image-position" inState:themeState]];
00558 else if (segment.image)
00559 [contentView setImagePosition:CPImageOnly];
00560
00561 if (i == count - 1)
00562 continue;
00563
00564 var borderState = _themeStates[i] | _themeStates[i+1];
00565
00566 borderState = (borderState & CPThemeStateSelected & ~CPThemeStateHighlighted) ? CPThemeStateSelected : CPThemeStateNormal;
00567
00568 borderState |= _themeState & CPThemeStateDisabled;
00569
00570 var borderColor = [self valueForThemeAttribute:@"divider-bezel-color"
00571 inState:borderState];
00572
00573 var borderView = [self layoutEphemeralSubviewNamed:"divider-bezel-"+i
00574 positioned:CPWindowBelow
00575 relativeToEphemeralSubviewNamed:nil];
00576
00577 [borderView setBackgroundColor:borderColor];
00578 }
00579 }
00580
00581
00587 - (void)drawSegment:(int)aSegment highlight:(BOOL)shouldHighlight
00588 {
00589 }
00590
00591 - (void)tileWithChangedSegment:(unsigned)aSegment
00592 {
00593 if (aSegment >= _segments.length)
00594 return;
00595
00596 var segment = _segments[aSegment],
00597 segmentWidth = segment.width,
00598 themeState = _themeStates[aSegment] | (_themeState & CPThemeStateDisabled),
00599 contentInset = [self valueForThemeAttribute:@"content-inset" inState:themeState],
00600 font = [self valueForThemeAttribute:@"font" inState:themeState];
00601
00602 if (!segmentWidth)
00603 {
00604 if (segment.image && segment.label)
00605 segmentWidth = [segment.label sizeWithFont:font].width + [segment.image size].width + contentInset.left + contentInset.right;
00606 else if (segment.image)
00607 segmentWidth = [segment.image size].width + contentInset.left + contentInset.right;
00608 else if (segment.label)
00609 segmentWidth = [segment.label sizeWithFont:font].width + contentInset.left + contentInset.right;
00610 else
00611 segmentWidth = 0.0;
00612 }
00613
00614 var delta = segmentWidth - CGRectGetWidth(segment.frame);
00615
00616 if (!delta)
00617 return;
00618
00619
00620 var frame = [self frame];
00621
00622 [self setFrameSize:CGSizeMake(CGRectGetWidth(frame) + delta, CGRectGetHeight(frame))];
00623
00624
00625 segment.width = segmentWidth;
00626 segment.frame = [self frameForSegment:aSegment];;
00627
00628
00629 var index = aSegment + 1;
00630
00631 for (; index < _segments.length; ++index)
00632 {
00633 _segments[index].frame.origin.x += delta;
00634
00635 [self drawSegmentBezel:index highlight:NO];
00636 [self drawSegment:index highlight:NO];
00637 }
00638
00639 [self drawSegmentBezel:aSegment highlight:NO];
00640 [self drawSegment:aSegment highlight:NO];
00641
00642 [self setNeedsLayout];
00643 [self setNeedsDisplay:YES];
00644 }
00645
00650 - (CGRect)frameForSegment:(unsigned)aSegment
00651 {
00652 return [self bezelFrameForSegment:aSegment];
00653 }
00654
00655 - (CGRect)bezelFrameForSegment:(unsigned)aSegment
00656 {
00657 var height = [self currentValueForThemeAttribute:@"default-height"],
00658 bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"],
00659 width = [self widthForSegment:aSegment],
00660 left = [self _leftOffsetForSegment:aSegment];
00661
00662 return CGRectMake(left, bezelInset.top, width, height);
00663 }
00664
00665 - (CGRect)contentFrameForSegment:(unsigned)aSegment
00666 {
00667 var height = [self currentValueForThemeAttribute:@"default-height"],
00668 contentInset = [self currentValueForThemeAttribute:@"content-inset"],
00669 width = [self widthForSegment:aSegment],
00670 left = [self _leftOffsetForSegment:aSegment];
00671
00672 return CGRectMake(left + contentInset.left, contentInset.top, width - contentInset.left - contentInset.right, height - contentInset.top - contentInset.bottom);
00673 }
00674
00680 - (unsigned)testSegment:(CGPoint)aPoint
00681 {
00682 var location = [self convertPoint:aPoint fromView:nil],
00683 count = _segments.length;
00684
00685 while (count--)
00686 if (CGRectContainsPoint(_segments[count].frame, aPoint))
00687 return count;
00688
00689 return -1;
00690 }
00691
00692 - (void)mouseDown:(CPEvent)anEvent
00693 {
00694 if (![self isEnabled])
00695 return;
00696
00697 [self trackSegment:anEvent];
00698 }
00699
00700
00701 - (void)mouseUp:(CPEvent)anEvent
00702 {
00703 }
00704
00709 - (void)trackSegment:(CPEvent)anEvent
00710 {
00711 var type = [anEvent type],
00712 location = [self convertPoint:[anEvent locationInWindow] fromView:nil];
00713
00714 if (type == CPLeftMouseUp)
00715 {
00716 if (_trackingSegment == -1)
00717 return;
00718
00719 if (CGRectContainsPoint(_segments[_trackingSegment].frame, location))
00720 {
00721 if (_trackingMode == CPSegmentSwitchTrackingSelectAny)
00722 {
00723 [self setSelected:![self isSelectedForSegment:_trackingSegment] forSegment:_trackingSegment];
00724
00725
00726 _selectedSegment = _trackingSegment;
00727 }
00728 else
00729 [self setSelected:YES forSegment:_trackingSegment];
00730
00731 [self sendAction:[self action] to:[self target]];
00732
00733 if (_trackingMode == CPSegmentSwitchTrackingMomentary)
00734 {
00735 [self setSelected:NO forSegment:_trackingSegment];
00736
00737 _selectedSegment = -1;
00738 }
00739 }
00740
00741 [self drawSegmentBezel:_trackingSegment highlight:NO];
00742
00743 _trackingSegment = -1;
00744
00745 return;
00746 }
00747
00748 if (type == CPLeftMouseDown)
00749 {
00750 _trackingHighlighted = YES;
00751 _trackingSegment = [self testSegment:location];
00752
00753 [self drawSegmentBezel:_trackingSegment highlight:YES];
00754 }
00755
00756 else if (type == CPLeftMouseDragged)
00757 {
00758 if (_trackingSegment == -1)
00759 return;
00760
00761 var highlighted = CGRectContainsPoint(_segments[_trackingSegment].frame, location);
00762
00763 if (highlighted != _trackingHighlighted)
00764 {
00765 _trackingHighlighted = highlighted;
00766
00767 [self drawSegmentBezel:_trackingSegment highlight:_trackingHighlighted];
00768 }
00769 }
00770
00771 [CPApp setTarget:self selector:@selector(trackSegment:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
00772 }
00773
00774 - (void)setFont:(CPFont)aFont
00775 {
00776 [super setFont:aFont];
00777
00778 [self tileWithChangedSegment:0];
00779 }
00780
00781 @end
00782
00783 var CPSegmentedControlSegmentsKey = "CPSegmentedControlSegmentsKey",
00784 CPSegmentedControlSelectedKey = "CPSegmentedControlSelectedKey",
00785 CPSegmentedControlSegmentStyleKey = "CPSegmentedControlSegmentStyleKey",
00786 CPSegmentedControlTrackingModeKey = "CPSegmentedControlTrackingModeKey";
00787
00788 @implementation CPSegmentedControl (CPCoding)
00789
00790 - (id)initWithCoder:(CPCoder)aCoder
00791 {
00792 self = [super initWithCoder:aCoder];
00793
00794 if (self)
00795 {
00796 var frame = [self frame],
00797 originalWidth = frame.size.width;
00798
00799 frame.size.width = 0;
00800
00801 [self setFrame:frame];
00802
00803 _segments = [aCoder decodeObjectForKey:CPSegmentedControlSegmentsKey];
00804 _segmentStyle = [aCoder decodeIntForKey:CPSegmentedControlSegmentStyleKey];
00805 _themeStates = [];
00806
00807 if ([aCoder containsValueForKey:CPSegmentedControlSelectedKey])
00808 _selectedSegment = [aCoder decodeIntForKey:CPSegmentedControlSelectedKey];
00809 else
00810 _selectedSegment = -1;
00811
00812 if ([aCoder containsValueForKey:CPSegmentedControlTrackingModeKey])
00813 _trackingMode = [aCoder decodeIntForKey:CPSegmentedControlTrackingModeKey];
00814 else
00815 _trackingMode = CPSegmentSwitchTrackingSelectOne;
00816
00817
00818
00819 for (var i = 0; i < _segments.length; i++)
00820 {
00821 _themeStates[i] = _segments[i].selected ? CPThemeStateSelected : CPThemeStateNormal;
00822 [self tileWithChangedSegment:i];
00823 }
00824
00825 var difference = MAX(originalWidth - [self frame].size.width, 0.0),
00826 remainingWidth = FLOOR(difference / _segments.length);
00827
00828 for (var i=0; i < _segments.length; i++)
00829 [self setWidth:_segments[i].width + remainingWidth forSegment:i];
00830
00831 [self tileWithChangedSegment:0];
00832 }
00833
00834 return self;
00835 }
00836
00837 - (void)encodeWithCoder:(CPCoder)aCoder
00838 {
00839 [super encodeWithCoder:aCoder];
00840
00841 [aCoder encodeObject:_segments forKey:CPSegmentedControlSegmentsKey];
00842 [aCoder encodeInt:_selectedSegment forKey:CPSegmentedControlSelectedKey];
00843 [aCoder encodeInt:_segmentStyle forKey:CPSegmentedControlSegmentStyleKey];
00844 [aCoder encodeInt:_trackingMode forKey:CPSegmentedControlTrackingModeKey];
00845 }
00846
00847 @end
00848
00849
00850 @implementation _CPSegmentItem : CPObject
00851 {
00852 CPImage image;
00853 CPString label;
00854 CPMenu menu;
00855 BOOL selected;
00856 BOOL enabled;
00857 int tag;
00858 int width;
00859
00860 CGRect frame;
00861 }
00862
00863 - (id)init
00864 {
00865 if (self = [super init])
00866 {
00867 image = nil;
00868 label = @"";
00869 menu = nil;
00870 selected = NO;
00871 enabled = NO;
00872 tag = 0;
00873 width = 0;
00874
00875 frame = CGRectMakeZero();
00876 }
00877 return self;
00878 }
00879
00880 @end
00881
00882 var CPSegmentItemImageKey = "CPSegmentItemImageKey",
00883 CPSegmentItemLabelKey = "CPSegmentItemLabelKey",
00884 CPSegmentItemMenuKey = "CPSegmentItemMenuKey",
00885 CPSegmentItemSelectedKey = "CPSegmentItemSelectedKey",
00886 CPSegmentItemEnabledKey = "CPSegmentItemEnabledKey",
00887 CPSegmentItemTagKey = "CPSegmentItemTagKey",
00888 CPSegmentItemWidthKey = "CPSegmentItemWidthKey";
00889
00890 @implementation _CPSegmentItem (CPCoding)
00891
00892 - (id)initWithCoder:(CPCoder)aCoder
00893 {
00894 self = [super init];
00895
00896 if (self)
00897 {
00898 image = [aCoder decodeObjectForKey:CPSegmentItemImageKey];
00899 label = [aCoder decodeObjectForKey:CPSegmentItemLabelKey];
00900 menu = [aCoder decodeObjectForKey:CPSegmentItemMenuKey];
00901 selected = [aCoder decodeBoolForKey:CPSegmentItemSelectedKey];
00902 enabled = [aCoder decodeBoolForKey:CPSegmentItemEnabledKey];
00903 tag = [aCoder decodeIntForKey:CPSegmentItemTagKey];
00904 width = [aCoder decodeFloatForKey:CPSegmentItemWidthKey];
00905
00906 frame = CGRectMakeZero();
00907 }
00908
00909 return self;
00910 }
00911
00912 - (void)encodeWithCoder:(CPCoder)aCoder
00913 {
00914 [aCoder encodeObject:image forKey:CPSegmentItemImageKey];
00915 [aCoder encodeObject:label forKey:CPSegmentItemLabelKey];
00916 [aCoder encodeObject:menu forKey:CPSegmentItemMenuKey];
00917 [aCoder encodeBool:selected forKey:CPSegmentItemSelectedKey];
00918 [aCoder encodeBool:enabled forKey:CPSegmentItemEnabledKey];
00919 [aCoder encodeInt:tag forKey:CPSegmentItemTagKey];
00920 [aCoder encodeFloat:width forKey:CPSegmentItemWidthKey];
00921 }
00922
00923 @end
00924