52 BOOL _drawsBackground;
61 CPInteger _datePickerElements;
62 CPInteger _datePickerMode;
63 CPInteger _datePickerStyle;
64 CPInteger _timeInterval;
66 BOOL _invokedByUserEvent;
67 _CPDatePickerTextField _datePickerTextfield;
68 _CPDatePickerCalendar _datePickerCalendar;
69 unsigned _implementedCDatePickerDelegateMethods;
74 #pragma mark Theme methods 85 @"border-width" : 1.0,
87 @"content-inset": CGInsetMakeZero(),
88 @"bezel-inset": CGInsetMakeZero(),
90 @"min-size-datepicker-textfield": CGSizeMakeZero(),
91 @"content-inset-datepicker-textfield": CGInsetMakeZero(),
92 @"content-inset-datepicker-textfield-separator": CGInsetMakeZero(),
93 @"separator-content-inset": CGInsetMakeZero(),
94 @"date-hour-margin": 5.0,
95 @"stepper-margin": 5.0,
99 @"title-text-shadow-offset": CGSizeMakeZero(),
103 @"weekday-text-shadow-offset": CGSizeMakeZero(),
107 @"arrow-image-left-highlighted": [
CPNull null],
108 @"arrow-image-right-highlighted": [
CPNull null],
109 @"arrow-inset": CGInsetMakeZero(),
114 @"tile-text-shadow-offset": CGSizeMakeZero(),
116 @"size-tile": CGSizeMakeZero(),
117 @"size-calendar": CGSizeMakeZero(),
118 @"size-header": CGSizeMakeZero(),
119 @"min-size-calendar": CGSizeMakeZero(),
120 @"max-size-calendar": CGSizeMakeZero(),
124 @"clock-text-shadow-offset": CGSizeMakeZero(),
130 @"size-clock": CGSizeMakeZero(),
131 @"second-hand-size": CGSizeMakeZero(),
132 @"hour-hand-size": CGSizeMakeZero(),
133 @"middle-hand-size": CGSizeMakeZero(),
134 @"minute-hand-size": CGSizeMakeZero(),
140 #pragma mark Binding methods 142 + (Class)_binderClassForBinding:(
CPString)theBinding
144 if (theBinding == CPValueBinding || theBinding == CPMinValueBinding || theBinding == CPMaxValueBinding)
145 return [_CPDatePickerValueBinder class];
147 return [
super _binderClassForBinding:theBinding];
152 if (aBinding == CPValueBinding)
155 if (aBinding == CPMinValueBinding)
158 if (aBinding == CPMaxValueBinding)
161 return [
super _replacementKeyPathForBinding:aBinding];
166 #pragma mark Init methods 168 - (id)initWithFrame:(CGRect)aFrame
170 if (
self = [super initWithFrame:aFrame])
172 _drawsBackground = YES;
177 _implementedCDatePickerDelegateMethods = 0;
197 _datePickerTextfield = [[_CPDatePickerTextField alloc] initWithFrame:[
self bounds] withDatePicker:self];
198 [_datePickerTextfield setDateValue:_dateValue];
200 _datePickerCalendar = [[_CPDatePickerCalendar alloc] initWithFrame:[
self bounds] withDatePicker:self];
201 [_datePickerCalendar setDateValue:_dateValue];
204 [_datePickerTextfield setEnabled:[
self isEnabled]];
206 [
self setNeedsDisplay:YES];
207 [
self setNeedsLayout];
212 #pragma mark Control Size 214 - (void)setControlSize:(CPControlSize)aControlSize
219 [
self _sizeToControlSize];
224 #pragma mark Delegate methods 229 - (void)setDelegate:(
id)aDelegate
231 _delegate = aDelegate;
232 _implementedCDatePickerDelegateMethods = 0;
235 if ([_delegate respondsToSelector:
@selector(datePicker:validateProposedDateValue:timeInterval:)])
241 #pragma mark Layout method 245 - (void)layoutSubviews
251 if (![_datePickerTextfield superview])
254 if ([_datePickerCalendar superview])
255 [_datePickerCalendar removeFromSuperview];
257 [_datePickerTextfield setControlSize:[
self controlSize]];
258 [_datePickerTextfield setNeedsLayout];
259 [_datePickerTextfield setNeedsDisplay:YES];
263 if (![_datePickerCalendar superview])
266 if ([_datePickerTextfield superview])
267 [_datePickerTextfield removeFromSuperview];
269 [_datePickerCalendar setNeedsLayout];
270 [_datePickerCalendar setNeedsDisplay:YES];
290 if (![aValue isKindOfClass:[
CPDate class]])
301 if (aDateValue == nil)
304 _invokedByUserEvent = NO;
305 [
self _setDateValue:aDateValue timeInterval:_timeInterval];
312 - (void)_setDateValue:(
CPDate)aDateValue timeInterval:(CPTimeInterval)aTimeInterval
315 if (!isFinite(aDateValue))
318 reason:@"aDateValue is not valid"];
323 aDateValue =
new Date (MAX(aDateValue, _minDate));
326 aDateValue =
new Date (MIN(aDateValue, _maxDate));
328 aTimeInterval = MAX(MIN(aTimeInterval, [_maxDate timeIntervalSinceDate:aDateValue]), [_minDate timeIntervalSinceDate:aDateValue]);
330 if ([aDateValue isEqualToDate:_dateValue] && aTimeInterval == _timeInterval)
333 [_datePickerTextfield setDateValue:_dateValue];
335 [_datePickerCalendar setDateValue:_dateValue];
343 var aStartDateRef =
function(x){
if (typeof x ==
'undefined')
return aDateValue; aDateValue = x;};
344 var aTimeIntervalRef =
function(x){
if (typeof x ==
'undefined')
return aTimeInterval; aTimeInterval = x;};
346 [_delegate datePicker:self validateProposedDateValue:aStartDateRef timeInterval:aTimeIntervalRef];
349 [
self willChangeValueForKey:@"objectValue"];
350 [
self willChangeValueForKey:@"dateValue"];
351 _dateValue = aDateValue;
352 [
super setObjectValue:_dateValue];
353 [
self didChangeValueForKey:@"objectValue"];
354 [
self didChangeValueForKey:@"dateValue"];
356 [
self willChangeValueForKey:@"timeInterval"];
358 [
self didChangeValueForKey:@"timeInterval"];
360 if (_invokedByUserEvent)
361 [
self sendAction:[
self action] to:[
self target]];
364 [_datePickerTextfield setDateValue:_dateValue];
366 [_datePickerCalendar setDateValue:_dateValue];
374 [
self willChangeValueForKey:@"minDate"];
376 [
self didChangeValueForKey:@"minDate"];
378 [
self _setDateValue:_dateValue timeInterval:_timeInterval];
386 [
self willChangeValueForKey:@"maxDate"];
388 [
self didChangeValueForKey:@"maxDate"];
390 [
self _setDateValue:_dateValue timeInterval:_timeInterval];
396 - (void)setDatePickerStyle:(CPInteger)aDatePickerStyle
398 _datePickerStyle = aDatePickerStyle;
409 - (void)setDatePickerElements:(CPInteger)aDatePickerElements
411 _datePickerElements = aDatePickerElements;
420 - (void)setDatePickerMode:(CPInteger)aDatePickerMode
422 _datePickerMode = aDatePickerMode;
425 [
self _setDateValue:[
self dateValue] timeInterval:0];
434 - (void)setTimeInterval:(CPInteger)aTimeInterval
439 [
self _setDateValue:[
self dateValue] timeInterval:aTimeInterval];
451 [
self willChangeValueForKey:@"locale"];
452 [_formatter setLocale:_locale];
453 [
self didChangeValueForKey:@"locale"];
457 [_datePickerTextfield setDateValue:_dateValue];
466 - (void)setBezeled:(BOOL)shouldBeBezeled
468 _isBezeled = shouldBeBezeled;
480 - (void)setBordered:(BOOL)shouldBeBordered
482 _isBordered = shouldBeBordered;
484 if (shouldBeBordered)
502 - (void)setEnabled:(BOOL)aBoolean
506 [_datePickerTextfield setEnabled:aBoolean];
507 [_datePickerCalendar setEnabled:aBoolean];
515 _backgroundColor = aColor;
522 - (void)setDrawsBackground:(BOOL)aBoolean
524 [
self willChangeValueForKey:@"drawsBackground"];
525 _drawsBackground = aBoolean;
526 [
self didChangeValueForKey:@"drawsBackground"];
536 [
self willChangeValueForKey:@"timeZone"];
537 _timeZone = aTimeZone;
538 [
self didChangeValueForKey:@"timeZone"];
543 [_datePickerTextfield setDateValue:_dateValue];
545 [_datePickerCalendar setDateValue:_dateValue];
550 #pragma mark First responder methods 554 - (BOOL)becomeFirstResponder
558 if (![super becomeFirstResponder])
561 [_datePickerTextfield _selectTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]];
571 - (BOOL)acceptsFirstResponder
578 - (BOOL)resignFirstResponder
581 [_datePickerTextfield resignFirstResponder];
595 return [
self hasThemeState:CPThemeStateBezeled];
603 return [
self hasThemeState:CPThemeStateBordered];
616 - (BOOL)_isAmericanFormat
618 return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
622 #pragma mark Key event 630 [_datePickerTextfield keyDown:anEvent];
656 _textFont = [aCoder decodeObjectForKey:CPTextFontKey];
659 _timeInterval = [aCoder decodeDoubleForKey:CPIntervalKey];
660 _datePickerMode = [aCoder decodeIntForKey:CPDatePickerModeKey];
661 _datePickerElements = [aCoder decodeIntForKey:CPDatePickerElementsKey];
663 _locale = [aCoder decodeObjectForKey:CPLocaleKey];
664 _dateValue = [aCoder decodeObjectForKey:CPDateValueKey];
665 _backgroundColor = [aCoder decodeObjectForKey:CPBackgroundColorKey];
666 _drawsBackground = [aCoder decodeBoolForKey:CPDrawsBackgroundKey];
667 _isBordered = [aCoder decodeBoolForKey:CPBorderedKey];
680 [aCoder encodeDouble:_timeInterval forKey:CPIntervalKey];
681 [aCoder encodeInt:_datePickerMode forKey:CPDatePickerModeKey];
682 [aCoder encodeInt:_datePickerStyle forKey:CPDatePickerStyleKey];
683 [aCoder encodeInt:_datePickerElements forKey:CPDatePickerElementsKey];
684 [aCoder encodeObject:_minDate forKey:CPMinDateKey];
685 [aCoder encodeObject:_maxDate forKey:CPMaxDateKey];
686 [aCoder encodeObject:_dateValue forKey:CPDateValueKey];;
687 [aCoder encodeObject:_textFont forKey:CPTextFontKey];
688 [aCoder encodeObject:_locale forKey:CPLocaleKey];
689 [aCoder encodeObject:_backgroundColor forKey:CPBackgroundColorKey];
690 [aCoder encodeObject:_drawsBackground forKey:CPDrawsBackgroundKey];
691 [aCoder encodeObject:_isBordered forKey:CPBorderedKey];
696 @implementation _CPDatePickerValueBinder :
CPBinder 707 return 32 -
new Date(
self.getFullYear(),
self.getMonth(), 32).getDate();
710 - (void)_resetToMidnight
715 self.setMilliseconds(0);
718 - (void)_resetToLastSeconds
723 self.setMilliseconds(99);
741 - (void)setBordered:(BOOL)aValue
743 _isBordered = aValue;
757 - (void)setBezeled:(BOOL)aValue
765 - (BOOL)drawsBackground
767 return _drawsBackground;
773 - (void)setDrawsBackground:(BOOL)aValue
775 _drawsBackground = aValue;
861 - (CPCalendar)calendar
869 - (void)setCalendar:(CPCalendar)aValue
901 - (void)setDelegate:(
id)aValue
909 - (CPInteger)datePickerElements
911 return _datePickerElements;
917 - (void)setDatePickerElements:(CPInteger)aValue
919 _datePickerElements = aValue;
925 - (CPInteger)datePickerMode
927 return _datePickerMode;
933 - (void)setDatePickerMode:(CPInteger)aValue
935 _datePickerMode = aValue;
941 - (CPInteger)datePickerStyle
943 return _datePickerStyle;
949 - (void)setDatePickerStyle:(CPInteger)aValue
951 _datePickerStyle = aValue;
957 - (CPInteger)timeInterval
959 return _timeInterval;
965 - (void)setTimeInterval:(CPInteger)aValue
967 _timeInterval = aValue;
Used to implement exception handling (creating & raising).
void setFont:(CPFont aFont)
CPControlSize controlSize()
void addSubview:(CPView aSubview)
BOOL setThemeState:(ThemeState aState)
CPHourMinuteDatePickerElementFlag
A representation of a single point in time.
An object representation of nil.
void setDateValue:(CPDate aDateValue)
CPTextFieldAndStepperDatePickerStyle
void raise:reason:(CPString aName, [reason] CPString aReason)
void setControlSize:(CPControlSize aControlSize)
void setEnabled:(BOOL isEnabled)
CPEraDatePickerElementFlag
A mutable key-value pair collection.
void setBordered:(BOOL shouldBeBordered)
CPTimeZoneDatePickerElementFlag
void setControlSize:(CPControlSize aControlSize)
An immutable string (collection of characters).
CPHourMinuteSecondDatePickerElementFlag
id initWithCoder:(CPCoder aCoder)
void setBezeled:(BOOL shouldBeBezeled)
void setNeedsDisplay:(BOOL aFlag)
CPTimeZone is a class to define the behvior of time zone object (like CPDatePicker) ...
global CPLocaleLanguageCode global CPDateFormatterShortStyle var CPDatePicker_validateProposedDateValue_timeInterval
var CPDatePickerElementsKey
Defines methods for use when archiving & restoring (enc/decoding).
CPClockAndCalendarDatePickerStyle
CPTextFieldDatePickerStyle
BOOL unsetThemeState:(ThemeState aState)
void setDatePickerStyle:(CPInteger aDatePickerStyle)
void setObjectValue:(CPDate aValue)
CPYearMonthDatePickerElementFlag
void encodeWithCoder:(CPCoder aCoder)
CPYearMonthDayDatePickerElementFlag