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
145 return [_CPDatePickerValueBinder class];
147 return [
super _binderClassForBinding:theBinding];
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];
378 [
self _setDateValue:_dateValue timeInterval:_timeInterval];
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];
452 [_formatter setLocale:_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
525 _drawsBackground = aBoolean;
537 _timeZone = aTimeZone;
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];
616 - (BOOL)_isAmericanFormat
618 return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
623 - (BOOL)_isEnglishFormat
625 return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"];
630 #pragma mark Key event
638 [_datePickerTextfield keyDown:anEvent];
664 _textFont = [aCoder decodeObjectForKey:CPTextFontKey];
667 _timeInterval = [aCoder decodeDoubleForKey:CPIntervalKey];
668 _datePickerMode = [aCoder decodeIntForKey:CPDatePickerModeKey];
669 _datePickerElements = [aCoder decodeIntForKey:CPDatePickerElementsKey];
671 _locale = [aCoder decodeObjectForKey:CPLocaleKey];
672 _dateValue = [aCoder decodeObjectForKey:CPDateValueKey];
673 _backgroundColor = [aCoder decodeObjectForKey:CPBackgroundColorKey];
674 _drawsBackground = [aCoder decodeBoolForKey:CPDrawsBackgroundKey];
675 _isBordered = [aCoder decodeBoolForKey:CPBorderedKey];
688 [aCoder encodeDouble:_timeInterval forKey:CPIntervalKey];
689 [aCoder encodeInt:_datePickerMode forKey:CPDatePickerModeKey];
690 [aCoder encodeInt:_datePickerStyle forKey:CPDatePickerStyleKey];
691 [aCoder encodeInt:_datePickerElements forKey:CPDatePickerElementsKey];
692 [aCoder encodeObject:_minDate forKey:CPMinDateKey];
693 [aCoder encodeObject:_maxDate forKey:CPMaxDateKey]
694 [aCoder encodeObject:_dateValue forKey:CPDateValueKey];;
695 [aCoder encodeObject:_textFont forKey:CPTextFontKey];
696 [aCoder encodeObject:_locale forKey:CPLocaleKey];
697 [aCoder encodeObject:_backgroundColor forKey:CPBackgroundColorKey];
698 [aCoder encodeObject:_drawsBackground forKey:CPDrawsBackgroundKey];
699 [aCoder encodeObject:_isBordered forKey:CPBorderedKey];
704 @implementation _CPDatePickerValueBinder :
CPBinder
715 return 32 -
new Date(
self.getFullYear(),
self.getMonth(), 32).getDate();
718 - (void)_resetToMidnight
723 self.setMilliseconds(0);
726 - (void)_resetToLastSeconds
731 self.setMilliseconds(99);
749 - (void)setBordered:(BOOL)aValue
751 _isBordered = aValue;
765 - (void)setBezeled:(BOOL)aValue
773 - (BOOL)drawsBackground
775 return _drawsBackground;
781 - (void)setDrawsBackground:(BOOL)aValue
783 _drawsBackground = aValue;
869 - (CPCalendar)calendar
877 - (void)setCalendar:(CPCalendar)aValue
909 - (void)setDelegate:(
id)aValue
917 - (CPInteger)datePickerElements
919 return _datePickerElements;
925 - (void)setDatePickerElements:(CPInteger)aValue
927 _datePickerElements = aValue;
933 - (CPInteger)datePickerMode
935 return _datePickerMode;
941 - (void)setDatePickerMode:(CPInteger)aValue
943 _datePickerMode = aValue;
949 - (CPInteger)datePickerStyle
951 return _datePickerStyle;
957 - (void)setDatePickerStyle:(CPInteger)aValue
959 _datePickerStyle = aValue;
965 - (CPInteger)timeInterval
967 return _timeInterval;
973 - (void)setTimeInterval:(CPInteger)aValue
975 _timeInterval = aValue;