API  0.9.8
 All Classes Files Functions Variables Typedefs 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 
27 
29 
32 
36 
43 
48 @implementation CPDatePicker : CPControl
49 {
50  BOOL _isBordered;
51  BOOL _isBezeled;
52  BOOL _drawsBackground;
53  CPDate _dateValue;
54  CPDate _minDate;
55  CPDate _maxDate;
56  CPFont _textFont;
57  CPLocale _locale;
58  //CPCalendar _calendar;
59  CPTimeZone _timeZone;
60  id _delegate;
61  CPInteger _datePickerElements;
62  CPInteger _datePickerMode;
63  CPInteger _datePickerStyle;
64  CPInteger _timeInterval;
65 
66  BOOL _invokedByUserEvent;
67  _CPDatePickerTextField _datePickerTextfield;
68  _CPDatePickerCalendar _datePickerCalendar;
69  unsigned _implementedCDatePickerDelegateMethods;
70 }
71 
72 
73 #pragma mark -
74 #pragma mark Theme methods
75 
76 + (CPString)defaultThemeClass
77 {
78  return @"datePicker";
79 }
80 
81 + (CPDictionary)themeAttributes
82 {
83  return @{
84  @"bezel-color": [CPColor clearColor],
85  @"border-width" : 1.0,
86  @"border-color": [CPColor clearColor],
87  @"content-inset": CGInsetMakeZero(),
88  @"bezel-inset": CGInsetMakeZero(),
89  @"datepicker-textfield-bezel-color": [CPColor clearColor],
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,
96  @"bezel-color-calendar": [CPColor clearColor],
97  @"title-text-color": [CPColor blackColor],
98  @"title-text-shadow-color": [CPColor clearColor],
99  @"title-text-shadow-offset": CGSizeMakeZero(),
100  @"title-font": [CPNull null],
101  @"weekday-text-color": [CPColor blackColor],
102  @"weekday-text-shadow-color": [CPColor clearColor],
103  @"weekday-text-shadow-offset": CGSizeMakeZero(),
104  @"weekday-font": [CPNull null],
105  @"arrow-image-left": [CPNull null],
106  @"arrow-image-right": [CPNull null],
107  @"arrow-image-left-highlighted": [CPNull null],
108  @"arrow-image-right-highlighted": [CPNull null],
109  @"arrow-inset": CGInsetMakeZero(),
110  @"circle-image": [CPNull null],
111  @"circle-image-highlighted": [CPNull null],
112  @"tile-text-color": [CPColor blackColor],
113  @"tile-text-shadow-color": [CPColor clearColor],
114  @"tile-text-shadow-offset": CGSizeMakeZero(),
115  @"tile-font": [CPNull null],
116  @"size-tile": CGSizeMakeZero(),
117  @"size-calendar": CGSizeMakeZero(),
118  @"size-header": CGSizeMakeZero(),
119  @"min-size-calendar": CGSizeMakeZero(),
120  @"max-size-calendar": CGSizeMakeZero(),
121  @"bezel-color-clock": [CPColor clearColor],
122  @"clock-text-color": [CPColor blackColor],
123  @"clock-text-shadow-color": [CPColor clearColor],
124  @"clock-text-shadow-offset": CGSizeMakeZero(),
125  @"clock-font": [CPNull null],
126  @"second-hand-image": [CPNull null],
127  @"hour-hand-image": [CPNull null],
128  @"middle-hand-image": [CPNull null],
129  @"minute-hand-image": [CPNull null],
130  @"size-clock": CGSizeMakeZero(),
131  @"second-hand-size": CGSizeMakeZero(),
132  @"hour-hand-size": CGSizeMakeZero(),
133  @"middle-hand-size": CGSizeMakeZero(),
134  @"minute-hand-size": CGSizeMakeZero(),
135  };
136 }
137 
138 
139 #pragma mark -
140 #pragma mark Binding methods
141 
142 + (Class)_binderClassForBinding:(CPString)theBinding
143 {
144  if (theBinding == CPValueBinding || theBinding == CPMinValueBinding || theBinding == CPMaxValueBinding)
145  return [_CPDatePickerValueBinder class];
146 
147  return [super _binderClassForBinding:theBinding];
148 }
149 
150 - (CPString)_replacementKeyPathForBinding:(CPString)aBinding
151 {
152  if (aBinding == CPValueBinding)
153  return @"dateValue";
154 
155  if (aBinding == CPMinValueBinding)
156  return @"minDate";
157 
158  if (aBinding == CPMaxValueBinding)
159  return @"maxDate";
160 
161  return [super _replacementKeyPathForBinding:aBinding];
162 }
163 
164 
165 #pragma mark -
166 #pragma mark Init methods
167 
168 - (id)initWithFrame:(CGRect)aFrame
169 {
170  if (self = [super initWithFrame:aFrame])
171  {
172  _drawsBackground = YES;
173  _datePickerStyle = CPTextFieldAndStepperDatePickerStyle;
174  _datePickerMode = CPSingleDateMode;
176  _timeInterval = 0;
177  _implementedCDatePickerDelegateMethods = 0;
178 
179  [self setObjectValue:[CPDate date]];
180  _minDate = [CPDate distantPast];
181  _maxDate = [CPDate distantFuture];
182 
183  [self setBezeled:YES];
184  [self setBordered:YES];
185 
186  [self _init];
187  }
188 
189  return self
190 }
191 
192 - (void)_init
193 {
194  if (!_locale)
195  _locale = [CPLocale currentLocale];
196 
197  _datePickerTextfield = [[_CPDatePickerTextField alloc] initWithFrame:[self bounds] withDatePicker:self];
198  [_datePickerTextfield setDateValue:_dateValue];
199 
200  _datePickerCalendar = [[_CPDatePickerCalendar alloc] initWithFrame:[self bounds] withDatePicker:self];
201  [_datePickerCalendar setDateValue:_dateValue];
202 
203  // We might have been unarchived in a disabled state.
204  [_datePickerTextfield setEnabled:[self isEnabled]];
205 
206  [self setNeedsDisplay:YES];
207  [self setNeedsLayout];
208 }
209 
210 
211 #pragma mark -
212 #pragma mark Control Size
213 
214 - (void)setControlSize:(CPControlSize)aControlSize
215 {
216  [super setControlSize:aControlSize];
217 
218  if ([self datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [self datePickerStyle] == CPTextFieldDatePickerStyle)
219  [self _sizeToControlSize];
220 }
221 
222 
223 #pragma mark -
224 #pragma mark Delegate methods
225 
229 - (void)setDelegate:(id)aDelegate
230 {
231  _delegate = aDelegate;
232  _implementedCDatePickerDelegateMethods = 0;
233 
234  // Look if the delegate implements or not the delegate methods
235  if ([_delegate respondsToSelector:@selector(datePicker:validateProposedDateValue:timeInterval:)])
236  _implementedCDatePickerDelegateMethods |= CPDatePicker_validateProposedDateValue_timeInterval;
237 }
238 
239 
240 #pragma mark -
241 #pragma mark Layout method
242 
245 - (void)layoutSubviews
246 {
247  [super layoutSubviews];
248 
249  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
250  {
251  if (![_datePickerTextfield superview])
252  [self addSubview:_datePickerTextfield];
253 
254  if ([_datePickerCalendar superview])
255  [_datePickerCalendar removeFromSuperview];
256 
257  [_datePickerTextfield setControlSize:[self controlSize]];
258  [_datePickerTextfield setNeedsLayout];
259  [_datePickerTextfield setNeedsDisplay:YES];
260  }
261  else
262  {
263  if (![_datePickerCalendar superview])
264  [self addSubview:_datePickerCalendar];
265 
266  if ([_datePickerTextfield superview])
267  [_datePickerTextfield removeFromSuperview];
268 
269  [_datePickerCalendar setNeedsLayout];
270  [_datePickerCalendar setNeedsDisplay:YES];
271  }
272 }
273 
274 #pragma mark -
275 #pragma mark Setter
276 
279 - (id)objectValue
280 {
281  // TODO : add timeZone effect. How to do it because js ???
282  return _dateValue
283 }
284 
288 - (void)setObjectValue:(CPDate)aValue
289 {
290  if (![aValue isKindOfClass:[CPDate class]])
291  return;
292 
293  [self setDateValue:aValue];
294 }
295 
296 /* Set the dateValue of the datePicker
297  @param aDateValue the dateValue
298 */
299 - (void)setDateValue:(CPDate)aDateValue
300 {
301  if (aDateValue == nil)
302  return;
303 
304  _invokedByUserEvent = NO;
305  [self _setDateValue:aDateValue timeInterval:_timeInterval];
306 }
307 
312 - (void)_setDateValue:(CPDate)aDateValue timeInterval:(CPTimeInterval)aTimeInterval
313 {
314  // Make sure to have a valid date and avoid NaN values
315  if (!isFinite(aDateValue))
316  {
317  [CPException raise:CPInvalidArgumentException
318  reason:@"aDateValue is not valid"];
319  return;
320  }
321 
322  if (_minDate)
323  aDateValue = new Date (MAX(aDateValue, _minDate));
324 
325  if (_maxDate)
326  aDateValue = new Date (MIN(aDateValue, _maxDate));
327 
328  aTimeInterval = MAX(MIN(aTimeInterval, [_maxDate timeIntervalSinceDate:aDateValue]), [_minDate timeIntervalSinceDate:aDateValue]);
329 
330  if ([aDateValue isEqualToDate:_dateValue] && aTimeInterval == _timeInterval)
331  {
332  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
333  [_datePickerTextfield setDateValue:_dateValue];
334  else
335  [_datePickerCalendar setDateValue:_dateValue];
336 
337  return;
338  }
339 
340  if (_implementedCDatePickerDelegateMethods & CPDatePicker_validateProposedDateValue_timeInterval)
341  {
342  // constrain timeInterval also
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;}
345 
346  [_delegate datePicker:self validateProposedDateValue:aStartDateRef timeInterval:aTimeIntervalRef];
347  }
348 
349  [self willChangeValueForKey:@"objectValue"];
350  [self willChangeValueForKey:@"dateValue"];
351  _dateValue = aDateValue;
352  [super setObjectValue:_dateValue];
353  [self didChangeValueForKey:@"objectValue"];
354  [self didChangeValueForKey:@"dateValue"];
355 
356  [self willChangeValueForKey:@"timeInterval"];
357  _timeInterval = (_datePickerMode == CPSingleDateMode)? 0 : aTimeInterval;
358  [self didChangeValueForKey:@"timeInterval"];
359 
360  if (_invokedByUserEvent)
361  [self sendAction:[self action] to:[self target]];
362 
363  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
364  [_datePickerTextfield setDateValue:_dateValue];
365  else
366  [_datePickerCalendar setDateValue:_dateValue];
367 }
368 
372 - (void)setMinDate:(CPDate)aMinDate
373 {
374  [self willChangeValueForKey:@"minDate"];
375  _minDate = aMinDate;
376  [self didChangeValueForKey:@"minDate"];
377 
378  [self _setDateValue:_dateValue timeInterval:_timeInterval];
379 }
380 
384 - (void)setMaxDate:(CPDate)aMaxDate
385 {
386  [self willChangeValueForKey:@"maxDate"];
387  _maxDate = aMaxDate;
388  [self didChangeValueForKey:@"maxDate"];
389 
390  [self _setDateValue:_dateValue timeInterval:_timeInterval];
391 }
392 
396 - (void)setDatePickerStyle:(CPInteger)aDatePickerStyle
397 {
398  _datePickerStyle = aDatePickerStyle;
399 
400  [self setControlSize:[self controlSize]];
401 
402  [self setNeedsDisplay:YES];
403  [self setNeedsLayout];
404 }
405 
409 - (void)setDatePickerElements:(CPInteger)aDatePickerElements
410 {
411  _datePickerElements = aDatePickerElements;
412 
413  [self setNeedsDisplay:YES];
414  [self setNeedsLayout];
415 }
416 
420 - (void)setDatePickerMode:(CPInteger)aDatePickerMode
421 {
422  _datePickerMode = aDatePickerMode;
423 
424  if (_datePickerMode == CPSingleDateMode)
425  [self _setDateValue:[self dateValue] timeInterval:0];
426 
427  [self setNeedsDisplay:YES];
428  [self setNeedsLayout];
429 }
430 
434 - (void)setTimeInterval:(CPInteger)aTimeInterval
435 {
436  if (_datePickerMode == CPSingleDateMode)
437  return;
438 
439  [self _setDateValue:[self dateValue] timeInterval:aTimeInterval];
440 }
441 
445 - (void)setLocale:(CPLocale)aLocale
446 {
447  _locale = aLocale;
448 
449  if (_formatter)
450  {
451  [self willChangeValueForKey:@"locale"];
452  [_formatter setLocale:_locale];
453  [self didChangeValueForKey:@"locale"];
454  }
455 
456  // This will update the textFields (usefull when changing with a date with pm and am)
457  [_datePickerTextfield setDateValue:_dateValue];
458  [self setNeedsDisplay:YES];
459  [self setNeedsLayout];
460 }
461 
466 - (void)setBezeled:(BOOL)shouldBeBezeled
467 {
468  _isBezeled = shouldBeBezeled;
469 
470  if (shouldBeBezeled)
471  [self setThemeState:CPThemeStateBezeled];
472  else
473  [self unsetThemeState:CPThemeStateBezeled];
474 }
475 
480 - (void)setBordered:(BOOL)shouldBeBordered
481 {
482  _isBordered = shouldBeBordered;
483 
484  if (shouldBeBordered)
485  [self setThemeState:CPThemeStateBordered];
486  else
487  [self unsetThemeState:CPThemeStateBordered];
488 }
489 
494 - (void)setTextFont:(CPFont)aFont
495 {
496  [self setFont:aFont];
497 }
498 
502 - (void)setEnabled:(BOOL)aBoolean
503 {
504  [super setEnabled:aBoolean];
505 
506  [_datePickerTextfield setEnabled:aBoolean];
507  [_datePickerCalendar setEnabled:aBoolean];
508 }
509 
513 - (void)setBackgroundColor:(CPColor)aColor
514 {
515  _backgroundColor = aColor;
516  [self setNeedsLayout];
517 }
518 
522 - (void)setDrawsBackground:(BOOL)aBoolean
523 {
524  [self willChangeValueForKey:@"drawsBackground"];
525  _drawsBackground = aBoolean;
526  [self didChangeValueForKey:@"drawsBackground"];
527 
528  [self setNeedsLayout];
529 }
530 
534 - (void)setTimeZone:(CPTimeZone)aTimeZone
535 {
536  [self willChangeValueForKey:@"timeZone"];
537  _timeZone = aTimeZone;
538  [self didChangeValueForKey:@"timeZone"];
539 
540  [self setNeedsLayout];
541 
542  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
543  [_datePickerTextfield setDateValue:_dateValue];
544  else
545  [_datePickerCalendar setDateValue:_dateValue];
546 }
547 
548 
549 #pragma mark -
550 #pragma mark First responder methods
551 
554 - (BOOL)becomeFirstResponder
555 {
556  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
557  {
558  if (![super becomeFirstResponder])
559  return NO;
560 
561  [_datePickerTextfield _selectTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]];
562 
563  return YES;
564  }
565 
566  return NO;
567 }
568 
571 - (BOOL)acceptsFirstResponder
572 {
573  return YES;
574 }
575 
578 - (BOOL)resignFirstResponder
579 {
580  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
581  [_datePickerTextfield resignFirstResponder];
582 
583  return YES;
584 }
585 
586 
587 #pragma mark -
588 #pragma mark getter
589 
593 - (BOOL)isBezeled
594 {
595  return [self hasThemeState:CPThemeStateBezeled];
596 }
597 
601 - (BOOL)isBordered
602 {
603  return [self hasThemeState:CPThemeStateBordered];
604 }
605 
609 - (CPFont)textFont
610 {
611  return [self font];
612 }
613 
616 - (BOOL)_isAmericanFormat
617 {
618  return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
619 }
620 
623 - (BOOL)_isEnglishFormat
624 {
625  return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"];
626 }
627 
628 
629 #pragma mark -
630 #pragma mark Key event
631 
635 - (void)keyDown:(CPEvent)anEvent
636 {
637  if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
638  [_datePickerTextfield keyDown:anEvent];
639 }
640 
641 @end
642 
643 var CPDatePickerModeKey = @"CPDatePickerModeKey",
644  CPIntervalKey = @"CPIntervalKey",
645  CPMinDateKey = @"CPMinDateKey",
646  CPMaxDateKey = @"CPMaxDateKey",
647  CPBackgroundColorKey = @"CPBackgroundColorKey",
648  CPDrawsBackgroundKey = @"CPDrawsBackgroundKey",
649  CPTextFontKey = @"CPTextFontKey",
650  CPDatePickerElementsKey = @"CPDatePickerElementsKey",
651  CPDatePickerStyleKey = @"CPDatePickerStyleKey",
652  CPLocaleKey = @"CPLocaleKey",
653  CPBorderedKey = @"CPBorderedKey",
654  CPDateValueKey = @"CPDateValueKey";
655 
656 @implementation CPDatePicker (CPCoding)
657 
658 - (id)initWithCoder:(CPCoder)aCoder
659 {
660  self = [super initWithCoder:aCoder];
661 
662  if (self)
663  {
664  _textFont = [aCoder decodeObjectForKey:CPTextFontKey];
665  _minDate = [aCoder decodeObjectForKey:CPMinDateKey] || [CPDate distantPast];
666  _maxDate = [aCoder decodeObjectForKey:CPMaxDateKey] || [CPDate distantFuture];
667  _timeInterval = [aCoder decodeDoubleForKey:CPIntervalKey];
668  _datePickerMode = [aCoder decodeIntForKey:CPDatePickerModeKey];
669  _datePickerElements = [aCoder decodeIntForKey:CPDatePickerElementsKey];
670  [self setDatePickerStyle:[aCoder decodeIntForKey:CPDatePickerStyleKey]];
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];
676 
677  [self _init];
678  }
679 
680  return self
681 }
682 
683 - (void)encodeWithCoder:(CPCoder)aCoder
684 {
685  // FIXME Do we need to encode _datePickerTextfield and _datePickerCalendar? As subviews they'll be encoded, but when we decode we recreate them anyhow.
686  [super encodeWithCoder:aCoder];
687 
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];
700 
701 }
702 
703 @end
704 @implementation _CPDatePickerValueBinder : CPBinder
705 {
706  id __doxygen__;
707 }
708 
709 @end
710 
712 
713 - (int)_daysInMonth
714 {
715  return 32 - new Date(self.getFullYear(), self.getMonth(), 32).getDate();
716 }
717 
718 - (void)_resetToMidnight
719 {
720  self.setHours(0);
721  self.setMinutes(0);
722  self.setSeconds(0);
723  self.setMilliseconds(0);
724 }
725 
726 - (void)_resetToLastSeconds
727 {
728  self.setHours(23);
729  self.setMinutes(59);
730  self.setSeconds(59);
731  self.setMilliseconds(99);
732 }
733 
734 @end
735 
737 
741 - (BOOL)isBordered
742 {
743  return _isBordered;
744 }
745 
749 - (void)setBordered:(BOOL)aValue
750 {
751  _isBordered = aValue;
752 }
753 
757 - (BOOL)isBezeled
758 {
759  return _isBezeled;
760 }
761 
765 - (void)setBezeled:(BOOL)aValue
766 {
767  _isBezeled = aValue;
768 }
769 
773 - (BOOL)drawsBackground
774 {
775  return _drawsBackground;
776 }
777 
781 - (void)setDrawsBackground:(BOOL)aValue
782 {
783  _drawsBackground = aValue;
784 }
785 
789 - (CPDate)dateValue
790 {
791  return _dateValue;
792 }
793 
797 - (void)setDateValue:(CPDate)aValue
798 {
799  _dateValue = aValue;
800 }
801 
805 - (CPDate)minDate
806 {
807  return _minDate;
808 }
809 
813 - (void)setMinDate:(CPDate)aValue
814 {
815  _minDate = aValue;
816 }
817 
821 - (CPDate)maxDate
822 {
823  return _maxDate;
824 }
825 
829 - (void)setMaxDate:(CPDate)aValue
830 {
831  _maxDate = aValue;
832 }
833 
837 - (CPFont)textFont
838 {
839  return _textFont;
840 }
841 
845 - (void)setTextFont:(CPFont)aValue
846 {
847  _textFont = aValue;
848 }
849 
853 - (CPLocale)locale
854 {
855  return _locale;
856 }
857 
861 - (void)setLocale:(CPLocale)aValue
862 {
863  _locale = aValue;
864 }
865 
869 - (CPCalendar)calendar
870 {
871  return _calendar;
872 }
873 
877 - (void)setCalendar:(CPCalendar)aValue
878 {
879  _calendar = aValue;
880 }
881 
885 - (CPTimeZone)timeZone
886 {
887  return _timeZone;
888 }
889 
893 - (void)setTimeZone:(CPTimeZone)aValue
894 {
895  _timeZone = aValue;
896 }
897 
901 - (id)delegate
902 {
903  return _delegate;
904 }
905 
909 - (void)setDelegate:(id)aValue
910 {
911  _delegate = aValue;
912 }
913 
917 - (CPInteger)datePickerElements
918 {
919  return _datePickerElements;
920 }
921 
925 - (void)setDatePickerElements:(CPInteger)aValue
926 {
927  _datePickerElements = aValue;
928 }
929 
933 - (CPInteger)datePickerMode
934 {
935  return _datePickerMode;
936 }
937 
941 - (void)setDatePickerMode:(CPInteger)aValue
942 {
943  _datePickerMode = aValue;
944 }
945 
949 - (CPInteger)datePickerStyle
950 {
951  return _datePickerStyle;
952 }
953 
957 - (void)setDatePickerStyle:(CPInteger)aValue
958 {
959  _datePickerStyle = aValue;
960 }
961 
965 - (CPInteger)timeInterval
966 {
967  return _timeInterval;
968 }
969 
973 - (void)setTimeInterval:(CPInteger)aValue
974 {
975  _timeInterval = aValue;
976 }
977 
978 @end