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/CPApplication.j b/AppKit/CPApplication.j index 1307407a6..946e01149 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -371,22 +371,32 @@ CPRunContinuesResponse = -1002; applicationVersion = [options objectForKey:@"ApplicationVersion"] || [mainInfo objectForKey:@"CPBundleShortVersionString"], copyright = [options objectForKey:@"Copyright"] || [mainInfo objectForKey:@"CPHumanReadableCopyright"]; - var aboutPanelPath = [[CPBundle bundleForClass:[CPWindowController class]] pathForResource:@"AboutPanel.cib"], - aboutPanelController = [CPWindowController alloc], - aboutPanelController = [aboutPanelController initWithWindowCibPath:aboutPanelPath owner:aboutPanelController], - aboutPanel = [aboutPanelController window], - contentView = [aboutPanel contentView], - imageView = [contentView viewWithTag:1], - applicationLabel = [contentView viewWithTag:2], - versionLabel = [contentView viewWithTag:3], - copyrightLabel = [contentView viewWithTag:4], - standardPath = [[CPBundle bundleForClass:[self class]] pathForResource:@"standardApplicationIcon.png"]; + var windowWidth = 275, + windowHeight = 223, + imgWidth = 100, + imgHeight = 100, + interField = 8, + aboutPanel = [[CPWindow alloc] initWithContentRect:CGRectMake(0, 0, windowWidth, windowHeight) styleMask:CPClosableWindowMask], + imageView = [[CPImageView alloc] initWithFrame:CGRectMake((windowWidth / 2) - (imgWidth / 2), interField, imgWidth, imgHeight)], + applicationLabel = [[CPTextField alloc] initWithFrame:CGRectMake(17, imgHeight + 16, windowWidth - 34, 24)], + versionLabel = [[CPTextField alloc] initWithFrame:CGRectMake(17, imgHeight + 48, windowWidth - 34, 16)], + copyrightLabel = [[CPTextField alloc] initWithFrame:CGRectMake(17, imgHeight + 72, windowWidth - 34, 32)], + contentView = [aboutPanel contentView]; - // FIXME move this into the CIB eventually [applicationLabel setFont:[CPFont boldSystemFontOfSize:[CPFont systemFontSize] + 2]]; [applicationLabel setAlignment:CPCenterTextAlignment]; + [versionLabel setFont:[CPFont systemFontOfSize:[CPFont systemFontSize] - 1]]; [versionLabel setAlignment:CPCenterTextAlignment]; + [copyrightLabel setFont:[CPFont systemFontOfSize:[CPFont systemFontSize] - 1]]; [copyrightLabel setAlignment:CPCenterTextAlignment]; + [copyrightLabel setLineBreakMode:CPLineBreakByWordWrapping]; + + [contentView addSubview:imageView]; + [contentView addSubview:applicationLabel]; + [contentView addSubview:versionLabel]; + [contentView addSubview:copyrightLabel]; + + var standardPath = [[CPBundle bundleForClass:[self class]] pathForResource:@"standardApplicationIcon.png"]; [imageView setImage:applicationIcon || [[CPImage alloc] initWithContentsOfFile:standardPath size:CGSizeMake(256, 256)]]; @@ -400,7 +410,7 @@ CPRunContinuesResponse = -1002; else [versionLabel setStringValue:@""]; - [copyrightLabel setStringValue:copyright || ""]; + [copyrightLabel setStringValue:copyright || @""]; [aboutPanel center]; _aboutPanel = aboutPanel; diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index 903f31037..0b25334d9 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -65,51 +65,51 @@ + (CPSet)keyPathsForValuesAffectingContentArray { - return [CPSet setWithObjects:"content"]; + return [CPSet setWithObjects:@"content"]; } + (CPSet)keyPathsForValuesAffectingArrangedObjects { // Also depends on "filterPredicate" but we'll handle that manually. - return [CPSet setWithObjects:"content", "sortDescriptors"]; + return [CPSet setWithObjects:@"content", @"sortDescriptors"]; } + (CPSet)keyPathsForValuesAffectingSelection { - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } + (CPSet)keyPathsForValuesAffectingSelectionIndex { - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } + (CPSet)keyPathsForValuesAffectingSelectionIndexes { // When the arranged objects change, selection preservation may cause the indexes // to change. - return [CPSet setWithObjects:"arrangedObjects"]; + return [CPSet setWithObjects:@"arrangedObjects"]; } + (CPSet)keyPathsForValuesAffectingSelectedObjects { // Don't need to depend on arrangedObjects here because selectionIndexes already does. - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } + (CPSet)keyPathsForValuesAffectingCanRemove { - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } + (CPSet)keyPathsForValuesAffectingCanSelectNext { - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } + (CPSet)keyPathsForValuesAffectingCanSelectPrevious { - return [CPSet setWithObjects:"selectionIndexes"]; + return [CPSet setWithObjects:@"selectionIndexes"]; } diff --git a/AppKit/CPDatePicker/CPDatePicker.j b/AppKit/CPDatePicker/CPDatePicker.j new file mode 100644 index 000000000..af7b9938c --- /dev/null +++ b/AppKit/CPDatePicker/CPDatePicker.j @@ -0,0 +1,686 @@ +/* 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; + [super setObjectValue:_dateValue]; + [self didChangeValueForKey:@"dateValue"]; + [self didChangeValueForKey:@"objectValue"]; + + [self willChangeValueForKey:@"timeInterval"]; + _timeInterval = (_datePickerMode == CPSingleDateMode)? 0 : aTimeInterval; + [self didChangeValueForKey:@"timeInterval"]; + + [self sendAction:[self action] to:[self target]]; + + 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..6681631af --- /dev/null +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -0,0 +1,1444 @@ +/* _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 || !_currentTextField) + { + 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 && [anEvent keyCode] == CPTabKeyCode) + { + 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: + + var dateNextMonth = [dateValue copy]; + + dateNextMonth.setDate(1); + dateNextMonth.setMonth(parseInt(anObjectValue) - 1); + + var numberDayNextMonth = [dateNextMonth _daysInMonth]; + + if (numberDayNextMonth < [dateValue _daysInMonth] && dateValue.getDate() > numberDayNextMonth) + dateValue.setDate(numberDayNextMonth); + + 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/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index db0b238da..06ce850b7 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -257,7 +257,11 @@ var CPBindingOperationAnd = 0, if (valueTransformer) aValue = [valueTransformer transformedValue:aValue]; - if (aValue === undefined || aValue === nil || aValue === [CPNull null]) + // If the value is nil AND the source doesn't respond to setPlaceholderString: then + // we set the value to the placeholder. Otherwise, we do not want to short cut the process + // of setting the placeholder that is based on the fact that the value is nil. + if ((aValue === undefined || aValue === nil || aValue === [CPNull null]) + && ![_source respondsToSelector:@selector(setPlaceholderString:)]) aValue = [options objectForKey:CPNullPlaceholderBindingOption] || nil; return aValue; diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index 0fd7264e9..58630f9ab 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -851,6 +851,8 @@ var _CPMenuBarVisible = NO, var theWindow = [aView window], menuWindow = [_CPMenuWindow menuWindowWithMenu:aMenu font:aFont]; + [_CPMenuWindow poolMenuWindow:menuWindow]; + [menuWindow setBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle]; var constraintRect = [CPMenu _constraintRectForView:aView], diff --git a/AppKit/CPMenu/_CPMenuBarWindow.j b/AppKit/CPMenu/_CPMenuBarWindow.j index f02011e7d..2c6c2bcaa 100644 --- a/AppKit/CPMenu/_CPMenuBarWindow.j +++ b/AppKit/CPMenu/_CPMenuBarWindow.j @@ -143,6 +143,7 @@ _textColor = aColor; [_menuItemViews makeObjectsPerformSelector:@selector(setTextColor:) withObject:_textColor]; + [_menuItemViews makeObjectsPerformSelector:@selector(setParentMenuTextColor:) withObject:_textColor]; } - (void)setTitleColor:(CPColor)aColor @@ -163,6 +164,7 @@ _textShadowColor = aColor; [_menuItemViews makeObjectsPerformSelector:@selector(setTextShadowColor:) withObject:_textShadowColor]; + [_menuItemViews makeObjectsPerformSelector:@selector(setParentMenuTextShadowColor:) withObject:_textShadowColor]; } - (void)setTitleShadowColor:(CPColor)aColor @@ -181,6 +183,8 @@ return; _highlightColor = aColor; + + [_menuItemViews makeObjectsPerformSelector:@selector(setParentMenuHighlightColor:) withObject:_highlightColor]; } - (void)setHighlightTextColor:(CPColor)aColor @@ -190,7 +194,7 @@ _highlightTextColor = aColor; -// [_menuItemViews makeObjectsPerformSelector:@selector(setActivateColor:) withObject:_highlightTextColor]; + [_menuItemViews makeObjectsPerformSelector:@selector(setParentMenuHighlightTextColor:) withObject:_highlightTextColor]; } - (void)setHighlightTextShadowColor:(CPColor)aColor @@ -200,7 +204,7 @@ _highlightTextShadowColor = aColor; -// [_menuItemViews makeObjectsPerformSelector:@selector(setActivateShadowColor:) withObject:_highlightTextShadowColor]; + [_menuItemViews makeObjectsPerformSelector:@selector(setParentMenuHighlightTextShadowColor:) withObject:_highlightTextShadowColor]; } - (void)setMenu:(CPMenu)aMenu diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 83a8377e0..dd5b7abaf 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -214,15 +214,6 @@ var STICKY_TIME_INTERVAL = 0.4, [self _trackAgain]; - if (_keyBuffer) - { - if (([anEvent timestamp] - _startTime) > (STICKY_TIME_INTERVAL + [activeMenu numberOfItems] / 2)) - [self selectNextItemBeginningWith:_keyBuffer inMenu:menu clearBuffer:YES]; - - if (type === CPPeriodic) - return; - } - // unhighlight when mouse is moved off the menu if (_lastGlobalLocation && CGRectContainsPoint([activeMenuContainer globalFrame], _lastGlobalLocation) && !CGRectContainsPoint([activeMenuContainer globalFrame], globalLocation)) @@ -563,6 +554,9 @@ var STICKY_TIME_INTERVAL = 0.4, } else if (!(modifierFlags & (CPCommandKeyMask | CPControlKeyMask))) { + if (([anEvent timestamp] - _startTime) > STICKY_TIME_INTERVAL) + _keyBuffer = nil; + if (!_keyBuffer) { _startTime = [anEvent timestamp]; @@ -574,12 +568,12 @@ var STICKY_TIME_INTERVAL = 0.4, else _keyBuffer += character; - [self selectNextItemBeginningWith:_keyBuffer inMenu:menu clearBuffer:NO]; - _lastGlobalLocation = Nil; + [self selectNextItemBeginningWith:_keyBuffer inMenu:menu]; + _lastGlobalLocation = nil; } } -- (void)selectNextItemBeginningWith:(CPString)characters inMenu:(CPMenu)menu clearBuffer:(BOOL)shouldClear +- (void)selectNextItemBeginningWith:(CPString)characters inMenu:(CPMenu)menu { var iter = [[menu itemArray] objectEnumerator], obj; @@ -596,13 +590,7 @@ var STICKY_TIME_INTERVAL = 0.4, } } - if (shouldClear) - { - [CPEvent stopPeriodicEvents]; - _keyBuffer = Nil; - } - else - _startTime = [CPEvent currentTimestamp]; + _startTime = [CPEvent currentTimestamp]; } - (void)scrollToBeginningOfDocument:(CPMenu)menu diff --git a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j index 06f997fb7..8d213511d 100644 --- a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j +++ b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j @@ -28,13 +28,18 @@ @implementation _CPMenuItemMenuBarView : CPView { + CPColor _highlightColor @accessors(property=highlightColor); + CPColor _textColor @accessors(property=textColor); + CPColor _textShadowColor @accessors(property=textShadowColor); + CPColor _highlightTextColor @accessors(property=highlightTextColor); + CPColor _highlightTextShadowColor @accessors(property=highlightTextShadowColor); + CPMenuItem _menuItem @accessors(property=menuItem); CPFont _font; - CPColor _textColor; - CPColor _textShadowColor; BOOL _isDirty; + BOOL _shouldHighlight; _CPImageAndTextView _imageAndTextView; } @@ -47,8 +52,6 @@ + (id)themeAttributes { return @{ - @"menu-item-selection-color": [CPNull null], - @"menu-item-text-shadow-color": [CPNull null], @"horizontal-margin": 9.0, @"submenu-indicator-margin": 3.0, @"vertical-margin": 4.0, @@ -81,12 +84,36 @@ return self; } +- (CPColor)setTextColor:(CPColor)aColor +{ + _textColor = aColor; + [self setNeedsLayout]; +} + +- (CPColor)setTextShadowColor:(CPColor)aColor +{ + _textShadowColor = aColor; + [self setNeedsLayout]; +} + +- (CPColor)setHighlightTextColor:(CPColor)aColor +{ + _highlightTextColor = aColor; + [self setNeedsLayout]; +} + +- (CPColor)setHighlightTextShadowColor:(CPColor)aColor +{ + _highlightTextShadowColor = aColor; + [self setNeedsLayout]; +} + - (CPColor)textColor { if (![_menuItem isEnabled]) return [CPColor lightGrayColor]; - return _textColor || [CPColor colorWithCalibratedRed:70.0 / 255.0 green:69.0 / 255.0 blue:69.0 / 255.0 alpha:1.0]; + return _textColor || [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-text-color" forClass:_CPMenuView]; } - (CPColor)textShadowColor @@ -94,7 +121,28 @@ if (![_menuItem isEnabled]) return [CPColor clearColor]; - return _textShadowColor || [CPColor colorWithWhite:1.0 alpha:0.8]; + return _textShadowColor || [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-text-shadow-color" forClass:_CPMenuView]; +} + +- (CPColor)highlightTextColor +{ + if (![_menuItem isEnabled]) + return [CPColor lightGrayColor]; + + return _highlightTextColor || [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-highlight-text-color" forClass:_CPMenuView]; +} + +- (CPColor)highlightTextShadowColor +{ + if (![_menuItem isEnabled]) + return [CPColor clearColor]; + + return _highlightTextShadowColor || [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-highlight-text-shadow-color" forClass:_CPMenuView]; +} + +- (CPColor)highlightColor +{ + return _highlightColor || [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-selected-color" forClass:_CPMenuView]; } - (void)update @@ -102,13 +150,11 @@ var x = [self valueForThemeAttribute:@"horizontal-margin"], height = 0.0; + [_imageAndTextView setText:[_menuItem title]]; [_imageAndTextView setFont:[_menuItem font] || [_CPMenuBarWindow font]]; [_imageAndTextView setVerticalAlignment:CPCenterVerticalTextAlignment]; - [_imageAndTextView setImage:[_menuItem image]]; - [_imageAndTextView setText:[_menuItem title]]; - [_imageAndTextView setTextColor:[self textColor]]; - [_imageAndTextView setTextShadowColor:[self textShadowColor]]; [_imageAndTextView setTextShadowOffset:CGSizeMake(0.0, 1.0)]; + [_imageAndTextView setImage:[_menuItem image]]; [_imageAndTextView sizeToFit]; var imageAndTextViewFrame = [_imageAndTextView frame]; @@ -123,6 +169,7 @@ [self setAutoresizesSubviews:NO]; [self setFrameSize:CGSizeMake(x + [self valueForThemeAttribute:@"horizontal-margin"], height)]; [self setAutoresizesSubviews:YES]; + [self setNeedsLayout]; } - (void)highlight:(BOOL)shouldHighlight @@ -131,14 +178,20 @@ if (![_menuItem isEnabled]) shouldHighlight = NO; - if (shouldHighlight) + _shouldHighlight = shouldHighlight; + [self setNeedsLayout]; +} + +- (void)layoutSubviews +{ + if (_shouldHighlight) { if (![_menuItem _isMenuBarButton]) - [self setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-selected-color" forClass:_CPMenuView]]; + [self setBackgroundColor:[self highlightColor]]; [_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]]; - [_imageAndTextView setTextColor:[CPColor whiteColor]]; - [_imageAndTextView setTextShadowColor:[self valueForThemeAttribute:@"menu-item-text-shadow-color"]]; + [_imageAndTextView setTextColor:[self highlightTextColor]]; + [_imageAndTextView setTextShadowColor:[self highlightTextShadowColor]]; } else { diff --git a/AppKit/CPMenuItem/_CPMenuItemView.j b/AppKit/CPMenuItem/_CPMenuItemView.j index a0311b333..9dc244b44 100644 --- a/AppKit/CPMenuItem/_CPMenuItemView.j +++ b/AppKit/CPMenuItem/_CPMenuItemView.j @@ -220,6 +220,36 @@ return [_menuItem isEnabled] ? (_textShadowColor ? _textShadowColor : [CPColor colorWithWhite:1.0 alpha:0.8]) : [CPColor colorWithWhite:0.8 alpha:0.8]; } +- (void)setParentMenuHighlightColor:(CPColor)aColor +{ + if ([_view respondsToSelector:@selector(setHighlightColor:)]) + [_view setHighlightColor:aColor]; +} + +- (void)setParentMenuHighlightTextColor:(CPColor)aColor +{ + if ([_view respondsToSelector:@selector(setHighlightTextColor:)]) + [_view setHighlightTextColor:aColor]; +} + +- (void)setParentMenuHighlightTextShadowColor:(CPColor)aColor +{ + if ([_view respondsToSelector:@selector(setHighlightTextShadowColor:)]) + [_view setHighlightTextShadowColor:aColor]; +} + +- (void)setParentMenuTextColor:(CPColor)aColor +{ + if ([_view respondsToSelector:@selector(setTextColor:)]) + [_view setTextColor:aColor]; +} + +- (void)setParentMenuTextShadowColor:(CPColor)aColor +{ + if ([_view respondsToSelector:@selector(setTextShadowColor:)]) + [_view setTextShadowColor:aColor]; +} + @end @implementation _CPMenuItemArrowView : CPView diff --git a/AppKit/CPPopover.j b/AppKit/CPPopover.j index 46991f0d9..cc2048d5e 100644 --- a/AppKit/CPPopover.j +++ b/AppKit/CPPopover.j @@ -63,7 +63,7 @@ var CPPopoverDelegate_popover_willShow_ = 1 << 0, @outlet CPViewController _contentViewController @accessors(property=contentViewController); @outlet id _delegate @accessors(getter=delegate); - BOOL _animates @accessors(property=animates); + BOOL _animates @accessors(getter=animates); int _appearance @accessors(property=appearance); int _behavior @accessors(getter=behavior); @@ -153,6 +153,20 @@ var CPPopoverDelegate_popover_willShow_ = 1 << 0, return [_popoverWindow isVisible]; } +/*! + Set if the popover should animate for open/close actions. + + @param shouldAnimate if YES, the popover will be animated. +*/ +- (void)setAnimates:(BOOL)shouldAnimate +{ + if (_animates == shouldAnimate) + return; + + _animates = shouldAnimate; + [_popoverWindow setAnimates:_animates]; +} + /*! Set the behavior of the CPPopover. It can be: diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index f133231a4..955bc5594 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -3623,7 +3623,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @discussion Typically identifier is associated with an external CIB and the table view will automatically instantiate the CIB with the provided owner. The owner of the CIB that may be loaded and instantiated to create a new view with the particular identifier is typically the table view’s delegate. The owner is useful in setting up outlets and target and actions from the view. - This method will typically be called by the delegate in tableView:dataViewForTableColumn:row:, but it can also be overridden to provide custom views for the identifier. This method may also return a reused view with the same identifier that was no longer available on screen. + This method will typically be called by the delegate in tableView:viewForTableColumn:row:, but it can also be overridden to provide custom views for the identifier. This method may also return a reused view with the same identifier that was no longer available on screen. */ - (id)makeViewWithIdentifier:(CPString)anIdentifier owner:(id)anOwner { diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 3adaac2b6..6acd12975 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -532,7 +532,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); /* @ignore */ - (BOOL)acceptsFirstResponder { - return [self isEditable] && [self isEnabled]; + return [self isEditable] && [self isEnabled] && [self _isWithinUsablePlatformRect]; } /* @ignore */ @@ -1585,9 +1585,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (BOOL)_isWithinUsablePlatformRect { - // Make sure the text field is visible so the browser will not scroll - // without the NSScrollView knowing about it. - [self scrollRectToVisible:[self bounds]]; + // Make sure the text field is completely within the platform window + // so the browser will not scroll it into view. var wind = [self window], frame = [self convertRectToBase:[self bounds]], diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index aefe07e67..d929cd0c7 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -31,7 +31,7 @@ @import "CPTheme.j" @class CPButtonBar - +@class CPView var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", _CPCibCustomResourceResourceNameKey = @"_CPCibCustomResourceResourceNameKey", @@ -42,6 +42,7 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", CPString _className; CPString _resourceName; CPDictionary _properties; + CPBundle _bundle; } + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize @@ -63,6 +64,7 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", _className = aClassName; _resourceName = aResourceName; _properties = properties; + _bundle = nil; } return self; @@ -77,6 +79,7 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", _className = [aCoder decodeObjectForKey:_CPCibCustomResourceClassNameKey]; _resourceName = [aCoder decodeObjectForKey:_CPCibCustomResourceResourceNameKey]; _properties = [aCoder decodeObjectForKey:_CPCibCustomResourcePropertiesKey]; + _bundle = nil; } return self; @@ -100,39 +103,72 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", else if (_resourceName == "CPRemoveTemplate") return [[CPTheme defaultTheme] valueForAttributeWithName:@"button-image-minus" forClass:[CPButtonBar class]]; - return [self imageFromBundle:[aCoder bundle]]; + return [self imageFromCoder:aCoder]; } return self; } -- (CPImage)imageFromBundle:(CPBundle)aBundle -{ - if (!aBundle) - { - var bundleClass = _properties.valueForKey(@"bundleClass"); - - if (bundleClass) - { - bundleClass = CPClassFromString(bundleClass); - - if (bundleClass) - aBundle = [CPBundle bundleForClass:bundleClass]; - } - else - aBundle = [CPBundle mainBundle]; - } - - return [[CPImage alloc] initWithContentsOfFile:[aBundle pathForResource:_resourceName] size:_properties.valueForKey(@"size")]; -} - @end @implementation _CPCibCustomResource (CPImage) +- (CPBundle)imageBundleWithCoder:(CPCoder)aCoder +{ + if (_bundle) + return _bundle; + + var bundleIdentifier = [_properties valueForKey:@"bundleIdentifier"]; + + if (bundleIdentifier) + _bundle = [CPBundle bundleWithIdentifier:bundleIdentifier]; + else + { + var bundleClass = [_properties valueForKey:@"bundleClass"]; + + if (bundleClass) + { + bundleClass = CPClassFromString(bundleClass); + + if (bundleClass) + _bundle = [CPBundle bundleForClass:bundleClass]; + } + } + + if (!_bundle) + { + var framework = [_properties valueForKey:@"framework"]; + + if (framework) + { + // Get AppKit and hope the framework is in the same directory + var appKit = [CPBundle bundleForClass:[CPView class]], + url = [[appKit bundleURL] URLByDeletingLastPathComponent]; + + url = [CPURL URLWithString:framework relativeToURL:url]; + _bundle = [CPBundle bundleWithURL:url]; + } + } + + if (!_bundle) + { + if (aCoder) + _bundle = [aCoder bundle]; + else + _bundle = [CPBundle mainBundle]; + } + + return _bundle; +} + +- (CPImage)imageFromCoder:(CPCoder)aCoder +{ + return [[CPImage alloc] initWithContentsOfFile:[[self imageBundleWithCoder:aCoder] pathForResource:_resourceName] size:[_properties valueForKey:@"size"]]; +} + - (CPString)filename { - return [[CPBundle mainBundle] pathForResource:_resourceName]; + return [[self imageBundleWithCoder:nil] pathForResource:_resourceName]; } - (CGSize)size @@ -162,7 +198,7 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", - (CPString)description { - var image = [self imageFromBundle:nil]; + var image = [self imageFromCoder:nil]; return [image description]; } diff --git a/AppKit/CoreAnimation/CALayer.j b/AppKit/CoreAnimation/CALayer.j index 188334a42..066ff8437 100644 --- a/AppKit/CoreAnimation/CALayer.j +++ b/AppKit/CoreAnimation/CALayer.j @@ -157,6 +157,7 @@ var CALayerRegisteredRunLoopUpdates = nil; _sublayers = []; +#if PLATFORM(DOM) _DOMElement = document.createElement("div"); _DOMElement.style.overflow = "visible"; @@ -167,6 +168,7 @@ var CALayerRegisteredRunLoopUpdates = nil; _DOMElement.style.zIndex = 0; _DOMElement.style.width = "0px"; _DOMElement.style.height = "0px"; +#endif } return self; @@ -711,10 +713,12 @@ if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex) [_sublayers insertObject:aLayer atIndex:anIndex]; +#if PLATFORM(DOM) if (anIndex >= _sublayers.length - 1) _DOMElement.appendChild(DOM(aLayer)); else _DOMElement.insertBefore(DOM(aLayer), _sublayers[anIndex + 1]._DOMElement); +#endif aLayer._superlayer = self; diff --git a/AppKit/Resources/AboutPanel.cib b/AppKit/Resources/AboutPanel.cib deleted file mode 100644 index 0f3bfd601..000000000 --- a/AppKit/Resources/AboutPanel.cib +++ /dev/null @@ -1 +0,0 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;K;21;CPCibObjectRecordsKeyD;K;6;CP$UIDd;1;4E;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;5E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;6E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;7E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;8E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;2;10E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;11E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;12E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;13E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;15E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;17E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;19E;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;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;28E;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;21E;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;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;54E;D;K;6;CP$UIDd;2;54E;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;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;E;E;S;16;IBCocoaFrameworkd;3;461D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;42E;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;16E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;57E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;15;CibObjectRecordK;8;$classesA;S;15;CibObjectRecordS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;59E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;60E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;62E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;63E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;42E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;64E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;48E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;65E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;66E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;67E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;68E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;42E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;69E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;47E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;70E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;71E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;72E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;73E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;42E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;74E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;46E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;75E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;76E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;77E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;78E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;1;0E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;79E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;80E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;42E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;81E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;44E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;60E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;82E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;17E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;39E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;83E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;42E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;60E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;84E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;39E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;CibObjectRecordParentKeyD;K;6;CP$UIDd;2;60E;K;26;CibObjectRecordChildrenKeyD;K;6;CP$UIDd;2;85E;K;24;CibObjectRecordObjectKeyD;K;6;CP$UIDd;2;40E;K;23;CibObjectRecordLabelKeyD;K;6;CP$UIDd;2;51E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;86E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;87E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;88E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;89E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;90E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;91E;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;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;92E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;93E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;94E;K;15;CPViewWindowKeyD;K;6;CP$UIDd;2;95E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;96E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;92E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;97E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;98E;E;D;K;10;$classnameS;11;CPImageViewK;8;$classesA;S;11;CPImageViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;15;CPViewWindowKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;102E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;98E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;103E;K;11;$aalignmentD;K;6;CP$UIDd;3;103E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;106E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;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;2;45E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;107E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;108E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;109E;K;15;CPViewWindowKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;98E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;12;$atext-colorD;K;6;CP$UIDd;3;114E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;117E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;117E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;118E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewWindowKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;98E;K;6;$afontD;K;6;CP$UIDd;3;121E;K;12;$atext-colorD;K;6;CP$UIDd;3;122E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;117E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;117E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;124E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewWindowKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;98E;K;6;$afontD;K;6;CP$UIDd;3;127E;K;12;$atext-colorD;K;6;CP$UIDd;3;128E;K;11;$aalignmentD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;129E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;117E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;117E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;12;File's OwnerS;6;WindowS;11;ApplicationS;4;ViewS;10;Image viewS;10;Text fieldD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;17E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;S;18;CPWindowControllerD;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;17E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;ArrayD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;48E;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;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;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;47E;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;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;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;46E;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;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;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;44E;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;44E;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;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;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;42E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;26;{3.40282e+38, 3.40282e+38}S;8;CPWindowS;22;{{72, 57}, {219, 263}}d;1;7S;0;S;13;CPApplicationS;5;$nullS;21;{{0, 26}, {219, 263}}S;20;{{0, 0}, {219, 263}}S;5;$nullD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;E;E;d;2;18S;6;normalS;1;1S;24;{{45.5, 16}, {128, 128}}S;20;{{0, 0}, {128, 128}}d;2;37d;1;0D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;104E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;131E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;132E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;134E;E;d;1;4S;1;2S;22;{{16, 165}, {187, 25}}S;19;{{0, 0}, {187, 25}}d;2;36D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;135E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;136E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;117E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;137E;E;S;7;AppNamed;4;3072F;S;1;3S;22;{{16, 194}, {187, 20}}S;19;{{0, 0}, {187, 20}}D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;135E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;136E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;117E;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;138E;E;S;19;Version XXX (build)S;1;4S;22;{{16, 222}, {187, 22}}S;19;{{0, 0}, {187, 22}}D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;135E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;136E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;117E;E;D;K;6;$classD;K;6;CP$UIDd;3;113E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;139E;E;S;9;CopyrightS;6;windowS;7;CPImageS;8;Icon.pngD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;141E;E;E;S;5;Ariald;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;142E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;142E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;142E;E;E;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;140E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;143E;E;d;1;1S;24;{"width":-1,"height":-1}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ 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..ed9f0cc15 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)], @@ -2585,8 +2808,6 @@ var themedButtonValues = nil, themeValues = [ - [@"menu-item-selection-color", [CPColor colorWithHexString:@"5C85D8"]], - [@"menu-item-text-shadow-color", [CPColor colorWithCalibratedRed:26.0 / 255.0 green: 73.0 / 255.0 blue:109.0 / 255.0 alpha:1.0]], [@"horizontal-margin", 12.0], [@"submenu-indicator-margin", 3.0], [@"vertical-margin", 4.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..37a9bfae4 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)], @@ -2021,8 +2226,6 @@ var themedButtonValues = nil, themeValues = [ - [@"menu-item-selection-color", [CPColor colorWithHexString:@"5C85D8"]], - [@"menu-item-text-shadow-color", [CPColor colorWithCalibratedRed:26.0 / 255.0 green: 73.0 / 255.0 blue:109.0 / 255.0 alpha:1.0]], [@"horizontal-margin", 9.0], [@"submenu-indicator-margin", 3.0], [@"vertical-margin", 4.0] diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index 0bca4ca41..f42dfadca 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -319,9 +319,6 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, if (_image == anImage) return; - if ([_image delegate] === self) - [[CPNotificationCenter defaultCenter] removeObserver:self name:CPImageDidLoadNotification object:_image]; - _image = anImage; _flags |= _CPImageAndTextViewImageChangedFlag; @@ -347,6 +344,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, - (void)imageDidLoad:(CPNotification)aNotification { + [[CPNotificationCenter defaultCenter] removeObserver:self name:CPImageDidLoadNotification object:_image]; _flags |= _CPImageAndTextViewImageChangedFlag; [self setNeedsLayout]; } diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index 7c4fedf4a..817ba6717 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -51,6 +51,24 @@ var CPBundlesForURLStrings = { }; return [self bundleWithURL:aPath]; } ++ (CPBundle)bundleWithIdentifier:(CPString)anIdentifier +{ + var bundle = CFBundle.bundleWithIdentifier(anIdentifier); + + if (bundle) + { + var url = bundle.bundleURL(), + cpBundle = CPBundlesForURLStrings[url.absoluteString()]; + + if (!cpBundle) + cpBundle = [self bundleWithURL:url]; + + return cpBundle; + } + + return nil; +} + + (CPBundle)bundleForClass:(Class)aClass { return [self bundleWithURL:CFBundle.bundleForClass(aClass).bundleURL()]; @@ -118,12 +136,12 @@ var CPBundlesForURLStrings = { }; //[self load]; - return className ? CPClassFromString(className) : Nil; + return className ? CPClassFromString(className) : nil; } - (CPString)bundleIdentifier { - return [self objectForInfoDictionaryKey:@"CPBundleIdentifier"]; + return _bundle.identifier(); } - (BOOL)isLoaded 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..01945215c --- /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 (typeof navigator != "undefined") + { + 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 diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index bdb11df0b..71b1bd6b5 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -565,11 +565,11 @@ function CPDescriptionOfObject(anObject) properties.sort(); if (properties.length === 2 && anObject.hasOwnProperty("width") && anObject.hasOwnProperty("height")) - desc = [CPString stringWithFormat:@"CGSize: { width:%f, height:%f }", anObject.width, anObject.height]; + desc = [CPString stringWithFormat:@"CGSize: (%f, %f)", anObject.width, anObject.height]; else if (properties.length === 2 && anObject.hasOwnProperty("x") && anObject.hasOwnProperty("y")) - desc = [CPString stringWithFormat:@"CGPoint: { x:%f, y:%f }", anObject.x, anObject.y]; + desc = [CPString stringWithFormat:@"CGPoint: (%f, %f)", anObject.x, anObject.y]; else if (properties.length === 2 && anObject.hasOwnProperty("origin") && anObject.hasOwnProperty("size")) - desc = [CPString stringWithFormat:@"CGRect: { x:%f, y:%f }, { width:%f, height:%f }", anObject.origin.x, anObject.origin.y, anObject.size.width, anObject.size.height]; + desc = [CPString stringWithFormat:@"CGRect: (%f, %f), (%f, %f)", anObject.origin.x, anObject.origin.y, anObject.size.width, anObject.size.height]; else if (properties.length === 4 && anObject.hasOwnProperty("top") && anObject.hasOwnProperty("right") && anObject.hasOwnProperty("bottom") && anObject.hasOwnProperty("left")) desc = [CPString stringWithFormat:@"CGInset: { top:%f, right:%f, bottom:%f, left:%f }", anObject.top, anObject.right, anObject.bottom, anObject.left]; else 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/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index 0faec4273..54fd3b99c 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -27,8 +27,9 @@ var CFBundleUnloaded = 0, CFBundleLoadingSpritedImages = 1 << 3, CFBundleLoaded = 1 << 4; -var CFBundlesForURLStrings = { }, - CFBundlesForClasses = { }, +var CFBundlesForURLStrings = { }, + CFBundlesForClasses = { }, + CFBundlesWithIdentifiers = { }, CFCacheBuster = new Date().getTime(), CFTotalBytesLoaded = 0, CPApplicationSizeInBytes = 0; @@ -108,8 +109,9 @@ function addClassToBundle(aClass, aBundle) function resetBundle() { - CFBundlesForURLStrings = { }; - CFBundlesForClasses = { }; + CFBundlesForURLStrings = { }; + CFBundlesForClasses = { }; + CFBundlesWithIdentifiers = { }; //CFCacheBuster = new Date().getTime(), CFTotalBytesLoaded = 0; CPApplicationSizeInBytes = 0; @@ -122,9 +124,16 @@ CFBundle.bundleForClass = function(/*Class*/ aClass) DISPLAY_NAME(CFBundle.bundleForClass); +CFBundle.bundleWithIdentifier = function(/*String*/ bundleID) +{ + return CFBundlesWithIdentifiers[bundleID] || NULL; +}; + +DISPLAY_NAME(CFBundle.bundleWithIdentifier); + CFBundle.prototype.bundleURL = function() { - return this._bundleURL; + return this._bundleURL.absoluteURL(); }; DISPLAY_NAME(CFBundle.prototype.bundleURL); @@ -192,6 +201,13 @@ CFBundle.prototype.valueForInfoDictionaryKey = function(/*String*/ aKey) DISPLAY_NAME(CFBundle.prototype.valueForInfoDictionaryKey); +CFBundle.prototype.identifier = function() +{ + return this._infoDictionary.valueForKey("CPBundleIdentifier"); +}; + +DISPLAY_NAME(CFBundle.prototype.identifier); + CFBundle.prototype.hasSpritedImages = function() { var environments = this._infoDictionary.valueForKey("CPBundleEnvironmentsWithImageSprites") || [], @@ -269,7 +285,7 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute) StaticResource.resolveResourceAtURL(parentURL, YES, function(aStaticResource) { - var resourceName = bundleURL.absoluteURL().lastPathComponent(); + var resourceName = bundleURL.lastPathComponent(); self._staticResource = aStaticResource._children[resourceName] || new StaticResource(bundleURL, aStaticResource, YES, NO); @@ -283,8 +299,15 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute) self._isValid = !!infoDictionary || CFBundle.mainBundle() === self; if (infoDictionary) + { self._infoDictionary = infoDictionary; + var identifier = self._infoDictionary.valueForKey("CPBundleIdentifier"); + + if (identifier) + CFBundlesWithIdentifiers[identifier] = self; + } + if (!self._infoDictionary) { finishBundleLoadingWithError(self, new Error("Could not load bundle at \"" + path + "\"")); @@ -698,7 +721,7 @@ DISPLAY_NAME(CFBundle.prototype.onerror); CFBundle.prototype.bundlePath = function() { - return this._bundleURL.absoluteURL().path(); + return this.bundleURL().path(); }; CFBundle.prototype.path = function() diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index 2bdfe3129..d15aa52cb 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -636,12 +636,9 @@ var array = [CGRectMake(1, 2, 3, 4), CGPointMake(5, 6)], d = [array description]; - [self assertTrue:d.indexOf("x:1") !== -1 message:"Can't find 'x:1' in description of array " + d]; - [self assertTrue:d.indexOf("y:2") !== -1 message:"Can't find 'y:2' in description of array " + d]; - [self assertTrue:d.indexOf("width:3") !== -1 message:"Can't find 'width:3' in description of array " + d]; - [self assertTrue:d.indexOf("height:4") !== -1 message:"Can't find 'height:4' in description of array " + d]; - [self assertTrue:d.indexOf("x:5") !== -1 message:"Can't find 'x:5' in description of array " + d]; - [self assertTrue:d.indexOf("y:6") !== -1 message:"Can't find 'y:6' in description of array " + d]; + [self assertTrue:d.indexOf("(1, 2)") !== -1 message:"Can't find '(1, 2)' in description of array " + d]; + [self assertTrue:d.indexOf("(3, 4)") !== -1 message:"Can't find '(3, 4)' in description of array " + d]; + [self assertTrue:d.indexOf("(5, 6)") !== -1 message:"Can't find '(5, 6)' in description of array " + d]; } - (void)testSortUsingDescriptorsWithDifferentSelectors diff --git a/Tests/Foundation/CPDictionaryTest.j b/Tests/Foundation/CPDictionaryTest.j index 7795a7414..78352a65a 100644 --- a/Tests/Foundation/CPDictionaryTest.j +++ b/Tests/Foundation/CPDictionaryTest.j @@ -392,12 +392,9 @@ var dict = [[CPDictionary alloc] initWithObjects:[CGRectMake(1, 2, 3, 4), CGPointMake(5, 6)] forKeys:[@"key1", @"key2"]], d = [dict description]; - [self assertTrue:d.indexOf("x:1") !== -1 message:"Can't find 'x: 1' in description of dictionary " + d]; - [self assertTrue:d.indexOf("y:2") !== -1 message:"Can't find 'y: 2' in description of dictionary " + d]; - [self assertTrue:d.indexOf("width:3") !== -1 message:"Can't find 'width: 3' in description of dictionary " + d]; - [self assertTrue:d.indexOf("height:4") !== -1 message:"Can't find 'height: 4' in description of dictionary " + d]; - [self assertTrue:d.indexOf("x:5") !== -1 message:"Can't find 'x: 5' in description of dictionary " + d]; - [self assertTrue:d.indexOf("y:6") !== -1 message:"Can't find 'y: 6' in description of dictionary " + d]; + [self assertTrue:d.indexOf("(1, 2)") !== -1 message:"Can't find '(1, 2)' in description of dictionary " + d]; + [self assertTrue:d.indexOf("(3, 4)") !== -1 message:"Can't find '(3, 4)' in description of dictionary " + d]; + [self assertTrue:d.indexOf("(5, 6)") !== -1 message:"Can't find '(5, 6)' in description of dictionary " + d]; [self assert:'@{\n @"key1": @[\n @"1",\n @"2",\n @"3"\n ],\n @"key2": @"This is a string",\n @"key3": @{\n @"another": @"object"\n }\n}' equals:[json_dict description]]; } 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/XcodeCapp/pbxprojModifier.py b/Tools/XcodeCapp/pbxprojModifier.py index 434210bbd..8904d2367 100755 --- a/Tools/XcodeCapp/pbxprojModifier.py +++ b/Tools/XcodeCapp/pbxprojModifier.py @@ -22,6 +22,9 @@ def update_general_include(project, projectBaseURL): def add_file(project, shadowGroup, sourceGroup, shadowHeaderPath, shadowImplementationFilePath, sourcePath, projectBaseURL): project.add_file(shadowHeaderPath, parent=shadowGroup) project.add_file(shadowImplementationFilePath, parent=shadowGroup) + + if sourcePath in project.get_files_by_os_path(os.path.relpath(sourcePath, projectBaseURL)): + return project.add_file(sourcePath, parent=sourceGroup) def remove_file(project, shadowGroup, sourceGroup, shadowHeaderPath, shadowImplementationFilePath, sourcePath, projectBaseURL): diff --git a/Tools/capp/Resources/Templates/Framework/Info.plist b/Tools/capp/Resources/Templates/Framework/Info.plist index 1bf5c227d..1b367a936 100644 --- a/Tools/capp/Resources/Templates/Framework/Info.plist +++ b/Tools/capp/Resources/Templates/Framework/Info.plist @@ -6,5 +6,7 @@ 6.0 CPBundlePackageType FMWK + CPPrincipalClass + __project.nameasidentifier__ diff --git a/Tools/capp/Resources/Templates/NibApplication/Info.plist b/Tools/capp/Resources/Templates/NibApplication/Info.plist index 35b6b0d88..bf0676ce1 100644 --- a/Tools/capp/Resources/Templates/NibApplication/Info.plist +++ b/Tools/capp/Resources/Templates/NibApplication/Info.plist @@ -6,5 +6,9 @@ MainMenu.cib CPBundleName __project.name__ + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © __project.year__, __organization.name__ All rights reserved. diff --git a/Tools/capp/Resources/Templates/NibApplication/Jakefile b/Tools/capp/Resources/Templates/NibApplication/Jakefile index 9e688f19f..81068711d 100644 --- a/Tools/capp/Resources/Templates/NibApplication/Jakefile +++ b/Tools/capp/Resources/Templates/NibApplication/Jakefile @@ -30,7 +30,6 @@ app ("__project.nameasidentifier__", function(task) task.setResources(new FileList("Resources/**")); task.setIndexFilePath("index.html"); task.setInfoPlistPath("Info.plist"); - task.setNib2CibFlags("-R Resources/"); if (configuration === "Debug") task.setCompilerFlags("-DDEBUG -g"); diff --git a/Tools/fontinfo/Jakefile b/Tools/fontinfo/Jakefile index 54dc028de..514ce5220 100644 --- a/Tools/fontinfo/Jakefile +++ b/Tools/fontinfo/Jakefile @@ -2,7 +2,8 @@ require ("../../common.jake"); var OS = require("os"), - task = require("jake").task; + task = require("jake").task, + SYSTEM = require("system"); task ("build", function() { @@ -16,7 +17,7 @@ task ("build", function() else args = "-sdk macosx " + args; - var xcodebuild = env.CAPP_BUILD ? "xcodebuild " : "CAPP_BUILD=../../Build xcodebuild "; + var xcodebuild = SYSTEM.env.CAPP_BUILD ? "xcodebuild " : "CAPP_BUILD=../../Build xcodebuild "; if (OS.system(xcodebuild + args)) OS.exit(1); diff --git a/Tools/nib2cib/Converter+Mac.j b/Tools/nib2cib/Converter+Mac.j index 63ba94421..e6145cfdf 100644 --- a/Tools/nib2cib/Converter+Mac.j +++ b/Tools/nib2cib/Converter+Mac.j @@ -20,17 +20,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - @import "Converter.j" @import "Nib2CibKeyedUnarchiver.j" @import "NSFont.j" +@class Nib2Cib + @implementation Converter (Mac) -- (void)convertedDataFromMacData:(CPData)data resourcesPath:(CPString)aResourcesPath +- (void)convertedDataFromMacData:(CPData)data { // Unarchive the NS data - var unarchiver = [[Nib2CibKeyedUnarchiver alloc] initForReadingWithData:data resourcesPath:aResourcesPath], + var unarchiver = [[Nib2CibKeyedUnarchiver alloc] initForReadingWithData:data], objectData = [unarchiver decodeObjectForKey:@"IB.objectdata"], objects = [unarchiver allObjects], count = [objects count]; @@ -107,7 +108,8 @@ // nil cibFont means try to use theme font if (!cibFont) { - var bold = [nibFont isBold]; + var bold = [nibFont isBold], + themes = [[Nib2Cib sharedNib2Cib] themes]; for (var i = 0; i < themes.length; ++i) { diff --git a/Tools/nib2cib/Converter.j b/Tools/nib2cib/Converter.j index ca3fe7f7c..ed9857fa1 100644 --- a/Tools/nib2cib/Converter.j +++ b/Tools/nib2cib/Converter.j @@ -30,6 +30,8 @@ @import "NSFoundation.j" @import "NSAppKit.j" +@class Nib2Cib + @global java var FILE = require("file"), @@ -48,13 +50,8 @@ ConverterConversionException = @"ConverterConversionException"; @implementation Converter : CPObject { - CPString inputPath @accessors(readonly); - CPString outputPath @accessors; - CPString resourcesPath @accessors; - NibFormat format @accessors(readonly); - CPArray themes @accessors(readonly); - CPArray userNSClasses @accessors; - BOOL compileNib @accessors; + CPString inputPath @accessors(readonly); + CPString outputPath @accessors; } + (Converter)sharedConverter @@ -62,59 +59,52 @@ ConverterConversionException = @"ConverterConversionException"; return SharedConverter; } -- (id)initWithInputPath:(CPString)aPath format:(NibFormat)nibFormat themes:(CPArray)themeList +- (id)initWithInputPath:(CPString)anInputPath outputPath:(CPString)anOutputPath { self = [super init]; if (self) { - SharedConverter = self; - inputPath = aPath; - format = nibFormat; - themes = themeList; - compileNib = YES; + if (!SharedConverter) + SharedConverter = self; + + inputPath = anInputPath; + outputPath = anOutputPath; } return self; } -- (void)convert +- (CPData)convert { - if ([resourcesPath length] && !FILE.isReadable(resourcesPath)) - [CPException raise:ConverterConversionException reason:@"Could not read Resources at path \"" + resourcesPath + "\""]; + // Assume its a Mac file. + var inferredFormat = NibFormatMac; - var inferredFormat = format; + // Some .xibs are iPhone nibs, check the actual contents in this case. + if (FILE.extension(inputPath) !== ".nib" && FILE.isFile(inputPath) && + FILE.read(inputPath, { charset:"UTF-8" }).indexOf(" @import -@class Converter +@class Nib2Cib @global CP_NSMapClassName @@ -48,7 +48,7 @@ var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey", // If this is a userland NS class, call its KVC methods directly var nsClass = nil; - if ([[[Converter sharedConverter] userNSClasses] containsObject:aClassName]) + if ([[[Nib2Cib sharedNib2Cib] userNSClasses] containsObject:aClassName]) nsClass = objj_lookUpClass("NS_" + aClassName); var originalClass = nsClass || objj_lookUpClass(anOriginalClassName); diff --git a/Tools/nib2cib/NSComboBox.j b/Tools/nib2cib/NSComboBox.j index 27b9d0715..f2c227adf 100644 --- a/Tools/nib2cib/NSComboBox.j +++ b/Tools/nib2cib/NSComboBox.j @@ -25,7 +25,7 @@ @import "NSTextField.j" -@class Converter +@class Nib2Cib @implementation CPComboBox (NSCoding) @@ -48,12 +48,13 @@ [self setEnabled:[cell isEnabled]]; // Make sure the height is clipped to the max given by the theme - var maxSize = [[[Converter sharedConverter] themes][0] valueForAttributeWithName:@"max-size" forClass:[CPComboBox class]], + var theme = [Nib2Cib defaultTheme], + maxSize = [theme valueForAttributeWithName:@"max-size" forClass:[CPComboBox class]], size = [self frameSize], widthOffset = -3; // Adjust for differences between Cocoa and Cappuccino widget framing. - if ([[[Converter sharedConverter] themes][0] name] == @"Aristo") + if ([theme name] == @"Aristo") { _frame.origin.x += 1; widthOffset = -5; diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 9ffff46f6..ad0886c38 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -41,7 +41,8 @@ var FILE = require("file"), _className = CP_NSMapClassName([aCoder decodeObjectForKey:@"NSClassName"]); _resourceName = [aCoder decodeObjectForKey:@"NSResourceName"]; - var size = CGSizeMakeZero(); + var size = CGSizeMakeZero(), + framework = @""; if (_resourceName == "NSSwitch") return nil; @@ -50,27 +51,49 @@ var FILE = require("file"), // Defer resolving this path until runtime. _resourceName = _resourceName.replace("NS", "CP"); } - else if (![[aCoder resourcesPath] length]) - { - CPLog.warn("Resources found in nib, but no resources path specified with -R option."); - } else { - var resourcePath = [aCoder resourcePathForName:_resourceName]; + var match = /^(.+)@(.+)$/.exec(_resourceName), + framework = @"", + bundleIdentifier = @""; - if (!resourcePath) - CPLog.warn("Resource \"" + _resourceName + "\" not found in the resources path: " + [aCoder resourcesPath]); + if (match) + { + framework = match[1]; + _resourceName = match[2]; + } + + var resourceInfo = [aCoder resourceInfoForName:_resourceName inFramework:framework]; + + if (!resourceInfo) + CPLog.warn("Resource \"" + _resourceName + "\" not found in the Resources directories"); else - size = imageSize(FILE.canonical(resourcePath)) || CGSizeMakeZero(); + { + size = imageSize(FILE.canonical(resourceInfo.path)) || CGSizeMakeZero(); + framework = resourceInfo.framework; + } // Account for the fact that an extension may have been inferred. - if (resourcePath && FILE.extension(resourcePath) !== FILE.extension(_resourceName)) - _resourceName += FILE.extension(resourcePath); + if (resourceInfo && + resourceInfo.path && + FILE.extension(resourceInfo.path) !== FILE.extension(_resourceName)) + { + _resourceName += FILE.extension(resourceInfo.path); + } - CPLog.debug(" Path: %s\n Size: %d x %d", FILE.canonical(resourcePath), size.width, size.height); + CPLog.debug(" Resource: %s\n Framework: %s\n Path: %s\n Size: %d x %d", _resourceName, framework, resourceInfo ? FILE.canonical(resourceInfo.path) : "", size.width, size.height); } - _properties = [CPDictionary dictionaryWithObject:size forKey:@"size"]; + if (resourceInfo && resourceInfo.path && resourceInfo.framework) + { + var frameworkPath = FILE.dirname(FILE.dirname(resourceInfo.path)), + bundle = [CPBundle bundleWithPath:frameworkPath]; + + [bundle loadWithDelegate:nil]; + bundleIdentifier = [bundle bundleIdentifier] || @""; + } + + _properties = @{ @"size":size, @"bundleIdentifier":bundleIdentifier, @"framework":framework }; } return self; 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..f0ebb2579 --- /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 Nib2Cib + +@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 = [Nib2Cib defaultTheme]; + + 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 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" diff --git a/Tools/nib2cib/NSNib.j b/Tools/nib2cib/NSNib.j index b54a4ecc9..f25f49e63 100644 --- a/Tools/nib2cib/NSNib.j +++ b/Tools/nib2cib/NSNib.j @@ -1,5 +1,27 @@ +/* + * NSNib.j + * nib2cib + * + * Created by cacaodev. + * Copyright 2013, Cappuccino Foundation. + * + * 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 + @class Converter var FILE = require("file"), @@ -12,21 +34,15 @@ var FILE = require("file"), { self = [super init]; + // FIXME: change /tmp/ to os.tmpDir() in Node var nibPath = @"/tmp/" + UUID.uuid() + ".nib", - data = [aCoder decodeObjectForKey:@"NSNibFileData"], - sharedConverter = [Converter sharedConverter]; + data = [aCoder decodeObjectForKey:@"NSNibFileData"]; - FILE.write(nibPath, data.bytes(), {charset:"UTF-16" }); + FILE.write(nibPath, data.bytes(), { charset:"UTF-16" }); - var converter = [[Converter alloc] initWithInputPath:"" - format:[sharedConverter format] - themes:[sharedConverter themes]]; - [converter setCompileNib:NO]; + var converter = [[Converter alloc] initWithInputPath:nibPath outputPath:nil]; - CPLog.info("Converting sub nib to plist..."); - - var nibData = [converter CPCompliantNibDataAtFilePath:nibPath]; - _data = [converter convertedDataFromMacData:nibData resourcesPath:[sharedConverter resourcesPath]]; + _data = [converter convert]; return self; } diff --git a/Tools/nib2cib/NSProgressIndicator.j b/Tools/nib2cib/NSProgressIndicator.j index 94795d77f..fa4ceff82 100644 --- a/Tools/nib2cib/NSProgressIndicator.j +++ b/Tools/nib2cib/NSProgressIndicator.j @@ -22,7 +22,7 @@ @import -@class Converter +@class Nib2Cib var NSProgressIndicatorSpinningFlag = 1 << 12; @@ -59,7 +59,7 @@ var NSProgressIndicatorSpinningFlag = 1 << 12; if (_style !== CPProgressIndicatorSpinningStyle) { - var theme = [[Converter sharedConverter] themes][0], + var theme = [Nib2Cib defaultTheme], height = [theme valueForAttributeWithName:@"default-height" forClass:CPProgressIndicator]; currentFrameSize.height = height; diff --git a/Tools/nib2cib/NSSearchField.j b/Tools/nib2cib/NSSearchField.j index 30bf0d384..367b5a7ed 100644 --- a/Tools/nib2cib/NSSearchField.j +++ b/Tools/nib2cib/NSSearchField.j @@ -24,7 +24,7 @@ @import "NSTextField.j" -@class Converter +@class Nib2Cib @implementation CPSearchField (NSCoding) @@ -43,7 +43,7 @@ [self setSendsWholeSearchString:[cell sendsWholeSearchString]]; [self setSendsSearchStringImmediately:[cell sendsSearchStringImmediately]]; - if ([[[Converter sharedConverter] themes][0] name] == @"Aristo" && [self isBezeled]) + if ([[Nib2Cib defaultTheme] name] === @"Aristo" && [self isBezeled]) { // NSTextField.j makes the field +7.0 pixels tall. We want +8.0 to go to 30. var frame = [self frame]; diff --git a/Tools/nib2cib/NSSegmentedControl.j b/Tools/nib2cib/NSSegmentedControl.j index 8525a2611..27abc164b 100644 --- a/Tools/nib2cib/NSSegmentedControl.j +++ b/Tools/nib2cib/NSSegmentedControl.j @@ -24,7 +24,7 @@ @import "NSCell.j" -@class Converter +@class Nib2Cib @implementation CPSegmentedControl (CPCoding) @@ -68,7 +68,7 @@ // Adjust for differences between Cocoa and Cappuccino widget framing. frame.origin.x += 6; - if ([[[Converter sharedConverter] themes][0] name] == @"Aristo2") + if ([[Nib2Cib defaultTheme] name] == @"Aristo2") frame.size.height += 1; frame.size.width = originalWidth; diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index 8a16d7a4d..cd53c1827 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -31,6 +31,7 @@ @import "NSTextField.j" @class Converter +@class Nib2Cib var IBDefaultFontSizeTableHeader = 11.0; @@ -63,7 +64,7 @@ var IBDefaultFontSizeTableHeader = 11.0; var headerCell = [aCoder decodeObjectForKey:@"NSHeaderCell"], headerView = [[_CPTableColumnHeaderView alloc] initWithFrame:CGRectMakeZero()], - theme = [[Converter sharedConverter] themes][0]; + theme = [Nib2Cib defaultTheme]; [headerView setStringValue:[headerCell objectValue]]; [headerView setFont:[headerCell font]]; @@ -124,7 +125,7 @@ var IBDefaultFontSizeTableHeader = 11.0; - (id)valueForDataViewThemeAttribute:(CPString)attribute inState:(int)state { - var themes = [[Converter sharedConverter] themes]; + var themes = [[Nib2Cib sharedNib2Cib] themes]; for (var i = 0; i < themes.length; ++i) { diff --git a/Tools/nib2cib/NSTableHeaderView.j b/Tools/nib2cib/NSTableHeaderView.j index 2ed89607a..48b0eab71 100644 --- a/Tools/nib2cib/NSTableHeaderView.j +++ b/Tools/nib2cib/NSTableHeaderView.j @@ -22,8 +22,8 @@ @import -@class Converter @class CPTableView +@class Nib2Cib @implementation CPTableHeaderView (NSCoding) @@ -37,7 +37,7 @@ // change the default height if (_bounds.size.height === 17) { - var theme = [[Converter sharedConverter] themes][0], + var theme = [Nib2Cib defaultTheme], height = [theme valueForAttributeWithName:@"default-row-height" forClass:CPTableView]; _bounds.size.height = height; diff --git a/Tools/nib2cib/NSTableView.j b/Tools/nib2cib/NSTableView.j index 46eefdd7c..3b4da3f54 100644 --- a/Tools/nib2cib/NSTableView.j +++ b/Tools/nib2cib/NSTableView.j @@ -22,7 +22,7 @@ @import -@class Converter +@class Nib2Cib @implementation CPTableView (NSCoding) @@ -43,7 +43,7 @@ // Convert xib default to cib default if (_rowHeight == 17) { - var theme = [[Converter sharedConverter] themes][0], + var theme = [Nib2Cib defaultTheme], height = [theme valueForAttributeWithName:@"default-row-height" forClass:CPTableView]; _rowHeight = height; diff --git a/Tools/nib2cib/NSTextField.j b/Tools/nib2cib/NSTextField.j index 9aa9f5bfb..e9dbb6330 100644 --- a/Tools/nib2cib/NSTextField.j +++ b/Tools/nib2cib/NSTextField.j @@ -38,6 +38,7 @@ [super NS_initWithCell:cell]; [self setEditable:[cell isEditable]]; + [self setEnabled:[cell isEnabled]]; [self setSelectable:[cell isSelectable]]; [self setSendsActionOnEndEditing:[cell sendsActionOnEndEditing]]; diff --git a/Tools/nib2cib/Nib2Cib.j b/Tools/nib2cib/Nib2Cib.j index fa0887f01..e3080b9f1 100644 --- a/Tools/nib2cib/Nib2Cib.j +++ b/Tools/nib2cib/Nib2Cib.j @@ -42,7 +42,9 @@ var FILE = require("file"), BuildTypes = ["Debug", "Release"], DefaultFile = "MainMenu", AllowedStoredOptionsRe = new RegExp("^(defaultTheme|auxThemes|verbosity|quiet|frameworks|format)$"), - ArgsRe = /"[^\"]+"|'[^\']+'|\S+/g; + ArgsRe = /"[^\"]+"|'[^\']+'|\S+/g, + + SharedNib2Cib = nil; @implementation Nib2Cib : CPObject @@ -50,10 +52,22 @@ var FILE = require("file"), CPArray commandLineArgs; JSObject parser; JSObject nibInfo; - CPString appDirectory; - CPString resourcesDirectory; - CPDictionary infoPlist; - CPArray userNSClasses; + CPString appDirectory @accessors(readonly); + CPDictionary frameworks @accessors(readonly); + CPString appResourceDirectory @accessors(readonly); + CPDictionary infoPlist @accessors(readonly); + CPArray userNSClasses @accessors(readonly); + CPArray themes @accessors(readonly); +} + ++ (Nib2Cib)sharedNib2Cib +{ + return SharedNib2Cib; +} + ++ (CPTheme)defaultTheme +{ + return [SharedNib2Cib themes][0]; } - (id)initWithArgs:(CPArray)theArgs @@ -62,13 +76,18 @@ var FILE = require("file"), if (self) { + if (!SharedNib2Cib) + SharedNib2Cib = self; + commandLineArgs = theArgs; parser = new (require("narwhal/args").Parser)(); nibInfo = {}; appDirectory = @""; - resourcesDirectory = @""; + frameworks = [CPDictionary dictionary]; + appResourceDirectory = @""; infoPlist = @{}; userNSClasses = []; + themes = []; } return self; @@ -86,7 +105,7 @@ var FILE = require("file"), if (options.watch) [self watchWithOptions:options]; else - [self convertWithOptions:options inputFile:nil]; + [self convertWithOptions:options inputPath:nil]; } catch (anException) { @@ -104,25 +123,55 @@ var FILE = require("file"), [self failWithMessage:@"fontinfo does not appear to be installed"]; } -- (BOOL)convertWithOptions:(JSObject)options inputFile:(CPString)inputFile +- (void)enumerateFrameworks +{ + var frameworksDirectory = FILE.join(appDirectory, "Frameworks"), + debugFrameworksDirectory = FILE.join(frameworksDirectory, "Debug"); + + [debugFrameworksDirectory, frameworksDirectory].forEach(function(directory) + { + if (FILE.isDirectory(directory)) + { + var frameworkList = FILE.list(directory); + + frameworkList.forEach(function(framework) + { + if (framework !== @"Debug" && ![frameworks containsKey:framework]) + { + var resourceDirectory = FILE.join(directory, framework, "Resources"); + + if (FILE.isDirectory(resourceDirectory)) + resourceDirectory = FILE.canonical(resourceDirectory); + else + resourceDirectory = @""; + + [frameworks setValue:{resourceDirectory:resourceDirectory, loaded:false} forKey:framework]; + } + }); + } + }); +} + +- (BOOL)convertWithOptions:(JSObject)options inputPath:(CPString)inputPath { try { - inputFile = inputFile || [self getInputFile:options.args]; + inputPath = inputPath || [self getInputPath:options.args]; - [self getAppAndResourceDirectoriesFromInputFile:inputFile options:options]; + [self getAppAndResourceDirectoriesFromInputPath:inputPath options:options]; + [self enumerateFrameworks]; if (options.readStoredOptions) { - options = [self mergeOptionsWithStoredOptions:options inputFile:inputFile]; + options = [self mergeOptionsWithStoredOptions:options inputPath:inputPath]; [self setLogLevel:options.quiet ? -1 : options.verbosity]; } if (!options.quiet && options.verbosity > 0) [self printVersion]; - var outputFile = [self getOutputFileFromInputFile:inputFile args:options.args], - configInfo = [self readConfigFile:options.configFile || @"" inputFile:inputFile]; + var configInfo = [self readConfigFile:options.configFile || @"" inputPath:inputPath], + outputPath = [self getOutputPathFromInputPath:inputPath args:options.args]; infoPlist = configInfo.plist; @@ -141,37 +190,40 @@ var FILE = require("file"), else infoPlist = @{}; - var themeList = [self getThemeList:options], - themes = [self loadThemesFromList:themeList]; + var themeList = [self getThemeList:options]; + + [self loadThemesFromList:themeList]; + [self loadFrameworks:options.frameworks verbosity:options.verbosity]; + [self loadNSClassesFromBundle:[CPBundle mainBundle]]; + + var frameworkList = []; + + [frameworks allKeys].forEach(function(name) + { + var info = [frameworks valueForKey:name]; + + if (info.resourceDirectory) + name += "*"; + + if (info.loaded) + name += "+"; + + frameworkList.push(name); + }); CPLog.info("\n-------------------------------------------------------------"); - CPLog.info("Input : " + inputFile); - CPLog.info("Output : " + outputFile); - CPLog.info("Format : " + ["Auto", "Mac", "iPhone"][options.format]); + CPLog.info("Input : " + inputPath); + CPLog.info("Output : " + outputPath); CPLog.info("Application : " + appDirectory); - CPLog.info("Resources : " + resourcesDirectory); - CPLog.info("Frameworks : " + (options.frameworks || "")); + CPLog.info("Frameworks : " + (frameworkList.join(", ") || "")); CPLog.info("Default theme : " + themeList[0]); CPLog.info("Aux themes : " + themeList.slice(1).join(", ")); CPLog.info("Config file : " + (configInfo.path || "")); CPLog.info("System Font : " + [CPFont systemFontSize] + "px " + [CPFont systemFontFace]); CPLog.info("-------------------------------------------------------------\n"); - var converter = [[Converter alloc] initWithInputPath:inputFile - format:options.format - themes:themes]; - - [converter setOutputPath:outputFile]; - [converter setResourcesPath:resourcesDirectory]; - - var loadFrameworksCallback = function() - { - [self loadNSClassesFromBundle:[CPBundle mainBundle]]; - [converter setUserNSClasses:userNSClasses]; - [converter convert]; - }; - - [self loadFrameworks:options.frameworks verbosity:options.verbosity callback:loadFrameworksCallback]; + var converter = [[Converter alloc] initWithInputPath:inputPath outputPath:outputPath]; + [converter convert]; return YES; } @@ -250,7 +302,7 @@ var FILE = require("file"), // Let the converter log however the user configured it [self setLogLevel:verbosity]; - var success = [self convertWithOptions:options inputFile:nib]; + var success = [self convertWithOptions:options inputPath:nib]; [self setLogLevel:1]; @@ -275,11 +327,6 @@ var FILE = require("file"), .set(true) .help("Ask nib2cib to watch a directory for changes"); - parser.option("-R", "resourcesDir") - .set() - .displayName("directory") - .help("Set the Resources directory, usually unnecessary as it is inferred from the input path"); - parser.option("--default-theme", "defaultTheme") .set() .displayName("name") @@ -312,15 +359,15 @@ var FILE = require("file"), .def(true) .help("Do not read stored options"); - parser.option("--mac", "format") - .set(NibFormatMac) - .def(NibFormatUndetermined) - .help("Set format to Mac"); - parser.option("--version", "showVersion") .action(function() { [self printVersionAndExit]; }) .help("Show the version of nib2cib and quit"); + parser.option("-R", "deprecatedResourcesDir") + .set() + .displayName("resources directory") + .help("This option is deprecated."); + parser.helpful(); var options = parser.parse(theArgs, null, null, true); @@ -334,13 +381,13 @@ var FILE = require("file"), return options; } -- (JSObject)mergeOptionsWithStoredOptions:(JSObject)options inputFile:(CPString)inputFile +- (JSObject)mergeOptionsWithStoredOptions:(JSObject)options inputPath:(CPString)inputPath { // We have to clone options var userOptions = [self readStoredOptionsAtPath:FILE.join(SYS.env["HOME"], ".nib2cibconfig")], appOptions = [self readStoredOptionsAtPath:FILE.join(appDirectory, "nib2cib.conf")], - filename = FILE.basename(inputFile, FILE.extension(inputFile)) + ".conf", - fileOptions = [self readStoredOptionsAtPath:FILE.join(FILE.dirname(inputFile), filename)]; + filename = FILE.basename(inputPath, FILE.extension(inputPath)) + ".conf", + fileOptions = [self readStoredOptionsAtPath:FILE.join(FILE.dirname(inputPath), filename)]; // At this point we have an array of args without the initial command in args[0], // add the command and parse the options. @@ -445,31 +492,31 @@ var FILE = require("file"), CPLogRegister(CPLogPrint, null, logFormatter); } -- (CPString)getInputFile:(CPArray)theArgs +- (CPString)getInputPath:(CPArray)theArgs { - var inputFile = theArgs[0] || DefaultFile, + var inputPath = theArgs[0] || DefaultFile, path = ""; - if (!/^.+\.[nx]ib$/.test(inputFile)) + if (!/^.+\.[nx]ib$/.test(inputPath)) { - if (path = [self findInputFile:inputFile extension:@".xib"]) - inputFile = path; - else if (path = [self findInputFile:inputFile extension:@".nib"]) - inputFile = path; + if (path = [self findInputPath:inputPath extension:@".xib"]) + inputPath = path; + else if (path = [self findInputPath:inputPath extension:@".nib"]) + inputPath = path; else - [self failWithMessage:@"Cannot find the input file (.xib or .nib): " + FILE.canonical(inputFile)]; + [self failWithMessage:@"Cannot find the input file (.xib or .nib): " + FILE.canonical(inputPath)]; } - else if (path = [self findInputFile:inputFile extension:nil]) - inputFile = path; + else if (path = [self findInputPath:inputPath extension:nil]) + inputPath = path; else - [self failWithMessage:@"Could not read the input file: " + FILE.canonical(inputFile)]; + [self failWithMessage:@"Could not read the input file: " + FILE.canonical(inputPath)]; - return FILE.canonical(inputFile); + return FILE.canonical(inputPath); } -- (void)findInputFile:(CPString)inputFile extension:(CPString)extension +- (void)findInputPath:(CPString)inputPath extension:(CPString)extension { - var path = inputFile; + var path = inputPath; if (extension) path += extension; @@ -477,7 +524,7 @@ var FILE = require("file"), if (FILE.isReadable(path)) return path; - if (FILE.basename(FILE.dirname(inputFile)) !== "Resources" && FILE.isDirectory("Resources")) + if (FILE.basename(FILE.dirname(inputPath)) !== "Resources" && FILE.isDirectory("Resources")) { path = FILE.resolve(path, FILE.join("Resources", FILE.basename(path))); @@ -488,71 +535,59 @@ var FILE = require("file"), return null; } -- (void)getAppAndResourceDirectoriesFromInputFile:(CPString)inputFile options:(JSObject)options +- (void)getAppAndResourceDirectoriesFromInputPath:(CPString)aPath options:(JSObject)options { - appDirectory = resourcesDirectory = ""; + appDirectory = @""; - if (options.resourcesDir) - { - var path = FILE.canonical(options.resourcesDir); - - if (!FILE.isDirectory(path)) - [self failWithMessage:@"Cannot read resources at: " + path]; - - resourcesDirectory = path; - } - - var parentDir = FILE.dirname(inputFile); + var parentDir = FILE.dirname(aPath); if (FILE.basename(parentDir) === "Resources") { appDirectory = FILE.dirname(parentDir); - resourcesDirectory = resourcesDirectory || parentDir; + appResourceDirectory = parentDir; } else { appDirectory = parentDir; - if (!resourcesDirectory) + if (!appResourceDirectory) { var path = FILE.join(appDirectory, "Resources"); if (FILE.isDirectory(path)) - resourcesDirectory = path; + appResourceDirectory = path; } } } -- (CPString)getOutputFileFromInputFile:(CPString)inputFile args:(CPArray)theArgs +- (CPString)getOutputPathFromInputPath:(CPString)aPath args:(CPArray)theArgs { - var outputFile = null; + var outputPath = null; if (theArgs.length > 1) { - outputFile = theArgs[1]; + outputPath = theArgs[1]; - if (!/^.+\.cib$/.test(outputFile)) - outputFile += ".cib"; + if (!/^.+\.cib$/.test(outputPath)) + outputPath += ".cib"; } else - outputFile = FILE.join(FILE.dirname(inputFile), FILE.basename(inputFile, FILE.extension(inputFile))) + ".cib"; + outputPath = FILE.join(FILE.dirname(aPath), FILE.basename(aPath, FILE.extension(aPath))) + ".cib"; - outputFile = FILE.canonical(outputFile); + outputPath = FILE.canonical(outputPath); - if (!FILE.isWritable(FILE.dirname(outputFile))) - [self failWithMessage:@"Cannot write the output file at: " + outputFile]; + if (!FILE.isWritable(FILE.dirname(outputPath))) + [self failWithMessage:@"Cannot write the output file at: " + outputPath]; - return outputFile; + return outputPath; } -- (void)loadFrameworks:(CPArray)frameworks verbosity:(int)verbosity callback:(JSObject)aCallback +- (void)loadFrameworks:(CPArray)frameworksToLoad verbosity:(int)verbosity { - if (!frameworks || frameworks.length === 0) - return aCallback(); + if (!frameworksToLoad || frameworksToLoad.length === 0) + return; - var returnPath = function(path) { return path; }; - - frameworks.forEach(function(aFramework) + frameworksToLoad.forEach(function(aFramework) { [self setLogLevel:verbosity]; @@ -561,19 +596,13 @@ var FILE = require("file"), // If it is just a name with no path components, try to locate it if (aFramework.indexOf("/") === -1) { - frameworkPath = [self findInCappBuild:aFramework isDirectory:YES callback:returnPath]; - - if (!frameworkPath) - frameworkPath = [self findInFrameworks:FILE.join(appDirectory, "Frameworks") - path:aFramework - isDirectory:YES - callback:returnPath]; - - if (!frameworkPath) - frameworkPath = [self findInInstalledFrameworks:aFramework isDirectory:YES callback:returnPath]; + frameworkPath = [self findInFrameworks:FILE.join(appDirectory, "Frameworks") + path:aFramework + isDirectory:YES + callback:function(path) { return path; }]; } else - frameworkPath = FILE.canonical(aFramework); + [self failWithMessage:@"-F should be used only with a framework name that is in the app's Framework directory"]; if (!frameworkPath) [self failWithMessage:@"Cannot find the framework \"" + aFramework + "\""]; @@ -592,6 +621,11 @@ var FILE = require("file"), [self setLogLevel:verbosity]; [self loadNSClassesFromBundle:frameworkBundle]; + + var frameworkName = FILE.basename(frameworkPath), + info = [frameworks valueForKey:frameworkName]; + + info.loaded = true; } finally { @@ -600,8 +634,6 @@ var FILE = require("file"), require("browser/timeout").serviceTimeouts(); }); - - aCallback(); } - (void)loadNSClassesFromBundle:(CPBundle)aBundle @@ -634,20 +666,20 @@ var FILE = require("file"), if (!defaultTheme) defaultTheme = [self getAppKitDefaultThemeName]; - var themes = [CPSet setWithObject:defaultTheme]; + var themeList = [CPSet setWithObject:defaultTheme]; if (options.auxThemes) - [themes addObjectsFromArray:options.auxThemes]; + [themeList addObjectsFromArray:options.auxThemes]; var auxThemes = infoPlist.valueForKey("CPAuxiliaryThemes"); if (auxThemes) - [themes addObjectsFromArray:auxThemes]; + [themeList addObjectsFromArray:auxThemes]; // Now remove the default theme, get the list as an array, and insert the default at the beginning - [themes removeObject:defaultTheme]; + [themeList removeObject:defaultTheme]; - var allThemes = [themes allObjects]; + var allThemes = [themeList allObjects]; [allThemes insertObject:defaultTheme atIndex:0]; @@ -735,23 +767,20 @@ var FILE = require("file"), return themeName; } -- (CPArray)loadThemesFromList:(CPArray)themeList +- (void)loadThemesFromList:(CPArray)themeList { - var themes = []; - for (var i = 0; i < themeList.length; ++i) - themes.push([self loadThemeNamed:themeList[i] directory:resourcesDirectory]); - - return themes; + themes.push([self loadThemeNamed:themeList[i]]); } -- (CPTheme)loadThemeNamed:(CPString)themeName directory:(CPString)themeDir +- (CPTheme)loadThemeNamed:(CPString)themeName { if (/^.+\.blend$/.test(themeName)) themeName = themeName.substr(0, themeName.length - ".blend".length); var blendName = themeName + ".blend", - themePath = ""; + themePath = "", + themeDir = appResourceDirectory; if (themeDir) { @@ -820,7 +849,7 @@ var FILE = require("file"), return theme; } -- (JSObject)readConfigFile:(CPString)configFile inputFile:(CPString)inputFile +- (JSObject)readConfigFile:(CPString)configFile inputPath:(CPString)inputPath { var configPath = null, path; diff --git a/Tools/nib2cib/Nib2CibKeyedUnarchiver.j b/Tools/nib2cib/Nib2CibKeyedUnarchiver.j index e60efd233..256a19759 100644 --- a/Tools/nib2cib/Nib2CibKeyedUnarchiver.j +++ b/Tools/nib2cib/Nib2CibKeyedUnarchiver.j @@ -22,22 +22,13 @@ @import +@class Nib2Cib + var FILE = require("file"); @implementation Nib2CibKeyedUnarchiver : CPKeyedUnarchiver { - CPString resourcesPath @accessors(readonly); -} - -- (id)initForReadingWithData:(CPData)data resourcesPath:(CPString)aResourcesPath -{ - self = [super initForReadingWithData:data]; - - if (self) - resourcesPath = aResourcesPath; - - return self; } - (CPArray)allObjects @@ -45,12 +36,51 @@ var FILE = require("file"); return _objects; } -- (CPString)resourcePathForName:(CPString)aName +- (JSObject)resourceInfoForName:(CPString)aName inFramework:(CPString)framework { - if (!resourcesPath) - return NULL; + var nib2cib = [Nib2Cib sharedNib2Cib], + frameworks = [nib2cib frameworks]; - var pathGroups = [FILE.listPaths(resourcesPath)]; + if (framework) + { + var info = [frameworks valueForKey:framework]; + + if (!info || !info.resourceDirectory) + return nil; + + return { path:[self _resourcePathForName:aName inDirectory:info.resourceDirectory], framework:framework }; + } + else + { + // Try the app's resource directory first + var resourcesDirectory = [nib2cib appResourceDirectory], + path = [self _resourcePathForName:aName inDirectory:resourcesDirectory]; + + if (path) + return { path:path, framework:framework }; + + var enumerator = [frameworks keyEnumerator]; + + while ((framework = [enumerator nextObject])) + { + var info = [frameworks valueForKey:framework]; + + if (!info || !info.resourceDirectory) + continue; + + path = [self _resourcePathForName:aName inDirectory:info.resourceDirectory]; + + if (path) + return { path:path, framework:framework }; + } + } + + return nil; +} + +- (CPString)_resourcePathForName:(CPString)aName inDirectory:(CPString)directory +{ + var pathGroups = [FILE.listPaths(directory)]; while (pathGroups.length > 0) { @@ -73,7 +103,7 @@ var FILE = require("file"); } } - return NULL; + return nil; } @end