23 #import "../Foundation/Ref.h"
95 BOOL _sendsActionOnEndEditing;
98 BOOL _continuousTracking;
99 BOOL _trackingWasWithinFrame;
100 unsigned _trackingMouseDownFlags;
101 CGPoint _previousTrackingLocation;
107 CPTopVerticalTextAlignment,
108 CPLineBreakByClipping,
116 _CGSizeMake(-1.0, -1.0)]
118 @"vertical-alignment",
122 @"text-shadow-color",
123 @"text-shadow-offset",
146 + (Class)_binderClassForBinding:(
CPString)theBinding
149 return [_CPValueBinder class];
151 return [
super _binderClassForBinding:theBinding];
157 - (void)_continuouslyReverseSetBinding
159 var binderClass = [[
self class] _binderClassForBinding:CPValueBinding],
160 theBinding = [binderClass getBinding:CPValueBinding forObject:self];
162 if ([theBinding continuouslyUpdatesValue])
163 [theBinding reverseSetValueFor:@"objectValue"];
166 - (void)_reverseSetBinding
168 var binderClass = [[
self class] _binderClassForBinding:CPValueBinding],
169 theBinding = [binderClass getBinding:CPValueBinding forObject:self];
171 [theBinding reverseSetValueFor:@"objectValue"];
174 - (id)initWithFrame:(CGRect)aFrame
181 _trackingMouseDownFlags = 0;
192 - (void)setAction:(
SEL)anAction
210 - (void)setTarget:(
id)aTarget
229 - (BOOL)sendAction:(
SEL)anAction to:(
id)anObject
231 [
self _reverseSetBinding];
233 return [CPApp sendAction:anAction to:anObject from:self];
236 - (int)sendActionOn:(
int)mask
238 var previousMask = _sendActionOn;
240 _sendActionOn = mask;
257 - (void)setContinuous:(BOOL)flag
269 - (BOOL)tracksMouseOutsideOfFrame
276 var type = [anEvent
type],
284 _trackingMouseDownFlags = 0;
302 if (!_trackingWasWithinFrame)
305 else if (_continuousTracking)
306 _continuousTracking = [
self continueTracking:_previousTrackingLocation
at:currentLocation];
312 [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
315 if ((_sendActionOn & (1 << type)) && isWithinFrame)
318 _trackingWasWithinFrame = isWithinFrame;
319 _previousTrackingLocation = currentLocation;
322 - (void)setState:(
int)state
336 - (void)performClick:(
id)sender
338 if (![
self isEnabled])
362 - (void)unhighlightButtonTimerDidFinish:(
id)sender
370 - (unsigned)mouseDownFlags
372 return _trackingMouseDownFlags;
375 - (BOOL)startTrackingAt:(CGPoint)aPoint
382 - (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint
387 - (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
397 if (![
self isEnabled])
405 if (![
self isEnabled])
433 - (void)setObjectValue:(
id)anObject
446 var floatValue = parseFloat(_value, 10);
447 return isNaN(floatValue) ? 0.0 : floatValue;
453 - (void)setFloatValue:(
float)aValue
461 - (double)doubleValue
463 var doubleValue = parseFloat(_value, 10);
464 return isNaN(doubleValue) ? 0.0 : doubleValue;
470 - (void)setDoubleValue:(
double)anObject
480 var intValue = parseInt(_value, 10);
481 return isNaN(intValue) ? 0.0 : intValue;
487 - (void)setIntValue:(
int)anObject
497 var intValue = parseInt(_value, 10);
498 return isNaN(intValue) ? 0.0 : intValue;
504 - (void)setIntegerValue:(
int)anObject
514 if (_formatter && _value !== undefined)
516 var formattedValue = [
self hasThemeState:CPThemeStateEditing] ? [_formatter editingStringForObjectValue:_value] : [_formatter stringForObjectValue:_value];
518 if (formattedValue !== nil && formattedValue !== undefined)
519 return formattedValue;
522 return (_value === undefined || _value === nil) ?
"" : String(_value);
531 if (aString === nil || aString === undefined)
533 CPLog.warn(
"nil or undefined sent to CPControl -setStringValue");
543 if ([_formatter getObjectValue:AT_REF(value) forString:aString errorDescription:nil] === NO)
546 if (!aString || [_formatter getObjectValue:AT_REF(value) forString:
@"" errorDescription:nil] === NO)
556 - (void)takeDoubleValueFrom:(
id)sender
558 if ([sender respondsToSelector:
@selector(doubleValue)])
563 - (void)takeFloatValueFrom:(
id)sender
565 if ([sender respondsToSelector:
@selector(floatValue)])
569 - (void)takeIntegerValueFrom:(
id)sender
571 if ([sender respondsToSelector:
@selector(integerValue)])
575 - (void)takeIntValueFrom:(
id)sender
577 if ([sender respondsToSelector:
@selector(intValue)])
581 - (void)takeObjectValueFrom:(
id)sender
583 if ([sender respondsToSelector:
@selector(objectValue)])
587 - (void)takeStringValueFrom:(
id)sender
589 if ([sender respondsToSelector:
@selector(stringValue)])
596 if ([note
object] !=
self)
605 if ([note
object] !=
self)
614 if ([note
object] !=
self)
617 [
self _reverseSetBinding];
633 - (void)setAlignment:(CPTextAlignment)alignment
641 - (CPTextAlignment)alignment
655 - (void)setVerticalAlignment:(CPTextVerticalAlignment)alignment
663 - (CPTextVerticalAlignment)verticalAlignment
680 - (void)setLineBreakMode:(CPLineBreakMode)mode
688 - (CPLineBreakMode)lineBreakMode
732 - (void)setTextShadowOffset:(CGSize)offset
740 - (CGSize)textShadowOffset
774 - (void)setImagePosition:(CPCellImagePosition)position
782 - (CPCellImagePosition)imagePosition
797 - (void)setImageScaling:(CPImageScaling)scaling
805 - (CPImageScaling)imageScaling
816 - (void)setEnabled:(BOOL)isEnabled
837 - (void)highlight:(BOOL)shouldHighlight
847 - (void)setHighlighted:(BOOL)isHighlighted
858 - (BOOL)isHighlighted
874 __Deprecated__CPImageViewImageKey =
@"CPImageViewImageKey";
890 [
self setObjectValue:[aCoder decodeObjectForKey:CPControlValueKey]];
892 [
self setTarget:[aCoder decodeObjectForKey:CPControlTargetKey]];
893 [
self setAction:[aCoder decodeObjectForKey:CPControlActionKey]];
895 [
self sendActionOn:[aCoder decodeIntForKey:CPControlSendActionOnKey]];
898 [
self setFormatter:[aCoder decodeObjectForKey:CPControlFormatterKey]];
913 if (_sendsActionOnEndEditing)
914 [aCoder encodeBool:_sendsActionOnEndEditing forKey:CPControlSendsActionOnEndEditingKey];
918 if (objectValue !== nil)
919 [aCoder encodeObject:objectValue forKey:CPControlValueKey];
922 [aCoder encodeConditionalObject:_target forKey:CPControlTargetKey];
925 [aCoder encodeObject:_action forKey:CPControlActionKey];
927 [aCoder encodeInt:_sendActionOn forKey:CPControlSendActionOnKey];
929 if (_formatter !== nil)
930 [aCoder encodeObject:_formatter forKey:CPControlFormatterKey];
935 var _CPControlSizeIdentifiers = [],
936 _CPControlCachedColorWithPatternImages = {},
937 _CPControlCachedThreePartImagePattern = {};
939 _CPControlSizeIdentifiers[CPRegularControlSize] =
"Regular";
940 _CPControlSizeIdentifiers[CPSmallControlSize] =
"Small";
941 _CPControlSizeIdentifiers[CPMiniControlSize] =
"Mini";
943 function _CPControlIdentifierForControlSize(aControlSize)
945 return _CPControlSizeIdentifiers[aControlSize];
948 function _CPControlColorWithPatternImage(sizes, aClassName)
951 count = arguments.length,
954 for (; index < count; ++index)
955 identifier += arguments[index];
957 var color = _CPControlCachedColorWithPatternImages[identifier];
965 _CPControlCachedColorWithPatternImages[identifier] = color;
971 function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
974 count = arguments.length,
977 for (; index < count; ++index)
978 identifier += arguments[index];
980 var color = _CPControlCachedThreePartImagePattern[identifier];
985 path = aClassName + "/" + identifier;
987 sizes = sizes[identifier];
995 _CPControlCachedThreePartImagePattern[identifier] = color;
1016 _formatter = aValue;
1022 - (BOOL)sendsActionOnEndEditing
1024 return _sendsActionOnEndEditing;
1030 - (void)setSendsActionOnEndEditing:(BOOL)aValue
1032 _sendsActionOnEndEditing = aValue;