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 000000000..de074caf9 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left-highlighted.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left.png b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left.png new file mode 100644 index 000000000..8f1fc7370 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-left.png differ 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 000000000..0c4af90e2 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right-highlighted.png differ 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 000000000..ca16659ee Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-calendar-arrow-right.png differ 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 000000000..2b3a52153 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-circle-image-highlighted.png differ 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 000000000..c315ff4b1 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-circle-image.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-disabled.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-disabled.png new file mode 100644 index 000000000..856977746 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-disabled.png differ 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 000000000..d4413ceb1 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand-disabled.png differ 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 000000000..d42a0c2b2 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-hour-hand.png differ 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 000000000..535b44678 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand-disabled.png differ 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 000000000..f0fbbc3fb Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-middle-hand.png differ 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 000000000..c051338e9 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand-disabled.png differ 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 000000000..a553f841e Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-minute-hand.png differ 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 000000000..9daea2c05 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand-disabled.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand.png b/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand.png new file mode 100644 index 000000000..7c50c2cd5 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock-second-hand.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-clock.png b/AppKit/Themes/Aristo/Resources/datepicker-clock.png new file mode 100644 index 000000000..251d086cf Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-clock.png differ 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 000000000..d9d618051 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-0.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-date-segment-1.png b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-1.png new file mode 100644 index 000000000..c08199498 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-1.png differ diff --git a/AppKit/Themes/Aristo/Resources/datepicker-date-segment-2.png b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-2.png new file mode 100644 index 000000000..314102fa7 Binary files /dev/null and b/AppKit/Themes/Aristo/Resources/datepicker-date-segment-2.png differ 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 000000000..2fda06e9b Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left-highlighted.png b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left-highlighted.png new file mode 100644 index 000000000..de074caf9 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left-highlighted.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left.png b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left.png new file mode 100644 index 000000000..8f1fc7370 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-left.png differ 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 000000000..0c4af90e2 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right-highlighted.png differ 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 000000000..ca16659ee Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-calendar-arrow-right.png differ 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 000000000..2b3a52153 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-circle-image-highlighted.png differ 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 000000000..c315ff4b1 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-circle-image.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-disabled.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-disabled.png new file mode 100644 index 000000000..856977746 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-disabled.png differ 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 000000000..d4413ceb1 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand-disabled.png differ 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 000000000..d42a0c2b2 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-hour-hand.png differ 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 000000000..535b44678 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand-disabled.png differ 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 000000000..f0fbbc3fb Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-middle-hand.png differ 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 000000000..c051338e9 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand-disabled.png differ 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 000000000..a553f841e Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-minute-hand.png differ 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 000000000..9daea2c05 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand-disabled.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand.png new file mode 100644 index 000000000..7c50c2cd5 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock-second-hand.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-clock.png b/AppKit/Themes/Aristo2/Resources/datepicker-clock.png new file mode 100644 index 000000000..251d086cf Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-clock.png differ 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 000000000..d9d618051 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-0.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-1.png b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-1.png new file mode 100644 index 000000000..c08199498 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-1.png differ diff --git a/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-2.png b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-2.png new file mode 100644 index 000000000..314102fa7 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/datepicker-date-segment-2.png differ 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 000000000..a5e705f6c Binary files /dev/null and b/Tests/Manual/CPDatePickerTest/Resources/spinner.gif differ 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"