API  0.9.7
 All Classes Files Functions Variables Macros Groups Pages
CPDatePicker.j
Go to the documentation of this file.
1 /* CPDatePicker.j
2 * AppKit
3 *
4 * Created by Alexandre Wilhelm
5 * Copyright 2012 <alexandre.wilhelmfr@gmail.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21 
22 
23 
24 @class CPStepper
25 @class CPApp
26 
27 @global CPLocaleLanguageCode
28 @global CPDateFormatterShortStyle
29 
30 var CPDatePicker_validateProposedDateValue_timeInterval = 1 << 1;
31 
32 CPSingleDateMode = 0;
33 CPRangeDateMode = 1;
34 
35 CPTextFieldAndStepperDatePickerStyle = 0;
36 CPClockAndCalendarDatePickerStyle = 1;
37 CPTextFieldDatePickerStyle = 2;
38 
39 CPHourMinuteDatePickerElementFlag = 0x000c;
40 CPHourMinuteSecondDatePickerElementFlag = 0x000e;
41 CPTimeZoneDatePickerElementFlag = 0x0010;
42 CPYearMonthDatePickerElementFlag = 0x00c0;
43 CPYearMonthDayDatePickerElementFlag = 0x00e0;
44 CPEraDatePickerElementFlag = 0x0100;
45 
50 @implementation CPDatePicker : CPControl
51 {
52  BOOL _isBordered;
53  BOOL _isBezeled;
54  BOOL _drawsBackground;
55  CPDate _dateValue;
56  CPDate _minDate;
57  CPDate _maxDate;
58  CPFont _textFont;
59  CPLocale _locale;
60  //CPCalendar _calendar;
61  CPTimeZone _timeZone;
62  id _delegate;
63  CPInteger _datePickerElements;
64  CPInteger _datePickerMode;
65  CPInteger _datePickerStyle;
66  CPInteger _timeInterval;
67 
68  _CPDatePickerTextField _datePickerTextfield;
69  _CPDatePickerCalendar _datePickerCalendar;
70  unsigned _implementedCDatePickerDelegateMethods;
71 }
72 
73 
74 #pragma mark -
75 #pragma mark Theme methods
76 
77 + (CPString)defaultThemeClass
78 {
79  return @"datePicker";
80 }
81 
82 + (CPDictionary)themeAttributes
83 {
84  return @{
85  @"bezel-color": [CPColor clearColor],
86  @"border-width" : 1.0,
87  @"border-color": [CPColor clearColor],
88  @"content-inset": CGInsetMakeZero(),
89  @"bezel-inset": CGInsetMakeZero(),
90  @"datepicker-textfield-bezel-color": [CPColor clearColor],
91  @"min-size-datepicker-textfield": CGSizeMakeZero(),
92  @"content-inset-datepicker-textfield": CGInsetMakeZero(),
93  @"content-inset-datepicker-textfield-separator": CGInsetMakeZero(),
94  @"separator-content-inset": CGInsetMakeZero(),
95  @"date-hour-margin": 5.0,
96  @"stepper-margin": 5.0,
97  @"bezel-color-calendar": [CPColor clearColor],
98  @"title-text-color": [CPColor blackColor],
99  @"title-text-shadow-color": [CPColor clearColor],
100  @"title-text-shadow-offset": CGSizeMakeZero(),
101  @"title-font": [CPNull null],
102  @"weekday-text-color": [CPColor blackColor],
103  @"weekday-text-shadow-color": [CPColor clearColor],
104  @"weekday-text-shadow-offset": CGSizeMakeZero(),
105  @"weekday-font": [CPNull null],
106  @"arrow-image-left": [CPNull null],
107  @"arrow-image-right": [CPNull null],
108  @"arrow-image-left-highlighted": [CPNull null],
109  @"arrow-image-right-highlighted": [CPNull null],
110  @"arrow-inset": CGInsetMakeZero(),
111  @"circle-image": [CPNull null],
112  @"circle-image-highlighted": [CPNull null],
113  @"tile-text-color": [CPColor blackColor],
114  @"tile-text-shadow-color": [CPColor clearColor],
115  @"tile-text-shadow-offset": CGSizeMakeZero(),
116  @"tile-font": [CPNull null],
117  @"size-tile": CGSizeMakeZero(),
118  @"size-calendar": CGSizeMakeZero(),
119  @"size-header": CGSizeMakeZero(),
120  @"min-size-calendar": CGSizeMakeZero(),
121  @"max-size-calendar": CGSizeMakeZero(),
122  @"bezel-color-clock": [CPColor clearColor],
123  @"clock-text-color": [CPColor blackColor],
124  @"clock-text-shadow-color": [CPColor clearColor],
125  @"clock-text-shadow-offset": CGSizeMakeZero(),
126  @"clock-font": [CPNull null],
127  @"second-hand-image": [CPNull null],
128  @"hour-hand-image": [CPNull null],
129  @"middle-hand-image": [CPNull null],
130  @"minute-hand-image": [CPNull null],
131  @"size-clock": CGSizeMakeZero(),
132  @"second-hand-size": CGSizeMakeZero(),
133  @"hour-hand-size": CGSizeMakeZero(),
134  @"middle-hand-size": CGSizeMakeZero(),
135  @"minute-hand-size": CGSizeMakeZero(),
136  };
137 }
138 
139 
140 #pragma mark -
141 #pragma mark Binding methods
142 
143 + (Class)_binderClassForBinding:(CPString)theBinding
144 {
145  if (theBinding == CPValueBinding || theBinding == CPMinValueBinding || theBinding == CPMaxValueBinding)
146  return [_CPDatePickerValueBinder class];
147 
148  return [super _binderClassForBinding:theBinding];
149 }
150 
151 - (CPString)_replacementKeyPathForBinding:(CPString)aBinding
152 {
153  if (aBinding == CPValueBinding)
154  return @"dateValue";
155 
156  if (aBinding == CPMinValueBinding)
157  return @"minDate";
158 
159  if (aBinding == CPMaxValueBinding)
160  return @"maxDate";
161 
162  return [super _replacementKeyPathForBinding:aBinding];
163 }
164 
165 
166 #pragma mark -
167 #pragma mark Init methods
168 
169 - (id)initWithFrame:(CGRect)aFrame
170 {
171  if (self = [super initWithFrame:aFrame])
172  {
173  _drawsBackground = YES;
174  _datePickerStyle = CPTextFieldAndStepperDatePickerStyle;
175  _datePickerMode = CPSingleDateMode;
176  _datePickerElements = CPYearMonthDayDatePickerElementFlag | CPHourMinuteSecondDatePickerElementFlag;
177  _timeInterval = 0;
178  _implementedCDatePickerDelegateMethods = 0;
179 
180  [self setObjectValue:[CPDate date]];
181  _minDate = [CPDate distantPast];
182  _maxDate = [CPDate distantFuture];
183 
184  [self setBezeled:YES];
185  [self setBordered:YES];
186 
187  [self _init];
188  }
189 
190  return self
191 }
192 
193 - (void)_init
194 {
195  if (!_locale)
196  _locale = [CPLocale currentLocale];
197 
198  if (!_timeZone)
199  _timeZone = [CPTimeZone systemTimeZone];
200 
201  _datePickerTextfield = [[_CPDatePickerTextField alloc] initWithFrame:[self bounds] withDatePicker:self];
202 
203  [_datePickerTextfield setDateValue:_dateValue];
204  [self addSubview:_datePickerTextfield];
205 
206  _datePickerCalendar = [[_CPDatePickerCalendar alloc] initWithFrame:[self bounds] withDatePicker:self];
207  [_datePickerCalendar setDateValue:_dateValue];
208  [_datePickerCalendar setHidden:YES];
209  [self addSubview:_datePickerCalendar];
210 
211  [self setNeedsDisplay:YES];
212  [self setNeedsLayout];
213 }
214 
215 
216 #pragma mark -
217 #pragma mark Delegate methods
218 
222 - (void)setDelegate:(id)aDelegate
223 {
224  _delegate = aDelegate;
225  _implementedCDatePickerDelegateMethods = 0;
226 
227  // Look if the delegate implements or not the delegate methods
228  if ([_delegate respondsToSelector:@selector(datePicker:validateProposedDateValue:timeInterval:)])
229  _implementedCDatePickerDelegateMethods |= CPDatePicker_validateProposedDateValue_timeInterval;
230 }
231 
232 
233 #pragma mark -
234 #pragma mark Layout method
235 
238 - (void)layoutSubviews
239 {
240  [super layoutSubviews];
241 
242  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
243  {
244  [_datePickerTextfield setHidden:NO];
245  [_datePickerCalendar setHidden:YES];
246  [_datePickerTextfield setNeedsLayout];
247  }
248  else
249  {
250  [_datePickerCalendar setHidden:NO];
251  [_datePickerTextfield setHidden:YES];
252  [_datePickerCalendar setNeedsLayout];
253  }
254 }
255 
256 #pragma mark -
257 #pragma mark Setter
258 
261 - (id)objectValue
262 {
263  // TODO : add timeZone effect. How to do it because js ???
264  return _dateValue
265 }
266 
270 - (void)setObjectValue:(CPDate)aValue
271 {
272  [self setDateValue:aValue];
273 }
274 
275 /* Set the dateValue of the datePicker
276  @param aDateValue the dateValue
277 */
278 - (void)setDateValue:(CPDate)aDateValue
279 {
280  if (aDateValue == nil)
281  return;
282 
283  [self _setDateValue:aDateValue timeInterval:_timeInterval];
284 }
285 
290 - (void)_setDateValue:(CPDate)aDateValue timeInterval:(CPTimeInterval)aTimeInterval
291 {
292  if (_minDate)
293  aDateValue = new Date (MAX(aDateValue, _minDate));
294 
295  if (_maxDate)
296  aDateValue = new Date (MIN(aDateValue, _maxDate));
297 
298  aTimeInterval = MAX(MIN(aTimeInterval, [_maxDate timeIntervalSinceDate:aDateValue]), [_minDate timeIntervalSinceDate:aDateValue]);
299 
300  if ([aDateValue isEqualToDate:_dateValue] && aTimeInterval == _timeInterval)
301  return;
302 
303  if (_implementedCDatePickerDelegateMethods & CPDatePicker_validateProposedDateValue_timeInterval)
304  {
305  // constrain timeInterval also
306  var aStartDateRef = function(x){if (typeof x == 'undefined') return aDateValue; aDateValue = x;}
307  var aTimeIntervalRef = function(x){if (typeof x == 'undefined') return aTimeInterval; aTimeInterval = x;}
308 
309  [_delegate datePicker:self validateProposedDateValue:aStartDateRef timeInterval:aTimeIntervalRef];
310  }
311 
312  [self willChangeValueForKey:@"objectValue"];
313  [self willChangeValueForKey:@"dateValue"];
314  _dateValue = aDateValue;
315  [super setObjectValue:_dateValue];
316  [self didChangeValueForKey:@"objectValue"];
317  [self didChangeValueForKey:@"dateValue"];
318 
319  [self willChangeValueForKey:@"timeInterval"];
320  _timeInterval = (_datePickerMode == CPSingleDateMode)? 0 : aTimeInterval;
321  [self didChangeValueForKey:@"timeInterval"];
322 
323  [self sendAction:[self action] to:[self target]];
324 
325  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
326  [_datePickerTextfield setDateValue:_dateValue];
327  else
328  [_datePickerCalendar setDateValue:_dateValue];
329 }
330 
334 - (void)setMinDate:(CPDate)aMinDate
335 {
336  [self willChangeValueForKey:@"minDate"];
337  _minDate = aMinDate;
338  [self didChangeValueForKey:@"minDate"];
339 
340  [self _setDateValue:_dateValue timeInterval:_timeInterval];
341 }
342 
346 - (void)setMaxDate:(CPDate)aMaxDate
347 {
348  [self willChangeValueForKey:@"maxDate"];
349  _maxDate = aMaxDate;
350  [self didChangeValueForKey:@"maxDate"];
351 
352  [self _setDateValue:_dateValue timeInterval:_timeInterval];
353 }
354 
358 - (void)setDatePickerStyle:(CPInteger)aDatePickerStyle
359 {
360  _datePickerStyle = aDatePickerStyle;
361 
362  [self setNeedsDisplay:YES];
363  [self setNeedsLayout];
364 }
365 
369 - (void)setDatePickerElements:(CPInteger)aDatePickerElements
370 {
371  _datePickerElements = aDatePickerElements;
372 
373  [self setNeedsDisplay:YES];
374  [self setNeedsLayout];
375 }
376 
380 - (void)setDatePickerMode:(CPInteger)aDatePickerMode
381 {
382  _datePickerMode = aDatePickerMode;
383 
384  if (_datePickerMode == CPSingleDateMode)
385  [self _setDateValue:[self dateValue] timeInterval:0];
386 
387  [self setNeedsDisplay:YES];
388  [self setNeedsLayout];
389 }
390 
394 - (void)setTimeInterval:(CPInteger)aTimeInterval
395 {
396  if (_datePickerMode == CPSingleDateMode)
397  return;
398 
399  [self _setDateValue:[self dateValue] timeInterval:aTimeInterval];
400 }
401 
405 - (void)setLocale:(CPLocale)aLocale
406 {
407  _locale = aLocale;
408 
409  if (_formatter)
410  {
411  [self willChangeValueForKey:@"locale"];
412  [_formatter setLocale:_locale];
413  [self didChangeValueForKey:@"locale"];
414  }
415 
416  // This will update the textFields (usefull when changing with a date with pm and am)
417  [_datePickerTextfield setDateValue:_dateValue];
418  [self setNeedsDisplay:YES];
419  [self setNeedsLayout];
420 }
421 
426 - (void)setBezeled:(BOOL)shouldBeBezeled
427 {
428  _isBezeled = shouldBeBezeled;
429 
430  if (shouldBeBezeled)
431  [self setThemeState:CPThemeStateBezeled];
432  else
433  [self unsetThemeState:CPThemeStateBezeled];
434 }
435 
440 - (void)setBordered:(BOOL)shouldBeBordered
441 {
442  _isBordered = shouldBeBordered;
443 
444  if (shouldBeBordered)
445  [self setThemeState:CPThemeStateBordered];
446  else
447  [self unsetThemeState:CPThemeStateBordered];
448 }
449 
454 - (void)setTextFont:(CPFont)aFont
455 {
456  [self setFont:aFont];
457 }
458 
462 - (void)setEnabled:(BOOL)aBoolean
463 {
464  [super setEnabled:aBoolean];
465 
466  [_datePickerTextfield setEnabled:aBoolean];
467  [_datePickerCalendar setEnabled:aBoolean];
468 }
469 
473 - (void)setBackgroundColor:(CPColor)aColor
474 {
475  _backgroundColor = aColor;
476  [self setNeedsLayout];
477 }
478 
482 - (void)setDrawsBackground:(BOOL)aBoolean
483 {
484  [self willChangeValueForKey:@"drawsBackground"];
485  _drawsBackground = aBoolean;
486  [self didChangeValueForKey:@"drawsBackground"];
487 
488  [self setNeedsLayout];
489 }
490 
494 - (void)setTimeZone:(CPTimeZone)aTimeZone
495 {
496  [self willChangeValueForKey:@"timeZone"];
497  _timeZone = aTimeZone;
498  [self didChangeValueForKey:@"timeZone"];
499 
500  [self setNeedsLayout];
501 }
502 
503 
504 #pragma mark -
505 #pragma mark First responder methods
506 
509 - (BOOL)becomeFirstResponder
510 {
511  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
512  [_datePickerTextfield _selecteTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]];
513  else
514  return NO;
515 
516  return YES;
517 }
518 
521 - (BOOL)acceptsFirstResponder
522 {
523  return YES;
524 }
525 
528 - (BOOL)resignFirstResponder
529 {
530  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
531  [_datePickerTextfield resignFirstResponder];
532 
533  return YES;
534 }
535 
536 
537 #pragma mark -
538 #pragma mark getter
539 
543 - (BOOL)isBezeled
544 {
545  return [self hasThemeState:CPThemeStateBezeled];
546 }
547 
551 - (BOOL)isBordered
552 {
553  return [self hasThemeState:CPThemeStateBordered];
554 }
555 
559 - (CPFont)textFont
560 {
561  return [self font];
562 }
563 
566 - (BOOL)_isAmericanFormat
567 {
568  return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
569 }
570 
573 - (BOOL)_isEnglishFormat
574 {
575  return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"];
576 }
577 
578 
579 #pragma mark -
580 #pragma mark Key event
581 
585 - (void)keyDown:(CPEvent)anEvent
586 {
587  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
588  [_datePickerTextfield keyDown:anEvent];
589 }
590 
591 @end
592 
593 var CPDatePickerModeKey = @"CPDatePickerModeKey",
594  CPIntervalKey = @"CPIntervalKey",
595  CPMinDateKey = @"CPMinDateKey",
596  CPMaxDateKey = @"CPMaxDateKey",
597  CPBackgroundColorKey = @"CPBackgroundColorKey",
598  CPDrawsBackgroundKey = @"CPDrawsBackgroundKey",
599  CPTextFontKey = @"CPTextFontKey",
600  CPDatePickerElementsKey = @"CPDatePickerElementsKey",
601  CPDatePickerStyleKey = @"CPDatePickerStyleKey",
602  CPLocaleKey = @"CPLocaleKey",
603  CPBorderedKey = @"CPBorderedKey",
604  CPDateValueKey = @"CPDateValueKey";
605 
606 @implementation CPDatePicker (CPCoding)
607 
608 - (id)initWithCoder:(CPCoder)aCoder
609 {
610  self = [super initWithCoder:aCoder];
611 
612  if (self)
613  {
614  _textFont = [aCoder decodeObjectForKey:CPTextFontKey];
615  _minDate = [aCoder decodeObjectForKey:CPMinDateKey] || [CPDate distantPast];
616  _maxDate = [aCoder decodeObjectForKey:CPMaxDateKey] || [CPDate distantFuture];
617  _timeInterval = [aCoder decodeDoubleForKey:CPIntervalKey];
618  _datePickerMode = [aCoder decodeIntForKey:CPDatePickerModeKey];
619  _datePickerElements = [aCoder decodeIntForKey:CPDatePickerElementsKey];
620  _datePickerStyle = [aCoder decodeIntForKey:CPDatePickerStyleKey];
621  _locale = [aCoder decodeObjectForKey:CPLocaleKey];
622  _dateValue = [aCoder decodeObjectForKey:CPDateValueKey];
623  _backgroundColor = [aCoder decodeObjectForKey:CPBackgroundColorKey];
624  _drawsBackground = [aCoder decodeBoolForKey:CPDrawsBackgroundKey];
625  _isBordered = [aCoder decodeBoolForKey:CPBorderedKey];
626  [self _init];
627  }
628 
629  return self
630 }
631 
632 - (void)encodeWithCoder:(CPCoder)aCoder
633 {
634  [super encodeWithCoder:aCoder];
635  [aCoder encodeDouble:_timeInterval forKey:CPIntervalKey];
636  [aCoder encodeInt:_datePickerMode forKey:CPDatePickerModeKey];
637  [aCoder encodeInt:_datePickerStyle forKey:CPDatePickerStyleKey];
638  [aCoder encodeInt:_datePickerElements forKey:CPDatePickerElementsKey];
639  [aCoder encodeObject:_minDate forKey:CPMinDateKey];
640  [aCoder encodeObject:_maxDate forKey:CPMaxDateKey]
641  [aCoder encodeObject:_dateValue forKey:CPDateValueKey];;
642  [aCoder encodeObject:_textFont forKey:CPTextFontKey];
643  [aCoder encodeObject:_locale forKey:CPLocaleKey];
644  [aCoder encodeObject:_backgroundColor forKey:CPBackgroundColorKey];
645  [aCoder encodeObject:_drawsBackground forKey:CPDrawsBackgroundKey];
646  [aCoder encodeObject:_isBordered forKey:CPBorderedKey];
647 }
648 
649 @end
650 @implementation _CPDatePickerValueBinder : CPBinder
651 {
652  id __doxygen__;
653 }
654 
655 @end
656 
657 @implementation CPDate (CPDatePickerAdditions)
658 
659 - (int)_daysInMonth
660 {
661  return 32 - new Date(self.getFullYear(), self.getMonth(), 32).getDate();
662 }
663 
664 - (void)_resetToMidnight
665 {
666  self.setHours(0);
667  self.setMinutes(0);
668  self.setSeconds(0);
669  self.setMilliseconds(0);
670 }
671 
672 - (void)_resetToLastSeconds
673 {
674  self.setHours(23);
675  self.setMinutes(59);
676  self.setSeconds(59);
677  self.setMilliseconds(99);
678 }
679 
680 @end
681 
682 @implementation CPDatePicker (CPSynthesizedAccessors)
683 
687 - (BOOL)isBordered
688 {
689  return _isBordered;
690 }
691 
695 - (void)setBordered:(BOOL)aValue
696 {
697  _isBordered = aValue;
698 }
699 
703 - (BOOL)isBezeled
704 {
705  return _isBezeled;
706 }
707 
711 - (void)setBezeled:(BOOL)aValue
712 {
713  _isBezeled = aValue;
714 }
715 
719 - (BOOL)drawsBackground
720 {
721  return _drawsBackground;
722 }
723 
727 - (void)setDrawsBackground:(BOOL)aValue
728 {
729  _drawsBackground = aValue;
730 }
731 
735 - (CPDate)dateValue
736 {
737  return _dateValue;
738 }
739 
743 - (void)setDateValue:(CPDate)aValue
744 {
745  _dateValue = aValue;
746 }
747 
751 - (CPDate)minDate
752 {
753  return _minDate;
754 }
755 
759 - (void)setMinDate:(CPDate)aValue
760 {
761  _minDate = aValue;
762 }
763 
767 - (CPDate)maxDate
768 {
769  return _maxDate;
770 }
771 
775 - (void)setMaxDate:(CPDate)aValue
776 {
777  _maxDate = aValue;
778 }
779 
783 - (CPFont)textFont
784 {
785  return _textFont;
786 }
787 
791 - (void)setTextFont:(CPFont)aValue
792 {
793  _textFont = aValue;
794 }
795 
799 - (CPLocale)locale
800 {
801  return _locale;
802 }
803 
807 - (void)setLocale:(CPLocale)aValue
808 {
809  _locale = aValue;
810 }
811 
815 - (CPCalendar)calendar
816 {
817  return _calendar;
818 }
819 
823 - (void)setCalendar:(CPCalendar)aValue
824 {
825  _calendar = aValue;
826 }
827 
831 - (CPTimeZone)timeZone
832 {
833  return _timeZone;
834 }
835 
839 - (void)setTimeZone:(CPTimeZone)aValue
840 {
841  _timeZone = aValue;
842 }
843 
847 - (id)delegate
848 {
849  return _delegate;
850 }
851 
855 - (void)setDelegate:(id)aValue
856 {
857  _delegate = aValue;
858 }
859 
863 - (CPInteger)datePickerElements
864 {
865  return _datePickerElements;
866 }
867 
871 - (void)setDatePickerElements:(CPInteger)aValue
872 {
873  _datePickerElements = aValue;
874 }
875 
879 - (CPInteger)datePickerMode
880 {
881  return _datePickerMode;
882 }
883 
887 - (void)setDatePickerMode:(CPInteger)aValue
888 {
889  _datePickerMode = aValue;
890 }
891 
895 - (CPInteger)datePickerStyle
896 {
897  return _datePickerStyle;
898 }
899 
903 - (void)setDatePickerStyle:(CPInteger)aValue
904 {
905  _datePickerStyle = aValue;
906 }
907 
911 - (CPInteger)timeInterval
912 {
913  return _timeInterval;
914 }
915 
919 - (void)setTimeInterval:(CPInteger)aValue
920 {
921  _timeInterval = aValue;
922 }
923 
924 @end