96 BOOL _sendsActionOnEndEditing;
99 BOOL _continuousTracking;
100 BOOL _trackingWasWithinFrame;
101 unsigned _trackingMouseDownFlags;
102 CGPoint _previousTrackingLocation;
114 @"text-shadow-offset": CGSizeMakeZero(),
117 @"min-size": CGSizeMakeZero(),
118 @"max-size": CGSizeMake(-1.0, -1.0),
127 [
self exposeBinding:@"value"];
128 [
self exposeBinding:@"objectValue"];
129 [
self exposeBinding:@"stringValue"];
130 [
self exposeBinding:@"integerValue"];
131 [
self exposeBinding:@"intValue"];
132 [
self exposeBinding:@"doubleValue"];
133 [
self exposeBinding:@"floatValue"];
135 [
self exposeBinding:@"enabled"];
138 + (Class)_binderClassForBinding:(
CPString)aBinding
140 if (aBinding === CPValueBinding)
141 return [_CPValueBinder class];
142 else if ([aBinding hasPrefix:CPEnabledBinding])
145 return [
super _binderClassForBinding:aBinding];
151 - (void)_continuouslyReverseSetBinding
153 var binderClass = [[
self class] _binderClassForBinding:CPValueBinding],
154 theBinding = [binderClass getBinding:CPValueBinding forObject:self];
156 if ([theBinding continuouslyUpdatesValue])
157 [theBinding reverseSetValueFor:@"objectValue"];
160 - (void)_reverseSetBinding
162 var binderClass = [[
self class] _binderClassForBinding:CPValueBinding],
163 theBinding = [binderClass getBinding:CPValueBinding forObject:self];
165 [theBinding reverseSetValueFor:@"objectValue"];
168 - (id)initWithFrame:(CGRect)aFrame
170 self = [
super initWithFrame:aFrame];
175 _trackingMouseDownFlags = 0;
186 - (void)setAction:(
SEL)anAction
204 - (void)setTarget:(
id)aTarget
223 - (BOOL)sendAction:(
SEL)anAction to:(
id)anObject
225 [
self _reverseSetBinding];
227 var binding = [
CPBinder getBinding:CPTargetBinding forObject:self];
228 [binding invokeAction];
230 return [CPApp sendAction:anAction to:anObject from:self];
233 - (int)sendActionOn:(
int)mask
235 var previousMask = _sendActionOn;
237 _sendActionOn = mask;
254 - (void)setContinuous:(BOOL)flag
266 - (BOOL)tracksMouseOutsideOfFrame
273 var type = [anEvent type],
274 currentLocation = [
self convertPoint:[anEvent locationInWindow] fromView:nil],
281 _trackingMouseDownFlags = 0;
284 [
self setThemeState:CPThemeStateHovered];
288 [
self unsetThemeState:CPThemeStateHovered];
292 _trackingMouseDownFlags = [anEvent modifierFlags];
299 if (!_trackingWasWithinFrame)
302 else if (_continuousTracking)
303 _continuousTracking = [
self continueTracking:_previousTrackingLocation
at:currentLocation];
309 [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
312 if ((_sendActionOn & (1 << type)) && isWithinFrame)
315 _trackingWasWithinFrame = isWithinFrame;
316 _previousTrackingLocation = currentLocation;
319 - (void)setState:(CPInteger)state
323 - (CPInteger)nextState
333 - (void)performClick:(
id)sender
335 if (![
self isEnabled])
359 - (void)unhighlightButtonTimerDidFinish:(
id)sender
367 - (unsigned)mouseDownFlags
369 return _trackingMouseDownFlags;
372 - (BOOL)startTrackingAt:(CGPoint)aPoint
379 - (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint
384 - (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
402 if (![
self isEnabled])
410 if (![
self isEnabled])
413 [
self setThemeState:CPThemeStateHovered];
418 var currentLocation = [
self convertPoint:[anEvent locationInWindow] fromView:nil],
424 [
self unsetThemeState:CPThemeStateHovered];
438 - (void)setObjectValue:(
id)anObject
442 [
self setNeedsLayout];
443 [
self setNeedsDisplay:YES];
451 var floatValue = parseFloat(_value, 10);
452 return isNaN(floatValue) ? 0.0 : floatValue;
458 - (void)setFloatValue:(
float)aValue
466 - (double)doubleValue
468 var doubleValue = parseFloat(_value, 10);
469 return isNaN(doubleValue) ? 0.0 : doubleValue;
475 - (void)setDoubleValue:(
double)anObject
485 var intValue = parseInt(_value, 10);
486 return isNaN(intValue) ? 0.0 : intValue;
492 - (void)setIntValue:(
int)anObject
502 var intValue = parseInt(_value, 10);
503 return isNaN(intValue) ? 0.0 : intValue;
509 - (void)setIntegerValue:(
int)anObject
519 if (_formatter && _value !== undefined)
521 var formattedValue = [
self hasThemeState:CPThemeStateEditing] ? [_formatter editingStringForObjectValue:_value] : [_formatter stringForObjectValue:_value];
523 if (formattedValue !== nil && formattedValue !== undefined)
524 return formattedValue;
527 return (_value === undefined || _value === nil) ?
@"" : String(_value);
536 if (aString === nil || aString === undefined)
538 CPLog.warn(
"nil or undefined sent to CPControl -setStringValue");
548 if ([_formatter getObjectValue:@ref(value) forString:aString errorDescription:nil] === NO)
551 if (!aString || [_formatter getObjectValue:@ref(value) forString:
@"" errorDescription:nil] === NO)
561 - (void)takeDoubleValueFrom:(
id)sender
563 if ([sender respondsToSelector:
@selector(doubleValue)])
568 - (void)takeFloatValueFrom:(
id)sender
570 if ([sender respondsToSelector:
@selector(floatValue)])
574 - (void)takeIntegerValueFrom:(
id)sender
576 if ([sender respondsToSelector:
@selector(integerValue)])
580 - (void)takeIntValueFrom:(
id)sender
582 if ([sender respondsToSelector:
@selector(intValue)])
586 - (void)takeObjectValueFrom:(
id)sender
588 if ([sender respondsToSelector:
@selector(objectValue)])
592 - (void)takeStringValueFrom:(
id)sender
594 if ([sender respondsToSelector:
@selector(stringValue)])
601 if ([note
object] !=
self)
610 if ([note
object] !=
self)
619 if ([note
object] !=
self)
622 [
self _reverseSetBinding];
632 - (unsigned)_currentTextMovement
634 var currentEvent = [CPApp currentEvent],
635 keyCode = [currentEvent keyCode],
636 modifierFlags = [currentEvent modifierFlags];
640 case CPEscapeKeyCode:
643 case CPLeftArrowKeyCode:
646 case CPRightArrowKeyCode:
649 case CPUpArrowKeyCode:
652 case CPDownArrowKeyCode:
655 case CPReturnKeyCode:
680 - (void)setAlignment:(CPTextAlignment)alignment
682 [
self setValue:alignment forThemeAttribute:@"alignment"];
688 - (CPTextAlignment)alignment
690 return [
self valueForThemeAttribute:@"alignment"];
702 - (void)setVerticalAlignment:(CPTextVerticalAlignment)alignment
704 [
self setValue:alignment forThemeAttribute:@"vertical-alignment"];
710 - (CPTextVerticalAlignment)verticalAlignment
712 return [
self valueForThemeAttribute:@"vertical-alignment"];
727 - (void)setLineBreakMode:(CPLineBreakMode)mode
729 [
self setValue:mode forThemeAttribute:@"line-break-mode"];
735 - (CPLineBreakMode)lineBreakMode
737 return [
self valueForThemeAttribute:@"line-break-mode"];
747 [
self setValue:aColor forThemeAttribute:@"text-color"];
755 return [
self valueForThemeAttribute:@"text-color"];
763 [
self setValue:aColor forThemeAttribute:@"text-shadow-color"];
771 return [
self valueForThemeAttribute:@"text-shadow-color"];
779 - (void)setTextShadowOffset:(CGSize)offset
781 [
self setValue:offset forThemeAttribute:@"text-shadow-offset"];
787 - (CGSize)textShadowOffset
789 return [
self valueForThemeAttribute:@"text-shadow-offset"];
797 [
self setValue:aFont forThemeAttribute:@"font"];
805 return [
self valueForThemeAttribute:@"font"];
821 - (void)setImagePosition:(CPCellImagePosition)position
823 [
self setValue:position forThemeAttribute:@"image-position"];
829 - (CPCellImagePosition)imagePosition
831 return [
self valueForThemeAttribute:@"image-position"];
844 - (void)setImageScaling:(CPImageScaling)scaling
846 [
self setValue:scaling forThemeAttribute:@"image-scaling"];
852 - (CPUInteger)imageScaling
854 return [
self valueForThemeAttribute:@"image-scaling"];
863 - (void)setEnabled:(BOOL)isEnabled
866 [
self unsetThemeState:CPThemeStateDisabled];
868 [
self setThemeState:CPThemeStateDisabled];
876 return ![
self hasThemeState:CPThemeStateDisabled];
884 - (void)highlight:(BOOL)shouldHighlight
894 - (void)setHighlighted:(BOOL)isHighlighted
897 [
self setThemeState:CPThemeStateHighlighted];
899 [
self unsetThemeState:CPThemeStateHighlighted];
905 - (BOOL)isHighlighted
907 return [
self hasThemeState:CPThemeStateHighlighted];
921 __Deprecated__CPImageViewImageKey =
@"CPImageViewImageKey";
933 self = [
super initWithCoder:aCoder];
937 [
self setObjectValue:[aCoder decodeObjectForKey:CPControlValueKey]];
939 [
self setTarget:[aCoder decodeObjectForKey:CPControlTargetKey]];
940 [
self setAction:[aCoder decodeObjectForKey:CPControlActionKey]];
942 [
self sendActionOn:[aCoder decodeIntForKey:CPControlSendActionOnKey]];
945 [
self setFormatter:[aCoder decodeObjectForKey:CPControlFormatterKey]];
958 [
super encodeWithCoder:aCoder];
960 if (_sendsActionOnEndEditing)
961 [aCoder encodeBool:_sendsActionOnEndEditing forKey:CPControlSendsActionOnEndEditingKey];
965 if (objectValue !== nil)
966 [aCoder encodeObject:objectValue forKey:CPControlValueKey];
969 [aCoder encodeConditionalObject:_target forKey:CPControlTargetKey];
972 [aCoder encodeObject:_action forKey:CPControlActionKey];
974 [aCoder encodeInt:_sendActionOn forKey:CPControlSendActionOnKey];
976 if (_formatter !== nil)
977 [aCoder encodeObject:_formatter forKey:CPControlFormatterKey];
982 var _CPControlSizeIdentifiers = [],
983 _CPControlCachedColorWithPatternImages = {},
984 _CPControlCachedThreePartImagePattern = {};
986 _CPControlSizeIdentifiers[CPRegularControlSize] =
"Regular";
987 _CPControlSizeIdentifiers[CPSmallControlSize] =
"Small";
988 _CPControlSizeIdentifiers[CPMiniControlSize] =
"Mini";
990 function _CPControlIdentifierForControlSize(aControlSize)
992 return _CPControlSizeIdentifiers[aControlSize];
995 function _CPControlColorWithPatternImage(sizes, aClassName)
998 count = arguments.length,
1001 for (; index < count; ++index)
1002 identifier += arguments[index];
1004 var color = _CPControlCachedColorWithPatternImages[identifier];
1012 _CPControlCachedColorWithPatternImages[identifier] = color;
1018 function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
1021 count = arguments.length,
1024 for (; index < count; ++index)
1025 identifier += arguments[index];
1027 var color = _CPControlCachedThreePartImagePattern[identifier];
1032 path = aClassName + "/" + identifier;
1034 sizes = sizes[identifier];
1037 [[
CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "0.png"] size:sizes[0]],
1038 [[
CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "1.png"] size:sizes[1]],
1039 [[
CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "2.png"] size:sizes[2]]
1040 ] isVertical:isVertical]];
1042 _CPControlCachedThreePartImagePattern[identifier] = color;
1063 _formatter = aValue;
1069 - (BOOL)sendsActionOnEndEditing
1071 return _sendsActionOnEndEditing;
1077 - (void)setSendsActionOnEndEditing:(BOOL)aValue
1079 _sendsActionOnEndEditing = aValue;