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