From 1649ea64cce015f08e0727c55cc97b3ac4df5816 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 26 Mar 2013 16:52:46 -0700 Subject: [PATCH] New: CPDatePicker Support - Added CPDatePicker - Added CPLocale - nib2cib for CPDatePicker Test app in Tests/Manual/CPDatePickerTest --- AppKit/AppKit.j | 1 + AppKit/CPDatePicker/CPDatePicker.j | 683 +++ AppKit/CPDatePicker/_CPDatePickerCalendar.j | 1212 ++++++ AppKit/CPDatePicker/_CPDatePickerClock.j | 284 ++ AppKit/CPDatePicker/_CPDatePickerTextField.j | 1433 +++++++ ...picker-calendar-arrow-left-highlighted.png | Bin 0 -> 1109 bytes .../datepicker-calendar-arrow-left.png | Bin 0 -> 1193 bytes ...icker-calendar-arrow-right-highlighted.png | Bin 0 -> 1108 bytes .../datepicker-calendar-arrow-right.png | Bin 0 -> 1195 bytes .../datepicker-circle-image-highlighted.png | Bin 0 -> 1162 bytes .../Resources/datepicker-circle-image.png | Bin 0 -> 1235 bytes .../Resources/datepicker-clock-disabled.png | Bin 0 -> 6249 bytes .../datepicker-clock-hour-hand-disabled.png | Bin 0 -> 1188 bytes .../Resources/datepicker-clock-hour-hand.png | Bin 0 -> 1205 bytes .../datepicker-clock-middle-hand-disabled.png | Bin 0 -> 1345 bytes .../datepicker-clock-middle-hand.png | Bin 0 -> 1374 bytes .../datepicker-clock-minute-hand-disabled.png | Bin 0 -> 1441 bytes .../datepicker-clock-minute-hand.png | Bin 0 -> 1467 bytes .../datepicker-clock-second-hand-disabled.png | Bin 0 -> 1457 bytes .../datepicker-clock-second-hand.png | Bin 0 -> 1474 bytes .../Aristo/Resources/datepicker-clock.png | Bin 0 -> 6574 bytes .../Resources/datepicker-date-segment-0.png | Bin 0 -> 240 bytes .../Resources/datepicker-date-segment-1.png | Bin 0 -> 137 bytes .../Resources/datepicker-date-segment-2.png | Bin 0 -> 238 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 223 + .../Aristo2/Resources/Aristo-11-06-07_501.png | Bin 0 -> 998 bytes ...picker-calendar-arrow-left-highlighted.png | Bin 0 -> 1109 bytes .../datepicker-calendar-arrow-left.png | Bin 0 -> 1193 bytes ...icker-calendar-arrow-right-highlighted.png | Bin 0 -> 1108 bytes .../datepicker-calendar-arrow-right.png | Bin 0 -> 1195 bytes .../datepicker-circle-image-highlighted.png | Bin 0 -> 1162 bytes .../Resources/datepicker-circle-image.png | Bin 0 -> 1235 bytes .../Resources/datepicker-clock-disabled.png | Bin 0 -> 6249 bytes .../datepicker-clock-hour-hand-disabled.png | Bin 0 -> 1188 bytes .../Resources/datepicker-clock-hour-hand.png | Bin 0 -> 1205 bytes .../datepicker-clock-middle-hand-disabled.png | Bin 0 -> 1345 bytes .../datepicker-clock-middle-hand.png | Bin 0 -> 1374 bytes .../datepicker-clock-minute-hand-disabled.png | Bin 0 -> 1441 bytes .../datepicker-clock-minute-hand.png | Bin 0 -> 1467 bytes .../datepicker-clock-second-hand-disabled.png | Bin 0 -> 1457 bytes .../datepicker-clock-second-hand.png | Bin 0 -> 1474 bytes .../Aristo2/Resources/datepicker-clock.png | Bin 0 -> 6574 bytes .../Resources/datepicker-date-segment-0.png | Bin 0 -> 240 bytes .../Resources/datepicker-date-segment-1.png | Bin 0 -> 137 bytes .../Resources/datepicker-date-segment-2.png | Bin 0 -> 238 bytes AppKit/Themes/Aristo2/ThemeDescriptors.j | 205 + Foundation/CPDateFormatter.j | 9 +- Foundation/CPLocale.j | 233 ++ Foundation/Foundation.j | 1 + Tests/Manual/CPDatePickerTest/AppController.j | 76 + Tests/Manual/CPDatePickerTest/Info.plist | 10 + Tests/Manual/CPDatePickerTest/Jakefile | 94 + .../CPDatePickerTest/Resources/MainMenu.cib | 1 + .../CPDatePickerTest/Resources/MainMenu.xib | 3711 +++++++++++++++++ .../CPDatePickerTest/Resources/spinner.gif | Bin 0 -> 1434 bytes .../Manual/CPDatePickerTest/index-debug.html | 107 + Tests/Manual/CPDatePickerTest/index.html | 77 + Tests/Manual/CPDatePickerTest/main.j | 18 + Tools/nib2cib/NSAppKit.j | 1 + Tools/nib2cib/NSDate.j | 40 + Tools/nib2cib/NSDatePicker.j | 228 + Tools/nib2cib/NSFoundation.j | 1 + 62 files changed, 8646 insertions(+), 2 deletions(-) create mode 100644 AppKit/CPDatePicker/CPDatePicker.j create mode 100644 AppKit/CPDatePicker/_CPDatePickerCalendar.j create mode 100644 AppKit/CPDatePicker/_CPDatePickerClock.j create mode 100644 AppKit/CPDatePicker/_CPDatePickerTextField.j create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left-highlighted.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right-highlighted.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-circle-image-highlighted.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-circle-image.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-disabled.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand-disabled.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand-disabled.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand-disabled.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand-disabled.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-clock.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-date-segment-0.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-date-segment-1.png create mode 100644 AppKit/Themes/Aristo/Resources/datepicker-date-segment-2.png create mode 100644 AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left-highlighted.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right-highlighted.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-circle-image-highlighted.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-circle-image.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-disabled.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand-disabled.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand-disabled.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand-disabled.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand-disabled.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-clock.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-date-segment-0.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-date-segment-1.png create mode 100644 AppKit/Themes/Aristo2/Resources/datepicker-date-segment-2.png create mode 100644 Foundation/CPLocale.j create mode 100644 Tests/Manual/CPDatePickerTest/AppController.j create mode 100644 Tests/Manual/CPDatePickerTest/Info.plist create mode 100644 Tests/Manual/CPDatePickerTest/Jakefile create mode 100644 Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPDatePickerTest/Resources/spinner.gif create mode 100644 Tests/Manual/CPDatePickerTest/index-debug.html create mode 100644 Tests/Manual/CPDatePickerTest/index.html create mode 100644 Tests/Manual/CPDatePickerTest/main.j create mode 100644 Tools/nib2cib/NSDate.j create mode 100644 Tools/nib2cib/NSDatePicker.j diff --git a/AppKit/AppKit.j b/AppKit/AppKit.j index 27f3a3001..bada5344d 100644 --- a/AppKit/AppKit.j +++ b/AppKit/AppKit.j @@ -55,6 +55,7 @@ @import "CPController.j" @import "CPCookie.j" @import "CPCursor.j" +@import "CPDatePicker.j" @import "CPDocument.j" @import "CPDocumentController.j" @import "CPEvent.j" diff --git a/AppKit/CPDatePicker/CPDatePicker.j b/AppKit/CPDatePicker/CPDatePicker.j new file mode 100644 index 000000000..ac7cd70da --- /dev/null +++ b/AppKit/CPDatePicker/CPDatePicker.j @@ -0,0 +1,683 @@ +/* CPDatePicker.j +* AppKit +* +* Created by Alexandre Wilhelm +* Copyright 2012 +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import "CPControl.j" +@import "CPFont.j" +@import "CPTextField.j" +@import "_CPDatePickerTextField.j" +@import "_CPDatePickerCalendar.j" + +@import +@import +@import +@import +@import + +@class CPStepper +@class CPApp + +@global CPLocaleLanguageCode +@global CPDateFormatterShortStyle + +var CPDatePicker_validateProposedDateValue_timeInterval = 1 << 1; + +CPSingleDateMode = 0; +CPRangeDateMode = 1; + +CPTextFieldAndStepperDatePickerStyle = 0; +CPClockAndCalendarDatePickerStyle = 1; +CPTextFieldDatePickerStyle = 2; + +CPHourMinuteDatePickerElementFlag = 0x000c; +CPHourMinuteSecondDatePickerElementFlag = 0x000e; +CPTimeZoneDatePickerElementFlag = 0x0010; +CPYearMonthDatePickerElementFlag = 0x00c0; +CPYearMonthDayDatePickerElementFlag = 0x00e0; +CPEraDatePickerElementFlag = 0x0100; + +/*! + @ingroup appkit + This control displays a datepicker in a Cappuccino application +*/ +@implementation CPDatePicker : CPControl +{ + BOOL _isBordered @accessors(getter=isBordered, setter=setBordered:); + BOOL _isBezeled @accessors(getter=isBezeled, setter=setBezeled:); + BOOL _drawsBackground @accessors(property=drawsBackground); + CPDate _dateValue @accessors(property=dateValue); + CPDate _minDate @accessors(property=minDate); + CPDate _maxDate @accessors(property=maxDate); + CPFont _textFont @accessors(property=textFont); + CPLocale _locale @accessors(property=locale); + //CPCalendar _calendar @accessors(property=calendar); + //CPTimeZone _timeZone @accessors(property=timeZone); + CPDateFormatter _formatter @accessors(property=formatter); + id _delegate @accessors(property=delegate); + unsigned _datePickerElements @accessors(property=datePickerElements); + CPInteger _datePickerMode @accessors(property=datePickerMode); + CPInteger _datePickerStyle @accessors(property=datePickerStyle); + CPInteger _timeInterval @accessors(property=timeInterval); + + _CPDatePickerTextField _datePickerTextfield; + _CPDatePickerCalendar _datePickerCalendar; + unsigned _implementedCDatePickerDelegateMethods; +} + + +#pragma mark - +#pragma mark Theme methods + ++ (CPString)defaultThemeClass +{ + return @"datePicker"; +} + ++ (id)themeAttributes +{ + return @{ + @"bezel-color": [CPColor clearColor], + @"border-width" : 1.0, + @"border-color": [CPColor clearColor], + @"content-inset": CGInsetMakeZero(), + @"bezel-inset": CGInsetMakeZero(), + @"datepicker-textfield-bezel-color": [CPColor clearColor], + @"min-size-datepicker-textfield": CGSizeMakeZero(), + @"content-inset-datepicker-textfield": CGInsetMakeZero(), + @"content-inset-datepicker-textfield-separator": CGInsetMakeZero(), + @"separator-content-inset": CGInsetMakeZero(), + @"date-hour-margin": 5.0, + @"stepper-margin": 5.0, + @"bezel-color-calendar": [CPColor clearColor], + @"title-text-color": [CPColor blackColor], + @"title-text-shadow-color": [CPColor clearColor], + @"title-text-shadow-offset": CGSizeMakeZero(), + @"title-font": [CPNull null], + @"weekday-text-color": [CPColor blackColor], + @"weekday-text-shadow-color": [CPColor clearColor], + @"weekday-text-shadow-offset": CGSizeMakeZero(), + @"weekday-font": [CPNull null], + @"arrow-image-left": [CPNull null], + @"arrow-image-right": [CPNull null], + @"arrow-image-left-highlighted": [CPNull null], + @"arrow-image-right-highlighted": [CPNull null], + @"arrow-inset": CGInsetMakeZero(), + @"circle-image": [CPNull null], + @"circle-image-highlighted": [CPNull null], + @"tile-text-color": [CPColor blackColor], + @"tile-text-shadow-color": [CPColor clearColor], + @"tile-text-shadow-offset": CGSizeMakeZero(), + @"tile-font": [CPNull null], + @"size-tile": CGSizeMakeZero(), + @"size-calendar": CGSizeMakeZero(), + @"size-header": CGSizeMakeZero(), + @"min-size-calendar": CGSizeMakeZero(), + @"max-size-calendar": CGSizeMakeZero(), + @"bezel-color-clock": [CPColor clearColor], + @"clock-text-color": [CPColor blackColor], + @"clock-text-shadow-color": [CPColor clearColor], + @"clock-text-shadow-offset": CGSizeMakeZero(), + @"clock-font": [CPNull null], + @"second-hand-color": [CPColor clearColor], + @"hour-hand-color": [CPColor clearColor], + @"middle-hand-color": [CPColor clearColor], + @"minute-hand-color": [CPColor clearColor], + @"size-clock": CGSizeMakeZero(), + @"second-hand-size": CGSizeMakeZero(), + @"hour-hand-size": CGSizeMakeZero(), + @"middle-hand-size": CGSizeMakeZero(), + @"minute-hand-size": CGSizeMakeZero(), + }; +} + + +#pragma mark - +#pragma mark Binding methods + ++ (Class)_binderClassForBinding:(CPString)theBinding +{ + if (theBinding == CPValueBinding || theBinding == CPMinValueBinding || theBinding == CPMaxValueBinding) + return [_CPDatePickerValueBinder class]; + + return [super _binderClassForBinding:theBinding]; +} + +- (id)_replacementKeyPathForBinding:(CPString)aBinding +{ + if (aBinding == CPValueBinding) + return @"dateValue"; + + if (aBinding == CPMinValueBinding) + return @"minDate"; + + if (aBinding == CPMaxValueBinding) + return @"maxDate"; + + return [super _replacementKeyPathForBinding:aBinding]; +} + + +#pragma mark - +#pragma mark Init methods + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [super initWithFrame:aFrame]) + { + _drawsBackground = YES; + _datePickerStyle = CPTextFieldAndStepperDatePickerStyle; + _datePickerMode = CPSingleDateMode; + _datePickerElements = CPYearMonthDayDatePickerElementFlag | CPHourMinuteSecondDatePickerElementFlag; + _timeInterval = 0; + _implementedCDatePickerDelegateMethods = 0; + _formatter = [[CPDateFormatter alloc] init]; + + [self setObjectValue:[CPDate date]]; + _minDate = [CPDate distantPast]; + _maxDate = [CPDate distantFuture]; + + [self setBezeled:YES]; + [self setBordered:YES]; + + [self _init]; + } + + return self +} + +- (void)_init +{ + if (!_locale) + _locale = [CPLocale currentLocale]; + + _datePickerTextfield = [[_CPDatePickerTextField alloc] initWithFrame:[self bounds] withDatePicker:self]; + + [_datePickerTextfield setDateValue:_dateValue]; + [self addSubview:_datePickerTextfield]; + + _datePickerCalendar = [[_CPDatePickerCalendar alloc] initWithFrame:[self bounds] withDatePicker:self]; + [_datePickerCalendar setDateValue:_dateValue]; + [_datePickerCalendar setHidden:YES]; + [self addSubview:_datePickerCalendar]; + + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; +} + + +#pragma mark - +#pragma mark Delegate methods + +/*! Set the delegate of the datePicker + @param aDelegate delegate of the datePicker +*/ +- (void)setDelegate:(id)aDelegate +{ + _delegate = aDelegate; + _implementedCDatePickerDelegateMethods = 0; + + // Look if the delegate implements or not the delegate methods + if ([_delegate respondsToSelector:@selector(datePicker:validateProposedDateValue:timeInterval:)]) + _implementedCDatePickerDelegateMethods |= CPDatePicker_validateProposedDateValue_timeInterval; +} + + +#pragma mark - +#pragma mark Layout method + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + [super layoutSubviews]; + + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) + { + [_datePickerTextfield setHidden:NO]; + [_datePickerCalendar setHidden:YES]; + [_datePickerTextfield setNeedsLayout]; + } + else + { + [_datePickerCalendar setHidden:NO]; + [_datePickerTextfield setHidden:YES]; + [_datePickerCalendar setNeedsLayout]; + } +} + +#pragma mark - +#pragma mark Setter + +/*! Return the objectValue of the datePicker. The objectValue is made with the current formatter of the datePicker +*/ +- (void)objectValue +{ + // try + // { + // return [_formatter stringFromDate:_dateValue]; + // } + // catch(e) + // { + return _dateValue + // } +} + +/*! Set the objectValue ofhe datePier. It has to be a CPDate + @param aDateValue the dateValue +*/ +- (void)setObjectValue:(CPDate)aValue +{ + [self setDateValue:aValue]; +} + +/* Set the dateValue of the datePicker + @param aDateValue the dateValue +*/ +- (void)setDateValue:(CPDate)aDateValue +{ + if (aDateValue == nil) + return; + + [self _setDateValue:aDateValue timeInterval:_timeInterval]; +} + +/*! Set the dateValue and the timeInterval. This method checks the min and max date of the datePicker also. It will call the delegate if possible. + @param aDateValue the dateValue + @param aTimeInterval the timeInterval +*/ +- (void)_setDateValue:(CPDate)aDateValue timeInterval:(CPTimeInterval)aTimeInterval +{ + if (_minDate) + aDateValue = new Date (MAX(aDateValue, _minDate)); + + if (_maxDate) + aDateValue = new Date (MIN(aDateValue, _maxDate)); + + aTimeInterval = MAX(MIN(aTimeInterval, [_maxDate timeIntervalSinceDate:aDateValue]), [_minDate timeIntervalSinceDate:aDateValue]); + + if ([aDateValue isEqualToDate:_dateValue] && aTimeInterval == _timeInterval) + return; + + if (_implementedCDatePickerDelegateMethods & CPDatePicker_validateProposedDateValue_timeInterval) + { + // constrain timeInterval also + var aStartDateRef = function(x){if (typeof x == 'undefined') return aDateValue; aDateValue = x;} + var aTimeIntervalRef = function(x){if (typeof x == 'undefined') return aTimeInterval; aTimeInterval = x;} + + [_delegate datePicker:self validateProposedDateValue:aStartDateRef timeInterval:aTimeIntervalRef]; + } + + [self willChangeValueForKey:@"objectValue"]; + [self willChangeValueForKey:@"dateValue"]; + _dateValue = aDateValue; + [self didChangeValueForKey:@"dateValue"]; + [self didChangeValueForKey:@"objectValue"]; + + [self willChangeValueForKey:@"timeInterval"]; + _timeInterval = (_datePickerMode == CPSingleDateMode)? 0 : aTimeInterval; + [self didChangeValueForKey:@"timeInterval"]; + + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) + [_datePickerTextfield setDateValue:_dateValue]; + else + [_datePickerCalendar setDateValue:_dateValue]; +} + +/*! Set the minDate of the datePicker + @param aMinDate the minDate +*/ +- (void)setMinDate:(CPDate)aMinDate +{ + [self willChangeValueForKey:@"minDate"]; + _minDate = aMinDate; + [self didChangeValueForKey:@"minDate"]; + + [self _setDateValue:_dateValue timeInterval:_timeInterval]; +} + +/*! Set the maxDate of the datePicker + @param aMaxDate the maxDate +*/ +- (void)setMaxDate:(CPDate)aMaxDate +{ + [self willChangeValueForKey:@"maxDate"]; + _maxDate = aMaxDate; + [self didChangeValueForKey:@"maxDate"]; + + [self _setDateValue:_dateValue timeInterval:_timeInterval]; +} + +/*! Set the syle of the datePicker + @param aDatePickerStyle the datePicker style +*/ +- (void)setDatePickerStyle:(CPDate)aDatePickerStyle +{ + _datePickerStyle = aDatePickerStyle; + + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; +} + +/*! Set the elements of the datePicker + @param aDatePickerElements the datePicker elements +*/ +- (void)setDatePickerElements:(CPDate)aDatePickerElements +{ + _datePickerElements = aDatePickerElements; + + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; +} + +/*! Set the mode of the datePicker + @param aDatePickerMode the datePicker mode +*/ +- (void)setDatePickerMode:(CPDate)aDatePickerMode +{ + _datePickerMode = aDatePickerMode; + + if (_datePickerMode == CPSingleDateMode) + [self _setDateValue:[self dateValue] timeInterval:0]; + + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; +} + +/*! Set the timeInterval of the datePicker + @param aTimeInterval the timeInterval of the datePicker +*/ +- (void)setTimeInterval:(CPInteger)aTimeInterval +{ + if (_datePickerMode == CPSingleDateMode) + return; + + [self _setDateValue:[self dateValue] timeInterval:aTimeInterval]; +} + +/*! Set the locale of the datePicker. This update laso the locale of the formatter. + @param aLocale the locale +*/ +- (void)setLocale:(CPLocale)aLocale +{ + _locale = aLocale; + + if (_formatter) + { + [self willChangeValueForKey:@"locale"]; + [_formatter setLocale:_locale]; + [self didChangeValueForKey:@"locale"]; + } + + // This will update the textFields (usefull when changing with a date with pm and am) + [_datePickerTextfield setDateValue:_dateValue]; + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; +} + +/*! + Sets whether the datepicker will have a bezeled border. + @param shouldBeBezeled \c YES means the datepicker will draw a bezeled border +*/ +- (void)setBezeled:(BOOL)shouldBeBezeled +{ + _isBezeled = shouldBeBezeled; + + if (shouldBeBezeled) + [self setThemeState:CPThemeStateBezeled]; + else + [self unsetThemeState:CPThemeStateBezeled]; +} + +/*! + Sets whether the datepicker will have a border drawn. (actually it does nothing) + @param shouldBeBordered \c YES makes the datepicker draw a border +*/ +- (void)setBordered:(BOOL)shouldBeBordered +{ + _isBordered = shouldBeBordered; + + if (shouldBeBordered) + [self setThemeState:CPThemeStateBordered]; + else + [self unsetThemeState:CPThemeStateBordered]; +} + +/*! + Sets the font of the control. + @param aFont +*/ +- (void)setTextFont:(CPFont)aFont +{ + [self setFont:aFont]; +} + +/*! Sets the enabled status of the control. Controls that are not enabled can not be used by the user and obtain the CPThemeStateDisabled theme state. + @param a boolean. YES if the control should be enabled, otherwise NO. +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [super setEnabled:aBoolean]; + + [_datePickerTextfield setEnabled:aBoolean]; + [_datePickerCalendar setEnabled:aBoolean]; +} + +/*! Set the background color of the datePicker + @param aColor +*/ +- (void)setBackgroundColor:(CPColor)aColor +{ + _backgroundColor = aColor; + [self setNeedsLayout]; +} + +/*! Set the boolean drawsBackgroundColor + @param aBoolean +*/ +- (void)setDrawsBackground:(BOOL)aBoolean +{ + [self willChangeValueForKey:@"drawsBackground"]; + _drawsBackground = aBoolean; + [self didChangeValueForKey:@"drawsBackground"]; + + [self setNeedsLayout]; +} + + +#pragma mark - +#pragma mark First responder methods + +/*! Return YES if style is set to CPTextFieldAndStepperDatePickerStyle or CPTextFieldDatePickerStyle +*/ +- (BOOL)becomeFirstResponder +{ + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) + [_datePickerTextfield _selecteTextFieldWithFlags:[[CPApp currentEvent] modifierFlags]]; + else + return NO; + + return YES; +} + +/*! Return YES +*/ +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +/*! Return YES +*/ +- (BOOL)resignFirstResponder +{ + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) + [_datePickerTextfield resignFirstResponder]; + + return YES; +} + + +#pragma mark - +#pragma mark getter + +/*! + Returns \c YES if the textfield is bezeled. +*/ +- (BOOL)isBezeled +{ + return [self hasThemeState:CPThemeStateBezeled]; +} + +/*! + Returns \c YES if the textfield has a border. +*/ +- (BOOL)isBordered +{ + return [self hasThemeState:CPThemeStateBordered]; +} + +/*! + Returns the font of the control. +*/ +- (CPFont)textFont +{ + return [self font]; +} + +/*! Check if we are in the american format or not. Depending on the locale +*/ +- (BOOL)_isAmericanFormat +{ + return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"]; +} + +/*! Check if we are in the english format or not. Depending on the locale +*/ +- (BOOL)_isEnglishFormat +{ + return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"]; +} + + +#pragma mark - +#pragma mark Key event + +/*! Key down event + @param anEvent +*/ +- (void)keyDown:(CPEvent)anEvent +{ + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle) + [_datePickerTextfield keyDown:anEvent]; +} + +@end + +var CPDatePickerModeKey = @"CPDatePickerModeKey", + CPIntervalKey = @"CPIntervalKey", + CPMinDateKey = @"CPMinDateKey", + CPMaxDateKey = @"CPMaxDateKey", + CPBackgroundColorKey = @"CPBackgroundColorKey", + CPDrawsBackgroundKey = @"CPDrawsBackgroundKey", + CPTextFontKey = @"CPTextFontKey", + CPDatePickerElementsKey = @"CPDatePickerElementsKey", + CPDatePickerStyleKey = @"CPDatePickerStyleKey", + CPLocaleKey = @"CPLocaleKey", + CPFormatterKey = @"CPFormatterKey", + CPBorderedKey = @"CPBorderedKey", + CPDateValueKey = @"CPDateValueKey"; + +@implementation CPDatePicker (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + _textFont = [aCoder decodeObjectForKey:CPTextFontKey]; + _minDate = [aCoder decodeObjectForKey:CPMinDateKey] || [CPDate distantPast]; + _maxDate = [aCoder decodeObjectForKey:CPMaxDateKey] || [CPDate distantFuture]; + _timeInterval = [aCoder decodeDoubleForKey:CPIntervalKey]; + _datePickerMode = [aCoder decodeIntForKey:CPDatePickerModeKey]; + _datePickerElements = [aCoder decodeIntForKey:CPDatePickerElementsKey]; + _datePickerStyle = [aCoder decodeIntForKey:CPDatePickerStyleKey]; + _locale = [aCoder decodeObjectForKey:CPLocaleKey]; + _formatter = [aCoder decodeObjectForKey:CPFormatterKey]; + _dateValue = [aCoder decodeObjectForKey:CPDateValueKey]; + _backgroundColor = [aCoder decodeObjectForKey:CPBackgroundColorKey]; + _drawsBackground = [aCoder decodeBoolForKey:CPDrawsBackgroundKey]; + _isBordered = [aCoder decodeBoolForKey:CPBorderedKey]; + [self _init]; + } + + return self +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + [aCoder encodeDouble:_timeInterval forKey:CPIntervalKey]; + [aCoder encodeInt:_datePickerMode forKey:CPDatePickerModeKey]; + [aCoder encodeInt:_datePickerStyle forKey:CPDatePickerStyleKey]; + [aCoder encodeInt:_datePickerElements forKey:CPDatePickerElementsKey]; + [aCoder encodeObject:_minDate forKey:CPMinDateKey]; + [aCoder encodeObject:_maxDate forKey:CPMaxDateKey] + [aCoder encodeObject:_dateValue forKey:CPDateValueKey];; + [aCoder encodeObject:_textFont forKey:CPTextFontKey]; + [aCoder encodeObject:_locale forKey:CPLocaleKey]; + [aCoder encodeObject:_formatter forKey:CPFormatterKey]; + [aCoder encodeObject:_backgroundColor forKey:CPBackgroundColorKey]; + [aCoder encodeObject:_drawsBackground forKey:CPDrawsBackgroundKey]; + [aCoder encodeObject:_isBordered forKey:CPBorderedKey]; +} + +@end + +@implementation _CPDatePickerValueBinder : CPBinder +{ +} + +@end + +@implementation CPDate (CPDatePickerAdditions) + +- (int)_daysInMonth +{ + return 32 - new Date(self.getFullYear(), self.getMonth(), 32).getDate(); +} + +- (void)_resetToMidnight +{ + self.setHours(0); + self.setMinutes(0); + self.setSeconds(0); + self.setMilliseconds(0); +} + +- (void)_resetToLastSeconds +{ + self.setHours(23); + self.setMinutes(59); + self.setSeconds(59); + self.setMilliseconds(99); +} + +@end \ No newline at end of file diff --git a/AppKit/CPDatePicker/_CPDatePickerCalendar.j b/AppKit/CPDatePicker/_CPDatePickerCalendar.j new file mode 100644 index 000000000..bf5e9399a --- /dev/null +++ b/AppKit/CPDatePicker/_CPDatePickerCalendar.j @@ -0,0 +1,1212 @@ +/* _CPDatePickerCalendar.j +* AppKit +* +* Created by Alexandre Wilhelm +* Copyright 2012 +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import "CPControl.j" +@import "CPTextField.j" +@import "CPButton.j" +@import "CPView.j" +@import "CPBezierPath.j" +@import "_CPDatePickerClock.j" + +@import + +@class CPDatePicker + +@global CPSingleDateMode +@global CPRangeDateMode + +@global CPTextFieldAndStepperDatePickerStyle +@global CPTextFieldDatePickerStyle + +@global CPHourMinuteDatePickerElementFlag +@global CPHourMinuteSecondDatePickerElementFlag +@global CPTimeZoneDatePickerElementFlag +@global CPYearMonthDatePickerElementFlag +@global CPYearMonthDayDatePickerElementFlag +@global CPEraDatePickerElementFlag + +var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"], + CPShortWeekDayNameArrayUS = [@"Su", @"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa"], + CPShortWeekDayNameArrayFr = [@"L", @"M", @"M", @"J", @"V", @"S", @"D"], + CPShortWeekDayNameArrayDe = [@"M", @"D", @"M", @"D", @"F", @"S", @"S"], + CPShortWeekDayNameArrayEs = [@"L", @"M", @"X", @"J", @"V", @"S", @"D"], + CPShortMonthNameArrayEn = [@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"], + CPShortMonthNameArrayFr = [@"janv.", String.fromCharCode(102, 233, 118, 46), @"mars", @"apr.", @"mai", @"juin", @"juil.", String.fromCharCode(97, 111, 251, 116), @"sept.", @"oct.", @"nov.", String.fromCharCode(100, 233, 99, 46)], + CPShortMonthNameArrayDe = [@"Jan", @"Feb", String.fromCharCode(77, 228, 114), @"Apr", @"Mai", @"Jun", @"Jul", @"Aug", @"Sep", @"Okt", @"Nov", @"Dez"], + CPShortMonthNameArrayEs = [@"ene", @"feb", @"mar", @"abr", @"may", @"jun", @"jul", @"ago", @"sep", @"oct", @"nov", @"dic"]; + +@implementation _CPDatePickerCalendar : CPControl +{ + _CPDatePickerMonthView _monthView; + _CPDatePickerHeaderView _headerView; + _CPDatePickerClock _datePickerClock; + CPBox _box; + CPDatePicker _datePicker; + CPInteger _startSelectionIndex; + CPInteger _currentSelectionIndex; +} + + +#pragma mark - +#pragma mark Init method + +/*! Init a _CPDatePickerCalendar + @param aFrame + @param aDatePicker + @return a new instance of _CPDatePickerCalendar +*/ +- (id)initWithFrame:(CGRect)aFrame withDatePicker:(CPDatePicker)aDatePicker +{ + if (self = [super initWithFrame:aFrame]) + { + _datePicker = aDatePicker + [self _init]; + } + return self; +} + +/*! Init the object +*/ +- (void)_init +{ + var sizeHeader = [_datePicker valueForThemeAttribute:@"size-header"], + sizeCalendar = [_datePicker valueForThemeAttribute:@"size-calendar"], + sizeClock = [_datePicker valueForThemeAttribute:@"size-clock"]; + + _box = [[_DatePickerBox alloc] initWithFrame:CGRectMake(0, 0, sizeCalendar.width, sizeHeader.height + sizeCalendar.height)]; + [_box setDatePicker:_datePicker]; + + _headerView = [[_CPDatePickerHeaderView alloc] initWithFrame:CGRectMake(0, 0, sizeHeader.width, sizeHeader.height) datePicker:_datePicker delegate:self]; + [_box addSubview:_headerView]; + + _monthView = [[_CPDatePickerMonthView alloc] initWithFrame:CGRectMake(0, sizeHeader.height, sizeCalendar.width, sizeCalendar.height) datePicker:_datePicker delegate:self]; + [_box addSubview:_monthView]; + + _datePickerClock = [[_CPDatePickerClock alloc] initWithFrame:CGRectMake(sizeCalendar.width + 10, sizeHeader.height + sizeCalendar.height / 2 - sizeClock.height / 2, sizeClock.width, sizeClock.height) datePicker:_datePicker]; + [_datePickerClock setHidden:YES]; + [self addSubview:_datePickerClock]; + + [self addSubview:_box]; + + [self setNeedsLayout]; +} + + +#pragma mark - +#pragma mark Responder methods + +- (BOOL)becomeFirstResponder +{ + return YES; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + + +#pragma mark - +#pragma mark Getter Setter methods + +/*! Set the date value of the component. It sets the dateValue of the header and the monthView also + @param aDateValue +*/ +- (void)setDateValue:(CPDate)aDateValue +{ + [_monthView setMonthForDate:aDateValue]; + [_headerView setMonthForDate:[_monthView monthDate]]; + + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + +/*! Set enabled + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [super setEnabled:aBoolean]; + + [_datePickerClock setEnabled:aBoolean]; + [_headerView setEnabled:aBoolean]; + [_monthView setEnabled:aBoolean]; +} + + +#pragma mark - +#pragma mark Layout methods + +/*! Manager the subviews. It hides or not the clock. +*/ +- (void)layoutSubviews +{ + if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle) + return; + + var minSize = [_datePicker valueForThemeAttribute:@"min-size-calendar"], + sizeHeader = [_datePicker valueForThemeAttribute:@"size-header"], + sizeCalendar = [_datePicker valueForThemeAttribute:@"size-calendar"], + sizeClock = [_datePicker valueForThemeAttribute:@"size-clock"]; + + [super layoutSubviews]; + + if ([_datePicker datePickerElements] & CPHourMinuteSecondDatePickerElementFlag || [_datePicker datePickerElements] & CPHourMinuteDatePickerElementFlag) + { + [_datePickerClock setHidden:NO]; + [_datePickerClock setNeedsLayout]; + + if ([_datePicker datePickerElements] & CPYearMonthDatePickerElementFlag || [_datePicker datePickerElements] & CPYearMonthDayDatePickerElementFlag) + { + var frameSize = CGSizeMakeCopy(minSize); + frameSize.width += sizeClock.width + 10; + + [_datePicker setFrameSize:frameSize]; + [_datePickerClock setFrameOrigin:CGPointMake(sizeCalendar.width + 10, [self bounds].size.height / 2 - sizeClock.height / 2)]; + } + else + { + [_datePicker setFrameSize:sizeClock]; + [_datePickerClock setFrameOrigin:CGPointMake(0, 0)]; + } + + } + else + { + [_datePicker setFrameSize:minSize]; + [_datePickerClock setHidden:YES]; + } + + if ([_datePicker datePickerElements] & CPYearMonthDatePickerElementFlag || [_datePicker datePickerElements] & CPYearMonthDayDatePickerElementFlag) + { + [_box setHidden:NO]; + [_headerView setHidden:NO]; + [_monthView setHidden:NO]; + [_box setNeedsLayout]; + [_box setNeedsDisplay:YES]; + [_headerView setNeedsLayout]; + [_monthView setNeedsLayout]; + [_monthView setNeedsDisplay:YES]; + } + else + { + [_box setHidden:YES]; + [_headerView setHidden:YES]; + [_monthView setHidden:YES]; + } +} + + +#pragma mark - +#pragma mark Action methods + +/*! Move to the nextMonth without changing the dateValue of the datePicker +*/ +- (void)_nextMonth:(id)sender +{ + [self setDateValue:[_monthView nextMonth]]; +} + +/*! Move to the previous month without changing the dateValue of the datePicker +*/ +- (void)_previousMonth:(id)sender +{ + [self setDateValue:[_monthView previousMonth]]; +} + +/*! Move to the current selected day +*/ +- (void)_currentMonth:(id)sender +{ + [self setDateValue:[_datePicker dateValue]]; +} + +@end + + +@implementation _CPDatePickerHeaderView : CPControl +{ + CPArray _dayLabels; + CPArray _monthNames; + CPButton _nextButton; + CPButton _previousButton; + CPButton _currentButton; + CPDatePicker _datePicker; + CPDate _date; + CPTextField _title; +} + + +#pragma mark - +#pragma mark Init methods + +/*! Init a new instance of _CPDatePickerHeaderView + @param aFrame + @param aDatePicker + @return a new instance of _CPDatePickerHeaderView +*/ +- (id)initWithFrame:(CGRect)aFrame datePicker:(CPDatePicker)aDatePicker delegate:(id)aDelegate +{ + self = [super initWithFrame:aFrame]; + + if (self) + { + _datePicker = aDatePicker; + + // Title + _title = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + + [_title setValue:[_datePicker valueForThemeAttribute:@"title-font" inState:CPThemeStateNormal] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + + [_title setValue:[_datePicker valueForThemeAttribute:@"title-font" inState:CPThemeStateDisabled] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_title setValue:[_datePicker valueForThemeAttribute:@"title-text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [self addSubview:_title]; + + _dayLabels = [CPArray array]; + + // Days + for (var i = 0; i < [[self _dayNames] count]; i++) + { + var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + [label setValue:CPCenterTextAlignment forThemeAttribute:@"alignment"]; + + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-font" inState:CPThemeStateNormal] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-font" inState:CPThemeStateDisabled] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [label setValue:[_datePicker valueForThemeAttribute:@"weekday-text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_dayLabels addObject:label]; + [self addSubview:label]; + } + + // Arrows + _previousButton = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; + [_previousButton setButtonType:CPMomentaryChangeButton]; + [_previousButton setBordered:NO]; + [_previousButton setImage:[_datePicker valueForThemeAttribute:@"arrow-image-left"]]; + [_previousButton setAlternateImage:[_datePicker valueForThemeAttribute:@"arrow-image-left-highlighted"]]; + [self addSubview:_previousButton]; + + _nextButton = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; + [_nextButton setButtonType:CPMomentaryChangeButton]; + [_nextButton setBordered:NO]; + [_nextButton setImage:[_datePicker valueForThemeAttribute:@"arrow-image-right"]]; + [_nextButton setAlternateImage:[_datePicker valueForThemeAttribute:@"arrow-image-right-highlighted"]]; + [self addSubview:_nextButton]; + + _currentButton = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; + [_currentButton setButtonType:CPMomentaryChangeButton]; + [_currentButton setBordered:NO]; + [_currentButton setImage:[_datePicker valueForThemeAttribute:@"circle-image"]]; + [_currentButton setAlternateImage:[_datePicker valueForThemeAttribute:@"circle-image-highlighted"]]; + [self addSubview:_currentButton]; + + [_previousButton setTarget:aDelegate]; + [_previousButton setAction:@selector(_previousMonth:)]; + + [_nextButton setTarget:aDelegate]; + [_nextButton setAction:@selector(_nextMonth:)]; + + [_currentButton setTarget:aDelegate]; + [_currentButton setAction:@selector(_currentMonth:)]; + + [self setNeedsLayout]; + } + + return self; +} + + +#pragma mark - +#pragma mark Getter Setter methods + +/*! Return the day names depending on the CPLocale of the datePicker + @return an array +*/ +- (CPArray)_dayNames +{ + switch ([[_datePicker locale] objectForKey:CPLocaleLanguageCode]) + { + case @"en": + + // Check if it's in the american format. If yes the week will begin the sunday + if ([_datePicker _isAmericanFormat]) + return CPShortWeekDayNameArrayUS; + else + return CPShortWeekDayNameArrayEn; + break; + + case @"es": + return CPShortWeekDayNameArrayEs; + break; + + case @"de": + return CPShortWeekDayNameArrayDe; + break; + + case @"fr": + return CPShortWeekDayNameArrayFr; + break; + + default: + return CPShortWeekDayNameArrayEn + break; + } +} + +/*! Return the month names depending on the CPLocale of the datePicker + @return an array +*/ +- (CPArray)_monthNames +{ + switch ([[_datePicker locale] objectForKey:CPLocaleLanguageCode]) + { + case @"en": + return CPShortMonthNameArrayEn; + break; + + case @"es": + return CPShortMonthNameArrayEs; + break; + + case @"de": + return CPShortMonthNameArrayDe; + break; + + case @"fr": + return CPShortMonthNameArrayFr; + break; + + default: + return CPShortMonthNameArrayEn + break; + } + +} + +/*! Set the monthDate of the header + @aMonthDate the new monthDate +*/ +- (void)setMonthForDate:(CPDate)aMonthDate +{ + _date = aMonthDate; + [self setNeedsLayout]; +} + +/*! Set enabled + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [_previousButton setEnabled:aBoolean]; + [_nextButton setEnabled:aBoolean]; + [_currentButton setEnabled:aBoolean]; + [_dayLabels makeObjectsPerformSelector:@selector(setEnabled:) withObject:aBoolean]; + [_title setEnabled:aBoolean]; +} + + +#pragma mark - +#pragma mark Layout methods + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + var bounds = [self bounds], + dayNames = [self _dayNames], + width = CGRectGetWidth(bounds), + buttonInset = [_datePicker valueForThemeAttribute:@"arrow-inset"], + numberOfLabels = [_dayLabels count], + labelWidth = width / numberOfLabels, + sizeButtonLeft = [[_datePicker valueForThemeAttribute:@"arrow-image-left"] size], + sizeButtonRight = [[_datePicker valueForThemeAttribute:@"arrow-image-right"] size], + sizeButtonCircle = [[_datePicker valueForThemeAttribute:@"circle-image"] size], + sizeTileWidth = [_datePicker valueForThemeAttribute:@"size-tile"].width; + + // Arrows + [_nextButton setFrame:CGRectMake(width - [_nextButton frameSize].width - buttonInset.right, buttonInset.top, sizeButtonRight.width, sizeButtonRight.height)]; + [_currentButton setFrame:CGRectMake(CGRectGetMinX([_nextButton frame]) - sizeButtonCircle.width - buttonInset.left - buttonInset.right, buttonInset.top, sizeButtonCircle.width, sizeButtonCircle.height)]; + [_previousButton setFrame:CGRectMake(CGRectGetMinX([_currentButton frame]) - sizeButtonLeft.width - buttonInset.left - buttonInset.right, buttonInset.top, sizeButtonLeft.width, sizeButtonLeft.height)]; + + var firstDayTileX; + + // Weekday label + for (var i = 0; i < numberOfLabels; i++) + { + var dayLabel = _dayLabels[i]; + + [dayLabel setStringValue:dayNames[i]]; + [dayLabel sizeToFit] + [dayLabel setFrameOrigin:CGPointMake(sizeTileWidth * (i + 1) - sizeTileWidth / 2 - [dayLabel frameSize].width / 2, 23)]; + + if (i == 0) + firstDayTileX = sizeTileWidth * (i + 1) - sizeTileWidth / 2 - [dayLabel frameSize].width / 2 + } + + // Title + [_title setStringValue:[CPString stringWithFormat:@"%s %i", [self _monthNames][_date.getMonth()], _date.getFullYear()]]; + [_title sizeToFit]; + [_title setFrameOrigin:CGPointMake(firstDayTileX, 6)]; +} + +@end + + +@implementation _CPDatePickerMonthView : CPControl +{ + BOOL _isMonthJustChanged; + CPArray _dayTiles; + CPDate _clickDate; + CPDate _dragDate; + CPDate _date; + CPDate _previousMonth @accessors(property=previousMonth); + CPDate _nextMonth @accessors(property=nextMonth); + CPDatePicker _datePicker; + CPEvent _eventDragged; + CPTimer _timerMonth; + id _delegate; + int _indexDayTile; +} + + +#pragma mark - +#pragma mark Init methods + +/*! Init a _CPDatePickerMonthView + @param aFrame + @param aDatePicker + @return a new _CPDatePickerMonthView +*/ +- (id)initWithFrame:(CGRect)aFrame datePicker:(CPDatePicker)aDatePicker delegate:(id)aDelegate +{ + if (self = [super initWithFrame:aFrame]) + { + _delegate = aDelegate; + _isMonthJustChanged = NO; + _indexDayTile = -1; + _datePicker = aDatePicker; + _dayTiles = [CPArray array]; + + // Create tiles + for (var i = 0; i < 42; i++) + { + var dayView = [[_CPDatePickerDayView alloc] initWithFrame:CGRectMakeZero() withDatePicker:_datePicker]; + [self addSubview:dayView]; + [_dayTiles addObject:dayView]; + } + + [self setNeedsLayout]; + } + return self; +} + + +#pragma mark - +#pragma mark Getter Setter methods + +/*! Set the monthDate of the component + @param aDate +*/ +- (void)setMonthForDate:(CPDate)aDate +{ + if (_dragDate) + { + if (_dragDate.getMonth() != _date.getMonth()) + _isMonthJustChanged = YES; + + _date = [_dragDate copy]; + } + else + { + _date = [aDate copy]; + } + + if (![aDate isEqualToDate:[CPDate distantFuture]]) + { + // Reset the date to the first day of the month & midnight + _date.setDate(1); + [_date _resetToMidnight]; + + // There must be a better way to do this. + var firstDay = [_date copy]; + firstDay.setDate(1); + + // Set the previous and next month date. This is usefull for the tile of the next/previous month + _previousMonth = new Date(firstDay.getTime() - 86400000); + _previousMonth.setDate(1); + + _nextMonth = new Date(firstDay.getTime() + (([_date _daysInMonth] + 1) * 86400000)); + _nextMonth.setDate(1); + } + + [self reloadData]; + + if (_isMonthJustChanged) + { + var dayTile = [_dayTiles objectAtIndex:_indexDayTile]; + + if ([dayTile date].getMonth() == _date.getMonth()) + { + [self mouseDragged:_eventDragged]; + } + else + { + if ([dayTile date].getMonth() - _date.getMonth() == 1 || [dayTile date].getFullYear() - _date.getFullYear() == 1) + _timerMonth = [CPTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(_timerNextMonthEvent:) userInfo:nil repeats:NO]; + else + _timerMonth = [CPTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(_timerPreviousMonthEvent:) userInfo:nil repeats:NO]; + } + } +} + +- (void)monthDate +{ + return _date; +} + +/*! Return the size of a tile +*/ +- (CGSize)tileSize +{ + return [_datePicker valueForThemeAttribute:@"size-tile"]; +} + +/*! Return the first index day of the month +*/ +- (int)startOfWeekForDate:(CPDate)aDate +{ + var day = aDate.getDay(); + + // American people begins the week the sunday + if (![_datePicker _isAmericanFormat]) + return (day + 6) % 7; + + return day; +} + +/*! Set enabled + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [super setEnabled:aBoolean]; + [self reloadData]; +} + + +/*! Return the index of tile depending of the giving event + @param anEvent + @return an index +*/ +- (CPInteger)indexOfTileForEvent:(CPEvent)anEvent +{ + var locationInView = [self convertPoint:[anEvent locationInWindow] fromView:nil], + tileSize = [self tileSize]; + + // Get the week row + var rowIndex = FLOOR(locationInView.y / tileSize.height), + columnIndex = FLOOR(locationInView.x / tileSize.width); + + columnIndex = MIN(MAX(columnIndex, 0), 6); + rowIndex = MIN(MAX(rowIndex, 0), 5); + + var tileIndex = (rowIndex * 7) + columnIndex; + + return tileIndex; +} + +#pragma mark - +#pragma mark Reload data + +/*! Reload the data +*/ +- (void)reloadData +{ + if (!_date) + return; + + var currentMonth = _date, + startOfMonthDay = [self startOfWeekForDate:currentMonth], + daysInPreviousMonth = [_previousMonth _daysInMonth], + firstDayToShowInPreviousMonth = daysInPreviousMonth - startOfMonthDay, + currentDate = new Date(_previousMonth.getFullYear(), _previousMonth.getMonth(), firstDayToShowInPreviousMonth), + now = [CPDate date], + dateValue = [_datePicker dateValue]; + + // Update the tiles + for (var i = 0; i < [_dayTiles count]; i++) + { + var dayTile = _dayTiles[i]; + + // Increment to next day + currentDate.setTime(currentDate.getTime() + 90000000); + [currentDate _resetToMidnight]; + + var isPresentMonth = (now.getMonth() == currentDate.getMonth() + && now.getFullYear() == currentDate.getFullYear()); + + [dayTile setDate:[currentDate copy]]; + [dayTile setStringValue:currentDate.getDate()]; + [dayTile setDisabled:![self isEnabled] || currentDate.getMonth() !== currentMonth.getMonth()]; + [dayTile setHighlighted:isPresentMonth && currentDate.getDate() == now.getDate()]; + } + + // Select the dates + [self _selectDate:[_datePicker dateValue] timeInterval:[_datePicker timeInterval]]; +} + + +#pragma mark - +#pragma mark Select methods + +/*! Select one date or several date depending of the giving interval + @param aStartDate + @param anInterval; +*/ +- (void)_selectDate:(CPDate)aStartDate timeInterval:(CPInteger)anInterval +{ + var endDate = [[CPDate alloc] initWithTimeInterval:anInterval sinceDate:aStartDate], + tilesCount = [_dayTiles count]; + + aStartDate = [aStartDate copy]; + + [aStartDate _resetToMidnight]; + [endDate _resetToMidnight]; + + for (var i = 0; i < tilesCount; i++) + { + var tile = _dayTiles[i], + tileDate = [[tile date] copy], + selected = NO; + + [tileDate _resetToMidnight] + + if (aStartDate) + selected = tileDate >= aStartDate && tileDate <= endDate; + + // Select a tile + [tile setSelected:selected]; + } +} + +#pragma mark - +#pragma mark Layout methods + +/*! Tile the view +*/ +- (void)tile +{ + var tileSize = [self tileSize], + width = tileSize.width, + height = tileSize.height, + tilesCount = [_dayTiles count], + borderWidth = [_datePicker valueForThemeAttribute:@"border-width"], + tileIndex; + + // Set the frame of the tiles + for (tileIndex = 0; tileIndex < tilesCount; tileIndex++) + { + var dayInWeek = tileIndex % 7, + weekInMonth = (tileIndex - dayInWeek) / 7, + tileFrame = CGRectMake(dayInWeek * width, weekInMonth * height, width + borderWidth, height + borderWidth); + + [_dayTiles[tileIndex] setFrame:tileFrame]; + } + + [self reloadData]; +} + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + [super layoutSubviews]; + + [self tile]; + [_dayTiles makeObjectsPerformSelector:@selector(setNeedsLayout)]; +} + +/*! Draw the component. This draws the border of the tile. + The selected tile are drawed in the drawRect method of the tile. But the unselected tile here. + It avoids some problems with tiles over other tiles (otherwise the color of the tile border would be different). + Rememeber that the first pixel of a tile are over the last pixel of the last tile (because the border) +*/ +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + var context = [[CPGraphicsContext currentContext] graphicsPort], + width = [self tileSize].width, + height = [self tileSize].height, + isBorderPair = ([_datePicker valueForThemeAttribute:@"border-width"] % 2) == 0; + + CGContextBeginPath(context); + CGContextSetStrokeColor(context, [_datePicker valueForThemeAttribute:@"border-color" inState:[_datePicker themeState]]); + CGContextSetLineWidth(context, [_datePicker valueForThemeAttribute:@"border-width"]); + + if ([_datePicker isBordered]) + { + for (var i = 0; i < 6; i++) + { + var y = i * height; + + // Very usefull to avoid to have a line of two pixels instead one + if (!isBorderPair) + y += 0.5 + + CGContextMoveToPoint(context, 0, y); + CGContextAddLineToPoint(context, [self bounds].size.width, y); + } + + for (var i = 0; i < 7; i++) + { + var x = i * width; + + // Very usefull to avoid to have a line of two pixels instead one + if (!isBorderPair) + x += 0.5 + + CGContextMoveToPoint(context, x, 0); + CGContextAddLineToPoint(context, x, [self bounds].size.height); + } + } + else + { + var y = 0; + + // Very usefull to avoid to have a line of two pixels instead one + if (!isBorderPair) + y += 0.5 + + CGContextMoveToPoint(context, 0, y); + CGContextAddLineToPoint(context, [self bounds].size.width, y); + } + + CGContextStrokePath(context); + CGContextClosePath(context); +} + + +#pragma mark - +#pragma mark Mouse event + +/*! Mouse down event +*/ +- (void)mouseDown:(CPEvent)anEvent +{ + if (![self isEnabled]) + return; + + var dayTile = [_dayTiles objectAtIndex:[self indexOfTileForEvent:anEvent]], + dateTile = [[dayTile date] copy], + dateValue = [_datePicker dateValue]; + + _clickDate = [dateTile copy]; + _dragDate = nil; + _indexDayTile = -1; + _eventDragged = nil + + // Check if we have to change or not the month of the component + if ([dayTile date].getMonth() == _date.getMonth()) + { + var minDate = [[_datePicker minDate] copy], + maxDate = [[_datePicker maxDate] copy]; + + [minDate _resetToMidnight]; + [maxDate _resetToLastSeconds]; + + if (dateTile >= minDate && dateTile <= maxDate) + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + } + else + { + // Check the year and the month. The year is usefull when changing from Jan to Dec. + if (_date.getMonth() - [dayTile date].getMonth() == 1 || _date.getFullYear() - [dayTile date].getFullYear() == 1) + [_delegate _previousMonth:self]; + else + [_delegate _nextMonth:self]; + } +} + +/*! Mouse dragged event +*/ +- (void)mouseDragged:(CPEvent)anEvent +{ + if (![self isEnabled] || !CGRectContainsPoint([self bounds],[self convertPoint:[anEvent locationInWindow] fromView:nil])) + return; + + var dayTile = [_dayTiles objectAtIndex:[self indexOfTileForEvent:anEvent]], + dateTile = [[dayTile date] copy], + dateValue = [_datePicker dateValue]; + + _dragDate = [dateTile copy]; + _indexDayTile = [self indexOfTileForEvent:anEvent]; + _eventDragged = anEvent; + + if ([_datePicker datePickerMode] == CPSingleDateMode) + { + // Check if we have to change or not the month of the component + if ([dayTile date].getMonth() == _date.getMonth()) + { + [_timerMonth invalidate]; + _isMonthJustChanged = NO; + + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + } + else if (!_isMonthJustChanged) + { + [_timerMonth invalidate]; + _isMonthJustChanged = NO; + + // Check the year and the month. The year is usefull when changing from Jan to Dec. + if (_date.getMonth() - [dayTile date].getMonth() == 1 || _date.getFullYear() - [dayTile date].getFullYear() == 1) + [_delegate _previousMonth:self]; + else + [_delegate _nextMonth:self]; + } + } + else + { + if (dateTile.getMonth() == _date.getMonth() || !_isMonthJustChanged) + { + [_timerMonth invalidate]; + _isMonthJustChanged = NO; + + var dateValueAtMidnight = [[_datePicker dateValue] copy]; + + [dateValueAtMidnight _resetToMidnight]; + + if (dateTile < _clickDate) + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:[_clickDate timeIntervalSinceDate:dateTile]]; + else if ([[dayTile date] isEqualToDate:_clickDate]) + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:dateTile] timeInterval:0]; + else + [_datePicker _setDateValue:[self _hoursMinutesSecondsFromDatePickerForDate:_clickDate] timeInterval:[dateTile timeIntervalSinceDate:dateValueAtMidnight]]; + } + } +} + +- (void)mouseUp:(CPEvent)anEvent +{ + [_timerMonth invalidate]; + _dragDate = nil; + _clickDate = nil; + _isMonthJustChanged = NO; + _indexDayTile = -1; + _eventDragged = nil; +} + + +#pragma mark - +#pragma mark Timer + +- (void)_timerNextMonthEvent:(CPEvent)anEvent +{ + if (_isMonthJustChanged) + { + _dragDate.setMonth(_date.getMonth() + 1); + [_delegate _nextMonth:self]; + } +} + +- (void)_timerPreviousMonthEvent:(CPEvent)anEvent +{ + if (_isMonthJustChanged) + { + _dragDate.setMonth(_date.getMonth() - 1); + [_delegate _previousMonth:self]; + } +} + + +#pragma mark - +#pragma mark Date methods + +- (CPDate)_hoursMinutesSecondsFromDatePickerForDate:(CPDate)aDate +{ + var dateValue = [_datePicker dateValue]; + + aDate.setHours(dateValue.getHours()); + aDate.setMinutes(dateValue.getMinutes()); + aDate.setSeconds(dateValue.getSeconds()); + + return aDate; +} + +@end + + +@implementation _CPDatePickerDayView : CPControl +{ + CPDate _date @accessors(property=date); + + BOOL _isDisabled; + BOOL _isHighlighted; + BOOL _isSelected; + CPDatePicker _datePicker; + CPTextField _textField; +} + + +#pragma mark - +#pragma mark Init methods + +/*! Create a new instance of _CPDatePickerDayView + @param aFrame + @param aDatePicker + @return a new instance of _CPDatePickerDayView +*/ +- (id)initWithFrame:(CGRect)aFrame withDatePicker:(CPDatePicker)aDatePicker +{ + if (self = [super initWithFrame:aFrame]) + { + [self setHitTests:NO]; + + _datePicker = aDatePicker; + + _textField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateNormal] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateSelected] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateDisabled] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateDisabled | CPThemeStateSelected] forThemeAttribute:@"font" inState:CPThemeStateDisabled | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateDisabled | CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateDisabled | CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateDisabled | CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled | CPThemeStateSelected]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateHighlighted] forThemeAttribute:@"font" inState:CPThemeStateHighlighted]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateHighlighted] forThemeAttribute:@"text-color" inState:CPThemeStateHighlighted]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateHighlighted] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateHighlighted]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateHighlighted] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateHighlighted]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState:CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"font" inState:CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState:CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState:CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState:CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateHighlighted | CPThemeStateSelected]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"font" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState: CPThemeStateDisabled | CPThemeStateHighlighted | CPThemeStateSelected]; + + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-font" inState: CPThemeStateDisabled | CPThemeStateHighlighted ] forThemeAttribute:@"font" inState: CPThemeStateDisabled | CPThemeStateHighlighted ]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted ] forThemeAttribute:@"text-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted ]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted ] forThemeAttribute:@"text-shadow-color" inState: CPThemeStateDisabled | CPThemeStateHighlighted ]; + [_textField setValue:[_datePicker valueForThemeAttribute:@"tile-text-shadow-offset" inState: CPThemeStateDisabled | CPThemeStateHighlighted ] forThemeAttribute:@"text-shadow-offset" inState: CPThemeStateDisabled | CPThemeStateHighlighted]; + + [self addSubview:_textField]; + + [self setNeedsLayout]; + } + + return self; +} + + +#pragma mark - +#pragma mark Theme methods + +/*! Set a theme +*/ +- (void)setThemeState:(CPThemeState)aState +{ + [_textField setThemeState:aState]; + [super setThemeState:aState]; +} + +/*! Unset a theme +*/ +- (void)unsetThemeState:(CPThemeState)aState +{ + [_textField unsetThemeState:aState]; + [super unsetThemeState:aState]; +} + + +#pragma mark - +#pragma mark Getter methods + +/*! Select the tile +*/ +- (void)setSelected:(BOOL)shouldBeSelected +{ + if (_isSelected === shouldBeSelected) + return; + + _isSelected = shouldBeSelected; + + if (_isSelected) + [self setThemeState:CPThemeStateSelected]; + else + [self unsetThemeState:CPThemeStateSelected]; +} + +/*! Disabled the tile (used for previous and next month tile) +*/ +- (void)setDisabled:(BOOL)shouldBeDisabled +{ + if (_isDisabled === shouldBeDisabled) + return; + + _isDisabled = shouldBeDisabled; + + if (_isDisabled) + [self setThemeState:CPThemeStateDisabled]; + else + [self unsetThemeState:CPThemeStateDisabled]; +} + +/*! Highlight the tile (used for current day) +*/ +- (void)setHighlighted:(BOOL)shouldBeHighlighted +{ + if (_isHighlighted === shouldBeHighlighted) + return; + + _isHighlighted = shouldBeHighlighted; + + if (_isHighlighted) + [self setThemeState:CPThemeStateHighlighted]; + else + [self unsetThemeState:CPThemeStateHighlighted]; +} + +/*! Set the stringValue of the tile + @param aStringValue +*/ +- (void)setStringValue:(CPString)aStringValue +{ + [_textField setStringValue:aStringValue]; + [_textField sizeToFit]; +} + + +#pragma mark - +#pragma mark Layout methods + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + var bounds = [self bounds]; + [_textField sizeToFit]; + [_textField setFrameOrigin:CGPointMake(bounds.size.width / 2 - [_textField frameSize].width / 2 + [_datePicker valueForThemeAttribute:@"border-width"], bounds.size.height / 2 - [_textField frameSize].height / 2)]; +} + +/*! Drawrect +*/ +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + var themeState = [self themeState], + context = [[CPGraphicsContext currentContext] graphicsPort]; + + if (themeState & CPThemeStateSelected) + { + [self setBackgroundColor:[_datePicker valueForThemeAttribute:@"bezel-color-calendar" inState:themeState]]; + CGContextSetLineWidth(context, [_datePicker valueForThemeAttribute:@"border-width"]); + CGContextSetStrokeColor(context, [_datePicker valueForThemeAttribute:@"border-color" inState:themeState]); + CGContextAddRect(context, [self bounds]); + CGContextStrokeRect(context, [self bounds]); + } + else + { + // Clear color, because the original color of a tile is handle by his superview + [self setBackgroundColor:[CPColor clearColor]]; + } + +} + +@end + + +@implementation _DatePickerBox : CPView +{ + CPDatePicker _datePicker @accessors(property=datePicker); +} + +- (id)init +{ + if (self = [super init]) + { + } + return self; +} + +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + if ([_datePicker isBordered]) + { + var context = [[CPGraphicsContext currentContext] graphicsPort], + borderWidth = [_datePicker valueForThemeAttribute:@"border-width"] / 2; + + CGContextBeginPath(context); + CGContextSetStrokeColor(context, [_datePicker valueForThemeAttribute:@"border-color" inState:[_datePicker themeState]]); + CGContextSetLineWidth(context, [_datePicker valueForThemeAttribute:@"border-width"]); + + CGContextMoveToPoint(context, borderWidth,borderWidth); + CGContextAddLineToPoint(context, aRect.size.width - borderWidth,borderWidth); + CGContextAddLineToPoint(context, aRect.size.width - borderWidth,aRect.size.height - borderWidth); + CGContextAddLineToPoint(context, borderWidth,aRect.size.height - borderWidth); + CGContextAddLineToPoint(context, borderWidth,borderWidth); + + CGContextStrokePath(context); + CGContextClosePath(context); + } +} + +- (void)layoutSubviews +{ + if ([_datePicker drawsBackground]) + [self setBackgroundColor:[_datePicker backgroundColor]]; + else + [self setBackgroundColor:[CPColor clearColor]]; +} + + +@end diff --git a/AppKit/CPDatePicker/_CPDatePickerClock.j b/AppKit/CPDatePicker/_CPDatePickerClock.j new file mode 100644 index 000000000..0015a41da --- /dev/null +++ b/AppKit/CPDatePicker/_CPDatePickerClock.j @@ -0,0 +1,284 @@ +/* _CPDatePickerClock.j +* AppKit +* +* Created by Alexandre Wilhelm +* Copyright 2012 +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import "CPView.j" +@import "CPTextField.j" +@import "CPImageView.j" +@import "CALayer.j" + +@class CPDatePicker + +@global CPHourMinuteSecondDatePickerElementFlag + +@implementation _CPDatePickerClock : CPView +{ + BOOL _isEnabled; + CALayer _rootLayer; + CALayer _hourHandLayer; + CALayer _minuteHandLayer; + CALayer _secondHandLayer; + CALayer _middleHandLayer; + CPDatePicker _datePicker; + CPTextField _PMAMTextField; +} + + +#pragma mark - +#pragma mark Init methods + +/*! Init a new _CPDatePickerClock + @param aFrame + @param aDatePicker + @return a new instance of _CPDatePickerClock +*/ +- (id)initWithFrame:(CGRect)aFrame datePicker:(CPDatePicker)aDatePicker +{ + if (self = [super initWithFrame:aFrame]) + { + _datePicker = aDatePicker; + + _PMAMTextField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-font" inState:CPThemeStateNormal] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-font" inState:CPThemeStateDisabled] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_PMAMTextField setValue:[_datePicker valueForThemeAttribute:@"clock-text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [self addSubview:_PMAMTextField]; + + var middleHandSize = [_datePicker valueForThemeAttribute:@"middle-hand-size"], + minuteHandSize = [_datePicker valueForThemeAttribute:@"minute-hand-size"], + hourHandSize = [_datePicker valueForThemeAttribute:@"hour-hand-size"], + secondHandSize = [_datePicker valueForThemeAttribute:@"second-hand-size"]; + + // We use layer to make the rotation possible + _hourHandLayer = [[HandLayer alloc] initWithSize:hourHandSize]; + [_hourHandLayer setBounds:CGRectMake(0, 0, aFrame.size.width, aFrame.size.height)]; + [_hourHandLayer setAnchorPoint:CGPointMakeZero()]; + [_hourHandLayer setPosition:CGPointMake(0.0, 0.0)]; + + _minuteHandLayer = [[HandLayer alloc] initWithSize:minuteHandSize]; + [_minuteHandLayer setBounds:CGRectMake(0, 0, aFrame.size.width, aFrame.size.height)]; + [_minuteHandLayer setAnchorPoint:CGPointMakeZero()]; + [_minuteHandLayer setPosition:CGPointMake(0.0, 0.0)]; + + _secondHandLayer = [[HandLayer alloc] initWithSize:secondHandSize]; + [_secondHandLayer setBounds:CGRectMake(0, 0, aFrame.size.width, aFrame.size.height)]; + [_secondHandLayer setAnchorPoint:CGPointMakeZero()]; + [_secondHandLayer setPosition:CGPointMake(0.0, 0.0)]; + + _middleHandLayer = [[HandLayer alloc] initWithSize:middleHandSize]; + [_middleHandLayer setBounds:CGRectMake(0, 0, aFrame.size.width, aFrame.size.height)]; + [_middleHandLayer setAnchorPoint:CGPointMakeZero()]; + [_middleHandLayer setPosition:CGPointMake(0.0, 0.0)]; + + _rootLayer = [CALayer layer]; + [self setWantsLayer:YES]; + [self setLayer:_rootLayer]; + + [_hourHandLayer setNeedsDisplay]; + [_middleHandLayer setNeedsDisplay]; + [_secondHandLayer setNeedsDisplay]; + [_minuteHandLayer setNeedsDisplay]; + + [_rootLayer addSublayer:_hourHandLayer]; + [_rootLayer addSublayer:_minuteHandLayer]; + [_rootLayer addSublayer:_secondHandLayer]; + [_rootLayer addSublayer:_middleHandLayer]; + + [_rootLayer setNeedsDisplay]; + + } + return self; +} + + +#pragma mark - +#pragma mark Layout methods + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + [super layoutSubviews]; + + var bounds = [self bounds]; + + [self setBackgroundColor:[_datePicker valueForThemeAttribute:@"bezel-color-clock" inState:[_datePicker themeState]]]; + [_middleHandLayer setBackgroundHandColor:[_datePicker valueForThemeAttribute:@"middle-hand-color" inState:[_datePicker themeState]]]; + [_hourHandLayer setBackgroundHandColor:[_datePicker valueForThemeAttribute:@"hour-hand-color" inState:[_datePicker themeState]]]; + [_minuteHandLayer setBackgroundHandColor:[_datePicker valueForThemeAttribute:@"minute-hand-color" inState:[_datePicker themeState]]]; + [_secondHandLayer setBackgroundHandColor:[_datePicker valueForThemeAttribute:@"second-hand-color" inState:[_datePicker themeState]]]; + + if ([_datePicker _isEnglishFormat]) + { + if ([_datePicker dateValue].getHours() > 11) + [_PMAMTextField setStringValue:@"PM"] + else + [_PMAMTextField setStringValue:@"AM"]; + + [_PMAMTextField sizeToFit]; + [_PMAMTextField setFrameOrigin:CGPointMake(bounds.size.width / 2 - [_PMAMTextField frameSize].width / 2, bounds.size.height / 2 + 15)]; + [_PMAMTextField setHidden:NO]; + } + else + { + [_PMAMTextField setHidden:YES]; + } + + [_hourHandLayer setRotationRadians:[self _hourPositionRadianForDate:[_datePicker dateValue]]]; + [_minuteHandLayer setRotationRadians:[self _minutePositionRadianForDate:[_datePicker dateValue]]]; + [_secondHandLayer setRotationRadians:[self _secondPositionRadianForDate:[_datePicker dateValue]]]; + + // Check if we have to display the hand second + if (([_datePicker datePickerElements] & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag) + [_secondHandLayer setHidden:NO]; + else + [_secondHandLayer setHidden:YES]; + + [_rootLayer setNeedsDisplay]; +} + + +#pragma mark - +#pragma mark Getter Setter methods + +/*! Return the radian position of the hour +*/ +- (float)_hourPositionRadianForDate:(CPDate)aDate +{ + var hours = aDate.getHours() + aDate.getMinutes() / 60; + + return (360 * hours / 12) * (Math.PI / 180) +} + +/*! Return the radian position of the second +*/ +- (float)_secondPositionRadianForDate:(CPDate)aDate +{ + return (360 * aDate.getSeconds() / 60) * (Math.PI / 180) +} + +/*! Return the radian position of the minute +*/ +- (float)_minutePositionRadianForDate:(CPDate)aDate +{ + var minutes = aDate.getMinutes() + aDate.getSeconds() / 60; + + return (360 * minutes / 60) * (Math.PI / 180) +} + +/*! Set enabled + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + _isEnabled = aBoolean; + [_PMAMTextField setEnabled:aBoolean]; + [_hourHandLayer setEnabled:aBoolean]; + [_middleHandLayer setEnabled:aBoolean]; + [_secondHandLayer setEnabled:aBoolean]; + [_minuteHandLayer setEnabled:aBoolean]; + + [self setNeedsLayout]; +} + +@end + + +@implementation HandLayer : CALayer +{ + BOOL _isEnabled @accessors(setter=setEnabled:, getter=isEnabled); + + CALayer _imageLayer; + float _rotationRadians; +} + + +#pragma mark - +#pragma mark Init methods + +/*! Init a new hand layer with an image. The image will be draw in a ImageLayer + @param anImage + @return a new instance of handLayer +*/ +- (id)initWithSize:(CGSize)aSize +{ + if (self = [super init]) + { + _isEnabled = YES; + _imageLayer = [CALayer layer]; + _rotationRadians = 0; + + [_imageLayer setDelegate:self]; + [_imageLayer setBounds:CGRectMake(0.0, 0.0, aSize.width, aSize.height)]; + + [self addSublayer:_imageLayer]; + } + return self; +} + + +#pragma mark - +#pragma mark Setter Getter methods + +/*! Set the bounds of the layer. The imageLayer will be at the center of this bounds + @param aRect +*/ +- (void)setBounds:(CGRect)aRect +{ + [super setBounds:aRect]; + + [_imageLayer setPosition:CGPointMake(CGRectGetMidX(aRect), CGRectGetMidY(aRect))]; +} + +/*! Set the rotation of the imageLayer + @param radians +*/ +- (void)setRotationRadians:(float)radians +{ + if (_rotationRadians == radians) + return; + + _rotationRadians = radians; + + [_imageLayer setAffineTransform:CGAffineTransformScale( + CGAffineTransformMakeRotation(_rotationRadians), + 1.0, 1.0)]; +} + +- (void)setBackgroundHandColor:(CPColor)aColor +{ + [_imageLayer setBackgroundColor:aColor]; +} + +- (void)setEnabled:(BOOL)aBoolean +{ + _isEnabled = aBoolean; + [self setNeedsDisplay]; +} + +@end diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j new file mode 100644 index 000000000..3e7ba86ed --- /dev/null +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -0,0 +1,1433 @@ +/* _CPDatePickerTextField.j +* AppKit +* +* Created by Alexandre Wilhelm +* Copyright 2012 +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import "CPControl.j" +@import "CPFont.j" +@import "CPTextField.j" + +@import +@import +@import +@import +@import + +@class CPDatePicker +@class CPStepper + +@global CPSingleDateMode +@global CPRangeDateMode + +@global CPTextFieldAndStepperDatePickerStyle +@global CPClockAndCalendarDatePickerStyle +@global CPTextFieldDatePickerStyle + +@global CPHourMinuteDatePickerElementFlag +@global CPHourMinuteSecondDatePickerElementFlag +@global CPTimeZoneDatePickerElementFlag +@global CPYearMonthDatePickerElementFlag +@global CPYearMonthDayDatePickerElementFlag +@global CPEraDatePickerElementFlag + +var CPDatePickerElementTextFieldBecomeFirstResponder = @"CPDatePickerElementTextFieldBecomeFirstResponder", + CPDatePickerElementTextFieldAMPMChangedNotification = @"CPDatePickerElementTextFieldAMPMChangedNotification"; + +var CPZeroKeyCode = 48, + CPNineKeyCode = 57, + CPMajAKeyCode = 65, + CPMajPKeyCode = 80, + CPAKeyCode = 97, + CPPKeyCode = 112; + +// This class is used to represente the datePicker with the CPTextFieldAndStepperDatePickerStyle/CPTextFieldDatePickerStyle mode +@implementation _CPDatePickerTextField : CPControl +{ + _CPDatePickerElementTextField _firstTextField @accessors(property=firstTextField); + _CPDatePickerElementTextField _lastTextField @accessors(property=lastTextField); + + _CPDatePickerElementTextField _currentTextField; + _CPDatePickerElementView _datePickerElementView; + CPDatePicker _datePicker; + CPStepper _stepper; + CPTimer _timerEdition; +} + + +#pragma mark - +#pragma mark Init + +- (id)initWithFrame:(CGRect)aFrame withDatePicker:(CPDatePicker)aDatePicker +{ + if (self = [super initWithFrame:aFrame]) + { + _datePicker = aDatePicker + [self _init]; + } + return self; +} + +- (void)_init +{ + _datePickerElementView = [[_CPDatePickerElementView alloc] initWithFrame:CGRectMakeZero() withDatePicker:_datePicker]; + [self addSubview:_datePickerElementView]; + + _stepper = [CPStepper stepper]; + [_stepper setTarget:self]; + [_stepper setAction:@selector(_clickStepper:)]; + [self addSubview:_stepper]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_datePickerElementTextFieldBecomeFirstResponder:) name:CPDatePickerElementTextFieldBecomeFirstResponder object:self]; + + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + + +#pragma mark - +#pragma mark Responder methods + +- (BOOL)becomeFirstResponder +{ + return NO; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)resignFirstResponder +{ + // End the timer of editing + [self _endTimer]; + + // Don't forget to unbind, otherwise several steppers will increase or decrease + [_currentTextField unbind:@"objectValue"]; + [_currentTextField makeDeselectable]; + _currentTextField = nil + + // This is usefull when clicking on the stepper when the datePicker is not selected + [_stepper setObjectValue:0]; + + return YES; +} + + +#pragma mark - +#pragma mark Setter Getter methods + + +/*! Set the value of the control + @param aDateValue +*/ +- (void)setDateValue:(CPDate)aDateValue +{ + [_datePickerElementView setDateValue:aDateValue]; +} + +/*! Set the widget enabled or not + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [super setEnabled:aBoolean]; + [_stepper setEnabled:aBoolean]; + [_datePickerElementView setEnabled:aBoolean]; +} + + +#pragma mark - +#pragma mark Notification methods + +/*! This is called to when the user just changed the selected textField + @param aNotification +*/ +- (void)_datePickerElementTextFieldBecomeFirstResponder:(CPNotification)aNotification +{ + if ([[aNotification userInfo] objectForKey:@"textField"] == _currentTextField) + return; + + [self _selectTextField:[[aNotification userInfo] objectForKey:@"textField"]]; + + // This is tricky, its to avoid to have the cursor + if ([[self window] firstResponder] != _datePicker) + [[self window] makeFirstResponder:_datePicker]; +} + + +#pragma mark - +#pragma mark SelectTextField action + +- (void)_selecteTextFieldWithFlags:(unsigned)flags +{ + // We select the firstTextField when the datePicker becomes firstResponder if _currentTextField is null. It can be null just when using tab + if (!_currentTextField) + { + if (flags & CPShiftKeyMask) + [self _selectTextField:_lastTextField]; + else + [self _selectTextField:_firstTextField]; + } + +} + +/*! Select a textField + @param aDatePickerElementTextField the textField +*/ +- (void)_selectTextField:(_CPDatePickerElementTextField)aDatePickerElementTextField +{ + if (_currentTextField == aDatePickerElementTextField) + return; + + // End the timer of editing + [self _endTimer]; + + // Don't forget to unbind, otherwise several steppers will increase or decrease + [_currentTextField unbind:@"objectValue"]; + [_currentTextField makeDeselectable]; + + _currentTextField = aDatePickerElementTextField; + [_currentTextField makeSelectable]; + + // We cannot assign a value with the textField AM/PM + if ([_currentTextField dateType] != CPAMPMDateType) + { + // We update the value of the stepper dependind on the textField + [_stepper setObjectValue:parseInt([_currentTextField objectValue])]; + [_stepper setMaxValue:[_currentTextField maxNumber]]; + [_stepper setMinValue:[_currentTextField minNumber]]; + + // We bind the stepper with textField + [_currentTextField bind:@"objectValue" toObject:_stepper withKeyPath:@"objectValue" options:nil]; + } +} + + +#pragma mark - +#pragma mark Events + +/*! Called when the user click on the stepper +*/ +- (void)_clickStepper:(id)sender +{ + // Success when clicking on the stepper if the datePicker is not selected + if ([[self window] firstResponder] != _datePicker) + { + var isUp = NO; + + if ([sender objectValue] == 1) + isUp = YES; + + [self _selectTextField:_firstTextField]; + [[self window] makeFirstResponder:_datePicker]; + + // This gonna update the dateValue with the binding + if (isUp) + [_stepper setDoubleValue:parseInt([_currentTextField objectValue]) + 1]; + else + [_stepper setDoubleValue:parseInt([_currentTextField objectValue]) - 1]; + + return; + } + + if ([_currentTextField dateType] != CPAMPMDateType) + { + // Make sure to get the good value, especially when we reach the maxDate or minDate + [sender setDoubleValue:parseInt([_currentTextField objectValue])]; + } + else + { + // AM/PM behavior + if ([[_currentTextField stringValue] isEqualToString:@"PM"]) + [_currentTextField setStringValue:@"AM"]; + else + [_currentTextField setStringValue:@"PM"]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPDatePickerElementTextFieldAMPMChangedNotification object:_currentTextField userInfo:nil]; + } +} + +/*! performKeyEquivalent event + Used for moving in the textField +*/ +- (BOOL)performKeyEquivalent:(CPEvent)anEvent +{ + if (![self isEnabled] || !_currentTextField || [[self window] firstResponder] != _datePicker) + return NO; + + var key = [anEvent charactersIgnoringModifiers]; + + if (key == CPUpArrowFunctionKey) + { + [self _endTimer]; + [_stepper setDoubleValue:parseInt([_currentTextField objectValue])]; + [_stepper performClickUp:self]; + return YES; + } + + if (key == CPDownArrowFunctionKey) + { + [self _endTimer]; + [_stepper setDoubleValue:parseInt([_currentTextField objectValue])]; + [_stepper performClickDown:self]; + return YES; + } + + if (key == CPLeftArrowFunctionKey || [anEvent keyCode] == CPTabKeyCode && [anEvent modifierFlags] & CPShiftKeyMask) + { + if (_currentTextField == _firstTextField) + { + if ([_datePicker previousKeyView]) + [[self window] makeFirstResponder:[_datePicker previousKeyView]]; + + return YES; + } + + [self _selectTextField:[_currentTextField previousKeyView]]; + return YES; + } + + if (key == CPRightArrowFunctionKey || [anEvent keyCode] == CPTabKeyCode) + { + + if (_currentTextField == _lastTextField && [anEvent keyCode] == CPTabKeyCode) + { + if ([_datePicker nextKeyView]) + [[self window] makeFirstResponder:[_datePicker nextKeyView]]; + + return YES; + } + + [self _selectTextField:[_currentTextField nextKeyView]]; + return YES; + } + + if ([anEvent keyCode] == CPReturnKeyCode && _timerEdition) + { + [_timerEdition fire]; + return YES; + } + + return NO; +} + +/*! KeyDown event + We just care care about the event A/P and every numbers +*/ +- (void)keyDown:(CPEvent)anEvent +{ + if (![self isEnabled]) + return; + + if ([_datePicker _isEnglishFormat] && [_currentTextField dateType] == CPAMPMDateType && ([anEvent keyCode] == CPAKeyCode || [anEvent keyCode] == CPPKeyCode || [anEvent keyCode] == CPMajAKeyCode || [anEvent keyCode] == CPMajPKeyCode)) + { + if ([anEvent keyCode] == CPAKeyCode || [anEvent keyCode] == CPMajAKeyCode) + [_currentTextField setStringValue:@"AM"]; + else + [_currentTextField setStringValue:@"PM"]; + + [[CPNotificationCenter defaultCenter] postNotificationName:CPDatePickerElementTextFieldAMPMChangedNotification object:_currentTextField userInfo:nil]; + + return; + } + + if ([anEvent keyCode] != CPDeleteKeyCode && [anEvent keyCode] != CPDeleteForwardKeyCode && [anEvent keyCode] < CPZeroKeyCode || [anEvent keyCode] > CPNineKeyCode) + return; + + // Here, at the first editing we launch a timer to auto-finish the editing. There is another behavior when the user has already edited something + if (!_timerEdition) + { + _timerEdition = [CPTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(_timerKeyEvent:) userInfo:nil repeats:NO]; + + // Take care about the delete key + if ([anEvent keyCode] == CPDeleteKeyCode || [anEvent keyCode] == CPDeleteForwardKeyCode) + [_currentTextField setStringKeyValue:@""]; + else + [_currentTextField setStringKeyValue:[anEvent characters]]; + } + else + { + var newFireDate = [CPDate date], + key; + + newFireDate.setSeconds(newFireDate.getSeconds() + 2); + + [_timerEdition setFireDate:newFireDate]; + + // Take care about the delete key + if ([anEvent keyCode] == CPDeleteKeyCode || [anEvent keyCode] == CPDeleteForwardKeyCode) + key = [[_currentTextField stringValue] substringToIndex:[[_currentTextField stringValue] length] - 1]; + else + key = [CPString stringWithFormat:@"%i%i",parseInt([_currentTextField stringValue]), parseInt([anEvent characters])]; + + [_currentTextField setStringKeyValue:key]; + } +} + + +#pragma mark - +#pragma mark Timer event + +/*! End of the timer +*/ +- (void)_timerKeyEvent:(id)sender +{ + _timerEdition = nil; + + if (![[_currentTextField stringValue] isEqualToString:@" "] && ![[_currentTextField stringValue] isEqualToString:@" "]) + { + var value = [_currentTextField stringValue]; + + if ([_datePicker _isEnglishFormat] && [_currentTextField dateType] == CPHourDateType) + { + if (![_datePickerElementView _isAMHour] && value != 12) + value = parseInt(value) + 12; + + if (value == 12 && ![_datePickerElementView _isAMHour]) + value = 12; + else if (value == 12) + value = 0; + } + + [_currentTextField setObjectValue:value]; + } + else + { + [_currentTextField setObjectValue:@"0"]; + } + + +} + +/*! We force to end the timer +*/ +- (void)_endTimer +{ + if (_timerEdition) + { + [_timerEdition invalidate]; + [self _timerKeyEvent:_timerEdition]; + _timerEdition = nil; + } +} + + +#pragma mark - +#pragma mark Layout methods + +/*! Layout the subviews +*/ +- (void)layoutSubviews +{ + if ([_datePicker datePickerStyle] == CPClockAndCalendarDatePickerStyle) + return; + + [super layoutSubviews]; + + var frameSize = CGSizeMakeZero(), + bezelInset = [_datePicker valueForThemeAttribute:@"bezel-inset" inState:[_datePicker themeState]]; + + // Check the mode to display or not the stepper + if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle) + { + frameSize = CGSizeMake(CGRectGetWidth([_datePicker frame]) - CGRectGetWidth([_stepper frame]) - [_datePicker valueForThemeAttribute:@"stepper-margin"], CGRectGetHeight([_datePicker frame])); + + frameSize.width -= bezelInset.left; + frameSize.height -= bezelInset.top + bezelInset.bottom; + + [_datePickerElementView setFrameSize:frameSize]; + [_datePickerElementView setFrameOrigin:CGPointMake(bezelInset.left, bezelInset.top)]; + [_stepper setHidden:NO]; + } + else if ([_datePicker datePickerStyle] == CPTextFieldDatePickerStyle) + { + frameSize = CGSizeMake(CGRectGetWidth([_datePicker frame]), CGRectGetHeight([_datePicker frame])); + + frameSize.width -= bezelInset.left + bezelInset.right; + frameSize.height -= bezelInset.top + bezelInset.bottom; + + [_datePickerElementView setFrameSize:frameSize]; + [_datePickerElementView setFrameOrigin:CGPointMake(bezelInset.left, bezelInset.top)]; + [_stepper setHidden:YES]; + } + + [_stepper setFrameOrigin:CGPointMake(CGRectGetMaxX([_datePickerElementView frame]) + [_datePicker valueForThemeAttribute:@"stepper-margin"], bezelInset.top + CGRectGetHeight([_datePickerElementView frame]) / 2 - CGRectGetHeight([_stepper frame]) / 2)]; + + [_datePickerElementView setNeedsLayout]; +} + +@end + + +/*! This class is used to display the elements (all of the textFields) in the datePicker +*/ +@implementation _CPDatePickerElementView : CPControl +{ + _CPDatePickerElementTextField _textFieldDay; + _CPDatePickerElementTextField _textFieldMonth; + _CPDatePickerElementTextField _textFieldYear; + _CPDatePickerElementTextField _textFieldHour; + _CPDatePickerElementTextField _textFieldMinute; + _CPDatePickerElementTextField _textFieldSecond; + _CPDatePickerElementTextField _textFieldPMAM; + CPDatePicker _datePicker; + CPTextField _textFieldSeparatorOne; + CPTextField _textFieldSeparatorTwo; + CPTextField _textFieldSeparatorThree; + CPTextField _textFieldSeparatorFour; +} + + +#pragma mark - +#pragma mark Init + +- (id)initWithFrame:(CGRect)aFrame withDatePicker:(CPDatePicker)aDatePicker +{ + if (self = [super init]) + { + _datePicker = aDatePicker; + [self _init]; + } + return self; +} + +- (void)_init +{ + _textFieldDay = [_CPDatePickerElementTextField new]; + [_textFieldDay setBezeled:NO]; + [_textFieldDay setBordered:NO]; + [_textFieldDay setDateType:CPDayDateType]; + [_textFieldDay setDatePicker:_datePicker]; + [_textFieldDay setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldDay]; + + _textFieldMonth = [_CPDatePickerElementTextField new]; + [_textFieldMonth setBezeled:NO]; + [_textFieldMonth setBordered:NO]; + [_textFieldMonth setDateType:CPMonthDateType]; + [_textFieldMonth setDatePicker:_datePicker]; + [_textFieldMonth setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldMonth]; + + _textFieldYear = [_CPDatePickerElementTextField new]; + [_textFieldYear setBezeled:NO]; + [_textFieldYear setBordered:NO]; + [_textFieldYear setDateType:CPYearDateType]; + [_textFieldYear setDatePicker:_datePicker]; + [_textFieldYear setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldYear]; + + _textFieldHour = [_CPDatePickerElementTextField new]; + [_textFieldHour setBezeled:NO]; + [_textFieldHour setBordered:NO]; + [_textFieldHour setDateType:CPHourDateType]; + [_textFieldHour setDatePicker:_datePicker]; + [_textFieldHour setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldHour]; + + _textFieldMinute = [_CPDatePickerElementTextField new]; + [_textFieldMinute setBezeled:NO]; + [_textFieldMinute setBordered:NO]; + [_textFieldMinute setDateType:CPMinuteDateType]; + [_textFieldMinute setDatePicker:_datePicker]; + [_textFieldMinute setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldMinute]; + + _textFieldSecond = [_CPDatePickerElementTextField new]; + [_textFieldSecond setBezeled:NO]; + [_textFieldSecond setBordered:NO]; + [_textFieldSecond setDateType:CPSecondDateType]; + [_textFieldSecond setDatePicker:_datePicker]; + [_textFieldSecond setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldSecond]; + + _textFieldPMAM = [_CPDatePickerElementTextField new]; + [_textFieldPMAM setBezeled:NO]; + [_textFieldPMAM setBordered:NO]; + [_textFieldPMAM setDateType:CPAMPMDateType]; + [_textFieldPMAM setDatePicker:_datePicker]; + [_textFieldPMAM setAlignment:CPRightTextAlignment]; + [self addSubview:_textFieldPMAM]; + + _textFieldSeparatorOne = [CPTextField labelWithTitle:@"/"]; + _textFieldSeparatorTwo = [CPTextField labelWithTitle:@"/"]; + _textFieldSeparatorThree = [CPTextField labelWithTitle:@":"]; + _textFieldSeparatorFour = [CPTextField labelWithTitle:@":"]; + + [self addSubview: _textFieldSeparatorOne]; + [self addSubview: _textFieldSeparatorTwo]; + [self addSubview: _textFieldSeparatorThree]; + [self addSubview: _textFieldSeparatorFour]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_datePickerElementTextFieldAMPMChangedNotification:) name:CPDatePickerElementTextFieldAMPMChangedNotification object:_textFieldPMAM]; + + [self setNeedsLayout]; +} + + +#pragma mark - +#pragma mark Responder methods + +- (BOOL)acceptFirstResponder +{ + return NO; +} + + +#pragma mark - +#pragma mark Setter Getter methods + +/*! Set the value of the textFields + @param aDateValue the value +*/ +- (void)setDateValue:(CPDate)aDateValue +{ + [_textFieldDay setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getDate()]]; + [_textFieldMonth setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getMonth() + 1]]; + [_textFieldYear setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getFullYear()]]; + [_textFieldHour setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getHours()]]; + [_textFieldMinute setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getMinutes()]]; + [_textFieldSecond setStringValue:[CPString stringWithFormat:@"%i", aDateValue.getSeconds()]]; + + if (aDateValue.getHours() > 11) + [_textFieldPMAM setStringValue:@"PM"]; + else + [_textFieldPMAM setStringValue:@"AM"]; +} + + +/*! Set the widget enabled or not + @param aBoolean +*/ +- (void)setEnabled:(BOOL)aBoolean +{ + [super setEnabled:aBoolean]; + [_textFieldDay setEnabled:aBoolean]; + [_textFieldMonth setEnabled:aBoolean]; + [_textFieldYear setEnabled:aBoolean]; + [_textFieldHour setEnabled:aBoolean]; + [_textFieldMinute setEnabled:aBoolean]; + [_textFieldSecond setEnabled:aBoolean]; + [_textFieldSeparatorOne setEnabled:aBoolean]; + [_textFieldSeparatorTwo setEnabled:aBoolean]; + [_textFieldSeparatorThree setEnabled:aBoolean]; + [_textFieldSeparatorFour setEnabled:aBoolean]; + [_textFieldPMAM setEnabled:aBoolean]; +} + +/*! Return YES if the hour is set to the morning +*/ +- (BOOL)_isAMHour +{ + return [[_textFieldPMAM stringValue] isEqualToString:@"AM"]; +} + + +#pragma mark - +#pragma mark Notification methods + +/*! Called when changing AM or PM + @param aNotification +*/ +- (void)_datePickerElementTextFieldAMPMChangedNotification:(CPNotification)aNotification +{ + var value = [[aNotification object] stringValue], + dateValue = [[_datePicker dateValue] copy]; + + if ([value isEqualToString:@"PM"]) + { + if (dateValue.getHours() <= 11) + dateValue.setHours(dateValue.getHours() + 12); + } + else + { + if (dateValue.getHours() > 11) + dateValue.setHours(dateValue.getHours() - 12); + } + + [_datePicker setDateValue:dateValue]; +} + + +#pragma mark - +#pragma mark Layout methods + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + var themeState = [_datePicker themeState]; + + if ([_datePicker isBezeled] && [_datePicker drawsBackground] || [_datePicker isBordered] && [_datePicker drawsBackground]) + [self setBackgroundColor:[_datePicker valueForThemeAttribute:@"bezel-color" inState:themeState]]; + else if ([_datePicker drawsBackground]) + [self setBackgroundColor:[_datePicker backgroundColor]]; + else + [self setBackgroundColor:[CPColor clearColor]]; + + [self _themeTextFields]; + + [self _updateResponderTextField]; + [self _updateHiddenTextFields]; + [self _sizeToFit]; + [self _updatePositions]; + + [self setNeedsDisplay:YES]; +} + +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + if (([_datePicker isBordered] || [_datePicker isBezeled]) && ![_datePicker drawsBackground]) + { + var context = [[CPGraphicsContext currentContext] graphicsPort], + borderWidth = [_datePicker valueForThemeAttribute:@"border-width"] / 2, + bezelInset = [_datePicker valueForThemeAttribute:@"bezel-inset" inState:[_datePicker themeState]]; + + CGContextBeginPath(context); + CGContextSetStrokeColor(context, [_datePicker valueForThemeAttribute:@"border-color" inState:[_datePicker themeState]]); + CGContextSetLineWidth(context, [_datePicker valueForThemeAttribute:@"border-width"]); + + CGContextMoveToPoint(context, borderWidth - bezelInset.left, borderWidth); + CGContextAddLineToPoint(context, [self bounds].size.width + bezelInset.left - borderWidth, borderWidth); + CGContextAddLineToPoint(context, [self bounds].size.width + bezelInset.left - borderWidth, [self bounds].size.height - borderWidth); + CGContextAddLineToPoint(context, borderWidth - bezelInset.left, [self bounds].size.height - borderWidth); + CGContextAddLineToPoint(context, borderWidth-bezelInset.left, borderWidth); + + CGContextStrokePath(context); + CGContextClosePath(context); + } + +} + +/*! Theme the textFields depending of the theme of the datePicker +*/ +- (void)_themeTextFields +{ + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldDay setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldDay setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldMonth setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldMonth setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldYear setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldYear setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldHour setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldHour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldMinute setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldMinute setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldSecond setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldSecond setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"min-size-datepicker-textfield"] forThemeAttribute:@"min-size"]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateSelected] forThemeAttribute:@"bezel-color" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateSelected]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateNormal] forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"datepicker-textfield-bezel-color" inState:CPThemeStateDisabled] forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled]; + [_textFieldPMAM setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldPMAM setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldSeparatorOne setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldSeparatorOne setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldSeparatorOne setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorOne setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldSeparatorTwo setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldSeparatorTwo setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldSeparatorTwo setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorTwo setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldSeparatorThree setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldSeparatorThree setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldSeparatorThree setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorThree setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateNormal] forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"content-inset-datepicker-textfield-separator" inState:CPThemeStateSelected] forThemeAttribute:@"content-inset" inState:CPThemeStateSelected]; + [_textFieldSeparatorFour setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateNormal]; + [_textFieldSeparatorFour setValue:[_datePicker textColor] forThemeAttribute:@"text-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateNormal]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateNormal]; + [_textFieldSeparatorFour setValue:[_datePicker textFont] forThemeAttribute:@"font" inState:CPThemeStateDisabled]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"text-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateDisabled]; + [_textFieldSeparatorFour setValue:[_datePicker valueForThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled] forThemeAttribute:@"text-shadow-offset" inState:CPThemeStateDisabled]; + +} + +/*! Hide or not the textField depending on the datePickerElements flag +*/ +- (void)_updateHiddenTextFields +{ + var datePickerElements = [_datePicker datePickerElements], + isEnglishFormat = [_datePicker _isEnglishFormat]; + + if (datePickerElements & CPYearMonthDatePickerElementFlag) + { + [_textFieldDay setHidden:YES]; + [_textFieldMonth setHidden:NO]; + [_textFieldYear setHidden:NO]; + [_textFieldSeparatorTwo setHidden:NO]; + [_textFieldSeparatorOne setHidden:YES]; + + if (([datePickerElements & CPYearMonthDayDatePickerElementFlag]) == CPYearMonthDayDatePickerElementFlag) + { + [_textFieldDay setHidden:NO]; + [_textFieldSeparatorOne setHidden:NO]; + } + } + else + { + [_textFieldMonth setHidden:YES]; + [_textFieldYear setHidden:YES]; + [_textFieldDay setHidden:YES]; + [_textFieldSeparatorTwo setHidden:YES]; + [_textFieldSeparatorOne setHidden:YES]; + } + + if (datePickerElements & CPHourMinuteDatePickerElementFlag) + { + [_textFieldHour setHidden:NO]; + [_textFieldMinute setHidden:NO]; + [_textFieldSecond setHidden:YES]; + [_textFieldSeparatorThree setHidden:NO]; + [_textFieldSeparatorFour setHidden:YES]; + + if (isEnglishFormat) + [_textFieldPMAM setHidden:NO]; + else + [_textFieldPMAM setHidden:YES]; + + if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag) + { + [_textFieldSecond setHidden:NO]; + [_textFieldSeparatorFour setHidden:NO]; + } + } + else + { + [_textFieldHour setHidden:YES]; + [_textFieldMinute setHidden:YES]; + [_textFieldSecond setHidden:YES]; + [_textFieldSeparatorThree setHidden:YES]; + [_textFieldSeparatorFour setHidden:YES]; + [_textFieldPMAM setHidden:YES]; + } +} + +/*! Update the position of the textField depending on the datePickerElements flag +*/ +- (void)_updatePositions +{ + var contentInset = [_datePicker valueForThemeAttribute:@"content-inset" inState:[_datePicker themeState]], + separatorContentInset = [_datePicker valueForThemeAttribute:@"separator-content-inset"], + horizontalInset = contentInset.left - contentInset.right, + verticalInset = contentInset.top - contentInset.bottom, + firstTexField = _textFieldMonth, + secondTextField = _textFieldDay, + isEnglishFormat = [_datePicker _isEnglishFormat]; + + if (!isEnglishFormat) + { + firstTexField = _textFieldDay; + secondTextField = _textFieldMonth; + } + + [firstTexField setFrameOrigin:CGPointMake(horizontalInset,verticalInset)]; + [_textFieldSeparatorOne setFrameOrigin:CGPointMake(CGRectGetMaxX([firstTexField frame]) + separatorContentInset.left, verticalInset)]; + + if ([firstTexField isHidden]) + [secondTextField setFrameOrigin:CGPointMake(horizontalInset,verticalInset)]; + else + [secondTextField setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldSeparatorOne frame]) + separatorContentInset.right, verticalInset)]; + + if (isEnglishFormat && [secondTextField isHidden]) + [_textFieldSeparatorTwo setFrameOrigin:CGPointMake(CGRectGetMaxX([firstTexField frame]) + separatorContentInset.left, verticalInset)]; + else + [_textFieldSeparatorTwo setFrameOrigin:CGPointMake(CGRectGetMaxX([secondTextField frame]) + separatorContentInset.left, verticalInset)]; + + [_textFieldYear setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldSeparatorTwo frame]) + separatorContentInset.right, verticalInset)]; + + if ([_textFieldMonth isHidden]) + [_textFieldHour setFrameOrigin:CGPointMake(horizontalInset, verticalInset)]; + else + [_textFieldHour setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldYear frame]) + [_datePicker valueForThemeAttribute:@"date-hour-margin"],verticalInset)]; + + [_textFieldSeparatorThree setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldHour frame]) + separatorContentInset.left, verticalInset)]; + [_textFieldMinute setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldSeparatorThree frame]) + separatorContentInset.right, verticalInset)]; + [_textFieldSeparatorFour setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldMinute frame]) + separatorContentInset.left, verticalInset)]; + [_textFieldSecond setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldSeparatorFour frame]) + separatorContentInset.right, verticalInset)]; + + if ([_textFieldSecond isHidden]) + [_textFieldPMAM setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldMinute frame]) + 2, verticalInset)]; + else + [_textFieldPMAM setFrameOrigin:CGPointMake(CGRectGetMaxX([_textFieldSecond frame]) + 2, verticalInset)]; +} + +/*! Size to fit all of the textFields +*/ +- (void)_sizeToFit +{ + [_textFieldDay sizeToFit]; + [_textFieldMonth sizeToFit]; + [_textFieldYear sizeToFit]; + [_textFieldHour sizeToFit]; + [_textFieldMinute sizeToFit]; + [_textFieldSecond sizeToFit]; + [_textFieldSeparatorOne sizeToFit]; + [_textFieldSeparatorTwo sizeToFit]; + [_textFieldSeparatorThree sizeToFit]; + [_textFieldSeparatorFour sizeToFit]; + [_textFieldPMAM sizeToFit]; +} + + +#pragma mark - +#pragma mark Responder methods + +- (void)_updateResponderTextField +{ + [self _updateFirstLastTextField]; + [self _updateKeyView]; +} + +/*! Update the var _firstTextField and _lastTextField +*/ +- (void)_updateFirstLastTextField +{ + var datePickerElements = [_datePicker datePickerElements]; + + if ([_datePicker _isEnglishFormat]) + { + if (datePickerElements & CPYearMonthDayDatePickerElementFlag || datePickerElements & CPYearMonthDatePickerElementFlag) + [[self superview] setFirstTextField:_textFieldMonth]; + else + [[self superview] setFirstTextField:_textFieldHour]; + + if (datePickerElements & CPHourMinuteSecondDatePickerElementFlag || datePickerElements & CPHourMinuteDatePickerElementFlag) + [[self superview] setLastTextField:_textFieldPMAM]; + else + [[self superview] setLastTextField:_textFieldYear]; + } + else + { + if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag) + [[self superview] setFirstTextField:_textFieldDay]; + else if (datePickerElements & CPYearMonthDayDatePickerElementFlag || datePickerElements & CPYearMonthDatePickerElementFlag) + [[self superview] setFirstTextField:_textFieldMonth]; + else + [[self superview] setFirstTextField:_textFieldHour]; + + if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag) + [[self superview] setLastTextField:_textFieldSecond]; + else if (datePickerElements & CPHourMinuteSecondDatePickerElementFlag || datePickerElements & CPHourMinuteDatePickerElementFlag) + [[self superview] setLastTextField:_textFieldMinute]; + else + [[self superview] setLastTextField:_textFieldYear]; + } +} + +/*! Update the nextTextField params of all of the textField. This is used to move the current textField with the arrows +*/ +- (void)_updateKeyView +{ + var datePickerElements = [_datePicker datePickerElements], + firstTexField = _textFieldMonth, + secondTextField = _textFieldDay, + isEnglishFormat = [_datePicker _isEnglishFormat]; + + if (!isEnglishFormat) + { + firstTexField = _textFieldDay; + secondTextField = _textFieldMonth; + } + + if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag) + [firstTexField setNextKeyView:secondTextField]; + else + [firstTexField setNextKeyView:_textFieldYear]; + + [secondTextField setNextKeyView:_textFieldYear]; + + if (datePickerElements & CPHourMinuteSecondDatePickerElementFlag || datePickerElements & CPHourMinuteDatePickerElementFlag) + [_textFieldYear setNextKeyView:_textFieldHour]; + else if (isEnglishFormat || (datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag) + [_textFieldYear setNextKeyView:firstTexField]; + else + [_textFieldYear setNextKeyView:secondTextField]; + + [_textFieldHour setNextKeyView:_textFieldMinute]; + + if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag) + [_textFieldMinute setNextKeyView:_textFieldSecond]; + else if (isEnglishFormat) + [_textFieldMinute setNextKeyView:_textFieldPMAM]; + else if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag) + [_textFieldMinute setNextKeyView:firstTexField]; + else if (datePickerElements & CPYearMonthDatePickerElementFlag) + [_textFieldMinute setNextKeyView:secondTextField]; + else + [_textFieldMinute setNextKeyView:_textFieldHour]; + + if (isEnglishFormat) + [_textFieldSecond setNextKeyView:_textFieldPMAM]; + else if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag) + [_textFieldSecond setNextKeyView:firstTexField]; + else if (datePickerElements & CPYearMonthDatePickerElementFlag) + [_textFieldSecond setNextKeyView:secondTextField]; + else + [_textFieldSecond setNextKeyView:_textFieldHour]; + + if (datePickerElements & CPYearMonthDayDatePickerElementFlag) + [_textFieldPMAM setNextKeyView:_textFieldMonth]; + else + [_textFieldPMAM setNextKeyView:_textFieldHour]; +} + +@end + + +var CPMonthDateType = 0, + CPDayDateType = 1, + CPYearDateType = 2, + CPHourDateType = 3, + CPSecondDateType = 4, + CPMinuteDateType = 5, + CPAMPMDateType = 6; + +/*! An element textField +*/ +@implementation _CPDatePickerElementTextField : CPTextField +{ + CPDatePicker _datePicker @accessors(setter=setDatePicker:); + + int _dateType @accessors(getter=dateType); + int _maxNumber @accessors(getter=maxNumber); + int _minNumber @accessors(getter=minNumber); +} + + +#pragma mark - +#pragma mark Getter Setter methods + +- (BOOL)acceptFirstResponder +{ + return NO; +} + +/*! Set the dateType of the textField +*/ +- (void)setDateType:(int)aDateType +{ + _dateType = aDateType; + + switch (aDateType) + { + case CPMonthDateType: + _minNumber = 1; + _maxNumber = 12; + break; + + case CPDayDateType: + _minNumber = 1; + _maxNumber = 31; + break; + + case CPYearDateType: + _minNumber = 0; + _maxNumber = 9999; + break; + + case CPHourDateType: + _minNumber = 0; + _maxNumber = 23; + break; + + case CPSecondDateType: + _minNumber = 0; + _maxNumber = 59; + break; + + case CPMinuteDateType: + _minNumber = 0; + _maxNumber = 59; + break; + } +} + +/*! Return the maxNumber of the textField +*/ +- (int)maxNumber +{ + if (_dateType == CPDayDateType) + return [[_datePicker dateValue] _daysInMonth]; + + return _maxNumber; +} + +/*! Return the maxNumber of the textField depending of the maxDate +*/ +- (int)_maxNumberWithMaxDate +{ + var maxDate = [_datePicker maxDate], + date = [_datePicker dateValue]; + + if (maxDate) + { + switch (_dateType) + { + case CPMonthDateType: + if (maxDate.getFullYear() == date.getFullYear()) + return maxDate.getMonth(); + break; + + case CPDayDateType: + if (maxDate.getFullYear() == date.getFullYear() && maxDate.getMonth() == date.getMonth()) + return maxDate.getDate(); + break; + + case CPYearDateType: + return maxDate.getFullYear(); + + case CPHourDateType: + if (maxDate.getFullYear() == date.getFullYear() && maxDate.getMonth() == date.getMonth() && maxDate.getDate() == date.getDate()) + return maxDate.getHours(); + break; + + case CPSecondDateType: + if (maxDate.getFullYear() == date.getFullYear() && maxDate.getMonth() == date.getMonth() && maxDate.getDate() == date.getDate() && maxDate.getHours() == date.getHours() && maxDate.getMinutes() == date.getMinutes()) + return maxDate.getSeconds(); + break; + + case CPMinuteDateType: + if (maxDate.getFullYear() == date.getFullYear() && maxDate.getMonth() == date.getMonth() && maxDate.getDate() == date.getDate() && maxDate.getHours() == date.getHours()) + return maxDate.getMinutes(); + break; + } + } + + return _maxNumber; +} + +/*! Set the stringValue of the textField. This is going to check if there is 2 or 4 letters. If not it adds a space. Check also the maxDate + It's called when the user is editing with the keyboard + @param aStringValue a CPString +*/ +- (void)setStringKeyValue:(id)anObjectValue +{ + if (_dateType == CPYearDateType) + { + if ([anObjectValue length] > 4) + return + + while ([anObjectValue length] < 4) + anObjectValue = " " + anObjectValue; + } + else + { + if ([anObjectValue length] > 2) + return + + while ([anObjectValue length] < 2) + anObjectValue = " " + anObjectValue; + } + + if (parseInt(anObjectValue) > [self _maxNumberWithMaxDate]) + return; + + if ([_datePicker _isEnglishFormat] && _dateType == CPHourDateType && parseInt(anObjectValue) > 12) + return; + + [super setObjectValue:anObjectValue]; +} + +/*! Set the stringValue of the TextField. Add some zeros of there isn't 2/4 letters in the value. It's called at the end of the editing process + @param aStringValue a CPString +*/ +- (void)setStringValue:(id)aStringValue +{ + if (_dateType == CPYearDateType) + { + while ([aStringValue length] < 4) + aStringValue = "0" + aStringValue; + } + else if (_dateType != CPAMPMDateType) + { + if (_dateType == CPHourDateType && [_datePicker _isEnglishFormat]) + { + var value = parseInt(aStringValue); + + if (value == 0) + value = 12; + else if (value > 12) + value = value - 12; + + aStringValue = value.toString(); + } + + while ([aStringValue length] < 2) + aStringValue = "0" + aStringValue; + } + + [super setObjectValue:aStringValue]; +} + +/*! Set the objectValue. This will update the dateValue of the datePicker also. It's called with the binding of the stepper or arrows + This is not going to update the objectValue of the control !!! It updates the dateValue of the datePicker who's going to update the datePickerTextField if necessary + It's a bit tricky + @param aObjectValue +*/ +- (void)setObjectValue:(id)anObjectValue +{ + var dateValue = [[_datePicker dateValue] copy]; + + switch (_dateType) + { + case CPMonthDateType: + dateValue.setMonth(parseInt(anObjectValue) - 1); + break; + + case CPDayDateType: + dateValue.setDate(parseInt(anObjectValue)); + break; + + case CPYearDateType: + dateValue.setFullYear(parseInt(anObjectValue)); + break; + + case CPHourDateType: + dateValue.setHours(parseInt(anObjectValue)); + break; + + case CPSecondDateType: + dateValue.setSeconds(parseInt(anObjectValue)); + break; + + case CPMinuteDateType: + dateValue.setMinutes(parseInt(anObjectValue)); + break; + } + + [_datePicker setDateValue:dateValue]; +} + +/*! Return the objectValue of the textField. Needed for the binding. + This returns the objectValue relative to the dateValue +*/ +- (void)objectValue +{ + var dateValue = [[_datePicker dateValue] copy]; + + switch (_dateType) + { + case CPMonthDateType: + return dateValue.getMonth() + 1; + break; + + case CPDayDateType: + return dateValue.getDate(); + break; + + case CPYearDateType: + return dateValue.getFullYear(); + break; + + case CPHourDateType: + return dateValue.getHours(); + break; + + case CPSecondDateType: + return dateValue.getSeconds(); + break; + + case CPMinuteDateType: + return dateValue.getMinutes(); + break; + + default: + return [super objectValue]; + break; + } + + return [super objectValue]; +} + +#pragma mark - +#pragma mark Mouse event + +/*! Mouse down event. Launch a notification to notif the new first responder textField +*/ +- (void)mouseDown:(CPEvent)anEvent +{ + if (![self isEnabled]) + return; + + [super mouseDown:anEvent]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPDatePickerElementTextFieldBecomeFirstResponder object:[[self superview] superview] userInfo:[CPDictionary dictionaryWithObject:self forKey:@"textField"]]; +} + + +#pragma mark - +#pragma mark Theme functions + +/*! Set the theme CPThemeStateSelected +*/ +- (void)makeSelectable +{ + [self setThemeState:CPThemeStateSelected]; +} + +/*! Unsert the theme CPThemeStateSelected +*/ +- (void)makeDeselectable +{ + [self unsetThemeState:CPThemeStateSelected]; +} + +@end \ No newline at end of file diff --git a/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left-highlighted.png b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..de074caf93f82e2a8bcaf796a93137832719fbc6 GIT binary patch literal 1109 zcmbVLO=#0l9M2|hW2_ED!B31CqQctbrES`T)h+EyUBS-L6)gy2mb|TD%ZJI^nhlv_ zyC@=V2le1VQ1RelM=ydOFb_i+y2Au7;z01E=t;$|m#v*1h6h8E_ul{gf4~3t#onHy zq2^u96h(z{-LOE`M)EZ`HITpm9EQlU6DuX$XAj_t>LNR?Q_L!_MD~H0W$0BEJd|SAoGRse>5T0n zIv$CJH4Xq;5F#KJ7X;8w^Bmw=j=Vw`#H6?&@d>*6FvOax4@d==t=b}|6jR37kyy4; zsYEK#i0uxtKorG*gXhCUBkYY?SoOn}*H&YI$kSZI!G>+o0i)V)kKhzTJY5UHbn^Li zV#}*0ilmJ7Rfh!;jy267u2pRh7tkL!Hq`ctV-8{q$g@XWjnreHtp+B!`?sM$k$58= zcMVb$br{;(h>0wmgDHmGM07)!IFKY+OvJbZ&k0EYM8Jsf}W7HxaD)&ad` z8{1ylcIZr>Kp)DhnqdWk!$E=8;)TdHMv z1PWASAt@x7DpvoWtg*xyHfWE(+NCBUJs51)o1Yxk#|K$tW?V8Hx6=FO$zVBUK9>Bj8rCvoQImG*_kdGGNQ*K*aVzc+D#se965c71QXG=Ki? zbYts7JUTkDI2ocYZ*N%n{O;NHn=`YsU#HZA+jgJ(@onUUWqk+!&nZ1{E`4U|H`tEm#95n^~da2 z;&f8k1{b6Xp`}7-2yueLq#?A!dH}ITtpsdAJHj|1K@T7yQ9gtQVr)FONdc+a0n7G# z@9+Qb_y6{*6Jt*g4L&i*aokXO6j#~W&z`}7FnjwQJj9kGv^Yg4?HSroUBcycdzyf< zsm_urQT67T&q$WzLUp4yMW-sy$eL}&)IcZZn+`*BTz15FRBet>FimC+E5~nrc%27^ zp5sp^D`Le_NZlA+bjjr6SWR1;(=s|g@)XGWG9xevRe^8LTb}Ia_-$U9?E|sEgKZT$ zm*aPwnyO3y#dZlu#^O;;gb*MUgNYb6MWSXU`!NDGl*+j+oM(Tj~jbxd$p!Rgevju1y^JBm^s=5 zv)nz{P@u@Xk;h$w6-AxLwzgmridpDW5OJ z5te!!dtpln5i9YelER51gheTjit#i~7gB{%CZ$NYhb>zkRV|J5>>A8&7h8BBR#sf1 zQroTB_I$4cCh9h|y}IoHWfFlC6;(5=K=5Qxpq+Rzag7&=UUF>{Y-d+5^`-o3wWa&N4(THd#tn{N$oxF+74VD=Uv~U3qS`@1?uHx5F*{ zmFB*I{pSuo`|EeNRzsKG`{kSU{+aOW#|CcRxN)I=7(8vTGgEq{8RyE?3I iz1%;%alT-14~4li*T%hLmqQnWpGUbkhTku|aN%z%WsLs- literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right-highlighted.png b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4af90e2957234da4a5471d027f2a4e03b9f4df GIT binary patch literal 1108 zcmbVL%TLrm7_UKbLGcwYcrcT~0S&wDbeDEpS)seLE1R&mSym-6QA#_o4fH`fu!R^O z#2CF8{{a%>QKDyzF&yw>!oj2Aq(|dH2}WZ?aSFTWfq1ZKJ2T&Wzu)(MP#n0>(tN6! zVVIVDA1cxHApM#njr1R^q87TelI#!}bVf;4^Dv_t&Iks1OB=%_tQj+tuW>iSG*ry; z5E&};E4pLFv`{A&ST02~Om|P@~-G^e11=}iQJjL!fHB=~qjN@U@6^lo8 z9zr0BF_`EQMc4@h9ts>!Uoi?3N|&ez5~w{awdNV4N(tp^w&*FvRtRwwj;mIyv1&Z# zcw-!tWjW*!gecXB`ZG4sf~f7c)fo`>bDVA-)JB{sl47Z+J0VzZp|DGA`?W;T zlyQOPaxlhomKDaet?iQ%{^Q1;+J1S)#as#d&XlLqdW^Q!!8CXOHWVsSZd5 z2(yAJX5&eeOiSsUEM){#$L4LHXts{)c1>!xhK>Idt7JT^5yvY#&P2TfiWP@Ae#LP? zW>5qj1x+{YP;e$J&`!Jvd*(DYa-L&>?F=jCULFW4l+r4St2>b=Gcb|O$S{kts+bfd zwuUwSCu+itGTpZj*Q2#(%={_co3J$>`*=l3g@dLPR7 jdhQ_k*oJm!|81s$x%<(-*Z8FKdN}9#>;QU}9-jLRpw?q_ literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right.png b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ca16659eed3e2090103217888f1b1a0607429765 GIT binary patch literal 1195 zcmbVM+iMh87@tImx)_W!N>bV~OvD@R&SiIJcgJkj&7PUM*iFM`rSU*u*NwiPYWpq%9sZ^qaYGBd;XiKds_o=PEJ$aeV-{@%*Q39! z2FAJD+mNS-y%D~(HCz;V2$)JyhXzW6IEB9iR818aHj1+t2{93l;iD`YW0@EL5-%l_ zQjiB+jbk^g6knwPC1AwyBew85Xo%JYb^# zjXauSLt-k%ia<>AQ9eR#W7YqYH5xlZd+qVBcBzSQ4|?03=EsMf@qq@O85SOBEsnz;vRfZ5&R#s%Q8yv{z zE0szgac2L|7ryYJh2Tl`{OsIZ>*C_#lM+IAqt2V9k>j(A8yg#~6B83(tyZgFHZ?cD ztMgs0zf^zw_qoYQ>)FDBa%l4Wft%$UMdEVD_v^2IJbS;(5k>KbL(F07ryH|JT3QZI fO--GiBI+85E7x+;)3NuX-tQwVc7X?-edB)vX$+4s literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-circle-image-highlighted.png b/AppKit/Themes/Aristo/Resources/datepicker-circle-image-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3a52153bf6e010081117650ac246e9176b963f GIT binary patch literal 1162 zcmbVMPiWg#99H5j*bd#&!swb&cvUYAnJqoVmL*{)Q!J@9jZ@>8F0idkkzQhvNKchs zW;s*$S}w^6)NB&VuGeS=Y>kMz;5X(bRKPUEZBmO z*#f)m)MU8=ia0a_Xa$Z>9PEKe(VW8b zq`*>7w?lCKa(PGC3)_jJDdU=^&%rd$xo#BK7CIzV^p6|6qQhFtM_d(!cs{V`c}ySf zkZJB-Zzuv%ZhJk$+Umtt+KyL4f%6%%jR3n~E5nMjiwFOWTq?qh zUNmyLs`5FtsIhIX{eQB?QD?ZQJpNTKoh@2}(R8Qy>0+mSkVktapv|$5`D8C`teYiG ztu=p~`s3BBkyt!-hVQ$`oPMwGV)u3CO&ODkQy%-P;V;=V92IQY@fFI|g^izmnW`}=?19O!<|)zZ@Q z{bKIS+KJ`-f#mN8A3c3?<@xu6Z)~c+e$YB)T-rasoNqn8>93D|cdM}x#D02_J#=XO zht*XQt2|4N?T!D|ef^!j2g literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-circle-image.png b/AppKit/Themes/Aristo/Resources/datepicker-circle-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c315ff4b1853528a5a89ceab9197cea54a51b24f GIT binary patch literal 1235 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 T;;#RF`ERIis#m4seD}Wq{tIX- literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand-disabled.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d4413ceb14f73ff98d5a82d4335b6f5e83a7d432 GIT binary patch literal 1188 zcmbVMTWkzb7@mYQG^7%wLFgFwurqVE-PxVdwVBTB>L#{oyJEuw)0xxm=+4E=shu`L z@PG#*;XzU*@hFrKp(r9kkPuB1!UG|ZKA>q6;uf4~yG7D?Fqt`*|NP(gU(Wx}f%>}D zQ%h%;5(F_dSu3aU%=q7=5)TTxpeA{$||ZbqqrYd0xU*P_&hP>N0263pqf z?G9{cugj?IEh?{3u~lTXCtv~tB8Bvfyy*&Flp5w0@Y)wM6gjMdTB6j5Q`uBKDOnCA zLv&?8WdR^Ljs{gBjsq*mAPa&Fi(f7Ps)P_H1jFR$Lt$%<)+D6m#HcO2i&8m+Y=L14 zg#uluq%EhJ0X)z99Km1!YXsaj6DeN6bQcsEWaz4nZX?|?NuN<^v|3S=!k&(VVA!eD z7_sS&CJLvF@f4c@G|L!L8< z$jVYpB$D6&hzCU$#1mpX!t)U<0%8%HG+m^aDlFR7eY+!A@t;^ha-f1NCu3RpVg=Oa zEM&Pk%O<4;j$E2jRNeFi%lr!(iC2b>z8z`_$1=#_3=8^r9`Juh9+5y*TuOxFqR56t zNv1}z+W%yY!Ok##dHhi>MG>w+e>qnCcr(^M(8N9C;O3|V-zjNi&#Cf;Y^`E_zuRv z3*G8n-}oYXw&T)`?oIqakC^)LR9HD!{_5wq>+^OUK60=B%ZK-;zur-X@^cpN`f#~= z;m(@7vFES9EnZ*#k~!EmW$0YlN}}xbfh8xrzlYCn24`*|`VMV=)EkyA`~Qt(yiV?_ H*|O&sh3lAp literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..d42a0c2b2350b22ca81b8c0609c7b1e15effa164 GIT binary patch literal 1205 zcmbVMeQ4BX7>^U3TG}xR^8*?0BBKtxBya96cL{fvG`Z8;ytZDC?L5ch{TbYC!7Dcca|P}hxZe{Bpu5k#z@LpNE)shc1&*+3X$gS}~cbwam47Lxbl zd4JE>?|q)^?d{&sx@^@lhGAL@8}$;M`RH4+n2tfm+sEj%lH@9+4-b%<;Uh-1a6bYC z#~4H?4rm;xSWz5J(aS6G=&e>wqXgkr(JI#b827N{W~QvkyzX`PP6^((|*v z=q}4v3Go!3uhnW?EzV(okcYA?M>a$;MiH@~?h+%6xxt#I1sw&ZZ+pbXE{H4|{dk0A zSsLj~3XWGS&KY)tS)wRqd}w$)e|dQUsW$ET$4dN))6tgfbLlUC&E-Rn5mG zU2NKzS68RJcWLQ#Ixj((6IB7`@@g(E%aI7GP2GYU5W_W5)2~haYI0YXEXG9&jQ^{y zqWQ=m*e_!|+^m4!DkeCnVh?D25?EU_OxukF&qWtBldq0^dlXrDA3I>0Va1*&0zrN> z^RxyNIW3>csj84tHJzQ+wf+xlJPn4A%Htp9(iG7ejFxl7Pd9VzgIwA(K5dTACxVN# zv2GP~wH#i%_Z@6I1y(HD@%*-ygIY(=k6Z37{VKlmF|Ob9e`~vbYHDh;_Scw@_@(pb z*|zfHB%Y97Y~f*Y^u3Rsw(sn!y)5rt ze)DkY6D6j6I%;pda`rQ6*NHErv1|3CdyW^@pMQVpxjz4DD##O5@+$ely^D qe}C%qsvBzN*E8)sj|{05+ZQZmxJhz>2khPGM^eaj>l0l&cK;1HWtEEn literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand-disabled.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..535b4467869d92dda46648d4ec897361d7fce9cc GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$Z5SAsGcrRWN+NuHtdjF{^%6m9^eS=-fVvqNZ0suv5|gu2OB9k) z(=+pImEP~(ucVNfVyhHx>TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVFffGH?<^D zp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRf0Gw!Z$#{Ilm}X!Bo#!H`&0@P{GVh&(Orw z%*;?n!N|bSNZ$a6%ybP+tW3?UjLa3FKnZADQA(Oskc%7CE+EfVDWjyMz)D}gyu4hm z+*mKaC|%#s($W%ShLMpjP=#)BWnM{Qg>GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smX zK$k+ikXzvE3pY5g7#dK(Ak(i%EYLU9Gtke?1^ElCy0|1L72yo5s*6J^3sUuiQj7CT zi;{uyk){mO3=BK`7J(E3U1Q~6lnIQK#2lCW*VHQZtQI0YGL7OX=vzbgMQb zVQFb$Vc}-z2-EACS6q^qmz)Z-Hxp zIvSWeI=d)A^`?*$YWhIO=!236QgVR_0n;Fe2~Ye$4m|s$<^l6e5ioQ7RpNfmz`&UA z>EaktaVsb2bk-pUk-6?25}GP6)vhKi^4h@&3;xZi`g#6De-MA5NUdOe=eOT~6+I_~XZ^8Z=KK(5s`i~J(M|7W%(}4E zrf#PVS88*(8XvSd-+edlyUqOb_Z^f2Po6hhWGulWbN+MQ2RE^)TOxE0olTpZ;pnLQ u`P#k0ziFGc#%;Z~+v)v+sHO6ZYzzx#oLlcHa(FAKQ1f*4b6Mw<&;$S-3EZ*( literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..f0fbbc3fba0830fe6f0b7507e611deb09fea62c3 GIT binary patch literal 1374 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$Z5SAsGcrRWN+NuHtdjF{^%6m9^eS=-fVvqNZ0suv5|gu2OB9k) z(=+pImEP~(ucVNfVyhHx>TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVFffGH?<^D zp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRf0Gw!Z$#{Ilm}X!Bo#!H`&0@P{GVh&(Orw z%*;?n!N|bSNZ$a6%ybP+tW3?UjLa3FKnZADQA(Oskc%7CE+EfVDWjyMz)D}gyu4hm z+*mKaC|%#s($W%ShLMpjP=#)BWnM{Qg>GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smX zK$k+ikXzvE3pY5g7#dK(Ak(i%EYLU9Gtke?1^ElCy0|1L72yo5s*6J^3sUuiQj7CT zi;{uyk){mO3=BK`7J(E3U1Q~6lnIQK#2lCW*VHQZtQI0Xkp=MX=vzbgMQb zVQFb$Vc}-z2-EACS6q^qmz)Z-Hxp$o0y!L2NKW(MG(ZlE~!PCWvMA{Mftf3;1IUT#Nq-2Q&gW@I2)R{I=h*> zIyxGdJ36~4LG`AP6KeWE$LNES2U2o@2?5g}hzU>pKn^_nq~-zhOc5}1ShJsfz`(%R zEnoV6H3nt_(HC==3LlUB@WxAh<1h z_0>5VT}6%p8GT}&!Lbns%2r=}WzknW@BH)rR)MrhDi4!3?s)(G_uYdDA9(uMTb`)0 z=WMS0%Iw?U_N7K1GVx`T*swQfWeFQQ|K*oo<_3vsol4sp_4d$iU(4m0ryNcl zuuK;ad;Rqn>qiZa&Z3S2mV=C(k1Wzws78N{^E&zAUgP67G07DR9r;~8)XvwPep-Hk z;LI6W`XXF>A6E(rJ>eJ1T>SS{r1ZxZGnHHyUwk3>vp!JwzvNxzS=KUq^GlQu{j7Oc zHLu*a^?$De(-Mt~JGD9NJzaFwr_J$E)6ZDzu$)iPq=fyj!I$*SH&fSN-+i(8QPz%- z+g4{+2d#WF{q)n|Ga2mj?jL*naqjC~>nj#(*i9&y${JpOHt7Dzpyw?%%m+{XpM0N* Zhv8S#O&j|+cP4^LJWp3Ymvv4FO#s9(>FEFf literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand-disabled.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c051338e9d9e346f0845ea8e2921d133b9253aaa GIT binary patch literal 1441 zcmbVMeM}Q)7(YaeYepnyuxu{f<;ZZm+1_2DM|+{-t=D3i#o8X)VWu9}gI=M%?s`ap z7#S|^OIe&_Cd@%MrmGrJmuP~s7qYO%yK$^_+^)M}uL&hM=P2Xqe+`1O=`Xs>P568Nbwv zz@pEBY%@A>XV@zE#f^=!;At#l`NkUF>_dvz!$naF7zhdq2SOU8EtTa8X?-lAE%?2oYWu z!-^<{VAUd5Db*w00Q{qw)nE#u($x0O1toA}1P2+{Ml|dG`zW-A-3PZ=OGF8faP-YM#n*9C~%XJ|nXv z_AB&Lc)32S@8f;;oNVn^2cpIO$=Yg5`~A&Z*G%o{%^I52=9!(Ij^CVpS1)#VR(DF1 z&FHX#-O9W5cB!#+<;@E1nOO1*?Zl>7vdiwu+#=lmA&osXT+p|}e*G*36erl}sc{Y3 z7I=?(hJEq#k=vt#Jr&(Ye~GVf&H6hYj$Hd@oh42>gkas4(>s#Iqo^*O?RvUoy2-S) z=M7Kd>g3Nmp~kgiodfx8f%C_;V`o~o#b(HfqK`C#SB`e=Lo+o4wquQ6&*5ct=cfPE zqUEy(eryk9_1F&HBd@dvE+7B&183|)S8MsS=Y;(%dy=^GX2zNg#*^;LFEl4R&V6gy zbL=AZb&eNJeCa+l)!Q5h&&=L6K!NSkYo$xQ?>>tj8osgquOkDG`pt>h-+W>wckD(h z#g?GEXGc#LzZ381#nNNsA2W&1_M!=RJaK(8Ex=z0HnnN?d~!c;XXnVo-O1N;_I5q$ z99xB^WwS2&rC5t*PI@XHYbo83kH RILN6#O^23(fj%Rh_(3>p9c literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..a553f841e70249cdbfb1c72182f896795c16a5ef GIT binary patch literal 1467 zcmeAS@N?(olHy`uVBq!ia0vp^p&-n`1|%)Mu80Csk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$(1uzuN zO$^M949qMH4J{1~EL~jO%-kFu-Hgp#j9_M9)$0NbcPD3O3kx?hLqk_1M*~AwH%C_s zOG^u&kf9??uV-FyNn&1dD$L$Yki8JSPI&cNITxiSmgEg;Cj>gZ@- z?&$2I1l5~DPN?Yv9itCQ9!SXrCIn1_ASOKV13B>QlbQ$2GeyA6;juXL9s>j8OHUWa zkcwMxX50EP8w$83tIz(c?8(XgkjKNsV`7=~H;yZJ*gBb8lFlEIT%g)BQCTv$arudk z@1E1%o~!zK%y{$c(&LW{8%wrsDmYOnlb=#Gp|IXU=HB_gd+wd+|F7}b@7UVb!%>Y@ zlFzjd#e1IHnHv+w5UM?APkG|BCA*kb%?mC!V!9%?qRKDUWrb+K*9Gq$ZBqWNoiR&I ze0_t#HHXkse-!^57TDUdzv+qG*X3bS%U@+qX2@$?_2f!QEOY2{zq=~0+pI&6uRMKu zu2yk#aOr|&f9raKr=IHw{yO*8@tZxtdkvQd{mHg8t?YOExPFNi;~8dA)#YW&t*@S1 zY|kBVUGT;AI*B&E6;EYDrJu`RXAIz;Gpl8PXSkM_Q0VNx-Ot`=i*c)l&b_j-@^)A7 ze~zu5R;w1M2AsYcQM_vBhvO@~{Cp3`KjRJfDm;~am6PYxx7!_buWx^3ZxXJu>eGk! zmmbAmvj}wzz4qIB!L-$<57oQ>nBHDLwbkA)G{FDc_3~Axtyb|b5c3kcQoN~l^2efY z>DxXWyB#xdD(hHZ*-v3-3~1yEVF_8lB+4kd!ok&nRVzRcpU?`96+ksi nS^IpyJfi)z4*}Q$iB}bR-dc literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand-disabled.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9daea2c05eea66e02d6789bba515f8b0ad890da1 GIT binary patch literal 1457 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>$1|&ndJJtg!$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Y0vL+s zCI;q424)t9hL(l~mM$)CW^Rs-ZpLOVMldt5>UA-5G;nb?x3F+CGcb#rvJ zu(Y%Q3K=@W^m^tMmn7yTr^4*b1lbGGYlc^^m2**QVo82cNPd0}ECmE)z!KHx7S4tyuFh`eu8xid z=8n!TN>IHi&5ieYaCdnYG4?W8v%xk2hX!Tq7;M@l2hQ zoWr%=ZoOV^IkzdkekV*KJMKj1Y}%^6ulGZf+H0rD={ZHkWqW~&&OAw!wm9*1;cOG5 zstKkGPZn>nus_$hCV$h+t$`5w=h@Tmy}G5_%N>6vWtNUdr__v-i=0w& z`Aj13KM{NKi}UDgXOqZ+vh2@=2al;|6@7eiTrjWAcb1y=gzlL>lUa=|MZWL7T7R&9 z|Ftz|_gr0h=SNV*>fnzCK|s^i#ASc1ls_@m%r5x;lP$YG?o4{T_+%4L*zBBd%^|ba zFv@jR8!zY1mS6HL_t_ks6G^w-IEwDph?VD{a~DV!$!T?$AL{Ug~{jyOUeXCHHBs#BStV+K^VcEz$1|&ndJJtg!$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Y0vL+s zCI;q424)t9hL(l~mM$)CW^Rs-ZpLOVMldt5>U9BzyOWE7g@v1$p`ojhqk*BTo1?3R zrKJT>$j}j{*E6rUBrz{J6=rWH$X>8sXE(fht(=Qe6HD@oLh|!-U@0IVBfliSI3vG6 z!8zDWLBlsOIWrF=pb3f~h<{yDi!#enQ{0O3a}~fLY?X=41(v8jw{SKzadmbxcXf0$ zFn4rzQG)7CAt%)IfsWA!B@d+J0uutJK@bz3_<dw3tLO(8o$uAX?+mI61(#|!>*3? zs;!9!);!bX-)CQ;a<`TLvUz^fRo=q}%DYbL*uMGs>t~dn^vcP{|9!c9s`z}bZkP1R zr>3!4Ccb(Q5!YT0sd#Fpu)M$jf@PTYlCG*E_Dz>K z&)=G#5&8P$$L?QZPrjT~E@3bFHN{8#m*%40e#=N^%UeGzK5FLFq<)!MF3wfiZMVO9 zj$L?=f6)D)y;t_m%wM=we#8B5@;?v%dU5)avGqT1hPO;9OhzXZgeN$vDKzsKF-oRP z-~@BoW;VdN%{~rb?gX-F(_1i(Es;8@;%Q~loCIBlk B9%}#q literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock.png b/AppKit/Themes/Aristo/Resources/datepicker-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..251d086cf5ccee876478939ae06440fdfbc0cd3d GIT binary patch literal 6574 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 aO8`mP>vWKv^NxT1py+BDXueXnkN7W;7C9II literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/datepicker-date-segment-0.png b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-0.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d618051acc6a298b4c0849e09106099bd2b0dd GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&8!N$PA$X)552jobWxJHx&=ckpFCl;kLIHu$$ zr7C#lCZ?wbr6#6S7M@JC0VEaktaVzP^|Nr*Pmv^t{`7i09)4-5a@%!ojdNno$ z1`dU`{`-wK4_`<{%0|urZ!ITG!zw=yQZ8U}fi7AzZCsS>JinKjl978H@CGGn8$^PZa9v%k9BU`?{su$oDa43-K iVr1fJ?(YkAkziO-$I~bf+PD*_jlt8^&t;ucLK6TX)+VEaktaVu%Z_hm%Y}Pl$asWz@X3|u`Q0Z$dRXk zA?e5e|Mtw6w`KDP=()T(`TPHWMy3wIB`q^KwZ43p_vvHoWE61VnP30sKfl?73$ZFI z`|mGYwov2P@dOs3KXZ6`7#P{Mi5$5&IVoX+SV97e_D}vJ;`0p|a-EIDS^oWXFXL%@ m?IE7fw$b4r>t`7bW`=pEY`#>=R5StI#^CAd=d#Wzp$Pzk(^dBX literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 8f8771bbc..3dc66a66c 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -30,6 +30,7 @@ @import @import @import +@import @import @import @import @@ -1094,6 +1095,228 @@ var themedButtonValues = nil, return searchField; } ++ (CPDatePicker)themedDatePicker +{ + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + + bezelColor = PatternColor( + [ + ["textfield-bezel-square-0.png", 6.0, 6.0], + ["textfield-bezel-square-1.png", 1.0, 6.0], + ["textfield-bezel-square-2.png", 6.0, 6.0], + ["textfield-bezel-square-3.png", 6.0, 1.0], + ["textfield-bezel-square-4.png", 1.0, 1.0], + ["textfield-bezel-square-5.png", 6.0, 1.0], + ["textfield-bezel-square-6.png", 6.0, 6.0], + ["textfield-bezel-square-7.png", 1.0, 6.0], + ["textfield-bezel-square-8.png", 6.0, 6.0] + ]), + + bezelDisabledColor = PatternColor( + [ + ["textfield-bezel-square-disabled-0.png", 6.0, 6.0], + ["textfield-bezel-square-disabled-1.png", 1.0, 6.0], + ["textfield-bezel-square-disabled-2.png", 6.0, 6.0], + ["textfield-bezel-square-disabled-3.png", 6.0, 1.0], + ["textfield-bezel-square-disabled-4.png", 1.0, 1.0], + ["textfield-bezel-square-disabled-5.png", 6.0, 1.0], + ["textfield-bezel-square-disabled-6.png", 6.0, 6.0], + ["textfield-bezel-square-disabled-7.png", 1.0, 6.0], + ["textfield-bezel-square-disabled-8.png", 6.0, 6.0] + ]), + + bezelColorDatePickerTextField = PatternColor( + [ + [@"datepicker-date-segment-0.png", 4.0, 18.0], + [@"datepicker-date-segment-1.png", 1.0, 18.0], + [@"datepicker-date-segment-2.png", 4.0, 18.0] + ], PatternIsHorizontal), + + themeValues = + [ + [@"bezel-color", bezelColor, CPThemeStateBezeled], + [@"bezel-color", bezelDisabledColor, CPThemeStateBezeled | CPThemeStateDisabled], + + [@"font", [CPFont boldSystemFontOfSize:13.0]], + [@"text-color", [CPColor colorWithWhite:0.2 alpha:0.8]], + [@"text-color", textDisabledColor, CPThemeStateDisabled], + + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 5.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(0.0, -3.0, 0.0, -3.0), CPThemeStateBezeled], + + [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], + [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], + [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal | CPThemeStateDisabled], + [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected | CPThemeStateDisabled], + + [@"min-size-datepicker-textfield", CGSizeMake(6.0, 18.0)], + + [@"separator-content-inset", CGInsetMake(0.0, -2.0, 0.0, -1.0)], + + [@"content-inset-datepicker-textfield", CGInsetMake(2.0, 2.0, 0.0, 1.0), CPThemeStateNormal], + [@"content-inset-datepicker-textfield-separator", CGInsetMake(2.0, 0.0, 0.0, 0.0), CPThemeStateNormal], + [@"content-inset-datepicker-textfield", CGInsetMake(2.0, 2.0, 0.0, 1.0), CPThemeStateSelected], + [@"content-inset-datepicker-textfield-separator", CGInsetMake(2.0, 0.0, 0.0, 0.0), CPThemeStateSelected], + + [@"date-hour-margin", 7.0], + [@"stepper-margin", 2.0], + + [@"min-size", CGSizeMake(0.0, 29.0)], + [@"max-size", CGSizeMake(-1.0, 29.0)] + ]; + + [self registerThemeValues:themeValues forView:datePicker]; + + return datePicker; +} + ++ (CPDatePicker)themedDatePickerCalendar +{ + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + + arrowImageLeft = PatternImage("datepicker-calendar-arrow-left.png", 7.0, 10.0), + arrowImageRight = PatternImage("datepicker-calendar-arrow-right.png", 7.0, 10.0), + circleImage = PatternImage("datepicker-circle-image.png", 9.0, 10.0), + + arrowImageLeftHighlighted = PatternImage("datepicker-calendar-arrow-left-highlighted.png", 7.0, 10.0), + arrowImageRightHighlighted = PatternImage("datepicker-calendar-arrow-right-highlighted.png", 7.0, 10.0), + circleImageHighlighted = PatternImage("datepicker-circle-image-highlighted.png", 9.0, 10.0), + + secondHandColor = PatternColor("datepicker-clock-second-hand.png", 89.0, 89.0), + minuteHandColor = PatternColor("datepicker-clock-minute-hand.png", 85.0, 85.0), + hourHandColor = PatternColor("datepicker-clock-hour-hand.png", 47.0, 47.0), + middleHandColor = PatternColor("datepicker-clock-middle-hand.png", 13.0, 13.0), + clockImageColor = PatternColor("datepicker-clock.png", 122.0, 123.0), + + secondHandColorDisabled = PatternColor("datepicker-clock-second-hand-disabled.png", 89.0, 89.0), + minuteHandColorDisabled = PatternColor("datepicker-clock-minute-hand-disabled.png", 85.0, 85.0), + hourHandColorDisabled = PatternColor("datepicker-clock-hour-hand-disabled.png", 47.0, 47.0), + middleHandColorDisabled = PatternColor("datepicker-clock-middle-hand-disabled.png", 13.0, 13.0), + clockImageColorDisabled = PatternColor("datepicker-clock-disabled.png", 122.0, 123.0), + + themeValues = + [ + [@"border-color", [CPColor colorWithCalibratedRed:217.0 / 255.0 green:217.0 / 255.0 blue:211.0 / 255.0 alpha:1.0], CPThemeStateNormal], + [@"border-color", [CPColor colorWithCalibratedRed:100.0 / 255.0 green:154.0 / 255.0 blue:184.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"border-color", [CPColor colorWithCalibratedRed:217.0 / 255.0 green:217.0 / 255.0 blue:211.0 / 255.0 alpha:0.5], CPThemeStateNormal | CPThemeStateDisabled], + [@"border-color", [CPColor colorWithCalibratedRed:100.0 / 255.0 green:154.0 / 255.0 blue:184.0 / 255.0 alpha:0.5], CPThemeStateSelected | CPThemeStateDisabled], + + [@"bezel-color-calendar", [CPColor whiteColor]], + [@"bezel-color-calendar", [CPColor colorWithCalibratedRed:159.0 / 255.0 green:201.0 / 255.0 blue:225.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"bezel-color-calendar", [CPColor colorWithCalibratedRed:159.0 / 255.0 green:201.0 / 255.0 blue:225.0 / 255.0 alpha:0.5], CPThemeStateSelected |CPThemeStateDisabled], + [@"bezel-color-clock", clockImageColor], + [@"bezel-color-clock", clockImageColorDisabled, CPThemeStateDisabled], + + [@"title-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0]], + [@"title-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], + [@"title-text-shadow-offset", CGSizeMake(0,1)], + [@"title-font", [CPFont boldSystemFontOfSize:12.0]], + + [@"title-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"title-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"title-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"title-font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateDisabled], + + [@"weekday-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0]], + [@"weekday-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], + [@"weekday-text-shadow-offset", CGSizeMake(0,1)], + [@"weekday-font", [CPFont systemFontOfSize:11.0]], + + [@"weekday-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"weekday-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"weekday-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"weekday-font", [CPFont systemFontOfSize:11.0], CPThemeStateDisabled], + + [@"clock-text-color", [CPColor colorWithCalibratedRed:153.0 / 255.0 green:153.0 / 255.0 blue:153.0 / 255.0 alpha:1.0]], + [@"clock-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], + [@"clock-text-shadow-offset", CGSizeMake(0,1)], + [@"clock-font", [CPFont systemFontOfSize:11.0]], + + [@"clock-text-color", [CPColor colorWithCalibratedRed:153.0 / 255.0 green:153.0 / 255.0 blue:153.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"clock-text-shadow-color", [CPColor whiteColor], CPThemeStateDisabled], + [@"clock-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"clock-font", [CPFont systemFontOfSize:11.0], CPThemeStateDisabled], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0], CPThemeStateNormal], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateNormal], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateNormal], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateNormal], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:100.0 / 255.0 green:154.0 / 255.0 blue:184.0 / 255.0 alpha:1.0], CPThemeStateHighlighted], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateHighlighted], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:100.0 / 255.0 green:154.0 / 255.0 blue:184.0 / 255.0 alpha:0.5], CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted | CPThemeStateDisabled], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateSelected], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0], CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted | CPThemeStateSelected], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:179.0 / 255.0 green:179.0 / 255.0 blue:179.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:0.5], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:0.5], CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled | CPThemeStateSelected], + + [@"arrow-image-left", arrowImageLeft], + [@"arrow-image-right", arrowImageRight], + [@"arrow-image-left-highlighted", arrowImageLeftHighlighted], + [@"arrow-image-right-highlighted", arrowImageRightHighlighted], + [@"circle-image", circleImage], + [@"circle-image-highlighted", circleImageHighlighted], + [@"arrow-inset", CGInsetMake(9.0, 4.0, 0.0, 0.0)], + + [@"second-hand-color", secondHandColor], + [@"hour-hand-color", hourHandColor], + [@"middle-hand-color", middleHandColor], + [@"minute-hand-color", minuteHandColor], + + [@"second-hand-color", secondHandColorDisabled, CPThemeStateDisabled], + [@"hour-hand-color", hourHandColorDisabled, CPThemeStateDisabled], + [@"middle-hand-color", middleHandColorDisabled, CPThemeStateDisabled], + [@"minute-hand-color", minuteHandColorDisabled, CPThemeStateDisabled], + + [@"second-hand-size", CGSizeMake(89.0, 89.0)], + [@"hour-hand-size", CGSizeMake(47.0, 47.0)], + [@"middle-hand-size", CGSizeMake(13.0, 13.0)], + [@"minute-hand-size", CGSizeMake(85.0, 85.0)], + + [@"border-width", 1.0], + [@"size-header", CGSizeMake(141.0, 39.0)], + [@"size-tile", CGSizeMake(20.0, 18.0)], + [@"size-clock", CGSizeMake(122.0, 123.0)], + [@"size-calendar", CGSizeMake(141.0, 109.0)], + [@"min-size-calendar", CGSizeMake(141.0, 148.0)], + [@"max-size-calendar", CGSizeMake(141.0, 148.0)] + + ]; + + [datePicker setDatePickerStyle:CPClockAndCalendarDatePickerStyle]; + [self registerThemeValues:themeValues forView:datePicker]; + + return datePicker; +} + + (CPTokenField)themedTokenField { var tokenfield = [[CPTokenField alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 29.0)], diff --git a/AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png b/AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png new file mode 100644 index 0000000000000000000000000000000000000000..2fda06e9ba6d70e59b7304ef56aee1f1824fdb1f GIT binary patch literal 998 zcmbVLJ#W)M7&c@}zAS_8I$1+)6BL zEc_6Lik$%@CjI~ee}a{*oRhdPR2{Hv-`#uf^Ss~h_xGM|ZftKzlC(M8#Urua5Z~6V zo8tfRt$r?+d)%M$F+1Q3l2gfz*o=ZBvi7TkI>bDubm8KXT-iQ`2A{cr2%&qqLf#1|dL5f$a`L@G;OesH>WI zQ4_Z94zhIvtRGoe%cBE(ga>O|;^fG4&NEw87mJ0mXelf|RH0>A6^E`jg+{YDO*tu> zX|Yo?U|NKEobi~YpkgF5cETN5c)AK9$%5dLI4#zR5-C$llBrP9)Fi3mT51=3ME|;R zrFJnn&8Rw}1v|+@QICV28Z2^my`f4`cw@iFV^I`xj9GY+(3B6cBa0g)iX&TtrpThv z)(l-kCWIE$EQ|+e;JSkr!g|ed6}E5ay4QxLfl(hqUw4t;GO^h=`UA`GbX;SHX~9Vv z(%Nn;?5?rKwOHHBDd8-iFm_yb!2XLNR?Q_L!_MD~H0W$0BEJd|SAoGRse>5T0n zIv$CJH4Xq;5F#KJ7X;8w^Bmw=j=Vw`#H6?&@d>*6FvOax4@d==t=b}|6jR37kyy4; zsYEK#i0uxtKorG*gXhCUBkYY?SoOn}*H&YI$kSZI!G>+o0i)V)kKhzTJY5UHbn^Li zV#}*0ilmJ7Rfh!;jy267u2pRh7tkL!Hq`ctV-8{q$g@XWjnreHtp+B!`?sM$k$58= zcMVb$br{;(h>0wmgDHmGM07)!IFKY+OvJbZ&k0EYM8Jsf}W7HxaD)&ad` z8{1ylcIZr>Kp)DhnqdWk!$E=8;)TdHMv z1PWASAt@x7DpvoWtg*xyHfWE(+NCBUJs51)o1Yxk#|K$tW?V8Hx6=FO$zVBUK9>Bj8rCvoQImG*_kdGGNQ*K*aVzc+D#se965c71QXG=Ki? zbYts7JUTkDI2ocYZ*N%n{O;NHn=`YsU#HZA+jgJ(@onUUWqk+!&nZ1{E`4U|H`tEm#95n^~da2 z;&f8k1{b6Xp`}7-2yueLq#?A!dH}ITtpsdAJHj|1K@T7yQ9gtQVr)FONdc+a0n7G# z@9+Qb_y6{*6Jt*g4L&i*aokXO6j#~W&z`}7FnjwQJj9kGv^Yg4?HSroUBcycdzyf< zsm_urQT67T&q$WzLUp4yMW-sy$eL}&)IcZZn+`*BTz15FRBet>FimC+E5~nrc%27^ zp5sp^D`Le_NZlA+bjjr6SWR1;(=s|g@)XGWG9xevRe^8LTb}Ia_-$U9?E|sEgKZT$ zm*aPwnyO3y#dZlu#^O;;gb*MUgNYb6MWSXU`!NDGl*+j+oM(Tj~jbxd$p!Rgevju1y^JBm^s=5 zv)nz{P@u@Xk;h$w6-AxLwzgmridpDW5OJ z5te!!dtpln5i9YelER51gheTjit#i~7gB{%CZ$NYhb>zkRV|J5>>A8&7h8BBR#sf1 zQroTB_I$4cCh9h|y}IoHWfFlC6;(5=K=5Qxpq+Rzag7&=UUF>{Y-d+5^`-o3wWa&N4(THd#tn{N$oxF+74VD=Uv~U3qS`@1?uHx5F*{ zmFB*I{pSuo`|EeNRzsKG`{kSU{+aOW#|CcRxN)I=7(8vTGgEq{8RyE?3I iz1%;%alT-14~4li*T%hLmqQnWpGUbkhTku|aN%z%WsLs- literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right-highlighted.png b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4af90e2957234da4a5471d027f2a4e03b9f4df GIT binary patch literal 1108 zcmbVL%TLrm7_UKbLGcwYcrcT~0S&wDbeDEpS)seLE1R&mSym-6QA#_o4fH`fu!R^O z#2CF8{{a%>QKDyzF&yw>!oj2Aq(|dH2}WZ?aSFTWfq1ZKJ2T&Wzu)(MP#n0>(tN6! zVVIVDA1cxHApM#njr1R^q87TelI#!}bVf;4^Dv_t&Iks1OB=%_tQj+tuW>iSG*ry; z5E&};E4pLFv`{A&ST02~Om|P@~-G^e11=}iQJjL!fHB=~qjN@U@6^lo8 z9zr0BF_`EQMc4@h9ts>!Uoi?3N|&ez5~w{awdNV4N(tp^w&*FvRtRwwj;mIyv1&Z# zcw-!tWjW*!gecXB`ZG4sf~f7c)fo`>bDVA-)JB{sl47Z+J0VzZp|DGA`?W;T zlyQOPaxlhomKDaet?iQ%{^Q1;+J1S)#as#d&XlLqdW^Q!!8CXOHWVsSZd5 z2(yAJX5&eeOiSsUEM){#$L4LHXts{)c1>!xhK>Idt7JT^5yvY#&P2TfiWP@Ae#LP? zW>5qj1x+{YP;e$J&`!Jvd*(DYa-L&>?F=jCULFW4l+r4St2>b=Gcb|O$S{kts+bfd zwuUwSCu+itGTpZj*Q2#(%={_co3J$>`*=l3g@dLPR7 jdhQ_k*oJm!|81s$x%<(-*Z8FKdN}9#>;QU}9-jLRpw?q_ literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right.png b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ca16659eed3e2090103217888f1b1a0607429765 GIT binary patch literal 1195 zcmbVM+iMh87@tImx)_W!N>bV~OvD@R&SiIJcgJkj&7PUM*iFM`rSU*u*NwiPYWpq%9sZ^qaYGBd;XiKds_o=PEJ$aeV-{@%*Q39! z2FAJD+mNS-y%D~(HCz;V2$)JyhXzW6IEB9iR818aHj1+t2{93l;iD`YW0@EL5-%l_ zQjiB+jbk^g6knwPC1AwyBew85Xo%JYb^# zjXauSLt-k%ia<>AQ9eR#W7YqYH5xlZd+qVBcBzSQ4|?03=EsMf@qq@O85SOBEsnz;vRfZ5&R#s%Q8yv{z zE0szgac2L|7ryYJh2Tl`{OsIZ>*C_#lM+IAqt2V9k>j(A8yg#~6B83(tyZgFHZ?cD ztMgs0zf^zw_qoYQ>)FDBa%l4Wft%$UMdEVD_v^2IJbS;(5k>KbL(F07ryH|JT3QZI fO--GiBI+85E7x+;)3NuX-tQwVc7X?-edB)vX$+4s literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-circle-image-highlighted.png b/AppKit/Themes/Aristo2/Resources/datepicker-circle-image-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3a52153bf6e010081117650ac246e9176b963f GIT binary patch literal 1162 zcmbVMPiWg#99H5j*bd#&!swb&cvUYAnJqoVmL*{)Q!J@9jZ@>8F0idkkzQhvNKchs zW;s*$S}w^6)NB&VuGeS=Y>kMz;5X(bRKPUEZBmO z*#f)m)MU8=ia0a_Xa$Z>9PEKe(VW8b zq`*>7w?lCKa(PGC3)_jJDdU=^&%rd$xo#BK7CIzV^p6|6qQhFtM_d(!cs{V`c}ySf zkZJB-Zzuv%ZhJk$+Umtt+KyL4f%6%%jR3n~E5nMjiwFOWTq?qh zUNmyLs`5FtsIhIX{eQB?QD?ZQJpNTKoh@2}(R8Qy>0+mSkVktapv|$5`D8C`teYiG ztu=p~`s3BBkyt!-hVQ$`oPMwGV)u3CO&ODkQy%-P;V;=V92IQY@fFI|g^izmnW`}=?19O!<|)zZ@Q z{bKIS+KJ`-f#mN8A3c3?<@xu6Z)~c+e$YB)T-rasoNqn8>93D|cdM}x#D02_J#=XO zht*XQt2|4N?T!D|ef^!j2g literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-circle-image.png b/AppKit/Themes/Aristo2/Resources/datepicker-circle-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c315ff4b1853528a5a89ceab9197cea54a51b24f GIT binary patch literal 1235 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 T;;#RF`ERIis#m4seD}Wq{tIX- literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand-disabled.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d4413ceb14f73ff98d5a82d4335b6f5e83a7d432 GIT binary patch literal 1188 zcmbVMTWkzb7@mYQG^7%wLFgFwurqVE-PxVdwVBTB>L#{oyJEuw)0xxm=+4E=shu`L z@PG#*;XzU*@hFrKp(r9kkPuB1!UG|ZKA>q6;uf4~yG7D?Fqt`*|NP(gU(Wx}f%>}D zQ%h%;5(F_dSu3aU%=q7=5)TTxpeA{$||ZbqqrYd0xU*P_&hP>N0263pqf z?G9{cugj?IEh?{3u~lTXCtv~tB8Bvfyy*&Flp5w0@Y)wM6gjMdTB6j5Q`uBKDOnCA zLv&?8WdR^Ljs{gBjsq*mAPa&Fi(f7Ps)P_H1jFR$Lt$%<)+D6m#HcO2i&8m+Y=L14 zg#uluq%EhJ0X)z99Km1!YXsaj6DeN6bQcsEWaz4nZX?|?NuN<^v|3S=!k&(VVA!eD z7_sS&CJLvF@f4c@G|L!L8< z$jVYpB$D6&hzCU$#1mpX!t)U<0%8%HG+m^aDlFR7eY+!A@t;^ha-f1NCu3RpVg=Oa zEM&Pk%O<4;j$E2jRNeFi%lr!(iC2b>z8z`_$1=#_3=8^r9`Juh9+5y*TuOxFqR56t zNv1}z+W%yY!Ok##dHhi>MG>w+e>qnCcr(^M(8N9C;O3|V-zjNi&#Cf;Y^`E_zuRv z3*G8n-}oYXw&T)`?oIqakC^)LR9HD!{_5wq>+^OUK60=B%ZK-;zur-X@^cpN`f#~= z;m(@7vFES9EnZ*#k~!EmW$0YlN}}xbfh8xrzlYCn24`*|`VMV=)EkyA`~Qt(yiV?_ H*|O&sh3lAp literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..d42a0c2b2350b22ca81b8c0609c7b1e15effa164 GIT binary patch literal 1205 zcmbVMeQ4BX7>^U3TG}xR^8*?0BBKtxBya96cL{fvG`Z8;ytZDC?L5ch{TbYC!7Dcca|P}hxZe{Bpu5k#z@LpNE)shc1&*+3X$gS}~cbwam47Lxbl zd4JE>?|q)^?d{&sx@^@lhGAL@8}$;M`RH4+n2tfm+sEj%lH@9+4-b%<;Uh-1a6bYC z#~4H?4rm;xSWz5J(aS6G=&e>wqXgkr(JI#b827N{W~QvkyzX`PP6^((|*v z=q}4v3Go!3uhnW?EzV(okcYA?M>a$;MiH@~?h+%6xxt#I1sw&ZZ+pbXE{H4|{dk0A zSsLj~3XWGS&KY)tS)wRqd}w$)e|dQUsW$ET$4dN))6tgfbLlUC&E-Rn5mG zU2NKzS68RJcWLQ#Ixj((6IB7`@@g(E%aI7GP2GYU5W_W5)2~haYI0YXEXG9&jQ^{y zqWQ=m*e_!|+^m4!DkeCnVh?D25?EU_OxukF&qWtBldq0^dlXrDA3I>0Va1*&0zrN> z^RxyNIW3>csj84tHJzQ+wf+xlJPn4A%Htp9(iG7ejFxl7Pd9VzgIwA(K5dTACxVN# zv2GP~wH#i%_Z@6I1y(HD@%*-ygIY(=k6Z37{VKlmF|Ob9e`~vbYHDh;_Scw@_@(pb z*|zfHB%Y97Y~f*Y^u3Rsw(sn!y)5rt ze)DkY6D6j6I%;pda`rQ6*NHErv1|3CdyW^@pMQVpxjz4DD##O5@+$ely^D qe}C%qsvBzN*E8)sj|{05+ZQZmxJhz>2khPGM^eaj>l0l&cK;1HWtEEn literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand-disabled.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..535b4467869d92dda46648d4ec897361d7fce9cc GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$Z5SAsGcrRWN+NuHtdjF{^%6m9^eS=-fVvqNZ0suv5|gu2OB9k) z(=+pImEP~(ucVNfVyhHx>TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVFffGH?<^D zp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRf0Gw!Z$#{Ilm}X!Bo#!H`&0@P{GVh&(Orw z%*;?n!N|bSNZ$a6%ybP+tW3?UjLa3FKnZADQA(Oskc%7CE+EfVDWjyMz)D}gyu4hm z+*mKaC|%#s($W%ShLMpjP=#)BWnM{Qg>GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smX zK$k+ikXzvE3pY5g7#dK(Ak(i%EYLU9Gtke?1^ElCy0|1L72yo5s*6J^3sUuiQj7CT zi;{uyk){mO3=BK`7J(E3U1Q~6lnIQK#2lCW*VHQZtQI0YGL7OX=vzbgMQb zVQFb$Vc}-z2-EACS6q^qmz)Z-Hxp zIvSWeI=d)A^`?*$YWhIO=!236QgVR_0n;Fe2~Ye$4m|s$<^l6e5ioQ7RpNfmz`&UA z>EaktaVsb2bk-pUk-6?25}GP6)vhKi^4h@&3;xZi`g#6De-MA5NUdOe=eOT~6+I_~XZ^8Z=KK(5s`i~J(M|7W%(}4E zrf#PVS88*(8XvSd-+edlyUqOb_Z^f2Po6hhWGulWbN+MQ2RE^)TOxE0olTpZ;pnLQ u`P#k0ziFGc#%;Z~+v)v+sHO6ZYzzx#oLlcHa(FAKQ1f*4b6Mw<&;$S-3EZ*( literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..f0fbbc3fba0830fe6f0b7507e611deb09fea62c3 GIT binary patch literal 1374 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$Z5SAsGcrRWN+NuHtdjF{^%6m9^eS=-fVvqNZ0suv5|gu2OB9k) z(=+pImEP~(ucVNfVyhHx>TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVFffGH?<^D zp&~aYuh^=>Rtapb6_5=Q)>l#hD=EpgRf0Gw!Z$#{Ilm}X!Bo#!H`&0@P{GVh&(Orw z%*;?n!N|bSNZ$a6%ybP+tW3?UjLa3FKnZADQA(Oskc%7CE+EfVDWjyMz)D}gyu4hm z+*mKaC|%#s($W%ShLMpjP=#)BWnM{Qg>GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smX zK$k+ikXzvE3pY5g7#dK(Ak(i%EYLU9Gtke?1^ElCy0|1L72yo5s*6J^3sUuiQj7CT zi;{uyk){mO3=BK`7J(E3U1Q~6lnIQK#2lCW*VHQZtQI0Xkp=MX=vzbgMQb zVQFb$Vc}-z2-EACS6q^qmz)Z-Hxp$o0y!L2NKW(MG(ZlE~!PCWvMA{Mftf3;1IUT#Nq-2Q&gW@I2)R{I=h*> zIyxGdJ36~4LG`AP6KeWE$LNES2U2o@2?5g}hzU>pKn^_nq~-zhOc5}1ShJsfz`(%R zEnoV6H3nt_(HC==3LlUB@WxAh<1h z_0>5VT}6%p8GT}&!Lbns%2r=}WzknW@BH)rR)MrhDi4!3?s)(G_uYdDA9(uMTb`)0 z=WMS0%Iw?U_N7K1GVx`T*swQfWeFQQ|K*oo<_3vsol4sp_4d$iU(4m0ryNcl zuuK;ad;Rqn>qiZa&Z3S2mV=C(k1Wzws78N{^E&zAUgP67G07DR9r;~8)XvwPep-Hk z;LI6W`XXF>A6E(rJ>eJ1T>SS{r1ZxZGnHHyUwk3>vp!JwzvNxzS=KUq^GlQu{j7Oc zHLu*a^?$De(-Mt~JGD9NJzaFwr_J$E)6ZDzu$)iPq=fyj!I$*SH&fSN-+i(8QPz%- z+g4{+2d#WF{q)n|Ga2mj?jL*naqjC~>nj#(*i9&y${JpOHt7Dzpyw?%%m+{XpM0N* Zhv8S#O&j|+cP4^LJWp3Ymvv4FO#s9(>FEFf literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand-disabled.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c051338e9d9e346f0845ea8e2921d133b9253aaa GIT binary patch literal 1441 zcmbVMeM}Q)7(YaeYepnyuxu{f<;ZZm+1_2DM|+{-t=D3i#o8X)VWu9}gI=M%?s`ap z7#S|^OIe&_Cd@%MrmGrJmuP~s7qYO%yK$^_+^)M}uL&hM=P2Xqe+`1O=`Xs>P568Nbwv zz@pEBY%@A>XV@zE#f^=!;At#l`NkUF>_dvz!$naF7zhdq2SOU8EtTa8X?-lAE%?2oYWu z!-^<{VAUd5Db*w00Q{qw)nE#u($x0O1toA}1P2+{Ml|dG`zW-A-3PZ=OGF8faP-YM#n*9C~%XJ|nXv z_AB&Lc)32S@8f;;oNVn^2cpIO$=Yg5`~A&Z*G%o{%^I52=9!(Ij^CVpS1)#VR(DF1 z&FHX#-O9W5cB!#+<;@E1nOO1*?Zl>7vdiwu+#=lmA&osXT+p|}e*G*36erl}sc{Y3 z7I=?(hJEq#k=vt#Jr&(Ye~GVf&H6hYj$Hd@oh42>gkas4(>s#Iqo^*O?RvUoy2-S) z=M7Kd>g3Nmp~kgiodfx8f%C_;V`o~o#b(HfqK`C#SB`e=Lo+o4wquQ6&*5ct=cfPE zqUEy(eryk9_1F&HBd@dvE+7B&183|)S8MsS=Y;(%dy=^GX2zNg#*^;LFEl4R&V6gy zbL=AZb&eNJeCa+l)!Q5h&&=L6K!NSkYo$xQ?>>tj8osgquOkDG`pt>h-+W>wckD(h z#g?GEXGc#LzZ381#nNNsA2W&1_M!=RJaK(8Ex=z0HnnN?d~!c;XXnVo-O1N;_I5q$ z99xB^WwS2&rC5t*PI@XHYbo83kH RILN6#O^23(fj%Rh_(3>p9c literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand.png new file mode 100644 index 0000000000000000000000000000000000000000..a553f841e70249cdbfb1c72182f896795c16a5ef GIT binary patch literal 1467 zcmeAS@N?(olHy`uVBq!ia0vp^p&-n`1|%)Mu80Csk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$(1uzuN zO$^M949qMH4J{1~EL~jO%-kFu-Hgp#j9_M9)$0NbcPD3O3kx?hLqk_1M*~AwH%C_s zOG^u&kf9??uV-FyNn&1dD$L$Yki8JSPI&cNITxiSmgEg;Cj>gZ@- z?&$2I1l5~DPN?Yv9itCQ9!SXrCIn1_ASOKV13B>QlbQ$2GeyA6;juXL9s>j8OHUWa zkcwMxX50EP8w$83tIz(c?8(XgkjKNsV`7=~H;yZJ*gBb8lFlEIT%g)BQCTv$arudk z@1E1%o~!zK%y{$c(&LW{8%wrsDmYOnlb=#Gp|IXU=HB_gd+wd+|F7}b@7UVb!%>Y@ zlFzjd#e1IHnHv+w5UM?APkG|BCA*kb%?mC!V!9%?qRKDUWrb+K*9Gq$ZBqWNoiR&I ze0_t#HHXkse-!^57TDUdzv+qG*X3bS%U@+qX2@$?_2f!QEOY2{zq=~0+pI&6uRMKu zu2yk#aOr|&f9raKr=IHw{yO*8@tZxtdkvQd{mHg8t?YOExPFNi;~8dA)#YW&t*@S1 zY|kBVUGT;AI*B&E6;EYDrJu`RXAIz;Gpl8PXSkM_Q0VNx-Ot`=i*c)l&b_j-@^)A7 ze~zu5R;w1M2AsYcQM_vBhvO@~{Cp3`KjRJfDm;~am6PYxx7!_buWx^3ZxXJu>eGk! zmmbAmvj}wzz4qIB!L-$<57oQ>nBHDLwbkA)G{FDc_3~Axtyb|b5c3kcQoN~l^2efY z>DxXWyB#xdD(hHZ*-v3-3~1yEVF_8lB+4kd!ok&nRVzRcpU?`96+ksi nS^IpyJfi)z4*}Q$iB}bR-dc literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand-disabled.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9daea2c05eea66e02d6789bba515f8b0ad890da1 GIT binary patch literal 1457 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>$1|&ndJJtg!$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Y0vL+s zCI;q424)t9hL(l~mM$)CW^Rs-ZpLOVMldt5>UA-5G;nb?x3F+CGcb#rvJ zu(Y%Q3K=@W^m^tMmn7yTr^4*b1lbGGYlc^^m2**QVo82cNPd0}ECmE)z!KHx7S4tyuFh`eu8xid z=8n!TN>IHi&5ieYaCdnYG4?W8v%xk2hX!Tq7;M@l2hQ zoWr%=ZoOV^IkzdkekV*KJMKj1Y}%^6ulGZf+H0rD={ZHkWqW~&&OAw!wm9*1;cOG5 zstKkGPZn>nus_$hCV$h+t$`5w=h@Tmy}G5_%N>6vWtNUdr__v-i=0w& z`Aj13KM{NKi}UDgXOqZ+vh2@=2al;|6@7eiTrjWAcb1y=gzlL>lUa=|MZWL7T7R&9 z|Ftz|_gr0h=SNV*>fnzCK|s^i#ASc1ls_@m%r5x;lP$YG?o4{T_+%4L*zBBd%^|ba zFv@jR8!zY1mS6HL_t_ks6G^w-IEwDph?VD{a~DV!$!T?$AL{Ug~{jyOUeXCHHBs#BStV+K^VcEz$1|&ndJJtg!$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md0Y0vL+s zCI;q424)t9hL(l~mM$)CW^Rs-ZpLOVMldt5>U9BzyOWE7g@v1$p`ojhqk*BTo1?3R zrKJT>$j}j{*E6rUBrz{J6=rWH$X>8sXE(fht(=Qe6HD@oLh|!-U@0IVBfliSI3vG6 z!8zDWLBlsOIWrF=pb3f~h<{yDi!#enQ{0O3a}~fLY?X=41(v8jw{SKzadmbxcXf0$ zFn4rzQG)7CAt%)IfsWA!B@d+J0uutJK@bz3_<dw3tLO(8o$uAX?+mI61(#|!>*3? zs;!9!);!bX-)CQ;a<`TLvUz^fRo=q}%DYbL*uMGs>t~dn^vcP{|9!c9s`z}bZkP1R zr>3!4Ccb(Q5!YT0sd#Fpu)M$jf@PTYlCG*E_Dz>K z&)=G#5&8P$$L?QZPrjT~E@3bFHN{8#m*%40e#=N^%UeGzK5FLFq<)!MF3wfiZMVO9 zj$L?=f6)D)y;t_m%wM=we#8B5@;?v%dU5)avGqT1hPO;9OhzXZgeN$vDKzsKF-oRP z-~@BoW;VdN%{~rb?gX-F(_1i(Es;8@;%Q~loCIBlk B9%}#q literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..251d086cf5ccee876478939ae06440fdfbc0cd3d GIT binary patch literal 6574 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 aO8`mP>vWKv^NxT1py+BDXueXnkN7W;7C9II literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-0.png b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-0.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d618051acc6a298b4c0849e09106099bd2b0dd GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&8!N$PA$X)552jobWxJHx&=ckpFCl;kLIHu$$ zr7C#lCZ?wbr6#6S7M@JC0VEaktaVzP^|Nr*Pmv^t{`7i09)4-5a@%!ojdNno$ z1`dU`{`-wK4_`<{%0|urZ!ITG!zw=yQZ8U}fi7AzZCsS>JinKjl978H@CGGn8$^PZa9v%k9BU`?{su$oDa43-K iVr1fJ?(YkAkziO-$I~bf+PD*_jlt8^&t;ucLK6TX)+VEaktaVu%Z_hm%Y}Pl$asWz@X3|u`Q0Z$dRXk zA?e5e|Mtw6w`KDP=()T(`TPHWMy3wIB`q^KwZ43p_vvHoWE61VnP30sKfl?73$ZFI z`|mGYwov2P@dOs3KXZ6`7#P{Mi5$5&IVoX+SV97e_D}vJ;`0p|a-EIDS^oWXFXL%@ m?IE7fw$b4r>t`7bW`=pEY`#>=R5StI#^CAd=d#Wzp$Pzk(^dBX literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index b9229297b..738d433f6 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -29,6 +29,7 @@ @import @import @import +@import @import @import @import @@ -652,6 +653,210 @@ var themedButtonValues = nil, return searchField; } ++ (CPDatePicker)themedDatePicker +{ + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + + bezelColor = PatternColor( + "textfield-bezel-square{state}{position}.png", + { + states: ["", "disabled"], + positions: "#", + width: 4.0, + height: 4.0 + }), + + bezelColorDatePickerTextField = PatternColor( + [ + [@"datepicker-date-segment-0.png", 4.0, 18.0], + [@"datepicker-date-segment-1.png", 1.0, 18.0], + [@"datepicker-date-segment-2.png", 4.0, 18.0] + ], PatternIsHorizontal), + + themeValues = + [ + [@"bezel-color", bezelColor["@"], CPThemeStateBezeled], + [@"bezel-color", bezelColor["disabled"], CPThemeStateBezeled | CPThemeStateDisabled], + + [@"font", [CPFont boldSystemFontOfSize:13.0]], + [@"text-color", [CPColor colorWithWhite:0.2 alpha:0.8]], + [@"text-color", [CPColor colorWithWhite:0.2 alpha:0.5], CPThemeStateDisabled], + + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], + [@"content-inset", CGInsetMake(3.0, 0.0, 0.0, 3.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(3.0, 0.0, 3.0, 0.0), CPThemeStateBezeled], + + [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], + [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], + [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal | CPThemeStateDisabled], + [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateSelected | CPThemeStateDisabled], + + [@"min-size-datepicker-textfield", CGSizeMake(6.0, 18.0)], + + [@"separator-content-inset", CGInsetMake(0.0, -2.0, 0.0, -1.0)], + + [@"content-inset-datepicker-textfield", CGInsetMake(2.0, 2.0, 0.0, 1.0), CPThemeStateNormal], + [@"content-inset-datepicker-textfield-separator",CGInsetMake(2.0, 0.0, 0.0, 0.0), CPThemeStateNormal], + [@"content-inset-datepicker-textfield", CGInsetMake(2.0, 2.0, 0.0, 1.0) , CPThemeStateSelected], + [@"content-inset-datepicker-textfield-separator",CGInsetMake(2.0, 0.0, 0.0, 0.0), CPThemeStateSelected], + + [@"date-hour-margin", 7.0], + [@"stepper-margin", 5.0], + + [@"min-size", CGSizeMake(0.0, 29.0)], + [@"max-size", CGSizeMake(-1.0, 29.0)] + ]; + + [self registerThemeValues:themeValues forView:datePicker]; + + return datePicker; +} + ++ (CPDatePicker)themedDatePickerCalendar +{ + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + + arrowImageLeft = PatternImage("datepicker-calendar-arrow-left.png", 7.0, 10.0), + arrowImageRight = PatternImage("datepicker-calendar-arrow-right.png", 7.0, 10.0), + circleImage = PatternImage("datepicker-circle-image.png", 9.0, 10.0), + + arrowImageLeftHighlighted = PatternImage("datepicker-calendar-arrow-left-highlighted.png", 7.0, 10.0), + arrowImageRightHighlighted = PatternImage("datepicker-calendar-arrow-right-highlighted.png", 7.0, 10.0), + circleImageHighlighted = PatternImage("datepicker-circle-image-highlighted.png", 9.0, 10.0), + + secondHandColor = PatternColor("datepicker-clock-second-hand.png", 89.0, 89.0), + minuteHandColor = PatternColor("datepicker-clock-minute-hand.png", 85.0, 85.0), + hourHandColor = PatternColor("datepicker-clock-hour-hand.png", 47.0, 47.0), + middleHandColor = PatternColor("datepicker-clock-middle-hand.png", 13.0, 13.0), + clockImageColor = PatternColor("datepicker-clock.png", 122.0, 123.0), + + secondHandColorDisabled = PatternColor("datepicker-clock-second-hand-disabled.png", 89.0, 89.0), + minuteHandColorDisabled = PatternColor("datepicker-clock-minute-hand-disabled.png", 85.0, 85.0), + hourHandColorDisabled = PatternColor("datepicker-clock-hour-hand-disabled.png", 47.0, 47.0), + middleHandColorDisabled = PatternColor("datepicker-clock-middle-hand-disabled.png", 13.0, 13.0), + clockImageColorDisabled = PatternColor("datepicker-clock-disabled.png", 122.0, 123.0), + + themeValues = + [ + [@"border-color", [CPColor colorWithCalibratedRed:217.0 / 255.0 green:217.0 / 255.0 blue:211.0 / 255.0 alpha:1.0], CPThemeStateNormal], + [@"border-color", [CPColor colorWithCalibratedRed:68.0 / 255.0 green:109.0 / 255.0 blue:198.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"border-color", [CPColor colorWithCalibratedRed:217.0 / 255.0 green:217.0 / 255.0 blue:211.0 / 255.0 alpha:0.5], CPThemeStateNormal | CPThemeStateDisabled], + [@"border-color", [CPColor colorWithCalibratedRed:68.0 / 255.0 green:109.0 / 255.0 blue:198.0 / 255.0 alpha:0.5], CPThemeStateSelected | CPThemeStateDisabled], + + [@"bezel-color-calendar", [CPColor whiteColor]], + [@"bezel-color-calendar", [CPColor colorWithCalibratedRed:87.0 / 255.0 green:128.0 / 255.0 blue:216.0 / 255.0 alpha:1.0], CPThemeStateSelected], + [@"bezel-color-calendar", [CPColor colorWithCalibratedRed:87.0 / 255.0 green:128.0 / 255.0 blue:216.0 / 255.0 alpha:0.5], CPThemeStateSelected |CPThemeStateDisabled], + [@"bezel-color-clock", clockImageColor], + [@"bezel-color-clock", clockImageColorDisabled, CPThemeStateDisabled], + + [@"title-text-color", [CPColor colorWithCalibratedRed:79.0 / 255.0 green:79.0 / 255.0 blue:79.0 / 255.0 alpha:1.0]], + [@"title-text-shadow-color", [CPColor whiteColor]], + [@"title-text-shadow-offset", CGSizeMake(0,1)], + [@"title-font", [CPFont boldSystemFontOfSize:12.0]], + + [@"title-text-color", [CPColor colorWithCalibratedRed:79.0 / 255.0 green:79.0 / 255.0 blue:79.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"title-text-shadow-color", [CPColor whiteColor], CPThemeStateDisabled], + [@"title-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"title-font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateDisabled], + + [@"weekday-text-color", [CPColor colorWithCalibratedRed:79.0 / 255.0 green:79.0 / 255.0 blue:79.0 / 255.0 alpha:1.0]], + [@"weekday-text-shadow-color", [CPColor whiteColor]], + [@"weekday-text-shadow-offset", CGSizeMake(0,1)], + [@"weekday-font", [CPFont systemFontOfSize:11.0]], + + [@"weekday-text-color", [CPColor colorWithCalibratedRed:79.0 / 255.0 green:79.0 / 255.0 blue:79.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"weekday-text-shadow-color", [CPColor whiteColor], CPThemeStateDisabled], + [@"weekday-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"weekday-font", [CPFont systemFontOfSize:11.0], CPThemeStateDisabled], + + [@"clock-text-color", [CPColor colorWithCalibratedRed:153.0 / 255.0 green:153.0 / 255.0 blue:153.0 / 255.0 alpha:1.0]], + [@"clock-text-shadow-color", [CPColor whiteColor]], + [@"clock-text-shadow-offset", CGSizeMake(0,1)], + [@"clock-font", [CPFont systemFontOfSize:11.0]], + + [@"clock-text-color", [CPColor colorWithCalibratedRed:153.0 / 255.0 green:153.0 / 255.0 blue:153.0 / 255.0 alpha:0.5], CPThemeStateDisabled], + [@"clock-text-shadow-color", [CPColor whiteColor], CPThemeStateDisabled], + [@"clock-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"clock-font", [CPFont systemFontOfSize:11.0], CPThemeStateDisabled], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:34.0 / 255.0 green:34.0 / 255.0 blue:34.0 / 255.0 alpha:1.0], CPThemeStateNormal], + [@"tile-text-shadow-color", [CPColor whiteColor], CPThemeStateNormal], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateNormal], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateNormal], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:87.0 / 255.0 green:128.0 / 255.0 blue:216.0 / 255.0 alpha:1.0], CPThemeStateHighlighted], + [@"tile-text-shadow-color", [CPColor whiteColor], CPThemeStateHighlighted], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:87.0 / 255.0 green:128.0 / 255.0 blue:216.0 / 255.0 alpha:0.5], CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-text-shadow-color", [CPColor whiteColor], CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted | CPThemeStateDisabled], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted | CPThemeStateDisabled], + + [@"tile-text-color", [CPColor whiteColor], CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedRed:0.0 / 255.0 green:0.0 / 255.0 blue:0.0 / 255.0 alpha:0.2], CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateHighlighted | CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateHighlighted | CPThemeStateSelected], + + [@"tile-text-color", [CPColor whiteColor], CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedRed:0.0 / 255.0 green:0.0 / 255.0 blue:0.0 / 255.0 alpha:0.2], CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateSelected], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:179.0 / 255.0 green:179.0 / 255.0 blue:179.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"tile-text-shadow-color", [CPColor whiteColor], CPThemeStateDisabled], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:255.0 / 255.0 green:255.0 / 255.0 blue:255.0 / 255.0 alpha:0.5], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedRed:0.0 / 255.0 green:0.0 / 255.0 blue:0.0 / 255.0 alpha:0.2], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled | CPThemeStateSelected | CPThemeStateHighlighted], + + [@"tile-text-color", [CPColor colorWithCalibratedRed:255.0 / 255.0 green:255.0 / 255.0 blue:255.0 / 255.0 alpha:0.5], CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-text-shadow-color", [CPColor colorWithCalibratedRed:0.0 / 255.0 green:0.0 / 255.0 blue:0.0 / 255.0 alpha:0.2], CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-text-shadow-offset", CGSizeMake(0,1), CPThemeStateDisabled | CPThemeStateSelected], + [@"tile-font", [CPFont systemFontOfSize:10.0], CPThemeStateDisabled | CPThemeStateSelected], + + [@"arrow-image-left", arrowImageLeft], + [@"arrow-image-right", arrowImageRight], + [@"arrow-image-left-highlighted", arrowImageLeftHighlighted], + [@"arrow-image-right-highlighted", arrowImageRightHighlighted], + [@"circle-image", circleImage], + [@"circle-image-highlighted", circleImageHighlighted], + [@"arrow-inset", CGInsetMake(9.0, 4.0, 0.0, 0.0)], + + [@"second-hand-color", secondHandColor], + [@"hour-hand-color", hourHandColor], + [@"middle-hand-color", middleHandColor], + [@"minute-hand-color", minuteHandColor], + + [@"second-hand-color", secondHandColorDisabled, CPThemeStateDisabled], + [@"hour-hand-color", hourHandColorDisabled, CPThemeStateDisabled], + [@"middle-hand-color", middleHandColorDisabled, CPThemeStateDisabled], + [@"minute-hand-color", minuteHandColorDisabled, CPThemeStateDisabled], + + [@"second-hand-size", CGSizeMake(89.0, 89.0)], + [@"hour-hand-size", CGSizeMake(47.0, 47.0)], + [@"middle-hand-size", CGSizeMake(13.0, 13.0)], + [@"minute-hand-size", CGSizeMake(85.0, 85.0)], + + [@"border-width", 1.0], + [@"size-header", CGSizeMake(141.0, 39.0)], + [@"size-tile", CGSizeMake(20.0, 18.0)], + [@"size-clock", CGSizeMake(122.0, 123.0)], + [@"size-calendar", CGSizeMake(141.0, 109.0)], + [@"min-size-calendar", CGSizeMake(141.0, 148.0)], + [@"max-size-calendar", CGSizeMake(141.0, 148.0)] + ]; + + [datePicker setDatePickerStyle:CPClockAndCalendarDatePickerStyle]; + [self registerThemeValues:themeValues forView:datePicker]; + + return datePicker; +} + + (CPTokenField)themedTokenField { var tokenfield = [[CPTokenField alloc] initWithFrame:CGRectMake(0.0, 0.0, 160.0, 29.0)], diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index eb28aeb8a..3563c5529 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -23,6 +23,7 @@ @import "CPDate.j" @import "CPString.j" @import "CPFormatter.j" +@import "CPLocale.j" CPDateFormatterNoStyle = 0; CPDateFormatterShortStyle = 1; @@ -42,7 +43,8 @@ CPDateFormatterFullStyle = 4; */ @implementation CPDateFormatter : CPFormatter { - CPDateFormatterStyle _dateStyle @accessors(property=dateStyle); + CPDateFormatterStyle _dateStyle @accessors(property=dateStyle); + CPLocale _locale @accessors(property=locale); } - (id)init @@ -109,7 +111,8 @@ CPDateFormatterFullStyle = 4; @end -var CPDateFormatterStyleKey = "CPDateFormatterStyle"; +var CPDateFormatterStyleKey = @"CPDateFormatterStyle", + CPDateFormatterLocaleKey = @"CPDateFormatterLocaleKey"; @implementation CPDateFormatter (CPCoding) @@ -120,6 +123,7 @@ var CPDateFormatterStyleKey = "CPDateFormatterStyle"; if (self) { _dateStyle = [aCoder decodeIntForKey:CPDateFormatterStyleKey]; + _locale = [aCoder decodeObjectForKey:CPDateFormatterLocaleKey]; } return self; @@ -130,6 +134,7 @@ var CPDateFormatterStyleKey = "CPDateFormatterStyle"; [super encodeWithCoder:aCoder]; [aCoder encodeInt:_dateStyle forKey:CPDateFormatterStyleKey]; + [aCoder encodeInt:_locale forKey:CPDateFormatterLocaleKey]; } @end diff --git a/Foundation/CPLocale.j b/Foundation/CPLocale.j new file mode 100644 index 000000000..8987b1275 --- /dev/null +++ b/Foundation/CPLocale.j @@ -0,0 +1,233 @@ +/* CPLocale.j +* Foundation +* +* Created by Alexandre Wilhelm +* Copyright 2012 +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +@import "CPObject.j" + +@class CPDictionary + +CPLocaleIdentifier = @"CPLocaleIdentifier"; +CPLocaleLanguageCode = @"CPLocaleLanguageCode"; +CPLocaleCountryCode = @"CPLocaleCountryCode"; +CPLocaleScriptCode = @"CPLocaleScriptCode"; +CPLocaleVariantCode = @"CPLocaleVariantCode"; +CPLocaleExemplarCharacterSet = @"CPLocaleExemplarCharacterSet"; +CPLocaleCalendar = @"CPLocaleCalendar"; +CPLocaleCollationIdentifier = @"CPLocaleCollationIdentifier"; +CPLocaleUsesMetricSystem = @"CPLocaleUsesMetricSystem"; +CPLocaleMeasurementSystem = @"CPLocaleMeasurementSystem"; +CPLocaleDecimalSeparator = @"CPLocaleDecimalSeparator"; +CPLocaleGroupingSeparator = @"CPLocaleGroupingSeparator"; +CPLocaleCurrencySymbol = @"CPLocaleCurrencySymbol"; +CPLocaleCurrencyCode = @"CPLocaleCurrencyCode"; +CPLocaleCollatorIdentifier = @"CPLocaleCollatorIdentifier"; +CPLocaleQuotationBeginDelimiterKey = @"CPLocaleQuotationBeginDelimiterKey"; +CPLocaleQuotationEndDelimiterKey = @"CPLocaleQuotationEndDelimiterKey"; +CPLocaleAlternateQuotationBeginDelimiterKey = @"CPLocaleAlternateQuotationBeginDelimiterKey"; +CPLocaleAlternateQuotationEndDelimiterKey = @"CPLocaleAlternateQuotationEndDelimiterKey"; + +CPGregorianCalendar = @"CPGregorianCalendar"; +CPBuddhistCalendar = @"CPBuddhistCalendar"; +CPChineseCalendar = @"CPChineseCalendar"; +CPHebrewCalendar = @"CPHebrewCalendar"; +CPIslamicCalendar = @"CPIslamicCalendar"; +CPIslamicCivilCalendar = @"CPIslamicCivilCalendar"; +CPJapaneseCalendar = @"CPJapaneseCalendar"; +CPRepublicOfChinaCalendar = @"CPRepublicOfChinaCalendar"; +CPPersianCalendar = @"CPPersianCalendar"; +CPIndianCalendar = @"CPIndianCalendar"; +CPISO8601Calendar = @"CPISO8601Calendar"; + +CPLocaleLanguageDirectionUnknown = @"CPLocaleLanguageDirectionUnknown"; +CPLocaleLanguageDirectionLeftToRight = @"CPLocaleLanguageDirectionLeftToRight"; +CPLocaleLanguageDirectionRightToLeft = @"CPLocaleLanguageDirectionRightToLeft"; +CPLocaleLanguageDirectionTopToBottom = @"CPLocaleLanguageDirectionTopToBottom"; +CPLocaleLanguageDirectionBottomToTop = @"CPLocaleLanguageDirectionBottomToTop"; + +var countryCodes = [@"DE", @"FR", @"ES", @"GB", @"US"], + languageCodes = [@"en", @"de", @"es", @"fr"], + availableLocaleIdentifiers = [@"de_DE", @"en_EN", @"en_US", @"es_ES", @"fr_FR"]; + +var sharedSystemLocale = nil, + sharedCurrentLocale = nil; + +@implementation CPLocale : CPObject +{ + CPDictionary _locale; +} + +/*! Return the system locale. By default is en_US +*/ ++ (id)systemLocale +{ + if (!sharedSystemLocale) + sharedSystemLocale = [[CPLocale alloc] initWithLocaleIdentifier:@"en_US"]; + + return sharedSystemLocale; +} + +/*! Return the current locale base on the navigator +*/ ++ (id)currentLocale +{ + if (!sharedCurrentLocale) + { + var localeIdentifier, + language; + + if (navigator) + { + if (navigator.appVersion.indexOf("MSIE") >= 0) + language = navigator.browserLanguage.substring(0,2); + else + language = navigator.language.substring(0,2); + + language = [CPString stringWithFormat:@"%s_%s", [language lowercaseString], [language uppercaseString]]; + + if ([availableLocaleIdentifiers indexOfObject:language]) + localeIdentifier = language; + } + + if (!localeIdentifier) + localeIdentifier = @"en_US"; + + sharedCurrentLocale = [[CPLocale alloc] initWithLocaleIdentifier:localeIdentifier]; + } + + return sharedCurrentLocale +} + +/*! Return an array of the availableLocaleIdentifiers +*/ ++ (CPArray)availableLocaleIdentifiers +{ + return availableLocaleIdentifiers; +} + +/*! Return an array with the ISOCountryCodes +*/ ++ (CPArray)ISOCountryCodes +{ + return countryCodes; +} + +// + (CPArray)ISOCurrencyCodes +// { +// // TODO +// return; +// } + +/*! Return an array with the ISOLanguageCodes +*/ ++ (CPArray)ISOLanguageCodes +{ + return languageCodes; +} + +// + (CPArray)commonISOCurrencyCodes +// { +// // TODO +// return; +// } + +/*! Init a new instance of CPLocale with a given identifier. + This method will call the class method _platformLocaleAdditionalDescriptionForIdentifier:. It's usefull if you want to implement your CPLocale. + @parameter anIdentifier +*/ +- (id)initWithLocaleIdentifier:(CPString)anIdentifier +{ + if (self == [super init]) + { + var parts = [anIdentifier componentsSeparatedByString:@"_"], + language = [parts objectAtIndex:0], + country = nil; + + if ([parts count] > 1) + country = [parts objectAtIndex:1]; + else + country = anIdentifier; + + _locale = [[CPDictionary alloc] init]; + [_locale setObject:anIdentifier forKey:CPLocaleIdentifier]; + [_locale setObject:language forKey:CPLocaleLanguageCode]; + [_locale setObject:country forKey:CPLocaleCountryCode]; + + if([[self class] respondsToSelector:@selector(_platformLocaleAdditionalDescriptionForIdentifier:)]) + { + // Use any platform specific method to fill the locale info if one is defined + var info = [[self class] performSelector:@selector(_platformLocaleAdditionalDescriptionForIdentifier:) withObject:anIdentifier]; + [_locale addEntriesFromDictionary:info]; + } + else + { + [_locale setObject:CPGregorianCalendar forKey:CPLocaleCalendar]; + } + } + + return self; +} + +// - (CPString)displayNameForKey:(id)aKey value:(id)aValue +// { +// // TODO +// return; +// } + +/*! Return the CPLocaleIdentifier +*/ +- (CPString)localeIdentifier +{ + return [_locale objectForKey:CPLocaleIdentifier]; +} + +/*! Return the object depending of the key + @param aKey + @return an object +*/ +- (id)objectForKey:(id)aKey +{ + return [_locale objectForKey:aKey]; +} + +@end + + +var CPLocaleIdentifierLocaleKey = @"CPLocaleIdentifierLocaleKey"; + +@implementation CPLocale (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self) + { + _locale = [aCoder decodeObjectForKey:CPLocaleIdentifierLocaleKey]; + } + + return self +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + //[super encodeWithCoder:aCoder]; + + [aCoder encodeObject:_locale forKey:CPLocaleIdentifierLocaleKey]; +} + +@end \ No newline at end of file diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index 4ce7d451c..a7dc3fdab 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -48,6 +48,7 @@ @import "CPKeyedUnarchiver.j" @import "CPKeyValueCoding.j" @import "CPKeyValueObserving.j" +@import "CPLocale.j" @import "CPMutableArray.j" @import "CPMutableSet.j" @import "CPNotification.j" diff --git a/Tests/Manual/CPDatePickerTest/AppController.j b/Tests/Manual/CPDatePickerTest/AppController.j new file mode 100644 index 000000000..26ed3eb9c --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/AppController.j @@ -0,0 +1,76 @@ +/* + * AppController.j + * CPDatePickerTest + * + * Created by You on March 15, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + + @outlet CPDatePicker pickerTarget; + @outlet CPDatePicker pickerMinDate; + @outlet CPDatePicker pickerMaxDate; + @outlet CPDatePicker pickerCurrentDate; + @outlet CPPopUpButton buttonStyle; + @outlet CPPopUpButton buttonElementsDate; + @outlet CPPopUpButton buttonElementsTime; +} + +// - (void)awakeFromCib +// { +// [theWindow setFullPlatformWindow:YES]; +// } + +- (IBAction)updateHasMinConstraint:(id)aSender +{ + [pickerMinDate setDateValue:[CPDate distantPast]]; + + if ([aSender state] == CPOffState) + [pickerMinDate setEnabled:NO]; + else + [pickerMinDate setEnabled:YES]; + +} + +- (IBAction)updateHasMaxConstraint:(id)aSender +{ + [pickerMaxDate setDateValue:[CPDate distantFuture]]; + + if ([aSender state] == CPOffState) + [pickerMaxDate setEnabled:NO]; + else + [pickerMaxDate setEnabled:YES]; +} + +- (IBAction)updateElements:(id)aSender +{ + var elemDate = [[buttonElementsDate selectedItem] tag], + elemTime = [[buttonElementsTime selectedItem] tag], + mask; + + mask = 0x0; + + if (elemDate == 1) + mask |= CPYearMonthDatePickerElementFlag; + if (elemDate == 2) + mask |= CPYearMonthDayDatePickerElementFlag; + + if (elemTime == 1) + mask |= CPHourMinuteDatePickerElementFlag; + if (elemTime == 2) + mask |= CPHourMinuteSecondDatePickerElementFlag; + + [pickerTarget setDatePickerElements:mask]; +} + + + +@end diff --git a/Tests/Manual/CPDatePickerTest/Info.plist b/Tests/Manual/CPDatePickerTest/Info.plist new file mode 100644 index 000000000..54f935728 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/Info.plist @@ -0,0 +1,10 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPDatePickerTest + + diff --git a/Tests/Manual/CPDatePickerTest/Jakefile b/Tests/Manual/CPDatePickerTest/Jakefile new file mode 100644 index 000000000..693ded808 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/Jakefile @@ -0,0 +1,94 @@ +/* + * Jakefile + * CPDatePickerTest + * + * Created by You on March 15, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"); + +app ("CPDatePickerTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPDatePickerTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPDatePickerTest"); + task.setIdentifier("com.yourcompany.CPDatePickerTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPDatePickerTest"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + task.setNib2CibFlags("-R Resources/"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CPDatePickerTest"], function() +{ + printResults(configuration); +}); + +task ("build", ["default"]); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", "CPDatePickerTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPDatePickerTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPDatePickerTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPDatePickerTest"), FILE.join("Build", "Deployment", "CPDatePickerTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPDatePickerTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPDatePickerTest"), FILE.join("Build", "Desktop", "CPDatePickerTest", "CPDatePickerTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPDatePickerTest", "CPDatePickerTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPDatePickerTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib new file mode 100644 index 000000000..ba8729818 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;161E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;205E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;206E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;168E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;172E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;209E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;161E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;210E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;192E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;187E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;184E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;213E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;157E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;153E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;184E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;187E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;187E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;192E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;192E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;184E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;150E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;157E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;217E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;87E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;220E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;137E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;221E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;142E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;222E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;135E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;136E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;99E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;227E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;80E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;127E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;231E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;233E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;121E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;122E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;238E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;104E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;117E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;114E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;120E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;243E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;147E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;148E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;123E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;249E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;168E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;172E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;186E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;188E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;253E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;195E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;254E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;256E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;262E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;263E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;264E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;194E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;265E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;266E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;267E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;193E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;268E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;269E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;270E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;192E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;271E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;272E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;273E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;187E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;274E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;275E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;276E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;184E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;277E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;278E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;279E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;165E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;150E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;280E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;281E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;282E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;283E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;161E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;150E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;284E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;281E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;285E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;157E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;287E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;288E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;289E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;157E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;291E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;292E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;293E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;294E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;157E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;295E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;255E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;296E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;297E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;205E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;298E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;299E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;300E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;301E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;85E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;301E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;304E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;305E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;309E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;310E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;311E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;85E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;312E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;313E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;91E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;313E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;314E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;315E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;316E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;317E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;91E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;318E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;319E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;91E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;320E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;91E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;91E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;321E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;98E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;321E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;322E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;323E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;324E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;325E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;101E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;325E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;327E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;328E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;329E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;330E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;331E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;332E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;333E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;334E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;335E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;336E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;337E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;338E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;339E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;341E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;341E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;342E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;343E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;344E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;345E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;346E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;347E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;348E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;349E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;350E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;351E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;352E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;353E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;354E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;356E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;357E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;119E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;357E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;358E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;359E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;119E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;360E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;119E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;361E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;362E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;119E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;363E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;364E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;119E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;365E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;125E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;365E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;367E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;125E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;368E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;125E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;369E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;129E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;101E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;369E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;370E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;371E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;356E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;372E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;352E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;353E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;373E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;344E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;345E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;374E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;134E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;374E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;376E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;377E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;378E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;379E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;380E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;381E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;382E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;383E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;384E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;140E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;384E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;385E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;386E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;387E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;140E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;388E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;389E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;306E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;390E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;391E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;302E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;146E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;82E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;391E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;393E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;394E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;395E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;396E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;146E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;303E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;397E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;306E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;398E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;399E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;400E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;401E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;402E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;403E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;349E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;404E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;155E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;406E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;406E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;407E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;E;D;K;10;$classnameS;12;CPDatePickerK;8;$classesA;S;12;CPDatePickerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;409E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;410E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;413E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;415E;K;6;$afontD;K;6;CP$UIDd;3;417E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;419E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;405E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;355E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;355E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;421E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;422E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;423E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;419E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;14;CPFormatterKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;413E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;306E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;306E;E;D;K;10;$classnameS;5;CPBoxK;8;$classesA;S;5;CPBoxS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;158E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;424E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;425E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;426E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;405E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;427E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;405E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;355E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;428E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;405E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;160E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;204E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;430E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;431E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;432E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;433E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;420E;K;6;$afontD;K;6;CP$UIDd;3;434E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;352E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;435E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;405E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;436E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;161E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;204E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;438E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;161E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;204E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;439E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;161E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;352E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;204E;E;D;K;6;$classD;K;6;CP$UIDd;3;160E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;203E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;440E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;431E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;432E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;433E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;420E;K;6;$afontD;K;6;CP$UIDd;3;441E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;435E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;405E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;442E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;165E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;443E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;165E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;3;160E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;202E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;444E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;431E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;432E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;433E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;420E;K;6;$afontD;K;6;CP$UIDd;3;445E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;405E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;435E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;405E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;168E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;447E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;168E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;448E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;168E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;352E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;3;160E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;201E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;449E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;431E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;432E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;433E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;420E;K;6;$afontD;K;6;CP$UIDd;3;445E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;405E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;435E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;405E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;450E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;172E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;352E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;451E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;172E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;355E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;172E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;437E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;201E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;452E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;445E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;455E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;457E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;434E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;458E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;459E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;441E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;460E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;461E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;462E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;464E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;466E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;467E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;468E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;464E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;469E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;158E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;470E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;471E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;405E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;427E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;14;$aborder-widthD;K;6;CP$UIDd;3;405E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;405E;K;16;$acontent-marginD;K;6;CP$UIDd;3;473E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;352E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;344E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;474E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;405E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;475E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;476E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;413E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;415E;K;6;$afontD;K;6;CP$UIDd;3;417E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;405E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;405E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;405E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;477E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;478E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;479E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;422E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;14;CPFormatterKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;413E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;306E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;480E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;481E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;482E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;483E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;484E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;485E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;486E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;487E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;476E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;413E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;415E;K;6;$afontD;K;6;CP$UIDd;3;417E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;423E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;405E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;405E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;405E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;477E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;488E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;489E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;423E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;14;CPFormatterKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;413E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;306E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;490E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;491E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;485E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;492E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;158E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;493E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;471E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;405E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;427E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;14;$aborder-widthD;K;6;CP$UIDd;3;405E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;405E;K;16;$acontent-marginD;K;6;CP$UIDd;3;494E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;352E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;344E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;474E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;405E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;495E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;496E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;497E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;498E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;453E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;405E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;499E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;500E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;405E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;501E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;476E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;413E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;414E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;415E;K;6;$afontD;K;6;CP$UIDd;3;417E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;502E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;405E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;405E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;405E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;477E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;503E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;504E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;502E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;14;CPFormatterKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;413E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;306E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;505E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;506E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;485E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;507E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;508E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;506E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;485E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;509E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;429E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;510E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;506E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;429E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;485E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;405E;K;6;$afontD;K;6;CP$UIDd;3;465E;K;16;$aimage-positionD;K;6;CP$UIDd;3;352E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;355E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;511E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;307E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;308E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;355E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;355E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;306E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;352E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;405E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;512E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;513E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;420E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;6;$afontD;K;6;CP$UIDd;3;514E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;515E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;420E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;516E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;517E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;352E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;12;$atext-colorD;K;6;CP$UIDd;3;518E;K;6;$afontD;K;6;CP$UIDd;3;519E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;520E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;352E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;176E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;521E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;517E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;411E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;454E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;11;$aalignmentD;K;6;CP$UIDd;3;352E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;352E;K;12;$atext-colorD;K;6;CP$UIDd;3;522E;K;6;$afontD;K;6;CP$UIDd;3;523E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;306E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;520E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;420E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;308E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;308E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;352E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;352E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;24;CPUserDefaultsControllerK;8;$classesA;S;24;CPUserDefaultsControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;33;CPUserDefaultsControllerSharedKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;524E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;525E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;524E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;526E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;524E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;527E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;524E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;528E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;153E;E;E;S;8;delegateS;18;buttonElementsDateS;18;buttonElementsTimeS;11;buttonStyleS;17;pickerCurrentDateS;13;pickerMaxDateS;13;pickerMinDateS;12;pickerTargetS;9;theWindowS;11;nextKeyViewS;7;contentS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;15;updateElements:S;23;updateHasMinConstraint:S;23;updateHasMaxConstraint:S;27;value: pickerTarget.enabledS;5;valueS;20;pickerTarget.enabledD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;32;value: pickerTarget.timeIntervalS;25;pickerTarget.timeIntervalD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;K;25;CPConditionallySetsHiddenD;K;6;CP$UIDd;3;306E;E;E;S;31;value: pickerTarget.objectValueS;24;pickerTarget.objectValueD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;28;value: pickerTarget.borderedS;21;pickerTarget.borderedD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;35;value: pickerTarget.drawsBackgroundS;28;pickerTarget.drawsBackgroundD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;29;value: pickerTarget.dateValueS;22;pickerTarget.dateValueD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;27;value: pickerTarget.maxDateS;20;pickerTarget.maxDateD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;27;value: pickerTarget.minDateS;20;pickerTarget.minDateD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;37;selectedTag: selection.datePickerModeS;11;selectedTagS;24;selection.datePickerModeD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;38;selectedTag: selection.datePickerStyleS;25;selection.datePickerStyleD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;35;maxValue: pickerMaxDate.objectValueS;8;maxValueS;25;pickerMaxDate.objectValueD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;35;minValue: pickerMinDate.objectValueS;8;minValueS;25;pickerMinDate.objectValueD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;36;value: pickerCurrentDate.objectValueS;29;pickerCurrentDate.objectValueD;K;6;$classD;K;6;CP$UIDd;3;257E;K;10;CP.objectsD;E;E;S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;97E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;93E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;99E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;124E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;114E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;123E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;126E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;144E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;141E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;12;CPDatePickerS;13;AppControllerS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{133, 112}, {885, 477}}S;21;{{0, 0}, {1440, 878}}S;17;CPDatePicker Testd;1;0S;20;{{0, 0}, {885, 477}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;E;E;S;6;normalS;24;{{456, 161}, {273, 148}}S;20;{{0, 0}, {273, 148}}d;2;36D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;412E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;529E;E;S;10;datePickerS;16;bezeled+borderedD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;531E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;D;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;532E;E;d;1;4d;3;510D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;533E;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;534E;E;S;22;{{21, 75}, {355, 382}}S;20;{{0, 0}, {355, 382}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;429E;E;E;S;3;boxS;10;ParametersD;K;6;$classD;K;6;CP$UIDd;3;154E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;159E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;405E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;544E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;545E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;546E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;547E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;408E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;548E;E;S;22;{{104, 16}, {227, 25}}S;19;{{0, 0}, {227, 25}}S;12;popup-buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;d;2;12S;9;GraphicalS;17;_popUpItemAction:S;20;Textual with StepperS;7;TextualS;22;{{104, 46}, {227, 25}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;11;Single DateS;10;Date RangeS;22;{{104, 77}, {227, 25}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;4;NoneS;14;Month and YearS;19;Month, Day and YearS;23;{{104, 108}, {227, 25}}S;23;Hour, Minute and SecondS;15;Hour and MinuteS;20;{{18, 18}, {78, 17}}S;18;{{0, 0}, {78, 17}}S;9;textfieldS;5;StyleD;K;6;$classD;K;6;CP$UIDd;3;412E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;536E;E;S;20;{{18, 50}, {78, 17}}S;7;SelectsS;20;{{18, 81}, {78, 17}}S;8;ElementsS;22;{{102, 138}, {89, 21}}S;18;{{0, 0}, {89, 21}}S;9;check-boxS;17;disabled+selectedD;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;9;Time zoneS;22;{{195, 138}, {76, 21}}S;18;{{0, 0}, {76, 21}}S;3;EraS;20;{{2, 163}, {357, 5}}S;18;{{0, 0}, {357, 5}}D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;472E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;537E;E;S;3;BoxS;23;{{104, 193}, {227, 29}}S;19;{{0, 0}, {227, 29}}d;3;238D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;538E;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;539E;E;S;21;{{18, 174}, {78, 17}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;11;ConstraintsS;23;{{102, 170}, {113, 21}}S;19;{{0, 0}, {113, 21}}S;8;selectedS;12;Minimum dateS;23;{{104, 245}, {227, 29}}D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;538E;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;539E;E;S;23;{{102, 222}, {116, 21}}S;19;{{0, 0}, {116, 21}}S;12;Maximum dateS;20;{{2, 277}, {357, 5}}D;K;6;$classD;K;6;CP$UIDd;3;472E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;537E;E;S;21;{{18, 290}, {78, 17}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;4;DateS;21;{{18, 315}, {78, 17}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;535E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;7;DisplayS;23;{{104, 284}, {227, 29}}D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;540E;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;538E;E;D;K;6;$classD;K;6;CP$UIDd;3;418E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;539E;E;S;22;{{102, 313}, {97, 21}}S;18;{{0, 0}, {97, 21}}S;10;BackgroundS;22;{{102, 333}, {97, 21}}S;6;BorderS;22;{{102, 353}, {97, 21}}S;7;EnabledS;21;{{20, 20}, {162, 29}}S;19;{{0, 0}, {162, 29}}D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;541E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;306E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;17;CPDatePicket testS;22;{{416, 75}, {356, 21}}S;19;{{0, 0}, {356, 21}}D;K;6;$classD;K;6;CP$UIDd;3;412E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;542E;E;D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;541E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;5;LabelS;23;{{416, 104}, {356, 21}}D;K;6;$classD;K;6;CP$UIDd;3;412E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;543E;E;D;K;6;$classD;K;6;CP$UIDd;3;416E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;530E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;541E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;308E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;306E;E;S;10;OtherViewsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;169E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;162E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;355E;D;K;6;CP$UIDd;3;355E;D;K;6;CP$UIDd;3;355E;D;K;6;CP$UIDd;3;355E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;13d;13;1355344212000d;15;-62135554022000d;14;64092254400000d;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;549E;D;K;6;CP$UIDd;3;549E;D;K;6;CP$UIDd;3;549E;D;K;6;CP$UIDd;3;355E;E;E;S;22;{"width":0,"height":0}d;15;-62135510400000d;14;64092297600000d;13;1355343132000d;2;17D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;355E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;550E;D;K;6;CP$UIDd;3;355E;E;E;S;21;{{1, -5}, {361, 386}}S;20;{{0, 0}, {361, 386}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;195E;E;E;d;2;18S;6;_NS:11f;18;0.6862745098039216f;12;0.3455284834E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib new file mode 100644 index 000000000..fdfd528c9 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib @@ -0,0 +1,3711 @@ + + + + 1050 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + YES + NSBox + NSButton + NSButtonCell + NSCustomObject + NSDatePicker + NSDatePickerCell + NSMenu + NSMenuItem + NSObjectController + NSPopUpButton + NSPopUpButtonCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + YES + + + NewApplication + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + NewApplication + + YES + + + About NewApplication + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + YES + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + YES + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + YES + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + YES + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + YES + + + Show Spelling… + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + YES + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + YES + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + YES + + + NewApplication Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + NSDatePicker + YES + + + + AppController + + + 7 + 2 + {{133, 289}, {885, 477}} + 1946157056 + CPDatePicker Test + NSWindow + + + + + 256 + + YES + + + 268 + {{456, 167}, {277, 148}} + + + _NS:9 + YES + + 71303168 + 0 + + 377037012 + + + LucidaGrande + 13 + 1044 + + _NS:9 + + 0.0 + 510 + 1 + 1 + + -63113861222 + + + 63113947200 + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 428}, {168, 29}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + CPDatePicket test + + LucidaGrande-Bold + 17 + 16 + + _NS:1535 + + + 6 + System + controlColor + + + + + NO + + + + 12 + + YES + + + 274 + + YES + + + 268 + {{104, 167}, {230, 27}} + + + + _NS:9 + YES + + 71303168 + 0 + + + _NS:9 + + 0.0 + 238 + + + + NO + + + + 268 + {{102, 343}, {232, 26}} + + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + + Graphical + + 2147483647 + 1 + + + _popUpItemAction: + 1 + + + YES + + OtherViews + + YES + + + Textual + + 2147483647 + + + _popUpItemAction: + 2 + + + + + Textual with Stepper + + 2147483647 + + + _popUpItemAction: + + + + + + + 2 + 1 + YES + YES + 2 + + NO + + + + 268 + {{102, 313}, {232, 26}} + + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + + Date Range + + 2147483647 + 1 + + + _popUpItemAction: + 1 + + + YES + + OtherViews + + YES + + + Single Date + + 2147483647 + + + _popUpItemAction: + + + + + + + 1 + 1 + YES + YES + 2 + + NO + + + + 268 + {{102, 282}, {232, 26}} + + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + + Month, Day and Year + + 2147483647 + 1 + + + _popUpItemAction: + 2 + + + YES + + OtherViews + + YES + + + + Month and Year + + 2147483647 + + + _popUpItemAction: + 1 + + + + + None + + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + NO + + + + 268 + {{102, 251}, {232, 26}} + + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + + Hour, Minute and Second + + 2147483647 + 1 + + + _popUpItemAction: + 2 + + + YES + + OtherViews + + YES + + + + Hour and Minute + + 2147483647 + + + _popUpItemAction: + 1 + + + + + None + + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + NO + + + + 268 + {{15, 351}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Style + + LucidaGrande-Bold + 13 + 2072 + + _NS:1535 + + + + + NO + + + + 268 + {{15, 319}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Selects + + _NS:1535 + + + + + NO + + + + 268 + {{15, 195}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Constraints + + _NS:1535 + + + + + NO + + + + 268 + {{15, 79}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Date + + _NS:1535 + + + + + NO + + + + 268 + {{15, 54}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Display + + _NS:1535 + + + + + NO + + + + 268 + {{15, 288}, {84, 17}} + + + + _NS:1535 + YES + + 68157504 + 4195328 + Elements + + _NS:1535 + + + + + NO + + + + 268 + {{102, 227}, {89, 18}} + + + + _NS:9 + YES + + -1543503872 + 268435456 + Time zone + + _NS:9 + + 1211912448 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + NO + + + + 268 + {{102, 195}, {113, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Minimum date + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{104, 115}, {230, 27}} + + + + _NS:9 + YES + + 71303168 + 0 + + + _NS:9 + + 0.0 + 238 + + + + NO + + + + 268 + {{104, 76}, {230, 27}} + + + + _NS:9 + YES + + 71303168 + 0 + + 377035932 + + + _NS:9 + + 0.0 + 238 + + + + NO + + + + 268 + {{102, 143}, {116, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Maximum date + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{195, 227}, {76, 18}} + + + + _NS:9 + YES + + -1543503872 + 268435456 + Era + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{102, 52}, {97, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Background + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{102, 32}, {97, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Border + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 12 + {{2, 218}, {357, 5}} + + + + _NS:9 + {0, 0} + + 67108864 + 0 + Box + + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 12 + {{2, 104}, {357, 5}} + + + + _NS:9 + {0, 0} + + 67108864 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 268 + {{102, 12}, {97, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Enabled + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + {{1, 1}, {361, 386}} + + + + _NS:11 + + + {{17, 16}, {363, 388}} + + + + _NS:9 + {0, 0} + + 67108864 + 0 + Parameters + + LucidaGrande + 11 + 3100 + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 0 + NO + + + + 268 + {{413, 381}, {362, 21}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Label + + LucidaGrande + 17 + 16 + + _NS:1535 + + + + 1 + MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA + + + NO + + + + 268 + {{413, 352}, {362, 21}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Label + + _NS:1535 + + + + 1 + MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA + + + NO + + + {885, 477} + + + + + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + YES + + + YES + + + + + YES + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 451 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + showHelp: + + + + 360 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + theWindow + + + + 459 + + + + pickerTarget + + + + 758 + + + + pickerMinDate + + + + 755 + + + + buttonStyle + + + + 776 + + + + updateElements: + + + + 812 + + + + buttonElementsDate + + + + 809 + + + + buttonElementsTime + + + + 810 + + + + updateElements: + + + + 811 + + + + pickerMaxDate + + + + 756 + + + + pickerCurrentDate + + + + 757 + + + + updateHasMinConstraint: + + + + 823 + + + + updateHasMaxConstraint: + + + + 824 + + + + maxValue: pickerMaxDate.objectValue + + + + + + maxValue: pickerMaxDate.objectValue + maxValue + pickerMaxDate.objectValue + 2 + + + 768 + + + + minValue: pickerMinDate.objectValue + + + + + + minValue: pickerMinDate.objectValue + minValue + pickerMinDate.objectValue + + 2 + + + 774 + + + + value: pickerCurrentDate.objectValue + + + + + + value: pickerCurrentDate.objectValue + value + pickerCurrentDate.objectValue + + 2 + + + 789 + + + + selectedTag: selection.datePickerStyle + + + + + + selectedTag: selection.datePickerStyle + selectedTag + selection.datePickerStyle + 2 + + + 806 + + + + selectedTag: selection.datePickerMode + + + + + + selectedTag: selection.datePickerMode + selectedTag + selection.datePickerMode + 2 + + + 808 + + + + nextKeyView + + + + 816 + + + + value: pickerTarget.minDate + + + + + + value: pickerTarget.minDate + value + pickerTarget.minDate + 2 + + + 832 + + + + nextKeyView + + + + 817 + + + + value: pickerTarget.maxDate + + + + + + value: pickerTarget.maxDate + value + pickerTarget.maxDate + 2 + + + 835 + + + + nextKeyView + + + + 821 + + + + value: pickerTarget.dateValue + + + + + + value: pickerTarget.dateValue + value + pickerTarget.dateValue + 2 + + + 828 + + + + value: pickerTarget.drawsBackground + + + + + + value: pickerTarget.drawsBackground + value + pickerTarget.drawsBackground + 2 + + + 870 + + + + value: pickerTarget.bordered + + + + + + value: pickerTarget.bordered + value + pickerTarget.bordered + 2 + + + 867 + + + + content + + + + 800 + + + + value: pickerTarget.objectValue + + + + + + value: pickerTarget.objectValue + value + pickerTarget.objectValue + 2 + + + 847 + + + + value: pickerTarget.timeInterval + + + + + + value: pickerTarget.timeInterval + value + pickerTarget.timeInterval + + NSConditionallySetsHidden + + + 2 + + + 860 + + + + value: pickerTarget.enabled + + + + + + value: pickerTarget.enabled + value + pickerTarget.enabled + 2 + + + 859 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 103 + + + YES + + + + + + 217 + + + YES + + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 72 + + + + + 82 + + + + + 124 + + + YES + + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 125 + + + YES + + + + + + 126 + + + + + 205 + + + YES + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + YES + + + + + + 216 + + + YES + + + + + + 200 + + + YES + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + YES + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 106 + + + YES + + + + + + 111 + + + + + 57 + + + YES + + + + + + + + + + 58 + + + + + 136 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 24 + + + YES + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + 297 + + + + + 298 + + + + + 211 + + + YES + + + + + + 212 + + + YES + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + YES + + + + + + 349 + + + YES + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + + + + + + 450 + + + + + 538 + + + YES + + + + + + 539 + + + + + 540 + + + YES + + + + + + 541 + + + + + 790 + + + + + 799 + + + DatePickerStyleController + + + 822 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + 582 + + + YES + + + + + + 583 + + + + + 542 + + + YES + + + + + + 543 + + + YES + + + + + + 544 + + + YES + + + + + + + + 547 + + + + + 546 + + + + + 545 + + + + + 548 + + + YES + + + + + + 549 + + + YES + + + + + + 550 + + + YES + + + + + + + 553 + + + + + 552 + + + + + 554 + + + YES + + + + + + 555 + + + YES + + + + + + 556 + + + YES + + + + + + + + 559 + + + + + 558 + + + + + 557 + + + + + 572 + + + YES + + + + + + 573 + + + YES + + + + + + 574 + + + YES + + + + + + + + 577 + + + + + 576 + + + + + 575 + + + + + 560 + + + YES + + + + + + 561 + + + + + 562 + + + YES + + + + + + 563 + + + + + 586 + + + YES + + + + + + 587 + + + + + 596 + + + YES + + + + + + 597 + + + + + 602 + + + YES + + + + + + 603 + + + + + 564 + + + YES + + + + + + 565 + + + + + 578 + + + YES + + + + + + 579 + + + + + 588 + + + YES + + + + + + 589 + + + + + 590 + + + YES + + + + + + 593 + + + + + 594 + + + YES + + + + + + 595 + + + + + 591 + + + YES + + + + + + 592 + + + + + 580 + + + YES + + + + + + 581 + + + + + 598 + + + YES + + + + + + 601 + + + + + 599 + + + YES + + + + + + 600 + + + + + 837 + + + + + 838 + + + + + 842 + + + YES + + + + + + 843 + + + + + 848 + + + YES + + + + + + 849 + + + + + 854 + + + YES + + + + + + 855 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 103.IBPluginDependency + 106.IBPluginDependency + 111.IBPluginDependency + 112.IBPluginDependency + 124.IBPluginDependency + 125.IBPluginDependency + 126.IBPluginDependency + 129.IBPluginDependency + 136.IBPluginDependency + 143.IBPluginDependency + 19.IBPluginDependency + 195.IBPluginDependency + 196.IBPluginDependency + 197.IBPluginDependency + 198.IBPluginDependency + 199.IBPluginDependency + 200.IBPluginDependency + 201.IBPluginDependency + 202.IBPluginDependency + 203.IBPluginDependency + 204.IBPluginDependency + 205.IBPluginDependency + 206.IBPluginDependency + 207.IBPluginDependency + 208.IBPluginDependency + 209.IBPluginDependency + 210.IBPluginDependency + 211.IBPluginDependency + 212.IBPluginDependency + 213.IBPluginDependency + 214.IBPluginDependency + 215.IBPluginDependency + 216.IBPluginDependency + 217.IBPluginDependency + 218.IBPluginDependency + 219.IBPluginDependency + 220.IBPluginDependency + 221.IBPluginDependency + 23.IBPluginDependency + 236.IBPluginDependency + 239.IBPluginDependency + 24.IBPluginDependency + 29.IBPluginDependency + 295.IBPluginDependency + 296.IBPluginDependency + 297.IBPluginDependency + 298.IBPluginDependency + 346.IBPluginDependency + 348.IBPluginDependency + 349.IBPluginDependency + 350.IBPluginDependency + 351.IBPluginDependency + 354.IBPluginDependency + 371.IBPluginDependency + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 372.IBPluginDependency + 450.IBPluginDependency + 5.IBPluginDependency + 538.IBPluginDependency + 539.IBPluginDependency + 539.datePicker.maxDate + 539.datePicker.minDate + 540.IBPluginDependency + 541.IBPluginDependency + 542.IBPluginDependency + 543.IBPluginDependency + 544.IBPluginDependency + 545.IBAttributePlaceholdersKey + 545.IBPluginDependency + 546.IBAttributePlaceholdersKey + 546.IBPluginDependency + 547.IBAttributePlaceholdersKey + 547.IBPluginDependency + 548.IBPluginDependency + 549.IBPluginDependency + 550.IBPluginDependency + 552.IBPluginDependency + 553.IBPluginDependency + 554.IBPluginDependency + 555.IBPluginDependency + 556.IBPluginDependency + 557.IBPluginDependency + 558.IBPluginDependency + 559.IBPluginDependency + 56.IBPluginDependency + 560.IBPluginDependency + 561.IBPluginDependency + 562.IBPluginDependency + 563.IBPluginDependency + 564.IBPluginDependency + 565.IBPluginDependency + 57.IBPluginDependency + 572.IBPluginDependency + 573.IBPluginDependency + 574.IBPluginDependency + 575.IBPluginDependency + 576.IBPluginDependency + 577.IBPluginDependency + 578.IBPluginDependency + 579.IBPluginDependency + 58.IBPluginDependency + 580.IBPluginDependency + 581.IBPluginDependency + 582.IBPluginDependency + 583.IBPluginDependency + 586.IBPluginDependency + 587.IBPluginDependency + 588.IBPluginDependency + 589.IBPluginDependency + 590.IBPluginDependency + 591.IBPluginDependency + 592.IBPluginDependency + 593.IBPluginDependency + 594.IBPluginDependency + 595.IBPluginDependency + 596.IBPluginDependency + 597.IBPluginDependency + 598.IBPluginDependency + 599.IBPluginDependency + 600.IBPluginDependency + 601.IBPluginDependency + 602.IBPluginDependency + 603.IBPluginDependency + 72.IBPluginDependency + 73.IBPluginDependency + 75.IBPluginDependency + 79.IBPluginDependency + 790.IBPluginDependency + 799.IBPluginDependency + 80.IBPluginDependency + 81.IBPluginDependency + 82.IBPluginDependency + 822.IBPluginDependency + 83.IBPluginDependency + 837.IBPluginDependency + 838.IBPluginDependency + 842.IBPluginDependency + 843.IBPluginDependency + 848.IBPluginDependency + 849.IBPluginDependency + 854.IBPluginDependency + 855.IBPluginDependency + 92.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{303, 221}, {480, 360}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + YES + + + + com.apple.InterfaceBuilder.CocoaPlugin + + YES + + + + com.apple.InterfaceBuilder.CocoaPlugin + + YES + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + + + + + YES + + + + + 878 + + + + YES + + AppController + NSObject + + YES + + YES + updateElements: + updateHasMaxConstraint: + updateHasMinConstraint: + + + YES + id + id + id + + + + YES + + YES + updateElements: + updateHasMaxConstraint: + updateHasMinConstraint: + + + YES + + updateElements: + id + + + updateHasMaxConstraint: + id + + + updateHasMinConstraint: + id + + + + + YES + + YES + buttonElementsDate + buttonElementsTime + buttonStyle + pickerCurrentDate + pickerMaxDate + pickerMinDate + pickerTarget + theWindow + + + YES + NSPopUpButton + NSPopUpButton + NSPopUpButton + NSDatePicker + NSDatePicker + NSDatePicker + NSDatePicker + NSWindow + + + + YES + + YES + buttonElementsDate + buttonElementsTime + buttonStyle + pickerCurrentDate + pickerMaxDate + pickerMinDate + pickerTarget + theWindow + + + YES + + buttonElementsDate + NSPopUpButton + + + buttonElementsTime + NSPopUpButton + + + buttonStyle + NSPopUpButton + + + pickerCurrentDate + NSDatePicker + + + pickerMaxDate + NSDatePicker + + + pickerMinDate + NSDatePicker + + + pickerTarget + NSDatePicker + + + theWindow + NSWindow + + + + + IBProjectSource + ./Classes/AppController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + NSSwitch + + + YES + {11, 11} + {10, 3} + {15, 15} + + + + diff --git a/Tests/Manual/CPDatePickerTest/Resources/spinner.gif b/Tests/Manual/CPDatePickerTest/Resources/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5e705f6cbdf914e5e714c35a8dfef807f19e3c2 GIT binary patch literal 1434 zcmZvbdrVVj7{t$-UNOu86#VHu^|s&3rWfwHBbPG_8{SrlB{Tv1uvvj4t6zP!)#d!Ogc zP^62J^$0+~?-ZcXXpBaq%jFsw8L`=H2?+@R02Yg-*Xw;gACBV^i3CMahr>Z667S!? zk3LDe>VLEsU;sWo$Py~o!gWuaIAnaG3Sv``&tvc+8DJO!| zt4fcbQ8tW}a&xZfgtQ9BnFYLvGG|PvCNlg&uh@Q^w9Pz}+I^hCj`vu9JQADPqdkyk zR40xycD9geUgJu1e;$L`Fpa)?Wl-2&6hO@U*KrPqK(I1H=1h?2fce}6GhhP1oBZC# z1e@gt-qFa6lZrl%s1>bdxg*W)Ebt__O(4sj6(*2X@ciUClwHH#U(NRM7XAjS z+scDZ32J*PCoslsgS~#ZlCCGo`r>S6F)Ghw5wVlqHioFaw?ucD(XoLJ0j;28oPoPV z9A}dR$0SKn>uExfkl#j09o;v$BZ909R=*p{ATNq8BJW;YduX2QMOU7$a$_L5e!G^g zpbkx5G4&FZ%7m14rTN}5YB(;x7$5XOc_hf3E|Hw$TVg)P#qf~}nOn03uqsp>UG>vi zWThIoO)-1Q#@u#O;fMC#WAf@Xj70-0g9YZ;dA$HH1fW1q=9-c>>_yA0S$7M*5?}vi z)8MU`Q%P!7sEBBnd$DrKgFQ2?O%6LpdaC%F8Pn-)EC2t=j~ zoaLamla$FX!GQqWi!%s>sj-#5SJX0IF!TP=r21Z}s)k#btN0?=I7uD9C)Gb$fZ#sm zaVq7g`LwZ%PfNpN^_N-IGLHj@AV`s#4&va7_{Hw63G6BkSGXHdogTZ%QOiRb bDpZ@qYcJKM>x%b%*HX74c8MnqfHi*u-bC?g literal 0 HcmV?d00001 diff --git a/Tests/Manual/CPDatePickerTest/index-debug.html b/Tests/Manual/CPDatePickerTest/index-debug.html new file mode 100644 index 000000000..588676347 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/index-debug.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + CPDatePickerTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPDatePickerTest/index.html b/Tests/Manual/CPDatePickerTest/index.html new file mode 100644 index 000000000..58bb17dd1 --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + CPDatePickerTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPDatePickerTest/main.j b/Tests/Manual/CPDatePickerTest/main.j new file mode 100644 index 000000000..812971efd --- /dev/null +++ b/Tests/Manual/CPDatePickerTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPDatePickerTest + * + * Created by You on March 15, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index ba4015446..c4665caf5 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -37,6 +37,7 @@ @import "NSCustomObject.j" @import "NSCustomResource.j" @import "NSCustomView.j" +@import "NSDatePicker.j" @import "NSDictionaryController.j" @import "NSEvent.j" @import "NSFont.j" diff --git a/Tools/nib2cib/NSDate.j b/Tools/nib2cib/NSDate.j new file mode 100644 index 000000000..135f51c49 --- /dev/null +++ b/Tools/nib2cib/NSDate.j @@ -0,0 +1,40 @@ +/* + * NSDatePicker.j + * nib2cib + * + * Created by cacaodev. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@implementation NSDate : CPDate +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + var interval = [aCoder decodeDoubleForKey:@"NS.time"] || 0; + + return [CPDate dateWithTimeIntervalSinceReferenceDate:interval]; +} + +- (Class)classForKeyedArchiver +{ + return [CPDate class]; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSDatePicker.j b/Tools/nib2cib/NSDatePicker.j new file mode 100644 index 000000000..0d2335299 --- /dev/null +++ b/Tools/nib2cib/NSDatePicker.j @@ -0,0 +1,228 @@ +/* + * NSDatePicker.j + * nib2cib + * + * Created by cacaodev. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import + +@import "NSCell.j" + +@class Converter + +@global CPTextFieldDatePickerStyle +@global CPTextFieldAndStepperDatePickerStyle +@global CPClockAndCalendarDatePickerStyle +@global CPHourMinuteSecondDatePickerElementFlag +@global CPHourMinuteDatePickerElementFlag +@global IBDefaultFontFace +@global IBDefaultFontSize + +var NSDatePickerDefaultSize = 22, + NSDatePickerCalendarDefaultSize = 148; + +@implementation CPDatePicker (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super NS_initWithCoder:aCoder]; + + var cell = [aCoder decodeObjectForKey:@"NSCell"]; + _minDate = [cell minDate]; + _maxDate = [cell maxDate]; + _timeInterval = [cell timeInterval]; + _datePickerMode = [cell datePickerMode]; + _datePickerElements = [cell datePickerElements]; + _datePickerStyle = [cell datePickerType]; + _dateValue = [cell objectValue]; + _backgroundColor = [cell backgroundColor]; + _drawsBackground = [cell drawsBackground]; + + [self setBezeled:[cell isBezeled]]; + [self setBordered:[cell isBordered]]; + + var theme = [[Converter sharedConverter] themes][0]; + + if (_datePickerStyle != CPClockAndCalendarDatePickerStyle) + { + var minSize = [theme valueForAttributeWithName:@"min-size" forClass:[self class]], + maxSize = [theme valueForAttributeWithName:@"max-size" forClass:[self class]]; + + if (minSize.height > 0) + { + _frame.size.height = MAX(_frame.size.height, minSize.height); + _bounds.size.height = MAX(_frame.size.height, minSize.height); + } + + if (maxSize.height > 0) + { + _frame.size.height = MIN(_frame.size.height, maxSize.height); + _bounds.size.height = MIN(_frame.size.height, maxSize.height); + } + + if (minSize.width > 0) + { + _frame.size.width = MAX(_frame.size.width, minSize.width); + _bounds.size.width = MAX(_frame.size.width, minSize.width); + } + + if (maxSize.width > 0) + { + _frame.size.width = MIN(_frame.size.width, maxSize.width); + _bounds.size.width = MAX(_frame.size.width, minSize.width); + } + + if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle) + { + _frame.size.width -= 3; + _bounds.size.width -= 3; + } + + _frame.origin.y -= _frame.size.height - NSDatePickerDefaultSize - 4; + } + else + { + var minSize = [theme valueForAttributeWithName:@"min-size-calendar" forClass:[self class]], + maxSize = [theme valueForAttributeWithName:@"max-size-calendar" forClass:[self class]], + sizeClock = [theme valueForAttributeWithName:@"size-clock" forClass:[self class]]; + + if (_datePickerElements & CPHourMinuteSecondDatePickerElementFlag || _datePickerElements & CPHourMinuteDatePickerElementFlag) + { + minSize.width += sizeClock.width + 10; + maxSize.width += sizeClock.width + 10; + } + + if (minSize.height > 0) + { + _frame.size.height = MAX(_frame.size.height, minSize.height); + _bounds.size.height = MAX(_frame.size.height, minSize.height); + } + + if (maxSize.height > 0) + { + _frame.size.height = MIN(_frame.size.height, maxSize.height); + _bounds.size.height = MIN(_frame.size.height, maxSize.height); + } + + if (minSize.width > 0) + { + _frame.size.width = MAX(_frame.size.width, minSize.width); + _bounds.size.width = MAX(_frame.size.width, minSize.width); + } + + if (maxSize.width > 0) + { + _frame.size.width = MIN(_frame.size.width, maxSize.width); + _bounds.size.width = MAX(_frame.size.width, minSize.width); + } + + _frame.origin.y -= _frame.size.height - NSDatePickerCalendarDefaultSize - 1; + } + + if ([cell font]._name === IBDefaultFontFace && [[cell font] size] == IBDefaultFontSize) + [self setTextFont:[theme valueForAttributeWithName:@"font" forClass:[self class]]]; + else + [self setTextFont:[cell font]]; + + + var textColor = [cell textColor], + defaultColor = [self currentValueForThemeAttribute:@"text-color"]; + + // Don't change the text color if it is not the default, that messes up the theme lookups later + if (![textColor isEqual:defaultColor]) + [self setTextColor:[cell textColor]]; + + return self; +} + +@end + +@implementation NSDatePicker : CPDatePicker +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [super NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [CPDatePicker class]; +} + +@end + + +@implementation NSDatePickerCell : NSCell +{ + BOOL _drawsBackground @accessors(getter=drawsBackground); + CPDate _minDate @accessors(getter=minDate); + CPDate _maxDate @accessors(getter=maxDate); + CPInteger _datePickerMode @accessors(getter=datePickerMode); + CPInteger _datePickerElements @accessors(getter=datePickerElements); + CPinteger _datePickerType @accessors(getter=datePickerType); + double _timeInterval @accessors(getter=timeInterval); + CPColor _textColor @accessors(getter=textColor); + CPColor _backgroundColor @accessors(getter=backgroundColor); +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + var flags = [aCoder decodeIntForKey:@"NSCellFlags"], + pickerType = [aCoder decodeIntForKey:@"NSDatePickerType"] || 0; + + if ([aCoder decodeIntForKey:@"NSSuppressStepper"] && pickerType != 1) + pickerType = 2; + + _timeInterval = [aCoder decodeDoubleForKey:@"NSTimeInterval"] || 0; + _datePickerMode = [aCoder decodeIntForKey:@"NSDatePickerMode"] || 0; + _datePickerElements = [aCoder decodeIntForKey:@"NSDatePickerElements"] || 0; + _datePickerType = pickerType; + _minDate = [aCoder decodeObjectForKey:@"NSMinDate"] || [CPDate distantPast]; + _maxDate = [aCoder decodeObjectForKey:@"NSMaxDate"]|| [CPDate distantFuture];; + _textColor = [aCoder decodeObjectForKey:@"NSTextColor"]; + _backgroundColor = [aCoder decodeObjectForKey:@"NSBackgroundColor"]; + _isBordered = _isBezeled; + + if ([aCoder containsValueForKey:@"NSDrawsBackground"]) + _drawsBackground = [aCoder decodeBoolForKey:@"NSDrawsBackground"]; + else + _drawsBackground = YES; + } + + return self; +} + +@end + +@implementation NSCalendarDate : CPDate +{ +} + +- (Class)classForKeyedArchiver +{ + return [CPDate class]; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSFoundation.j b/Tools/nib2cib/NSFoundation.j index 939f94432..26cc8fc45 100644 --- a/Tools/nib2cib/NSFoundation.j +++ b/Tools/nib2cib/NSFoundation.j @@ -23,6 +23,7 @@ @import "NSArray.j" @import "NSAttributedString.j" @import "NSByteCountFormatter.j" +@import "NSDate.j" @import "NSDateFormatter.j" @import "NSDictionary.j" @import "NSExpression.j"