diff --git a/.gitignore b/.gitignore index 0239170a8..0850a627e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,7 @@ xcuserdata/ !*.xcodeproj/project.pbxproj *.xCodeSupport/ *.XcodeSupport/ +*XcodeSupport/ +Tests/Manual/**/*.xcodeproj *.sublime-project *.sublime-workspace diff --git a/.travis.yml b/.travis.yml index 30fda1ba8..f5df3e46d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - 0.8 -install: ./bootstrap.sh --quiet --noprompt --directory ./narwhal +install: ./bootstrap.sh --noprompt --directory ./narwhal script: jake test env: PATH="$TRAVIS_BUILD_DIR/narwhal/bin:$PATH" CAPP_BUILD="$TRAVIS_BUILD_DIR/Build" NARWHAL_ENGINE=rhino diff --git a/AppKit/CPAlert.j b/AppKit/CPAlert.j index 4df69bc0e..38aeef5d8 100644 --- a/AppKit/CPAlert.j +++ b/AppKit/CPAlert.j @@ -41,6 +41,9 @@ @global CPApp +var CPAlertDelegate_alertShowHelp_ = 1 << 0, + CPAlertDelegate_alertDidEnd_returnCode_ = 1 << 1; + /* @global @group CPAlertStyle @@ -59,6 +62,14 @@ CPCriticalAlertStyle = 2; var bottomHeight = 71; +@protocol CPAlertDelegate + +@optional +- (BOOL)alertShowHelp:(CPAlert)alert; +- (void)alertDidEnd:(CPAlert)theAlert returnCode:(int)returnCode; + +@end + /*! @ingroup appkit @@ -83,31 +94,33 @@ var bottomHeight = 71; */ @implementation CPAlert : CPObject { - BOOL _showHelp @accessors(property=showsHelp); - BOOL _showSuppressionButton @accessors(property=showsSuppressionButton); + BOOL _showHelp @accessors(property=showsHelp); + BOOL _showSuppressionButton @accessors(property=showsSuppressionButton); - CPAlertStyle _alertStyle @accessors(property=alertStyle); - CPString _title @accessors(property=title); - CPView _accessoryView @accessors(property=accessoryView); - CPImage _icon @accessors(property=icon); + CPAlertStyle _alertStyle @accessors(property=alertStyle); + CPString _title @accessors(property=title); + CPView _accessoryView @accessors(property=accessoryView); + CPImage _icon @accessors(property=icon); - CPArray _buttons @accessors(property=buttons, readonly); - CPCheckBox _suppressionButton @accessors(property=suppressionButton, readonly); + CPArray _buttons @accessors(property=buttons, readonly); + CPCheckBox _suppressionButton @accessors(property=suppressionButton, readonly); - id _delegate @accessors(property=delegate); - id _modalDelegate; - SEL _didEndSelector; + id _delegate @accessors(property=delegate); + id _modalDelegate; + SEL _didEndSelector @accessors(property=didEndSelector); + Function _didEndBlock; + unsigned _implementedDelegateMethods; - _CPAlertThemeView _themeView @accessors(property=themeView, readonly); - CPWindow _window @accessors(property=window, readonly); - int _defaultWindowStyle; + _CPAlertThemeView _themeView @accessors(property=themeView, readonly); + CPWindow _window @accessors(property=window, readonly); + int _defaultWindowStyle; - CPImageView _alertImageView; - CPTextField _informativeLabel; - CPTextField _messageLabel; - CPButton _alertHelpButton; + CPImageView _alertImageView; + CPTextField _informativeLabel; + CPTextField _messageLabel; + CPButton _alertHelpButton; - BOOL _needsLayout; + BOOL _needsLayout; } #pragma mark Creating Alerts @@ -186,6 +199,30 @@ var bottomHeight = 71; return self; } + +#pragma mark - +#pragma mark Delegate + +/*! + Set the delegate of the receiver + @param aDelegate the delegate object for the alert. +*/ +- (void)setDelegate:(id )aDelegate +{ + if (_delegate === aDelegate) + return; + + _delegate = aDelegate; + _implementedDelegateMethods = 0; + + if ([_delegate respondsToSelector:@selector(alertShowHelp:)]) + _implementedDelegateMethods |= CPAlertDelegate_alertShowHelp_; + + if ([_delegate respondsToSelector:@selector(alertDidEnd:returnCode:)]) + _implementedDelegateMethods |= CPAlertDelegate_alertDidEnd_returnCode_; +} + + #pragma mark Accessors - (CPTheme)theme @@ -224,16 +261,15 @@ var bottomHeight = 71; } -/*! @deprecated -*/ -- (void)setWindowStyle:(int)aStyle +/*! @deprecated */ +- (void)setWindowStyle:(int)style { CPLog.warn("DEPRECATED: setWindowStyle: is deprecated. use setTheme: instead"); - [self setTheme:(aStyle === CPHUDBackgroundWindowMask) ? [CPTheme defaultHudTheme] : [CPTheme defaultTheme]]; + + [self setTheme:(style === CPHUDBackgroundWindowMask) ? [CPTheme defaultHudTheme] : [CPTheme defaultTheme]]; } -/*! @deprecated -*/ +/*! @deprecated */ - (int)windowStyle { CPLog.warn("DEPRECATED: windowStyle: is deprecated. use theme instead"); @@ -242,18 +278,19 @@ var bottomHeight = 71; /*! - set the text of the alert's message + Set the text of the alert's message. @param aText CPString containing the text */ -- (void)setMessageText:(CPString)aText +- (void)setMessageText:(CPString)text { - [_messageLabel setStringValue:aText]; + [_messageLabel setStringValue:text]; _needsLayout = YES; } /*! - return the content of the message text + Return the content of the message text. + @return CPString containing the message text */ - (CPString)messageText @@ -262,13 +299,13 @@ var bottomHeight = 71; } /*! - set the text of the alert's informative text + Set the text of the alert's informative text. @param aText CPString containing the informative text */ -- (void)setInformativeText:(CPString)aText +- (void)setInformativeText:(CPString)text { - [_informativeLabel setStringValue:aText]; + [_informativeLabel setStringValue:text]; _needsLayout = YES; } @@ -285,6 +322,7 @@ var bottomHeight = 71; /*! Sets the title of the alert window. This API is not present in Cocoa. + @param aTitle CPString containing the window title */ - (void)setTitle:(CPString)aTitle @@ -294,7 +332,7 @@ var bottomHeight = 71; } /*! - set the accessory view + Set the accessory view. @param aView the accessory view */ @@ -305,7 +343,7 @@ var bottomHeight = 71; } /*! - set if alert shows the suppression button + Set if the alert shows the suppression button. @param shouldShowSuppressionButton YES or NO */ @@ -596,6 +634,17 @@ var bottomHeight = 71; [CPApp runModalForWindow:_window]; } +/*! + The same as \c runModal, but executes the code in \c block when the + alert is dismissed. +*/ +- (void)runModalWithDidEndBlock:(Function /*(CPAlert alert, int returnCode)*/)block +{ + _didEndBlock = block; + + [self runModal]; +} + /*! Runs the receiver modally as an alert sheet attached to a specified window. @@ -630,6 +679,20 @@ var bottomHeight = 71; [self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; } +/*! + Runs the receiver modally as an alert sheet attached to a specified window. + Executes the code in \c block when the alert is dismissed. + + @param window The parent window for the sheet. + @param block Code block to execute on dismissal +*/ +- (void)beginSheetModalForWindow:(CPWindow)aWindow didEndBlock:(Function /*(CPAlert alert, int returnCode)*/)block +{ + _didEndBlock = block; + + [self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; +} + #pragma mark Private /*! @@ -642,6 +705,7 @@ var bottomHeight = 71; _window = [[CPPanel alloc] initWithContentRect:frame styleMask:forceStyle || _defaultWindowStyle]; [_window setLevel:CPStatusWindowLevel]; + [_window setPlatformWindow:[[CPApp keyWindow] platformWindow]]; if (_title) [_window setTitle:_title]; @@ -668,8 +732,7 @@ var bottomHeight = 71; */ - (@action)_showHelp:(id)aSender { - if ([_delegate respondsToSelector:@selector(alertShowHelp:)]) - [_delegate alertShowHelp:self]; + [self _sendDelegateAlertShowHelp]; } /* @@ -696,18 +759,62 @@ var bottomHeight = 71; */ - (void)_alertDidEnd:(CPWindow)aWindow returnCode:(int)returnCode contextInfo:(id)contextInfo { - if (_didEndSelector) - objj_msgSend(_modalDelegate, _didEndSelector, self, returnCode, contextInfo); + if (_didEndBlock) + { + if (typeof(_didEndBlock) === "function") + _didEndBlock(self, returnCode); + else + CPLog.warn("%s: didEnd block is not a function", [self description]); - _modalDelegate = nil; - _didEndSelector = nil; - - if ([_delegate respondsToSelector:@selector(alertDidEnd:returnCode:)]) - [_delegate alertDidEnd:self returnCode:returnCode]; + // didEnd blocks are transient + _didEndBlock = nil; + } + else if (_modalDelegate) + { + if (_didEndSelector) + objj_msgSend(_modalDelegate, _didEndSelector, self, returnCode, contextInfo); + } + else if (_delegate) + { + if (_didEndSelector) + objj_msgSend(_delegate, _didEndSelector, self, returnCode); + else + [self _sendDelegateAlertDidEndReturnCode:returnCode]; + } } @end + +@implementation CPAlert (CPAlertDelegate) + +/*! + @ignore + Call the delegate alertDidEnd:returnCode +*/ +- (void)_sendDelegateAlertDidEndReturnCode:(int)returnCode +{ + if (!(_implementedDelegateMethods & CPAlertDelegate_alertDidEnd_returnCode_)) + return; + + [_delegate alertDidEnd:self returnCode:returnCode]; +} + +/*! + @ignore + Call the delegate alertShowHelp: +*/ +- (BOOL)_sendDelegateAlertShowHelp +{ + if (!(_implementedDelegateMethods & CPAlertDelegate_alertShowHelp_)) + return YES; + + return [_delegate alertShowHelp:self]; +} + +@end + + @implementation _CPAlertThemeView : CPView + (CPString)defaultThemeClass @@ -715,7 +822,7 @@ var bottomHeight = 71; return @"alert"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"size": CGSizeMake(400.0, 110.0), diff --git a/AppKit/CPAnimation.j b/AppKit/CPAnimation.j index c79f1e2bb..67b4ae7fb 100644 --- a/AppKit/CPAnimation.j +++ b/AppKit/CPAnimation.j @@ -236,7 +236,9 @@ ACTUAL_FRAME_RATE = 0; ACTUAL_FRAME_RATE = 0; _lastTime = new Date(); - _timer = [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(animationTimerDidFire:) userInfo:nil repeats:YES]; + var timerInterval = _frameRate <= 0.0 ? 0.0001 : 1.0/_frameRate; + + _timer = [CPTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selector(animationTimerDidFire:) userInfo:nil repeats:YES]; } /* diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index 946e01149..f26e3b648 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -22,6 +22,7 @@ @import +@import "CPApplication_Constants.j" @import "CPCompatibility.j" @import "CPColorPanel.j" @import "CPCursor.j" @@ -34,28 +35,26 @@ @import "CPPanel.j" @import "CPPlatform.j" @import "CPWindowController.j" +@import "_CPPopoverWindow.j" var CPMainCibFile = @"CPMainCibFile", CPMainCibFileHumanFriendly = @"Main cib file base name", CPEventModifierFlags = 0; -CPApp = nil; -CPApplicationWillFinishLaunchingNotification = @"CPApplicationWillFinishLaunchingNotification"; -CPApplicationDidFinishLaunchingNotification = @"CPApplicationDidFinishLaunchingNotification"; -CPApplicationWillTerminateNotification = @"CPApplicationWillTerminateNotification"; -CPApplicationWillBecomeActiveNotification = @"CPApplicationWillBecomeActiveNotification"; -CPApplicationDidBecomeActiveNotification = @"CPApplicationDidBecomeActiveNotification"; -CPApplicationWillResignActiveNotification = @"CPApplicationWillResignActiveNotification"; -CPApplicationDidResignActiveNotification = @"CPApplicationDidResignActiveNotification"; +@protocol CPApplicationDelegate -CPTerminateNow = YES; -CPTerminateCancel = NO; -CPTerminateLater = -1; // not currently supported +@optional +- (void)applicationDidBecomeActive:(CPNotification)aNotification; +- (void)applicationDidChangeScreenParameters:(CPNotification)aNotification; +- (void)applicationDidFinishLaunching:(CPNotification)aNotification; +- (void)applicationDidResignActive:(CPNotification)aNotification; +- (void)applicationWillBecomeActive:(CPNotification)aNotification; +- (void)applicationWillFinishLaunching:(CPNotification)aNotification; +- (void)applicationWillResignActive:(CPNotification)aNotification; +- (void)applicationWillTerminate:(CPNotification)aNotification; -CPRunStoppedResponse = -1000; -CPRunAbortedResponse = -1001; -CPRunContinuesResponse = -1002; +@end /*! @ingroup appkit @@ -84,36 +83,36 @@ CPRunContinuesResponse = -1002; */ @implementation CPApplication : CPResponder { - CPArray _eventListeners; - int _eventListenerInsertionIndex; + CPArray _eventListeners; + int _eventListenerInsertionIndex; - CPEvent _currentEvent; - CPWindow _lastMouseMoveWindow; + CPEvent _currentEvent; + CPWindow _lastMouseMoveWindow; - CPArray _windows; - CPWindow _keyWindow; - CPWindow _mainWindow; - CPWindow _previousKeyWindow; - CPWindow _previousMainWindow; + CPArray _windows; + CPWindow _keyWindow; + CPWindow _mainWindow; + CPWindow _previousKeyWindow; + CPWindow _previousMainWindow; - CPDocumentController _documentController; + CPDocumentController _documentController; - CPModalSession _currentSession; + CPModalSession _currentSession; // - id _delegate; - BOOL _finishedLaunching; - BOOL _isActive; + id _delegate; + BOOL _finishedLaunching; + BOOL _isActive; - CPDictionary _namedArgs; - CPArray _args; - CPString _fullArgsString; + CPDictionary _namedArgs; + CPArray _args; + CPString _fullArgsString; - CPImage _applicationIconImage; + CPImage _applicationIconImage; - CPPanel _aboutPanel; + CPPanel _aboutPanel; - CPThemeBlend _themeBlend @accessors(property=themeBlend); + CPThemeBlend _themeBlend @accessors(property=themeBlend); } /*! @@ -159,7 +158,7 @@ CPRunContinuesResponse = -1002; react to these events. @param aDelegate the delegate object */ -- (void)setDelegate:(id)aDelegate +- (void)setDelegate:(id )aDelegate { if (_delegate == aDelegate) return; @@ -173,7 +172,8 @@ CPRunContinuesResponse = -1002; CPApplicationDidBecomeActiveNotification, @selector(applicationDidBecomeActive:), CPApplicationWillResignActiveNotification, @selector(applicationWillResignActive:), CPApplicationDidResignActiveNotification, @selector(applicationDidResignActive:), - CPApplicationWillTerminateNotification, @selector(applicationWillTerminate:) + CPApplicationWillTerminateNotification, @selector(applicationWillTerminate:), + CPApplicationDidChangeScreenParametersNotification, @selector(applicationDidChangeScreenParameters:) ], count = [delegateNotifications count]; @@ -586,8 +586,8 @@ CPRunContinuesResponse = -1002; /* @ignore */ - (BOOL)_handleKeyEquivalent:(CPEvent)anEvent { - return [[self keyWindow] performKeyEquivalent:anEvent] || - [[self mainMenu] performKeyEquivalent:anEvent]; + return [[self keyWindow] performKeyEquivalent:anEvent] || + [[self mainMenu] performKeyEquivalent:anEvent]; } /*! @@ -601,33 +601,10 @@ CPRunContinuesResponse = -1002; var theWindow = [anEvent window]; -#if PLATFORM(DOM) - var willPropagate = [[theWindow platformWindow] _willPropagateCurrentDOMEvent]; - - // temporarily pretend we won't propagate the event. we'll restore the saved value later - // we do this outside the if so that changes user code might make in _handleKeyEquiv. are preserved - [[theWindow platformWindow] _propagateCurrentDOMEvent:NO]; -#endif - // Check if this is a candidate for key equivalent... if ([anEvent _couldBeKeyEquivalent] && [self _handleKeyEquivalent:anEvent]) - { -#if PLATFORM(DOM) - var characters = [anEvent characters], - modifierFlags = [anEvent modifierFlags]; - - // Unconditionally propagate on these keys to solve browser copy paste bugs - if ((characters == "c" || characters == "x" || characters == "v") && (modifierFlags & CPPlatformActionKeyMask)) - [[theWindow platformWindow] _propagateCurrentDOMEvent:YES]; -#endif - + // The key equivalent was handled. return; - } - -#if PLATFORM(DOM) - // if we make it this far, then restore the original willPropagate value - [[theWindow platformWindow] _propagateCurrentDOMEvent:willPropagate]; -#endif if ([anEvent type] == CPMouseMoved) { @@ -1380,8 +1357,8 @@ var _CPAppBootstrapperActions = nil; if (mainCibFile) { [mainBundle loadCibFile:mainCibFile - externalNameTable:@{ CPCibOwner: CPApp } - loadDelegate:self]; + externalNameTable:@{ CPCibOwner: CPApp } + loadDelegate:self]; return YES; } @@ -1458,7 +1435,7 @@ var _CPAppBootstrapperActions = nil; + (void)cibDidFailToLoad:(CPCib)aCib { - throw new Error("Could not load main cib file (Did you forget to nib2cib it?)."); + throw new Error("Could not load main cib file. Did you forget to nib2cib it?"); } + (void)reset diff --git a/AppKit/CPApplication_Constants.j b/AppKit/CPApplication_Constants.j new file mode 100644 index 000000000..31016bacf --- /dev/null +++ b/AppKit/CPApplication_Constants.j @@ -0,0 +1,40 @@ +/* + * CPApplication_Constants.j + * AppKit + * + * Created by Aparajita Fishman. + * Copyright 2013 The Cappuccino Project + * + * 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 + */ + +CPApp = nil; + +CPApplicationWillFinishLaunchingNotification = @"CPApplicationWillFinishLaunchingNotification"; +CPApplicationDidFinishLaunchingNotification = @"CPApplicationDidFinishLaunchingNotification"; +CPApplicationWillTerminateNotification = @"CPApplicationWillTerminateNotification"; +CPApplicationWillBecomeActiveNotification = @"CPApplicationWillBecomeActiveNotification"; +CPApplicationDidBecomeActiveNotification = @"CPApplicationDidBecomeActiveNotification"; +CPApplicationWillResignActiveNotification = @"CPApplicationWillResignActiveNotification"; +CPApplicationDidResignActiveNotification = @"CPApplicationDidResignActiveNotification"; +CPApplicationDidChangeScreenParametersNotification = @"CPApplicationDidChangeScreenParametersNotification"; + +CPTerminateNow = YES; +CPTerminateCancel = NO; +CPTerminateLater = -1; // not currently supported + +CPRunStoppedResponse = -1000; +CPRunAbortedResponse = -1001; +CPRunContinuesResponse = -1002; diff --git a/AppKit/CPBezierPath.j b/AppKit/CPBezierPath.j index eb5899d65..e6354fc51 100644 --- a/AppKit/CPBezierPath.j +++ b/AppKit/CPBezierPath.j @@ -147,6 +147,8 @@ var DefaultLineWidth = 1.0; { _path = CGPathCreateMutable(); _lineWidth = [[self class] defaultLineWidth]; + _lineDashesPhase = 0; + _lineDashes = []; } return self; diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index 0a9240d7b..dc10564ff 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -76,7 +76,7 @@ CPBelowBottom = 6; return @"box"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"background-color": [CPNull null], diff --git a/AppKit/CPBrowser.j b/AppKit/CPBrowser.j index 9557e1aca..a6a16306d 100644 --- a/AppKit/CPBrowser.j +++ b/AppKit/CPBrowser.j @@ -71,7 +71,7 @@ return "browser"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"image-control-resize": [CPNull null], @@ -171,7 +171,7 @@ [self addColumn]; } -- (void)setLastColumn:(int)columnIndex +- (void)setLastColumn:(CPInteger)columnIndex { if (columnIndex >= _tableViews.length) return; @@ -181,7 +181,7 @@ if (columnIndex > 0) [_tableViews[columnIndex - 1] setNeedsDisplay:YES]; - + [_tableViews[columnIndex] setNeedsDisplay:YES]; [[_tableViews.slice(indexPlusOne) valueForKey:"enclosingScrollView"] @@ -291,7 +291,7 @@ [aTableView addTableColumn:column]; } -- (void)reloadColumn:(int)column +- (void)reloadColumn:(CPInteger)column { [[self tableViewInColumn:column] reloadData]; } @@ -359,7 +359,7 @@ // ITEMS -- (id)itemAtRow:(int)row inColumn:(int)column +- (id)itemAtRow:(CPInteger)row inColumn:(CPInteger)column { return [_tableDelegates[column] childAtIndex:row]; } @@ -369,7 +369,7 @@ return [_delegate respondsToSelector:@selector(browser:isLeafItem:)] && [_delegate browser:self isLeafItem:item]; } -- (id)parentForItemsInColumn:(int)column +- (id)parentForItemsInColumn:(CPInteger)column { return [_tableDelegates[column] _item]; } @@ -652,7 +652,7 @@ [_tableViews makeObjectsPerformSelector:@selector(registerForDraggedTypes:) withObject:types]; } -- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent +- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(CPInteger)columnIndex withEvent:(CPEvent)dragEvent { if ([_delegate respondsToSelector:@selector(browser:canDragRowsWithIndexes:inColumn:withEvent:)]) return [_delegate browser:self canDragRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent]; @@ -660,7 +660,7 @@ return YES; } -- (CPImage)draggingImageForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset +- (CPImage)draggingImageForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(CPInteger)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset { if ([_delegate respondsToSelector:@selector(browser:draggingImageForRowsWithIndexes:inColumn:withEvent:offset:)]) return [_delegate browser:self draggingImageForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset]; @@ -668,7 +668,7 @@ return nil; } -- (CPView)draggingViewForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset +- (CPView)draggingViewForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(CPInteger)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset { if ([_delegate respondsToSelector:@selector(browser:draggingViewForRowsWithIndexes:inColumn:withEvent:offset:)]) return [_delegate browser:self draggingViewForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset]; @@ -771,7 +771,7 @@ CPBrowser _browser @accessors; } -- (void)initWithFrame:(CGRect)aFrame +- (id)initWithFrame:(CGRect)aFrame { if (self = [super initWithFrame:aFrame]) { @@ -902,12 +902,12 @@ [_browser selectRowIndexes:selectedIndexes inColumn:_index]; } -- (id)childAtIndex:(unsigned)index +- (id)childAtIndex:(CPUInteger)index { return [_delegate browser:_browser child:index ofItem:_item]; } -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation { if ([_delegate respondsToSelector:@selector(browser:acceptDrop:atRow:column:dropOperation:)]) return [_delegate browser:_browser acceptDrop:info atRow:row column:_index dropOperation:operation]; @@ -915,7 +915,7 @@ return NO; } -- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)operation +- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)operation { if ([_delegate respondsToSelector:@selector(browser:validateDrop:proposedRow:column:dropOperation:)]) return [_delegate browser:_browser validateDrop:info proposedRow:row column:_index dropOperation:operation]; @@ -995,7 +995,7 @@ [aCoder encodeObject:_highlightedBranchImage forKey:"_CPBrowserLeafViewHighlightedBranchImageKey"]; } -- (void)initWithCoder:(CPCoder)aCoder +- (id)initWithCoder:(CPCoder)aCoder { if (self = [super initWithCoder:aCoder]) { diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index ac9b1b4bb..213fc6ed0 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -149,7 +149,7 @@ CPButtonImageOffset = 3.0; return @"button"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"image": [CPNull null], @@ -292,7 +292,7 @@ CPButtonImageOffset = 3.0; } /*! - Sets the button's next state to \c aState. + Sets the button's state to the next available state. @param aState Possible states are any of the CPButton globals: \c CPOffState, \c CPOnState, \c CPMixedState */ @@ -448,38 +448,47 @@ CPButtonImageOffset = 3.0; { switch (aButtonType) { - case CPMomentaryLightButton: [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; - [self setShowsStateBy:CPNoCellMask]; - break; + case CPMomentaryLightButton: + [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; + [self setShowsStateBy:CPNoCellMask]; + break; - case CPMomentaryPushInButton: [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask]; - [self setShowsStateBy:CPNoCellMask]; - break; + case CPMomentaryPushInButton: + [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask]; + [self setShowsStateBy:CPNoCellMask]; + break; - case CPMomentaryChangeButton: [self setHighlightsBy:CPContentsCellMask]; - [self setShowsStateBy:CPNoCellMask]; - break; + case CPMomentaryChangeButton: + [self setHighlightsBy:CPContentsCellMask]; + [self setShowsStateBy:CPNoCellMask]; + break; - case CPPushOnPushOffButton: [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask]; - [self setShowsStateBy:CPChangeBackgroundCellMask | CPChangeGrayCellMask]; - break; + case CPPushOnPushOffButton: + [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask]; + [self setShowsStateBy:CPChangeBackgroundCellMask | CPChangeGrayCellMask]; + break; - case CPOnOffButton: [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; - [self setShowsStateBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; - break; + case CPOnOffButton: + [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; + [self setShowsStateBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask]; + break; - case CPToggleButton: [self setHighlightsBy:CPPushInCellMask | CPContentsCellMask]; - [self setShowsStateBy:CPContentsCellMask]; - break; + case CPToggleButton: + [self setHighlightsBy:CPPushInCellMask | CPContentsCellMask]; + [self setShowsStateBy:CPContentsCellMask]; + break; - case CPSwitchButton: [CPException raise:CPInvalidArgumentException - reason:"The CPSwitchButton type is not supported in Cappuccino, use the CPCheckBox class instead."]; + case CPSwitchButton: + [CPException raise:CPInvalidArgumentException + reason:"The CPSwitchButton type is not supported in Cappuccino, use the CPCheckBox class instead."]; - case CPRadioButton: [CPException raise:CPInvalidArgumentException - reason:"The CPRadioButton type is not supported in Cappuccino, use the CPRadio class instead."]; + case CPRadioButton: + [CPException raise:CPInvalidArgumentException + reason:"The CPRadioButton type is not supported in Cappuccino, use the CPRadio class instead."]; - default: [CPException raise:CPInvalidArgumentException - reason:"Unknown button type."]; + default: + [CPException raise:CPInvalidArgumentException + reason:"Unknown button type."]; } [self setImageDimsWhenDisabled:YES]; diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index c96a01d76..8efe075b4 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -79,7 +79,7 @@ return @"button-bar"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"resize-control-inset": CGInsetMake(0.0, 0.0, 0.0, 0.0), diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 4bbbeeeba..5dbd5da53 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -32,6 +32,35 @@ @import "CPPasteboard.j" @import "CPView.j" + +var CPCollectionViewDelegate_collectionView_acceptDrop_index_dropOperation_ = 1 << 0, + CPCollectionViewDelegate_collectionView_canDragItemsAtIndexes_withEvent_ = 1 << 1, + CPCollectionViewDelegate_collectionView_writeItemsAtIndexes_toPasteboard_ = 1 << 2, + CPCollectionViewDelegate_collectionView_dragTypesForItemsAtIndexes_ = 1 << 3, + CPCollectionViewDelegate_collectionView_dataForItemsAtIndexes_forType_ = 1 << 4, + CPCollectionViewDelegate_collectionView_validateDrop_proposedIndex_dropOperation_ = 1 << 5, + CPCollectionViewDelegate_collectionView_didDoubleClickOnItemAtIndex_ = 1 << 6, + CPCollectionViewDelegate_collectionViewDidChangeSelection_ = 1 << 7, + CPCollectionViewDelegate_collectionView_menuForItemAtIndex_ = 1 << 8, + CPCollectionViewDelegate_collectionView_draggingViewForItemsAtIndexes_withEvent_offset = 1 << 9; + + +@protocol CPCollectionViewDelegate + +@optional +- (BOOL)collectionView:(CPCollectionView)collectionView acceptDrop:(id)draggingInfo index:(CPInteger)index dropOperation:(CPCollectionViewDropOperation)dropOperation; +- (BOOL)collectionView:(CPCollectionView)collectionView canDragItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)event; +- (BOOL)collectionView:(CPCollectionView)collectionView writeItemsAtIndexes:(CPIndexSet)indexes toPasteboard:(CPPasteboard)pasteboard; +- (CPArray)collectionView:(CPCollectionView)collectionView dragTypesForItemsAtIndexes:(CPIndexSet)indexes; +- (CPData)collectionView:(CPCollectionView)collectionView dataForItemsAtIndexes:(CPIndexSet)indices forType:(CPString)aType; +- (CPDragOperation)collectionView:(CPCollectionView)collectionView validateDrop:(id)draggingInfo proposedIndex:(CPInteger)proposedDropIndex dropOperation:(CPCollectionViewDropOperation)proposedDropOperation; +- (CPMenu)collectionView:(CPCollectionView)collectionView menuForItemAtIndex:(CPInteger)anIndex; +- (CPView)collectionView:(CPCollectionView)collectionView dragginViewForItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)event offset:(CGPoint)dragImageOffset; +- (void)collectionView:(CPCollectionView)collectionView didDoubleClickOnItemAtIndex:(int)index; +- (void)collectionViewDidChangeSelection:(CPCollectionView)collectionView; + +@end + /*! @ingroup appkit @class CPCollectionView @@ -69,51 +98,52 @@ var HORIZONTAL_MARGIN = 2; @implementation CPCollectionView : CPView { - CPArray _content; - CPArray _items; + CPArray _content; + CPArray _items; - CPData _itemData; - CPCollectionViewItem _itemPrototype; - CPCollectionViewItem _itemForDragging; - CPMutableArray _cachedItems; + CPData _itemData; + CPCollectionViewItem _itemPrototype; + CPCollectionViewItem _itemForDragging; + CPMutableArray _cachedItems; - unsigned _maxNumberOfRows; - unsigned _maxNumberOfColumns; + unsigned _maxNumberOfRows; + unsigned _maxNumberOfColumns; - CGSize _minItemSize; - CGSize _maxItemSize; + CGSize _minItemSize; + CGSize _maxItemSize; - CPArray _backgroundColors; + CPArray _backgroundColors; - float _tileWidth; + float _tileWidth; - BOOL _isSelectable; - BOOL _allowsMultipleSelection; - BOOL _allowsEmptySelection; - CPIndexSet _selectionIndexes; + BOOL _isSelectable; + BOOL _allowsMultipleSelection; + BOOL _allowsEmptySelection; + CPIndexSet _selectionIndexes; - CGSize _itemSize; + CGSize _itemSize; - float _horizontalMargin; - float _verticalMargin; + float _horizontalMargin; + float _verticalMargin; - unsigned _numberOfRows; - unsigned _numberOfColumns; + unsigned _numberOfRows; + unsigned _numberOfColumns; - id _delegate; + id _delegate; + unsigned _implementedDelegateMethods; - CPEvent _mouseDownEvent; + CPEvent _mouseDownEvent; - BOOL _needsMinMaxItemSizeUpdate; - CGSize _storedFrameSize; + BOOL _needsMinMaxItemSizeUpdate; + CGSize _storedFrameSize; - BOOL _uniformSubviewsResizing @accessors(property=uniformSubviewsResizing); - BOOL _lockResizing; + BOOL _uniformSubviewsResizing @accessors(property=uniformSubviewsResizing); + BOOL _lockResizing; - CPInteger _currentDropIndex; - CPDragOperation _currentDragOperation; + CPInteger _currentDropIndex; + CPDragOperation _currentDragOperation; - _CPCollectionViewDropIndicator _dropView; + _CPCollectionViewDropIndicator _dropView; } - (id)initWithFrame:(CGRect)aFrame @@ -168,6 +198,54 @@ var HORIZONTAL_MARGIN = 2; [self setAutoresizingMask:0]; } + + +#pragma mark - +#pragma mark Delegate + +/*! + Set the delegate of the receiver + @param aDelegate the delegate object for the collectionView. +*/ +- (void)setDelegate:(id )aDelegate +{ + if (_delegate === aDelegate) + return; + + _delegate = aDelegate; + _implementedDelegateMethods = 0; + + if ([_delegate respondsToSelector:@selector(collectionView:acceptDrop:index:dropOperation:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_acceptDrop_index_dropOperation_; + + if ([_delegate respondsToSelector:@selector(collectionView:canDragItemsAtIndexes:withEvent:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_canDragItemsAtIndexes_withEvent_; + + if ([_delegate respondsToSelector:@selector(collectionView:writeItemsAtIndexes:toPasteboard:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_writeItemsAtIndexes_toPasteboard_; + + if ([_delegate respondsToSelector:@selector(collectionView:dragTypesForItemsAtIndexes:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_dragTypesForItemsAtIndexes_; + + if ([_delegate respondsToSelector:@selector(collectionView:dataForItemsAtIndexes:forType:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_dataForItemsAtIndexes_forType_; + + if ([_delegate respondsToSelector:@selector(collectionView:validateDrop:proposedIndex:dropOperation:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_validateDrop_proposedIndex_dropOperation_; + + if ([_delegate respondsToSelector:@selector(collectionView:didDoubleClickOnItemAtIndex:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_didDoubleClickOnItemAtIndex_; + + if ([_delegate respondsToSelector:@selector(collectionViewDidChangeSelection:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionViewDidChangeSelection_; + + if ([_delegate respondsToSelector:@selector(collectionView:menuForItemAtIndex:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_menuForItemAtIndex_; + + if ([_delegate respondsToSelector:@selector(collectionView:draggingViewForItemsAtIndexes:withEvent:offset:)]) + _implementedDelegateMethods |= CPCollectionViewDelegate_collectionView_draggingViewForItemsAtIndexes_withEvent_offset; +} + /*! Sets the item prototype to \c anItem @param anItem the new item prototype. @@ -455,12 +533,12 @@ var HORIZONTAL_MARGIN = 2; [self tileIfNeeded:NO]; } -- (void)resizeSubviewsWithOldSize:(CPSize)oldBoundsSize +- (void)resizeSubviewsWithOldSize:(CGSize)oldBoundsSize { // Desactivate subviews autoresizing } -- (void)resizeWithOldSuperviewSize:(CPSize)oldBoundsSize +- (void)resizeWithOldSuperviewSize:(CGSize)oldBoundsSize { if (_lockResizing) return; @@ -755,8 +833,8 @@ var HORIZONTAL_MARGIN = 2; - (void)mouseUp:(CPEvent)anEvent { - if ([_selectionIndexes count] && [anEvent clickCount] == 2 && [_delegate respondsToSelector:@selector(collectionView:didDoubleClickOnItemAtIndex:)]) - [_delegate collectionView:self didDoubleClickOnItemAtIndex:[_selectionIndexes firstIndex]]; + if ([_selectionIndexes count] && [anEvent clickCount] == 2) + [self _sendDelegateDidDoubleClickOnItemAtIndex:[_selectionIndexes firstIndex]]; } - (void)mouseDown:(CPEvent)anEvent @@ -784,6 +862,10 @@ var HORIZONTAL_MARGIN = 2; var firstSelectedIndex = [[self selectionIndexes] firstIndex], newSelectedRange = nil; + // This catches the case where the shift key is held down for the first selection. + if (firstSelectedIndex === CPNotFound) + firstSelectedIndex = index; + if (index < firstSelectedIndex) newSelectedRange = CPMakeRange(index, (firstSelectedIndex - index) + 1); else @@ -826,7 +908,7 @@ var HORIZONTAL_MARGIN = 2; [self tile]; } -- (void)setUniformSubviewsResizing:(float)flag +- (void)setUniformSubviewsResizing:(BOOL)flag { _uniformSubviewsResizing = flag; [self tileIfNeeded:NO]; @@ -842,15 +924,6 @@ var HORIZONTAL_MARGIN = 2; return _verticalMargin; } -/*! - Sets the collection view's delegate - @param aDelegate the new delegate -*/ -- (void)setDelegate:(id)aDelegate -{ - _delegate = aDelegate; -} - /*! Returns the collection view's delegate */ @@ -864,13 +937,13 @@ var HORIZONTAL_MARGIN = 2; */ - (CPMenu)menuForEvent:(CPEvent)theEvent { - if (![[self delegate] respondsToSelector:@selector(collectionView:menuForItemAtIndex:)]) + if (![self _delegateRespondsToCollectionViewMenuForItemAtIndex]) return [super menuForEvent:theEvent]; var location = [self convertPoint:[theEvent locationInWindow] fromView:nil], index = [self _indexAtPoint:location]; - return [_delegate collectionView:self menuForItemAtIndex:index]; + return [self _sendDelegateMenuForItemAtIndex:index]; } - (int)_indexAtPoint:(CGPoint)thePoint @@ -888,12 +961,12 @@ var HORIZONTAL_MARGIN = 2; return CPNotFound; } -- (CPCollectionViewItem)itemAtIndex:(unsigned)anIndex +- (CPCollectionViewItem)itemAtIndex:(CPUInteger)anIndex { return [_items objectAtIndex:anIndex]; } -- (CGRect)frameForItemAtIndex:(unsigned)anIndex +- (CGRect)frameForItemAtIndex:(CPUInteger)anIndex { return [[[self itemAtIndex:anIndex] view] frame]; } @@ -928,7 +1001,7 @@ var HORIZONTAL_MARGIN = 2; */ - (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType { - [aPasteboard setData:[_delegate collectionView:self dataForItemsAtIndexes:_selectionIndexes forType:aType] forType:aType]; + [aPasteboard setData:[self _sendDelegateDataForItemsAtIndexes:_selectionIndexes forType:aType] forType:aType]; } - (void)_createDropIndicatorIfNeeded @@ -958,24 +1031,23 @@ var HORIZONTAL_MARGIN = 2; (ABS(locationInWindow.y - mouseDownLocationInWindow.y) < 3)) return; - if (![_delegate respondsToSelector:@selector(collectionView:dragTypesForItemsAtIndexes:)]) + if (![self _delegateRespondsToCollectionViewDragTypesForItemsAtIndexes]) return; // If we don't have any selected items, we've clicked away, and thus the drag is meaningless. if (![_selectionIndexes count]) return; - if ([_delegate respondsToSelector:@selector(collectionView:canDragItemsAtIndexes:withEvent:)] && - ![_delegate collectionView:self canDragItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent]) + if (![self _sendDelegateCanDragItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent]) return; // Set up the pasteboard - var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes]; + var dragTypes = [self _sendDelegateDragTypesForItemsAtIndexes:_selectionIndexes]; [[CPPasteboard pasteboardWithName:CPDragPboard] declareTypes:dragTypes owner:self]; var dragImageOffset = CGSizeMakeZero(), - view = [self _draggingViewForItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent offset:dragImageOffset]; + view = [self _sendDelegateDraggingViewForItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent offset:dragImageOffset]; [view setFrameSize:_itemSize]; [view setAlphaValue:0.7]; @@ -992,14 +1064,6 @@ var HORIZONTAL_MARGIN = 2; slideBack:YES]; } -- (CPView)_draggingViewForItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)anEvent offset:(CGPoint)offset -{ - if ([_delegate respondsToSelector:@selector(collectionView:draggingViewForItemsAtIndexes:withEvent:offset:)]) - return [_delegate collectionView:self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:offset]; - - return [self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:offset]; -} - - (CPView)draggingViewForItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)event offset:(CGPoint)dragImageOffset { var idx = _content[[indexes firstIndex]]; @@ -1012,14 +1076,6 @@ var HORIZONTAL_MARGIN = 2; return [_itemForDragging view]; } -- (BOOL)_canDragItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)anEvent -{ - if ([self respondsToSelector:@selector(collectionView:canDragItemsAtIndexes:withEvent:)]) - return [_delegate collectionView:self canDragItemsAtIndexes:indexes withEvent:anEvent]; - - return YES; -} - - (CPDragOperation)draggingEntered:(id)draggingInfo { var dropIndex = -1, @@ -1057,16 +1113,14 @@ var HORIZONTAL_MARGIN = 2; var result = CPDragOperationMove, dropIndex = [self _dropIndexForDraggingInfo:draggingInfo proposedDropOperation:dropOperation]; - if ([_delegate respondsToSelector:@selector(collectionView:validateDrop:proposedIndex:dropOperation:)]) + if ([self _delegateRespondsToCollectionViewValidateDropProposedIndexDropOperation]) { var dropIndexRef2 = @ref(dropIndex); - result = [_delegate collectionView:self validateDrop:draggingInfo proposedIndex:dropIndexRef2 dropOperation:dropOperation]; + result = [self _sendDelegateValidateDrop:draggingInfo proposedIndex:dropIndexRef2 dropOperation:dropOperation]; if (result !== CPDragOperationNone) - { dropIndex = dropIndexRef2(); - } } dropIndexRef(dropIndex); @@ -1100,7 +1154,7 @@ Not supported. Use -collectionView:dataForItemsAtIndexes:fortype: var result = NO; if (_currentDragOperation && _currentDropIndex !== -1) - result = [_delegate collectionView:self acceptDrop:draggingInfo index:_currentDropIndex dropOperation:1]; + result = [self _sendDelegateAcceptDrop:draggingInfo index:_currentDropIndex dropOperation:1]; [self draggingEnded:draggingInfo]; // Is this correct ? @@ -1318,13 +1372,14 @@ Not supported. Use -collectionView:dataForItemsAtIndexes:fortype: [self interpretKeyEvents:[anEvent]]; } -- (void)setAutoresizingMask:(int)aMask +- (void)setAutoresizingMask:(unsigned)aMask { [super setAutoresizingMask:0]; } @end + @implementation CPCollectionView (Deprecated) - (CGRect)rectForItemAtIndex:(int)anIndex @@ -1345,6 +1400,159 @@ Not supported. Use -collectionView:dataForItemsAtIndexes:fortype: @end + +@implementation CPCollectionView (CPCollectionViewDelegate) + +/* + @ignore + Return YES if the delegate implements collectionView:validateDrop:proposedIndex:dropOperation: +*/ +- (BOOL)_delegateRespondsToCollectionViewValidateDropProposedIndexDropOperation +{ + return _implementedDelegateMethods & CPCollectionViewDelegate_collectionView_validateDrop_proposedIndex_dropOperation_; +} + +/* + @ignore + Return YES if the delegate implements collectionView:menuForItemAtIndex: +*/ +- (BOOL)_delegateRespondsToCollectionViewMenuForItemAtIndex +{ + return _implementedDelegateMethods & CPCollectionViewDelegate_collectionView_menuForItemAtIndex_; +} + +/* + @ignore + Return YES if the delegate implements collectionView:dragTypesForItemsAtIndexes: +*/ +- (BOOL)_delegateRespondsToCollectionViewDragTypesForItemsAtIndexes +{ + return _implementedDelegateMethods & CPCollectionViewDelegate_collectionView_dragTypesForItemsAtIndexes_; +} + +/*! + @ignore + Call delegate collectionView:acceptDrop:index:dropOperation: +*/ +- (BOOL)_sendDelegateAcceptDrop:(id)draggingInfo index:(CPInteger)index dropOperation:(CPCollectionViewDropOperation)dropOperation +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_acceptDrop_index_dropOperation_)) + return NO; + + return [_delegate collectionView:self acceptDrop:draggingInfo index:index dropOperation:dropOperation]; +} + +/*! + @ignore + Call delegate collectionView:canDragItemsAtIndexes:withEvent: +*/ +- (BOOL)_sendDelegateCanDragItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)anEvent +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_canDragItemsAtIndexes_withEvent_)) + return YES; + + return [_delegate collectionView:self canDragItemsAtIndexes:indexes withEvent:anEvent]; +} + +/*! + @ignore + Call delegate collectionView:writeItemsAtIndexes:toPasteboard: +*/ +- (BOOL)_sendDelegateWriteItemsAtIndexes:(CPIndexSet)indexes toPasteboard:(CPPasteboard)pasteboard +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_writeItemsAtIndexes_toPasteboard_)) + return NO; + + return [_delegate collectionView:self writeItemsAtIndexes:indexes toPasteboard:pasteboard]; +} + +/*! + @ignore + Call delegate collectionView:dragTypesForItemsAtIndexes: +*/ +- (CPArray)_sendDelegateDragTypesForItemsAtIndexes:(CPIndexSet)indexes +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_dragTypesForItemsAtIndexes_)) + return []; + + return [_delegate collectionView:self dragTypesForItemsAtIndexes:indexes]; +} + +/*! + @ignore + Call delegate collectionView:dataForItemsAtIndexes:forType: +*/ +- (CPData)_sendDelegateDataForItemsAtIndexes:(CPIndexSet)indexes forType:(CPString)aType +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_dataForItemsAtIndexes_forType_)) + return nil; + + return [_delegate collectionView:self dataForItemsAtIndexes:indexes forType:aType]; +} + +/*! + @ignore + Call delegate collectionView:validateDrop:proposedIndex:dropOperation: +*/ +- (CPDragOperation)_sendDelegateValidateDrop:(id)draggingInfo proposedIndex:(CPInteger)proposedDropIndex dropOperation:(CPCollectionViewDropOperation)proposedDropOperation +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_validateDrop_proposedIndex_dropOperation_)) + return CPDragOperationNone; + + return [_delegate collectionView:self validateDrop:draggingInfo proposedIndex:proposedDropIndex dropOperation:proposedDropOperation]; +} + +/*! + @ignore + Call delegate collectionView:didDoubleClickOnItemAtIndex: +*/ +- (void)_sendDelegateDidDoubleClickOnItemAtIndex:(int)index +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_didDoubleClickOnItemAtIndex_)) + return; + + return [_delegate collectionView:self didDoubleClickOnItemAtIndex:index]; +} + +/*! + @ignore + Call delegate collectionViewDidChangeSelection +*/ +- (void)_sendDelegateCollectionViewDidChangeSelection:(CPCollectionView)collectionView +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionViewDidChangeSelection_)) + return; + + return [_delegate collectionViewDidChangeSelection:self]; +} + +/*! + @ignore + Call delegate collectionView:menuForItemAtIndex: +*/ +- (void)_sendDelegateMenuForItemAtIndex:(CPInteger)anIndex +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_menuForItemAtIndex_)) + return nil; + + return [_delegate collectionView:self menuForItemAtIndex:anIndex]; +} + +/*! + @ignore + Call delegate draggingViewForItemsAtIndexes:withEvent:offset: +*/ +- (CPView)_sendDelegateDraggingViewForItemsAtIndexes:(CPIndexSet)indexes withEvent:(CPEvent)anEvent offset:(CGPoint)dragImageOffset +{ + if (!(_implementedDelegateMethods & CPCollectionViewDelegate_collectionView_draggingViewForItemsAtIndexes_withEvent_offset)) + return [self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:dragImageOffset]; + + return [_delegate collectionView:self draggingViewForItemsAtIndexes:indexes withEvent:anEvent offset:dragImageOffset]; +} + +@end + + var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey", CPCollectionViewMaxItemSizeKey = @"CPCollectionViewMaxItemSizeKey", CPCollectionViewVerticalMarginKey = @"CPCollectionViewVerticalMarginKey", diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 6f302cefd..e3fdd083e 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -156,11 +156,15 @@ var cachedBlackColor, } /*! - Creates a new color in HSB space. + Creates a new color based on the given HSB components. - @param hue the hue value - @param saturation the saturation value - @param brightness the brightness value + Note: earlier versions of this method took a hue component as degrees between 0-360, + and saturation and brightness components as percent between 0-100. This method has + now been corrected to take all components in the 0-1 range as in Cocoa. + + @param hue the hue component (0.0-1.0) + @param saturation the saturation component (0.0-1.0) + @param brightness the brightness component (0.0-1.0) @return the initialized color */ @@ -169,25 +173,61 @@ var cachedBlackColor, return [self colorWithHue:hue saturation:saturation brightness:brightness alpha:1.0]; } +/*! + Calibrated colors are not supported in Cappuccino. + + This method has the same result as [CPColor colorWithHue:saturation:brightness:alpha:]. +*/ ++ (CPColor)colorWithCalibratedHue:(float)hue saturation:(float)saturation brightness:(float)brightness alpha:(float)alpha +{ + return [self colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; +} + +/*! + Creates a new color based on the given HSB components. + + Note: earlier versions of this method took a hue component as degrees between 0-360, + and saturation and brightness components as percent between 0-100. This method has + now been corrected to take all components in the 0-1 range as in Cocoa. + + @param hue the hue component (0.0-1.0) + @param saturation the saturation component (0.0-1.0) + @param brightness the brightness component (0.0-1.0) + @param alpha the opacity component (0.0-1.0) + + @return the initialized color +*/ + (CPColor)colorWithHue:(float)hue saturation:(float)saturation brightness:(float)brightness alpha:(float)alpha { + // Clamp values. + hue = MAX(MIN(hue, 1.0), 0.0); + saturation = MAX(MIN(saturation, 1.0), 0.0); + brightness = MAX(MIN(brightness, 1.0), 0.0); + if (saturation === 0.0) - return [CPColor colorWithCalibratedWhite:brightness / 100.0 alpha:alpha]; + return [CPColor colorWithCalibratedWhite:brightness alpha:alpha]; - var f = hue % 60, - p = (brightness * (100 - saturation)) / 10000, - q = (brightness * (6000 - saturation * f)) / 600000, - t = (brightness * (6000 - saturation * (60 -f))) / 600000, - b = brightness / 100.0; + var f = (hue * 360) % 60, + p = (brightness * (1 - saturation)), + q = (brightness * (60 - saturation * f)) / 60, + t = (brightness * (60 - saturation * (60 - f))) / 60, + b = brightness; - switch (FLOOR(hue / 60)) + switch (FLOOR(hue * 6)) { - case 0: return [CPColor colorWithCalibratedRed:b green:t blue:p alpha:alpha]; - case 1: return [CPColor colorWithCalibratedRed:q green:b blue:p alpha:alpha]; - case 2: return [CPColor colorWithCalibratedRed:p green:b blue:t alpha:alpha]; - case 3: return [CPColor colorWithCalibratedRed:p green:q blue:b alpha:alpha]; - case 4: return [CPColor colorWithCalibratedRed:t green:p blue:b alpha:alpha]; - case 5: return [CPColor colorWithCalibratedRed:b green:p blue:q alpha:alpha]; + case 0: + case 6: + return [CPColor colorWithCalibratedRed:b green:t blue:p alpha:alpha]; + case 1: + return [CPColor colorWithCalibratedRed:q green:b blue:p alpha:alpha]; + case 2: + return [CPColor colorWithCalibratedRed:p green:b blue:t alpha:alpha]; + case 3: + return [CPColor colorWithCalibratedRed:p green:q blue:b alpha:alpha]; + case 4: + return [CPColor colorWithCalibratedRed:t green:p blue:b alpha:alpha]; + case 5: + return [CPColor colorWithCalibratedRed:b green:p blue:q alpha:alpha]; } } @@ -575,6 +615,9 @@ var cachedBlackColor, /*! Returns an array with the HSB values for this color. + + The values are expressed as fractions between 0.0-1.0. + The index values are ordered as:
 Index   Component
@@ -621,12 +664,36 @@ var cachedBlackColor,
     }
 
     return [
-        ROUND(hue * 360.0),
-        ROUND(saturation * 100.0),
-        ROUND(brightness * 100.0)
+        hue,
+        saturation,
+        brightness
     ];
 }
 
+/*!
+    Returns the hue component, the H in HSB, of the receiver.
+*/
+- (float)hueComponent
+{
+    return [self hsbComponents][0];
+}
+
+/*!
+    Returns the saturation component, the S in HSB, of the receiver.
+*/
+- (float)saturationComponent
+{
+    return [self hsbComponents][1];
+}
+
+/*!
+    Returns the brightness component, the B in HSB, of the receiver.
+*/
+- (float)brightnessComponent
+{
+    return [self hsbComponents][2];
+}
+
 /*!
     Returns the CSS representation of this color. The color will
     be in one of the following forms:
diff --git a/AppKit/CPColorPanel.j b/AppKit/CPColorPanel.j
index 0a3f6ba88..af6bf3e1d 100644
--- a/AppKit/CPColorPanel.j
+++ b/AppKit/CPColorPanel.j
@@ -576,7 +576,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
         [aPasteboard setData:[CPKeyedArchiver archivedDataWithRootObject:_dragColor] forType:aType];
 }
 
-- (void)performDragOperation:(id )aSender
+- (void)performDragOperation:(id /**/)aSender
 {
     var location = [self convertPoint:[aSender draggingLocation] fromView:nil],
         pasteboard = [aSender draggingPasteboard],
@@ -615,7 +615,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
     return _colorPanel;
 }
 
-- (void)performDragOperation:(id )aSender
+- (void)performDragOperation:(id /**/)aSender
 {
     var pasteboard = [aSender draggingPasteboard];
 
diff --git a/AppKit/CPColorPicker.j b/AppKit/CPColorPicker.j
index 7a1d43961..14aed7793 100644
--- a/AppKit/CPColorPicker.j
+++ b/AppKit/CPColorPicker.j
@@ -158,12 +158,12 @@
         brightness = [_brightnessSlider floatValue];
 
     [_hueSaturationView setWheelBrightness:brightness / 100.0];
-    [_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hue saturation:saturation brightness:100]];
+    [_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hue / 360.0 saturation:saturation / 100.0 brightness:1]];
 
     var colorPanel = [self colorPanel],
         opacity = [colorPanel opacity];
 
-    _cachedColor = [CPColor colorWithHue:hue saturation:saturation brightness:brightness alpha:opacity];
+    _cachedColor = [CPColor colorWithHue:hue / 360.0 saturation:saturation / 100.0 brightness:brightness / 100.0 alpha:opacity];
 
     [[self colorPanel] setColor:_cachedColor];
 }
@@ -194,10 +194,10 @@
     var hsb = [newColor hsbComponents];
 
     [_hueSaturationView setPositionToColor:newColor];
-    [_brightnessSlider setFloatValue:hsb[2]];
-    [_hueSaturationView setWheelBrightness:hsb[2] / 100.0];
+    [_brightnessSlider setFloatValue:hsb[2] * 100.0];
+    [_hueSaturationView setWheelBrightness:hsb[2]];
 
-    [_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hsb[0] saturation:hsb[1] brightness:100]];
+    [_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hsb[0] saturation:hsb[1] brightness:1]];
 }
 
 - (CPImage)provideNewButtonImage
@@ -366,8 +366,8 @@
 {
     var hsb    = [aColor hsbComponents],
         bounds = [self bounds],
-        angle    = [self degreesToRadians:hsb[0]],
-        distance = (hsb[1] / 100.0) * _radius;
+        angle    = [self degreesToRadians:hsb[0] * 360.0],
+        distance = hsb[1] * _radius;
 
     [self setAngle:angle distance:distance];
 }
diff --git a/AppKit/CPColorWell.j b/AppKit/CPColorWell.j
index 8ebe88ce9..8d8132f3a 100644
--- a/AppKit/CPColorWell.j
+++ b/AppKit/CPColorWell.j
@@ -58,7 +58,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
     return @"colorwell";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"bezel-inset": CGInsetMakeZero(),
diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j
index 0651d53ee..272292fe3 100644
--- a/AppKit/CPComboBox.j
+++ b/AppKit/CPComboBox.j
@@ -58,7 +58,7 @@ var CPComboBoxTextSubview = @"text",
     return "combobox";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
                 @"popup-button-size": CGSizeMake(21.0, 29.0),
@@ -171,7 +171,7 @@ var CPComboBoxTextSubview = @"text",
 
 #pragma mark Setting a Delegate
 
-- (id < CPComboBoxDelegate >)delegate
+- (id /*< CPComboBoxDelegate >*/)delegate
 {
     return [super delegate];
 }
@@ -182,7 +182,7 @@ var CPComboBoxTextSubview = @"text",
     protocol, in actual fact it doesn't. Also note that the same
     delegate may conform to the NSTextFieldDelegate protocol.
 */
-- (void)setDelegate:(id < CPComboBoxDelegate >)aDelegate
+- (void)setDelegate:(id /*< CPComboBoxDelegate >*/)aDelegate
 {
     var delegate = [self delegate];
 
@@ -231,7 +231,7 @@ var CPComboBoxTextSubview = @"text",
 
 #pragma mark Setting a Data Source
 
-- (id < CPComboBoxDataSource >)dataSource
+- (id /*< CPComboBoxDataSource >*/)dataSource
 {
     if (!_usesDataSource)
         [self _dataSourceWarningForMethod:_cmd condition:NO];
@@ -239,7 +239,7 @@ var CPComboBoxTextSubview = @"text",
     return _dataSource;
 }
 
-- (void)setDataSource:(id < CPComboBoxDataSource >)aSource
+- (void)setDataSource:(id /*< CPComboBoxDataSource >*/)aSource
 {
     if (!_usesDataSource)
         [self _dataSourceWarningForMethod:_cmd condition:NO];
diff --git a/AppKit/CPCompatibility.j b/AppKit/CPCompatibility.j
index 4d190f0c3..bdd103417 100644
--- a/AppKit/CPCompatibility.j
+++ b/AppKit/CPCompatibility.j
@@ -46,7 +46,9 @@ CPHTMLDragAndDropFeature                = 8;
 
 CPJavaScriptInnerTextFeature            = 9;
 CPJavaScriptTextContentFeature          = 10;
+// In onpaste, oncopy and oncut events, the event has an event.clipboardData from which the current pasteboard contents can be read with event.clipboardData.getData.
 CPJavaScriptClipboardEventsFeature      = 11;
+// window.clipboardData exists and can be read and written to at any time using window.clipboardData.getData/setData.
 CPJavaScriptClipboardAccessFeature      = 12;
 CPJavaScriptCanvasDrawFeature           = 13;
 CPJavaScriptCanvasTransformFeature      = 14;
@@ -76,11 +78,19 @@ CPInputOnInputEventFeature              = 30;
 
 CPFileAPIFeature                        = 31;
 
+
+
 /*
     When an absolutely positioned div (CPView) with an absolutely positioned canvas in it (CPView with drawRect:) moves things on top of the canvas (subviews) don't redraw correctly. E.g. if you have a bunch of text fields in a CPBox in a sheet which animates in, some of the text fields might not be visible because the CPBox has a canvas at the bottom and the box moved form offscreen to onscreen. This bug is probably very related: https://bugs.webkit.org/show_bug.cgi?id=67203
 */
 CPCanvasParentDrawErrorsOnMovementBug   = 1 << 0;
 
+// The paste event is only sent if an input or textarea has focus.
+CPJavaScriptPasteRequiresEditableTarget   = 1 << 1;
+// Redirecting the focus of the browser on keydown to an input for Cmd-V or Ctrl-V makes the paste fail.
+CPJavaScriptPasteCantRefocus            = 1 << 2;
+
+
 var USER_AGENT                          = "",
     PLATFORM_ENGINE                     = CPUnknownBrowserEngine,
     PLATFORM_FEATURES                   = [],
@@ -118,6 +128,9 @@ else if (typeof window !== "undefined" && window.attachEvent) // Must follow Ope
 
     // Tested in Internet Explore 8 and 9.
     PLATFORM_FEATURES[CPInputSetFontOutsideOfDOM] = NO;
+
+    // IE allows free clipboard access.
+    PLATFORM_FEATURES[CPJavaScriptClipboardAccessFeature] = YES;
 }
 
 // WebKit
@@ -129,11 +142,8 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1)
     PLATFORM_FEATURES[CPCSSRGBAFeature] = YES;
     PLATFORM_FEATURES[CPHTMLContentEditableFeature] = YES;
 
-    if (USER_AGENT.indexOf("Chrome") === -1)
-        PLATFORM_FEATURES[CPHTMLDragAndDropFeature] = YES;
-
     PLATFORM_FEATURES[CPJavaScriptClipboardEventsFeature] = YES;
-    PLATFORM_FEATURES[CPJavaScriptClipboardAccessFeature] = YES;
+    PLATFORM_FEATURES[CPJavaScriptClipboardAccessFeature] = NO;
     PLATFORM_FEATURES[CPJavaScriptShadowFeature] = YES;
 
     var versionStart = USER_AGENT.indexOf("AppleWebKit/") + "AppleWebKit/".length,
@@ -159,7 +169,14 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1)
         PLATFORM_FEATURES[CPInput1PxLeftPadding] = YES;
 
     if (USER_AGENT.indexOf("Chrome") === CPNotFound)
+    {
         PLATFORM_FEATURES[CPSOPDisabledFromFileURLs] = YES;
+        PLATFORM_FEATURES[CPHTMLDragAndDropFeature] = YES;
+        // https://bugs.webkit.org/show_bug.cgi?id=75891
+        PLATFORM_BUGS |= CPJavaScriptPasteRequiresEditableTarget;
+        // https://bugs.webkit.org/show_bug.cgi?id=39689
+        PLATFORM_BUGS |= CPJavaScriptPasteCantRefocus;
+    }
 
     // Assume this bug was introduced around Safari 5.1/Chrome 16. This could probably be tighter.
     if (majorVersion > 533)
@@ -190,6 +207,17 @@ else if (USER_AGENT.indexOf("Gecko") !== -1) // Must follow KHTML check.
 
     // Some day this might be fixed and should be version prefixed. No known fixed version yet.
     PLATFORM_FEATURES[CPInput1PxLeftPadding] = YES;
+
+    // This was supposed to be added in Firefox 22, but when testing with the latest beta as of 2013-06-14
+    // it does not seem to work. It seems to exhibit the CPJavaScriptPasteRequiresEditableTarget problem,
+    // and in addition doesn't seem to work with our native copy code either.
+    /*if (version >= 22.0)
+    {
+        PLATFORM_FEATURES[CPJavaScriptClipboardEventsFeature] = YES;
+        // TODO File a bug at https://bugzilla.mozilla.org/. In other browsers, one can return "false" from the
+        // beforepaste event to indicate a paste should be enabled even that the DOMEvent.target is not editable.
+        PLATFORM_BUGS |= CPJavaScriptPasteRequiresEditableTarget;
+    }*/
 }
 
 // Feature-specific checks
@@ -324,6 +352,19 @@ function CPBrowserStyleProperty(aProperty)
                 r = candidates[PLATFORM_STYLE_JS_PROPERTIES['transition']] || nil;
                 break;
 
+            case 'transformorigin':
+
+                var candidates = {
+                        'WebkitTransform' : 'WebkitTransformOrigin',
+                        'MozTransform'    : 'MozTransformOrigin',
+                        'OTransform'      : 'OTransformOrigin',
+                        'msTransform'     : 'MSTransformOrigin',
+                        'transform'       : 'transformOrigin'
+                    };
+
+                r = candidates[PLATFORM_STYLE_JS_PROPERTIES['transform']] || nil;
+                break;
+
             case 'animationend':
                 var candidates = {
                         'WebkitAnimation' : 'webkitAnimationEnd',
@@ -335,6 +376,7 @@ function CPBrowserStyleProperty(aProperty)
 
                 r = candidates[PLATFORM_STYLE_JS_PROPERTIES['animation']] || nil;
                 break;
+
             default:
                 var prefixes = ["Webkit", "Moz", "O", "ms"],
                     strippedProperty = aProperty.split('-').join(' '),
diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j
index fb11b6ebc..a231378d2 100644
--- a/AppKit/CPControl.j
+++ b/AppKit/CPControl.j
@@ -322,11 +322,11 @@ var CPControlBlackColor = [CPColor blackColor];
     _previousTrackingLocation = currentLocation;
 }
 
-- (void)setState:(int)state
+- (void)setState:(CPInteger)state
 {
 }
 
-- (int)nextState
+- (CPInteger)nextState
 {
     return 0;
 }
@@ -530,7 +530,7 @@ var CPControlBlackColor = [CPColor blackColor];
             return formattedValue;
     }
 
-    return (_value === undefined || _value === nil) ? "" : String(_value);
+    return (_value === undefined || _value === nil) ? @"" : String(_value);
 }
 
 /*!
@@ -607,7 +607,7 @@ var CPControlBlackColor = [CPColor blackColor];
     if ([note object] != self)
         return;
 
-    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidBeginEditingNotification object:self userInfo:@{ "CPFieldEditor": [note object] }];
+    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidBeginEditingNotification object:self userInfo:@{"CPFieldEditor": [note object]}];
 }
 
 - (void)textDidChange:(CPNotification)note
@@ -616,7 +616,7 @@ var CPControlBlackColor = [CPColor blackColor];
     if ([note object] != self)
         return;
 
-    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidChangeNotification object:self userInfo:@{ "CPFieldEditor": [note object] }];
+    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidChangeNotification object:self userInfo:@{"CPFieldEditor": [note object]}];
 }
 
 - (void)textDidEndEditing:(CPNotification)note
@@ -627,7 +627,49 @@ var CPControlBlackColor = [CPColor blackColor];
 
     [self _reverseSetBinding];
 
-    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidEndEditingNotification object:self userInfo:@{ "CPFieldEditor": [note object] }];
+    [[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidEndEditingNotification object:self userInfo:[note userInfo]];
+}
+
+/*!
+    @ignore
+    Return the currentTextMovement needed by the delegate textDidEndEditing
+    This is going to check the currentEvent of the CPApp
+*/
+- (unsigned)_currentTextMovement
+{
+    var currentEvent = [CPApp currentEvent],
+        keyCode = [currentEvent keyCode],
+        modifierFlags = [currentEvent modifierFlags];
+
+    switch (keyCode)
+    {
+        case CPEscapeKeyCode:
+            return CPCancelTextMovement;
+
+        case CPLeftArrowKeyCode:
+            return CPLeftTextMovement;
+
+        case CPRightArrowKeyCode:
+            return CPRightTextMovement;
+
+        case CPUpArrowKeyCode:
+            return CPUpTextMovement;
+
+        case CPDownArrowKeyCode:
+            return CPDownTextMovement;
+
+        case CPReturnKeyCode:
+            return CPReturnTextMovement;
+
+        case CPTabKeyCode:
+            if (modifierFlags & CPShiftKeyMask)
+                return CPBacktabTextMovement;
+
+            return CPTabTextMovement;
+
+        default:
+            return CPOtherTextMovement;
+    }
 }
 
 /*!
@@ -813,7 +855,7 @@ var CPControlBlackColor = [CPColor blackColor];
 /*!
     Returns the image scaling of the control.
 */
-- (CPImageScaling)imageScaling
+- (CPUInteger)imageScaling
 {
     return [self valueForThemeAttribute:@"image-scaling"];
 }
diff --git a/AppKit/CPCursor.j b/AppKit/CPCursor.j
index 9987d9cae..c6c96acdc 100755
--- a/AppKit/CPCursor.j
+++ b/AppKit/CPCursor.j
@@ -116,7 +116,8 @@ var currentCursor = nil,
 
 - (void)push
 {
-    currentCursor = cursorStack.push(self);
+    cursorStack.push(self);
+    currentCursor = self;
 }
 
 - (void)set
diff --git a/AppKit/CPDatePicker/CPDatePicker.j b/AppKit/CPDatePicker/CPDatePicker.j
index af7b9938c..c4442a7b1 100644
--- a/AppKit/CPDatePicker/CPDatePicker.j
+++ b/AppKit/CPDatePicker/CPDatePicker.j
@@ -30,6 +30,7 @@
 @import 
 @import 
 @import 
+@import 
 
 @class CPStepper
 @class CPApp
@@ -68,10 +69,9 @@ CPEraDatePickerElementFlag              = 0x0100;
     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);
+    CPTimeZone      _timeZone           @accessors(property=timeZone);
     id              _delegate           @accessors(property=delegate);
-    unsigned        _datePickerElements @accessors(property=datePickerElements);
+    CPInteger       _datePickerElements @accessors(property=datePickerElements);
     CPInteger       _datePickerMode     @accessors(property=datePickerMode);
     CPInteger       _datePickerStyle    @accessors(property=datePickerStyle);
     CPInteger       _timeInterval       @accessors(property=timeInterval);
@@ -90,7 +90,7 @@ CPEraDatePickerElementFlag              = 0x0100;
     return @"datePicker";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"bezel-color": [CPColor clearColor],
@@ -135,10 +135,10 @@ CPEraDatePickerElementFlag              = 0x0100;
             @"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],
+            @"second-hand-image": [CPNull null],
+            @"hour-hand-image": [CPNull null],
+            @"middle-hand-image": [CPNull null],
+            @"minute-hand-image": [CPNull null],
             @"size-clock": CGSizeMakeZero(),
             @"second-hand-size": CGSizeMakeZero(),
             @"hour-hand-size": CGSizeMakeZero(),
@@ -159,7 +159,7 @@ CPEraDatePickerElementFlag              = 0x0100;
     return [super _binderClassForBinding:theBinding];
 }
 
-- (id)_replacementKeyPathForBinding:(CPString)aBinding
+- (CPString)_replacementKeyPathForBinding:(CPString)aBinding
 {
     if (aBinding == CPValueBinding)
         return @"dateValue";
@@ -187,7 +187,6 @@ CPEraDatePickerElementFlag              = 0x0100;
         _datePickerElements = CPYearMonthDayDatePickerElementFlag | CPHourMinuteSecondDatePickerElementFlag;
         _timeInterval = 0;
         _implementedCDatePickerDelegateMethods = 0;
-        _formatter = [[CPDateFormatter alloc] init];
 
         [self setObjectValue:[CPDate date]];
         _minDate = [CPDate distantPast];
@@ -265,18 +264,12 @@ CPEraDatePickerElementFlag              = 0x0100;
 #pragma mark -
 #pragma mark Setter
 
-/*! Return the objectValue of the datePicker. The objectValue is made with the current formatter of the datePicker
+/*! Return the objectValue of the datePicker. The objectValue should take the timeZoneEffect
 */
-- (void)objectValue
+- (id)objectValue
 {
-    // try
-    // {
-    //     return [_formatter stringFromDate:_dateValue];
-    // }
-    // catch(e)
-    // {
-        return _dateValue
-    // }
+    // TODO : add timeZone effect. How to do it because js ???
+    return _dateValue
 }
 
 /*! Set the objectValue ofhe datePier. It has to be a CPDate
@@ -313,7 +306,14 @@ CPEraDatePickerElementFlag              = 0x0100;
     aTimeInterval = MAX(MIN(aTimeInterval, [_maxDate timeIntervalSinceDate:aDateValue]), [_minDate timeIntervalSinceDate:aDateValue]);
 
     if ([aDateValue isEqualToDate:_dateValue] && aTimeInterval == _timeInterval)
+    {
+        if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
+            [_datePickerTextfield setDateValue:_dateValue];
+        else
+            [_datePickerCalendar setDateValue:_dateValue];
+
         return;
+    }
 
     if (_implementedCDatePickerDelegateMethods & CPDatePicker_validateProposedDateValue_timeInterval)
     {
@@ -328,8 +328,8 @@ CPEraDatePickerElementFlag              = 0x0100;
     [self willChangeValueForKey:@"dateValue"];
     _dateValue = aDateValue;
     [super setObjectValue:_dateValue];
-    [self didChangeValueForKey:@"dateValue"];
     [self didChangeValueForKey:@"objectValue"];
+    [self didChangeValueForKey:@"dateValue"];
 
     [self willChangeValueForKey:@"timeInterval"];
     _timeInterval = (_datePickerMode == CPSingleDateMode)? 0 : aTimeInterval;
@@ -370,7 +370,7 @@ CPEraDatePickerElementFlag              = 0x0100;
 /*! Set the syle of the datePicker
     @param aDatePickerStyle the datePicker style
 */
-- (void)setDatePickerStyle:(CPDate)aDatePickerStyle
+- (void)setDatePickerStyle:(CPInteger)aDatePickerStyle
 {
     _datePickerStyle = aDatePickerStyle;
 
@@ -381,7 +381,7 @@ CPEraDatePickerElementFlag              = 0x0100;
 /*! Set the elements of the datePicker
     @param aDatePickerElements the datePicker elements
 */
-- (void)setDatePickerElements:(CPDate)aDatePickerElements
+- (void)setDatePickerElements:(CPInteger)aDatePickerElements
 {
     _datePickerElements = aDatePickerElements;
 
@@ -392,7 +392,7 @@ CPEraDatePickerElementFlag              = 0x0100;
 /*! Set the mode of the datePicker
     @param aDatePickerMode the datePicker mode
 */
-- (void)setDatePickerMode:(CPDate)aDatePickerMode
+- (void)setDatePickerMode:(CPInteger)aDatePickerMode
 {
     _datePickerMode = aDatePickerMode;
 
@@ -503,6 +503,23 @@ CPEraDatePickerElementFlag              = 0x0100;
     [self setNeedsLayout];
 }
 
+/*! Set the timeZone
+    @param aTimeZone
+*/
+- (void)setTimeZone:(CPTimeZone)aTimeZone
+{
+    [self willChangeValueForKey:@"timeZone"];
+    _timeZone = aTimeZone;
+    [self didChangeValueForKey:@"timeZone"];
+
+    [self setNeedsLayout];
+
+    if (_datePickerStyle == CPTextFieldAndStepperDatePickerStyle || _datePickerStyle == CPTextFieldDatePickerStyle)
+        [_datePickerTextfield setDateValue:_dateValue];
+    else
+        [_datePickerCalendar setDateValue:_dateValue];
+}
+
 
 #pragma mark -
 #pragma mark First responder methods
@@ -603,7 +620,6 @@ var CPDatePickerModeKey         = @"CPDatePickerModeKey",
     CPDatePickerElementsKey     = @"CPDatePickerElementsKey",
     CPDatePickerStyleKey        = @"CPDatePickerStyleKey",
     CPLocaleKey                 = @"CPLocaleKey",
-    CPFormatterKey              = @"CPFormatterKey",
     CPBorderedKey               = @"CPBorderedKey",
     CPDateValueKey              = @"CPDateValueKey";
 
@@ -623,7 +639,6 @@ var CPDatePickerModeKey         = @"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];
@@ -646,7 +661,6 @@ var CPDatePickerModeKey         = @"CPDatePickerModeKey",
     [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];
@@ -683,4 +697,4 @@ var CPDatePickerModeKey         = @"CPDatePickerModeKey",
     self.setMilliseconds(99);
 }
 
-@end
\ No newline at end of file
+@end
diff --git a/AppKit/CPDatePicker/_CPDatePickerCalendar.j b/AppKit/CPDatePicker/_CPDatePickerCalendar.j
index bf5e9399a..a7d713585 100644
--- a/AppKit/CPDatePicker/_CPDatePickerCalendar.j
+++ b/AppKit/CPDatePicker/_CPDatePickerCalendar.j
@@ -132,7 +132,10 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 */
 - (void)setDateValue:(CPDate)aDateValue
 {
-    [_monthView setMonthForDate:aDateValue];
+    var dateValue = [aDateValue copy];
+    [dateValue _dateWithTimeZone:[_datePicker timeZone]];
+
+    [_monthView setMonthForDate:dateValue];
     [_headerView setMonthForDate:[_monthView monthDate]];
 
     [self setNeedsLayout];
@@ -442,6 +445,9 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 */
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle)
+        return;
+
     var bounds = [self bounds],
         dayNames = [self _dayNames],
         width = CGRectGetWidth(bounds),
@@ -750,6 +756,9 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 */
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle)
+        return;
+
     [super layoutSubviews];
 
     [self tile];
@@ -1050,7 +1059,7 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 
 /*! Set a theme
 */
-- (void)setThemeState:(CPThemeState)aState
+- (BOOL)setThemeState:(CPThemeState)aState
 {
     [_textField setThemeState:aState];
     [super setThemeState:aState];
@@ -1058,7 +1067,7 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 
 /*! Unset a theme
 */
-- (void)unsetThemeState:(CPThemeState)aState
+- (BOOL)unsetThemeState:(CPThemeState)aState
 {
     [_textField unsetThemeState:aState];
     [super unsetThemeState:aState];
@@ -1130,6 +1139,9 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 */
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle)
+        return;
+
     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)];
@@ -1202,6 +1214,9 @@ var CPShortWeekDayNameArrayEn = [@"Mo", @"Tu", @"We", @"Th", @"Fr", @"Sa", @"Su"
 
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle)
+        return;
+
     if ([_datePicker drawsBackground])
         [self setBackgroundColor:[_datePicker backgroundColor]];
     else
diff --git a/AppKit/CPDatePicker/_CPDatePickerClock.j b/AppKit/CPDatePicker/_CPDatePickerClock.j
index 0015a41da..2a8866dfa 100644
--- a/AppKit/CPDatePicker/_CPDatePickerClock.j
+++ b/AppKit/CPDatePicker/_CPDatePickerClock.j
@@ -1,4 +1,5 @@
-/* _CPDatePickerClock.j
+/*
+* _CPDatePickerClock.j
 * AppKit
 *
 * Created by Alexandre Wilhelm
@@ -24,9 +25,16 @@
 @import "CPImageView.j"
 @import "CALayer.j"
 
+
+@class _CPCibCustomResource
 @class CPDatePicker
 
 @global CPHourMinuteSecondDatePickerElementFlag
+@global CPTextFieldAndStepperDatePickerStyle
+@global CPTextFieldDatePickerStyle
+
+var RADIANS = Math.PI / 180;
+
 
 @implementation _CPDatePickerClock : CPView
 {
@@ -44,11 +52,6 @@
 #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])
@@ -110,8 +113,8 @@
         [_rootLayer addSublayer:_middleHandLayer];
 
         [_rootLayer setNeedsDisplay];
-
     }
+
     return self;
 }
 
@@ -119,23 +122,27 @@
 #pragma mark -
 #pragma mark Layout methods
 
-/*! Layout the subviews
-*/
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPTextFieldAndStepperDatePickerStyle || [_datePicker datePickerStyle] == CPTextFieldDatePickerStyle)
+        return;
+
     [super layoutSubviews];
 
-    var bounds = [self bounds];
+    var bounds = [self bounds],
+        dateValue = [[_datePicker dateValue] copy];
 
-    [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]]];
+    [dateValue _dateWithTimeZone:[_datePicker timeZone]];
+
+    [self setBackgroundColor:[_datePicker currentValueForThemeAttribute:@"bezel-color-clock"]];
+    [_middleHandLayer setImage:[_datePicker currentValueForThemeAttribute:@"middle-hand-image"]];
+    [_hourHandLayer setImage:[_datePicker currentValueForThemeAttribute:@"hour-hand-image"]];
+    [_minuteHandLayer setImage:[_datePicker currentValueForThemeAttribute:@"minute-hand-image"]];
+    [_secondHandLayer setImage:[_datePicker currentValueForThemeAttribute:@"second-hand-image"]];
 
     if ([_datePicker _isEnglishFormat])
     {
-        if ([_datePicker dateValue].getHours() > 11)
+        if (dateValue.getHours() > 11)
             [_PMAMTextField setStringValue:@"PM"]
         else
             [_PMAMTextField setStringValue:@"AM"];
@@ -149,9 +156,15 @@
         [_PMAMTextField setHidden:YES];
     }
 
-    [_hourHandLayer setRotationRadians:[self _hourPositionRadianForDate:[_datePicker dateValue]]];
-    [_minuteHandLayer setRotationRadians:[self _minutePositionRadianForDate:[_datePicker dateValue]]];
-    [_secondHandLayer setRotationRadians:[self _secondPositionRadianForDate:[_datePicker dateValue]]];
+    [_hourHandLayer setRotationRadians:[self _hourPositionRadianForDate:dateValue]];
+    [_minuteHandLayer setRotationRadians:[self _minutePositionRadianForDate:dateValue]];
+    [_secondHandLayer setRotationRadians:[self _secondPositionRadianForDate:dateValue]];
+
+    [_PMAMTextField setEnabled:_isEnabled];
+    [_hourHandLayer setEnabled:_isEnabled];
+    [_middleHandLayer setEnabled:_isEnabled];
+    [_secondHandLayer setEnabled:_isEnabled];
+    [_minuteHandLayer setEnabled:_isEnabled];
 
     // Check if we have to display the hand second
     if (([_datePicker datePickerElements] & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag)
@@ -164,46 +177,41 @@
 
 
 #pragma mark -
-#pragma mark Getter Setter methods
+#pragma mark Accessors
 
-/*! 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 (360 * hours / 12) * RADIANS;
 }
 
-/*! Return the radian position of the second
-*/
 - (float)_secondPositionRadianForDate:(CPDate)aDate
 {
-    return (360 * aDate.getSeconds() / 60) * (Math.PI / 180)
+    return (360 * aDate.getSeconds() / 60) * RADIANS;
 }
 
-/*! 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)
+    return (360 * minutes / 60) * RADIANS;
 }
 
-/*! Set enabled
-    @param aBoolean
-*/
-- (void)setEnabled:(BOOL)aBoolean
+- (void)setEnabled:(BOOL)shouldEnable
 {
-    _isEnabled = aBoolean;
-    [_PMAMTextField setEnabled:aBoolean];
-    [_hourHandLayer setEnabled:aBoolean];
-    [_middleHandLayer setEnabled:aBoolean];
-    [_secondHandLayer setEnabled:aBoolean];
-    [_minuteHandLayer setEnabled:aBoolean];
+    shouldEnable = !!shouldEnable;
 
+    if (shouldEnable === _isEnabled)
+        return;
+
+    _isEnabled = shouldEnable;
     [self setNeedsLayout];
+
+    // FIXME: This is a workaround for an apparent bug in CALayer.
+    // Without pumping the event loop, the sublayers of _rootLayer
+    // (the hands) are not redrawn until an event occurs.
+    [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
 }
 
 @end
@@ -213,6 +221,7 @@
 {
     BOOL    _isEnabled      @accessors(setter=setEnabled:, getter=isEnabled);
 
+    CPImage _image;
     CALayer _imageLayer;
     float   _rotationRadians;
 }
@@ -221,10 +230,6 @@
 #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])
@@ -238,6 +243,7 @@
 
         [self addSublayer:_imageLayer];
     }
+
     return self;
 }
 
@@ -245,8 +251,8 @@
 #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
+/*!
+    Set the bounds of the layer. The imageLayer will be at the center of this bounds.
 */
 - (void)setBounds:(CGRect)aRect
 {
@@ -255,12 +261,22 @@
     [_imageLayer setPosition:CGPointMake(CGRectGetMidX(aRect), CGRectGetMidY(aRect))];
 }
 
-/*! Set the rotation of the imageLayer
-    @param radians
-*/
+- (void)setImage:(CPImage)anImage
+{
+    if (_image === anImage)
+        return;
+
+    if ([anImage isKindOfClass:[_CPCibCustomResource class]])
+        _image = [anImage imageFromCoder:nil];
+    else
+        _image = anImage;
+
+    [_imageLayer setNeedsDisplay];
+}
+
 - (void)setRotationRadians:(float)radians
 {
-    if (_rotationRadians == radians)
+    if (_rotationRadians === radians)
         return;
 
     _rotationRadians = radians;
@@ -270,15 +286,29 @@
         1.0, 1.0)];
 }
 
-- (void)setBackgroundHandColor:(CPColor)aColor
+- (void)setEnabled:(BOOL)shouldEnable
 {
-    [_imageLayer setBackgroundColor:aColor];
+    shouldEnable = !!shouldEnable;
+
+    if (_isEnabled === shouldEnable)
+        return;
+
+    _isEnabled = shouldEnable;
+    [self setNeedsDisplay];
+    [_imageLayer setNeedsDisplay];
 }
 
-- (void)setEnabled:(BOOL)aBoolean
+- (void)imageDidLoad:(CPImage)anImage
 {
-    _isEnabled = aBoolean;
-    [self setNeedsDisplay];
+    [_imageLayer setNeedsDisplay];
+}
+
+- (void)drawLayer:(CALayer)aLayer inContext:(CGContext)aContext
+{
+    if ([_image loadStatus] != CPImageLoadStatusCompleted)
+        [_image setDelegate:self];
+    else
+        CGContextDrawImage(aContext, [aLayer bounds], _image);
 }
 
 @end
diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j
index 6681631af..9b1cd4910 100644
--- a/AppKit/CPDatePicker/_CPDatePickerTextField.j
+++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j
@@ -22,6 +22,7 @@
 @import "CPControl.j"
 @import "CPFont.j"
 @import "CPTextField.j"
+@import "CPStepper.j"
 
 @import 
 @import 
@@ -30,7 +31,6 @@
 @import 
 
 @class CPDatePicker
-@class CPStepper
 
 @global CPSingleDateMode
 @global CPRangeDateMode
@@ -66,7 +66,6 @@ var CPZeroKeyCode = 48,
     _CPDatePickerElementView            _datePickerElementView;
     CPDatePicker                        _datePicker;
     CPStepper                           _stepper;
-    CPTimer                             _timerEdition;
 }
 
 
@@ -101,7 +100,7 @@ var CPZeroKeyCode = 48,
 
 
 #pragma mark -
-#pragma mark Responder methods
+#pragma mark Override responder methods
 
 - (BOOL)becomeFirstResponder
 {
@@ -116,7 +115,7 @@ var CPZeroKeyCode = 48,
 - (BOOL)resignFirstResponder
 {
     // End the timer of editing
-    [self _endTimer];
+    [_currentTextField _endEditing];
 
     // Don't forget to unbind, otherwise several steppers will increase or decrease
     [_currentTextField unbind:@"objectValue"];
@@ -129,6 +128,10 @@ var CPZeroKeyCode = 48,
     return YES;
 }
 
+- (BOOL)canBecomeKeyView
+{
+    return NO;
+}
 
 #pragma mark -
 #pragma mark Setter Getter methods
@@ -139,7 +142,9 @@ var CPZeroKeyCode = 48,
 */
 - (void)setDateValue:(CPDate)aDateValue
 {
-    [_datePickerElementView setDateValue:aDateValue];
+    var dateValue = [aDateValue copy];
+    [dateValue _dateWithTimeZone:[_datePicker timeZone]];
+    [_datePickerElementView setDateValue:dateValue];
 }
 
 /*! Set the widget enabled or not
@@ -177,6 +182,8 @@ var CPZeroKeyCode = 48,
 
 - (void)_selecteTextFieldWithFlags:(unsigned)flags
 {
+    [_datePickerElementView _updateResponderTextField];
+
     // We select the firstTextField when the datePicker becomes firstResponder if _currentTextField is null. It can be null just when using tab
     if (!_currentTextField)
     {
@@ -197,7 +204,7 @@ var CPZeroKeyCode = 48,
         return;
 
     // End the timer of editing
-    [self _endTimer];
+    [_currentTextField _endEditing];
 
     // Don't forget to unbind, otherwise several steppers will increase or decrease
     [_currentTextField unbind:@"objectValue"];
@@ -210,7 +217,7 @@ var CPZeroKeyCode = 48,
     if ([_currentTextField dateType] != CPAMPMDateType)
     {
         // We update the value of the stepper dependind on the textField
-        [_stepper setObjectValue:parseInt([_currentTextField objectValue])];
+        [_stepper setObjectValue:parseInt([_currentTextField stringValue])];
         [_stepper setMaxValue:[_currentTextField maxNumber]];
         [_stepper setMinValue:[_currentTextField minNumber]];
 
@@ -276,7 +283,7 @@ var CPZeroKeyCode = 48,
 
     if (key == CPUpArrowFunctionKey)
     {
-        [self _endTimer];
+        [_currentTextField _invalidTimer];
         [_stepper setDoubleValue:parseInt([_currentTextField objectValue])];
         [_stepper performClickUp:self];
         return YES;
@@ -284,7 +291,7 @@ var CPZeroKeyCode = 48,
 
     if (key == CPDownArrowFunctionKey)
     {
-        [self _endTimer];
+        [_currentTextField _invalidTimer];
         [_stepper setDoubleValue:parseInt([_currentTextField objectValue])];
         [_stepper performClickDown:self];
         return YES;
@@ -294,34 +301,37 @@ var CPZeroKeyCode = 48,
     {
         if (_currentTextField == _firstTextField && [anEvent keyCode] == CPTabKeyCode)
         {
-            if ([_datePicker previousKeyView])
-                [[self window] makeFirstResponder:[_datePicker previousKeyView]];
+            var previousValidKeyView = [_datePicker previousValidKeyView];
+
+            if (previousValidKeyView)
+                [[self window] makeFirstResponder:previousValidKeyView];
 
             return YES;
         }
 
-        [self _selectTextField:[_currentTextField previousKeyView]];
+        [self _selectTextField:[_currentTextField previousTextField]];
         return YES;
     }
 
     if (key == CPRightArrowFunctionKey || [anEvent keyCode] == CPTabKeyCode)
     {
-
         if (_currentTextField == _lastTextField && [anEvent keyCode] == CPTabKeyCode)
         {
-            if ([_datePicker nextKeyView])
-                [[self window] makeFirstResponder:[_datePicker nextKeyView]];
+            var nextValidKeyView = [_datePicker nextValidKeyView];
+
+            if (nextValidKeyView)
+                [[self window] makeFirstResponder:nextValidKeyView];
 
             return YES;
         }
 
-        [self _selectTextField:[_currentTextField nextKeyView]];
+        [self _selectTextField:[_currentTextField nextTextField]];
         return YES;
     }
 
-    if ([anEvent keyCode] == CPReturnKeyCode && _timerEdition)
+    if ([anEvent keyCode] == CPReturnKeyCode)
     {
-        [_timerEdition fire];
+        [_currentTextField _endEditing];
         return YES;
     }
 
@@ -348,84 +358,7 @@ var CPZeroKeyCode = 48,
         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;
-    }
+    [_currentTextField setValueForKeyEvent:anEvent];
 }
 
 
@@ -516,6 +449,7 @@ var CPZeroKeyCode = 48,
     [_textFieldDay setDateType:CPDayDateType];
     [_textFieldDay setDatePicker:_datePicker];
     [_textFieldDay setAlignment:CPRightTextAlignment];
+    [_textFieldDay setDatePickerElementView:self];
     [self addSubview:_textFieldDay];
 
     _textFieldMonth = [_CPDatePickerElementTextField new];
@@ -524,6 +458,7 @@ var CPZeroKeyCode = 48,
     [_textFieldMonth setDateType:CPMonthDateType];
     [_textFieldMonth setDatePicker:_datePicker];
     [_textFieldMonth setAlignment:CPRightTextAlignment];
+    [_textFieldMonth setDatePickerElementView:self];
     [self addSubview:_textFieldMonth];
 
     _textFieldYear = [_CPDatePickerElementTextField new];
@@ -532,6 +467,7 @@ var CPZeroKeyCode = 48,
     [_textFieldYear setDateType:CPYearDateType];
     [_textFieldYear setDatePicker:_datePicker];
     [_textFieldYear setAlignment:CPRightTextAlignment];
+    [_textFieldYear setDatePickerElementView:self];
     [self addSubview:_textFieldYear];
 
     _textFieldHour = [_CPDatePickerElementTextField new];
@@ -540,6 +476,7 @@ var CPZeroKeyCode = 48,
     [_textFieldHour setDateType:CPHourDateType];
     [_textFieldHour setDatePicker:_datePicker];
     [_textFieldHour setAlignment:CPRightTextAlignment];
+    [_textFieldHour setDatePickerElementView:self];
     [self addSubview:_textFieldHour];
 
     _textFieldMinute = [_CPDatePickerElementTextField new];
@@ -548,6 +485,7 @@ var CPZeroKeyCode = 48,
     [_textFieldMinute setDateType:CPMinuteDateType];
     [_textFieldMinute setDatePicker:_datePicker];
     [_textFieldMinute setAlignment:CPRightTextAlignment];
+    [_textFieldMinute setDatePickerElementView:self];
     [self addSubview:_textFieldMinute];
 
     _textFieldSecond = [_CPDatePickerElementTextField new];
@@ -556,6 +494,7 @@ var CPZeroKeyCode = 48,
     [_textFieldSecond setDateType:CPSecondDateType];
     [_textFieldSecond setDatePicker:_datePicker];
     [_textFieldSecond setAlignment:CPRightTextAlignment];
+    [_textFieldSecond setDatePickerElementView:self];
     [self addSubview:_textFieldSecond];
 
     _textFieldPMAM = [_CPDatePickerElementTextField new];
@@ -564,6 +503,7 @@ var CPZeroKeyCode = 48,
     [_textFieldPMAM setDateType:CPAMPMDateType];
     [_textFieldPMAM setDatePicker:_datePicker];
     [_textFieldPMAM setAlignment:CPRightTextAlignment];
+    [_textFieldPMAM setDatePickerElementView:self];
     [self addSubview:_textFieldPMAM];
 
     _textFieldSeparatorOne = [CPTextField labelWithTitle:@"/"];
@@ -612,6 +552,13 @@ var CPZeroKeyCode = 48,
         [_textFieldPMAM setStringValue:@"AM"];
 }
 
+/*! Set the day date value to the appropriate textField
+    @param aDayDateValue the day
+*/
+- (void)setDayDateValue:(CPString)aDayDateValue
+{
+    [_textFieldDay setStringValue:aDayDateValue];
+}
 
 /*! Set the widget enabled or not
     @param aBoolean
@@ -639,6 +586,65 @@ var CPZeroKeyCode = 48,
     return [[_textFieldPMAM stringValue] isEqualToString:@"AM"];
 }
 
+- (CPDate)dateValue
+{
+    var date = [[_datePicker dateValue] copy];
+
+    [date _dateWithTimeZone:[_datePicker timeZone]];
+
+    if (![_textFieldDay isHidden])
+        date.setDate([_textFieldDay stringValue]);
+
+    if (![_textFieldMonth isHidden])
+        date.setMonth(parseInt([_textFieldMonth stringValue]) - 1);
+
+    if (![_textFieldYear isHidden])
+        date.setFullYear([_textFieldYear stringValue]);
+
+    if (![_textFieldSecond isHidden])
+        date.setSeconds([_textFieldSecond stringValue]);
+
+    if (![_textFieldMinute isHidden])
+        date.setMinutes([_textFieldMinute stringValue]);
+
+    if (![_textFieldHour isHidden])
+    {
+        var hour = parseInt([_textFieldHour stringValue]),
+            currentHour = parseInt(date.getHours());
+
+        if (hour != currentHour)
+        {
+            if (([_datePicker _isEnglishFormat] || [_datePicker _isAmericanFormat]))
+            {
+                if (![self _isAMHour])
+                {
+                    if (!(currentHour == 12 && hour == 11) && hour < 13)
+                        hour = hour + 12;
+                }
+                else if (hour == 12 && currentHour != 11)
+                {
+                    hour = 0;
+                }
+                else if (currentHour == 0 && hour == 11)
+                {
+                    hour = 23;
+                }
+                else if (hour == 13)
+                {
+                    hour = 1;
+                }
+            }
+
+            if (hour == 24)
+                hour = 0;
+
+            date.setHours(hour);
+        }
+    }
+
+    return date;
+}
+
 
 #pragma mark -
 #pragma mark Notification methods
@@ -649,16 +655,19 @@ var CPZeroKeyCode = 48,
 - (void)_datePickerElementTextFieldAMPMChangedNotification:(CPNotification)aNotification
 {
     var value = [[aNotification object] stringValue],
-        dateValue = [[_datePicker dateValue] copy];
+        dateValue = [[_datePicker dateValue] copy],
+        d = [dateValue copy];
+
+    [d _dateWithTimeZone:[_datePicker timeZone]];
 
     if ([value isEqualToString:@"PM"])
     {
-        if (dateValue.getHours() <= 11)
+        if (d.getHours() <= 11)
             dateValue.setHours(dateValue.getHours() + 12);
     }
     else
     {
-        if (dateValue.getHours() > 11)
+        if (d.getHours() > 11)
             dateValue.setHours(dateValue.getHours() - 12);
     }
 
@@ -671,6 +680,9 @@ var CPZeroKeyCode = 48,
 
 - (void)layoutSubviews
 {
+    if ([_datePicker datePickerStyle] == CPClockAndCalendarDatePickerStyle)
+        return;
+
     [super layoutSubviews];
 
     var themeState = [_datePicker themeState];
@@ -1076,6 +1088,12 @@ var CPZeroKeyCode = 48,
 /*! Update the nextTextField params of all of the textField. This is used to move the current textField with the arrows
 */
 - (void)_updateKeyView
+{
+    [self _updateNextTextField];
+    [self _updatePreviousTextField]
+}
+
+- (void)_updateNextTextField
 {
     var datePickerElements = [_datePicker datePickerElements],
         firstTexField = _textFieldMonth,
@@ -1089,45 +1107,94 @@ var CPZeroKeyCode = 48,
     }
 
     if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag)
-        [firstTexField setNextKeyView:secondTextField];
+        [firstTexField setNextTextField:secondTextField];
     else
-        [firstTexField setNextKeyView:_textFieldYear];
+        [firstTexField setNextTextField:_textFieldYear];
 
-    [secondTextField setNextKeyView:_textFieldYear];
+    [secondTextField setNextTextField:_textFieldYear];
 
     if (datePickerElements & CPHourMinuteSecondDatePickerElementFlag || datePickerElements & CPHourMinuteDatePickerElementFlag)
-        [_textFieldYear setNextKeyView:_textFieldHour];
+        [_textFieldYear setNextTextField:_textFieldHour];
     else if (isEnglishFormat || (datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag)
-        [_textFieldYear setNextKeyView:firstTexField];
+        [_textFieldYear setNextTextField:firstTexField];
     else
-        [_textFieldYear setNextKeyView:secondTextField];
+        [_textFieldYear setNextTextField:secondTextField];
 
-    [_textFieldHour setNextKeyView:_textFieldMinute];
+    [_textFieldHour setNextTextField:_textFieldMinute];
 
     if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag)
-        [_textFieldMinute setNextKeyView:_textFieldSecond];
+        [_textFieldMinute setNextTextField:_textFieldSecond];
     else if (isEnglishFormat)
-        [_textFieldMinute setNextKeyView:_textFieldPMAM];
+        [_textFieldMinute setNextTextField:_textFieldPMAM];
     else if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag)
-        [_textFieldMinute setNextKeyView:firstTexField];
+        [_textFieldMinute setNextTextField:firstTexField];
     else if (datePickerElements & CPYearMonthDatePickerElementFlag)
-        [_textFieldMinute setNextKeyView:secondTextField];
+        [_textFieldMinute setNextTextField:secondTextField];
     else
-        [_textFieldMinute setNextKeyView:_textFieldHour];
+        [_textFieldMinute setNextTextField:_textFieldHour];
 
     if (isEnglishFormat)
-        [_textFieldSecond setNextKeyView:_textFieldPMAM];
+        [_textFieldSecond setNextTextField:_textFieldPMAM];
     else if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag)
-        [_textFieldSecond setNextKeyView:firstTexField];
+        [_textFieldSecond setNextTextField:firstTexField];
     else if (datePickerElements & CPYearMonthDatePickerElementFlag)
-        [_textFieldSecond setNextKeyView:secondTextField];
+        [_textFieldSecond setNextTextField:secondTextField];
     else
-        [_textFieldSecond setNextKeyView:_textFieldHour];
+        [_textFieldSecond setNextTextField:_textFieldHour];
 
     if (datePickerElements & CPYearMonthDayDatePickerElementFlag)
-        [_textFieldPMAM setNextKeyView:_textFieldMonth];
+        [_textFieldPMAM setNextTextField:_textFieldMonth];
     else
-        [_textFieldPMAM setNextKeyView:_textFieldHour];
+        [_textFieldPMAM setNextTextField:_textFieldHour];
+}
+
+- (void)_updatePreviousTextField
+{
+    var datePickerElements = [_datePicker datePickerElements],
+        firstTexField = _textFieldMonth,
+        secondTextField = _textFieldDay,
+        isEnglishFormat = [_datePicker _isEnglishFormat];
+
+    if (!isEnglishFormat)
+    {
+        firstTexField = _textFieldDay;
+        secondTextField = _textFieldMonth;
+    }
+
+    if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag)
+        [_textFieldPMAM setPreviousTextField:_textFieldSecond];
+    else if (datePickerElements & CPHourMinuteDatePickerElementFlag)
+        [_textFieldPMAM setPreviousTextField:_textFieldMinute];
+
+    [_textFieldSecond setPreviousTextField:_textFieldMinute];
+    [_textFieldMinute setPreviousTextField:_textFieldHour];
+
+    if (datePickerElements & CPYearMonthDatePickerElementFlag)
+        [_textFieldHour setPreviousTextField:_textFieldYear];
+    else if (isEnglishFormat)
+        [_textFieldHour setPreviousTextField:_textFieldPMAM];
+    else if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag)
+        [_textFieldHour setPreviousTextField:_textFieldSecond];
+    else
+        [_textFieldHour setPreviousTextField:_textFieldMinute];
+
+    if (!isEnglishFormat)
+        [_textFieldYear setPreviousTextField:_textFieldMonth];
+    else if ((datePickerElements & CPYearMonthDayDatePickerElementFlag) == CPYearMonthDayDatePickerElementFlag)
+        [_textFieldYear setPreviousTextField:_textFieldDay];
+    else
+        [_textFieldYear setPreviousTextField:_textFieldMonth];
+
+    [secondTextField setPreviousTextField:firstTexField];
+
+    if (isEnglishFormat && datePickerElements & CPHourMinuteDatePickerElementFlag)
+        [firstTexField setPreviousTextField:_textFieldPMAM];
+    else if ((datePickerElements & CPHourMinuteSecondDatePickerElementFlag) == CPHourMinuteSecondDatePickerElementFlag)
+        [firstTexField setPreviousTextField:_textFieldSecond];
+    else if (datePickerElements & CPHourMinuteDatePickerElementFlag)
+        [firstTexField setPreviousTextField:_textFieldMinute];
+    else
+        [firstTexField setPreviousTextField:_textFieldYear];
 }
 
 @end
@@ -1145,11 +1212,18 @@ var CPMonthDateType = 0,
 */
 @implementation _CPDatePickerElementTextField : CPTextField
 {
+    _CPDatePickerElementTextField _nextTextField            @accessors(property=nextTextField);
+    _CPDatePickerElementTextField _previousTextField        @accessors(property=previousTextField);
+    _CPDatePickerElementView      _datePickerElementView    @accessors(property=datePickerElementView);
+
     CPDatePicker    _datePicker @accessors(setter=setDatePicker:);
 
     int _dateType  @accessors(getter=dateType);
     int _maxNumber @accessors(getter=maxNumber);
     int _minNumber @accessors(getter=minNumber);
+
+    BOOL    _firstEvent;
+    CPTimer _timerEdition;
 }
 
 
@@ -1158,6 +1232,7 @@ var CPMonthDateType = 0,
 
 - (BOOL)acceptFirstResponder
 {
+    _firstEvent = YES;
     return NO;
 }
 
@@ -1259,38 +1334,128 @@ var CPMonthDateType = 0,
     It's called when the user is editing with the keyboard
     @param aStringValue a CPString
 */
-- (void)setStringKeyValue:(id)anObjectValue
+- (void)setValueForKeyEvent:(CPEvent)anEvent
 {
-    if (_dateType == CPYearDateType)
-    {
-        if ([anObjectValue length] > 4)
-            return
+    var keyCode = [anEvent keyCode];
 
-        while ([anObjectValue length] < 4)
-            anObjectValue = " " + anObjectValue;
+    if (keyCode != CPDeleteKeyCode && keyCode != CPDeleteForwardKeyCode  && keyCode < CPZeroKeyCode || keyCode > CPNineKeyCode)
+        return;
+
+    var newValue = [self stringValue].replace(/\s/g, ''),
+        length = [newValue length],
+        eventKeyValue = parseInt([anEvent characters]).toString();
+
+    if (keyCode == CPDeleteKeyCode || keyCode == CPDeleteForwardKeyCode)
+    {
+        [_timerEdition invalidate];
+        _timerEdition = nil;
+        newValue = [newValue substringToIndex:(length - 1)];
     }
     else
     {
-        if ([anObjectValue length] > 2)
-            return
+        if (!_timerEdition)
+        {
+            _timerEdition = [CPTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(_timerKeyEvent:) userInfo:nil repeats:NO];
 
-        while ([anObjectValue length] < 2)
-            anObjectValue = " " + anObjectValue;
+            if (_firstEvent || !length)
+                newValue = eventKeyValue;
+            else
+                newValue = parseInt(newValue).toString() + eventKeyValue;
+        }
+        else
+        {
+            var newFireDate = [CPDate date];
+
+            newFireDate.setSeconds(newFireDate.getSeconds() + 2);
+            [_timerEdition setFireDate:newFireDate];
+
+            newValue = parseInt(newValue).toString() + eventKeyValue;
+        }
     }
 
-    if (parseInt(anObjectValue) > [self _maxNumberWithMaxDate])
+    if (parseInt(newValue) > [self _maxNumberWithMaxDate] || ([_datePicker _isEnglishFormat] && _dateType == CPHourDateType && parseInt(newValue) > 12))
         return;
 
-    if ([_datePicker _isEnglishFormat] && _dateType == CPHourDateType && parseInt(anObjectValue) > 12)
-        return;
+    _firstEvent = NO;
 
-    [super setObjectValue:anObjectValue];
+    [super setObjectValue:newValue];
+}
+
+/*!
+    End of the timer
+*/
+- (void)_timerKeyEvent:(id)sender
+{
+    var stringValue = [self stringValue];
+
+    _timerEdition = nil;
+
+    if ([stringValue length])
+    {
+        if ([_datePicker _isEnglishFormat] && [self dateType] == CPHourDateType)
+        {
+            var isAMHour = [[self superview] _isAMHour];
+
+            if (!isAMHour && stringValue != 12)
+                stringValue = parseInt(stringValue) + 12;
+
+            if (stringValue == 12 && !isAMHour)
+                stringValue = 12;
+            else if (stringValue == 12)
+                stringValue = 0;
+        }
+
+        [self setObjectValue:stringValue];
+    }
+}
+
+/*!
+    We force to end the timer
+*/
+- (void)_invalidTimer
+{
+    if (_timerEdition)
+    {
+        [_timerEdition invalidate];
+        _timerEdition = nil;
+    }
+}
+
+/*!
+    We force to end the timer and to update the objectValue of the datePicker
+*/
+- (void)_endEditing
+{
+    if (_timerEdition)
+        [_timerEdition invalidate];
+
+    _timerEdition = nil;
+
+    var objectValue = [self stringValue];
+
+    if (![objectValue length])
+        objectValue = [self objectValue];
+
+    if ([_datePicker _isEnglishFormat] && [self dateType] == CPHourDateType)
+    {
+        var isAMHour = [[self superview] _isAMHour];
+
+        if (!isAMHour && objectValue != 12)
+            objectValue = parseInt(objectValue) + 12;
+
+        if (objectValue == 12 && !isAMHour)
+            objectValue = 12;
+        else if (objectValue == 12)
+            objectValue = 0;
+    }
+
+    [self setObjectValue:objectValue];
 }
 
 /*! 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
+- (void)setStringValue:(CPString)aStringValue
 {
     if (_dateType == CPYearDateType)
     {
@@ -1312,7 +1477,13 @@ var CPMonthDateType = 0,
         }
 
         while ([aStringValue length] < 2)
-            aStringValue = "0" + aStringValue;
+        {
+            if (_dateType == CPSecondDateType || _dateType == CPMinuteDateType)
+                aStringValue = @"0" + aStringValue;
+            else
+                aStringValue = @" " + aStringValue;
+        }
+
     }
 
     [super setObjectValue:aStringValue];
@@ -1325,12 +1496,20 @@ var CPMonthDateType = 0,
 */
 - (void)setObjectValue:(id)anObjectValue
 {
-    var dateValue = [[_datePicker dateValue] copy];
+    var dateValue = [[_datePicker dateValue] copy],
+        lengthString = [[self stringValue] length],
+        objectValue = parseInt(anObjectValue);
 
     switch (_dateType)
     {
         case CPMonthDateType:
 
+            if (objectValue == 0 || !lengthString)
+            {
+                [self setStringValue:(dateValue.getMonth() + 1).toString()];
+                return;
+            }
+
             var dateNextMonth = [dateValue copy];
 
             dateNextMonth.setDate(1);
@@ -1339,76 +1518,81 @@ var CPMonthDateType = 0,
             var numberDayNextMonth = [dateNextMonth _daysInMonth];
 
             if (numberDayNextMonth < [dateValue _daysInMonth] && dateValue.getDate() > numberDayNextMonth)
-                dateValue.setDate(numberDayNextMonth);
+                [_datePickerElementView setDayDateValue:numberDayNextMonth.toString()];
 
-            dateValue.setMonth(parseInt(anObjectValue) - 1);
+            [super setObjectValue:objectValue];
             break;
 
         case CPDayDateType:
-            dateValue.setDate(parseInt(anObjectValue));
+
+            if (objectValue == 0 || !lengthString)
+            {
+                [self setStringValue:dateValue.getDate().toString()];
+                return;
+            }
+
+            [super setObjectValue:objectValue];
             break;
 
         case CPYearDateType:
-            dateValue.setFullYear(parseInt(anObjectValue));
+
+            if (objectValue == 0 || !lengthString)
+            {
+                [self setStringValue:dateValue.getFullYear().toString()];
+                return;
+            }
+
+            [super setObjectValue:objectValue];
             break;
 
         case CPHourDateType:
-            dateValue.setHours(parseInt(anObjectValue));
+
+            if (!lengthString)
+            {
+                [self setStringValue:dateValue.getHours().toString()];
+                return;
+            }
+
+            [super setObjectValue:objectValue];
             break;
 
         case CPSecondDateType:
-            dateValue.setSeconds(parseInt(anObjectValue));
+
+            if (!lengthString)
+            {
+                [self setStringValue:dateValue.getSeconds().toString()];
+                return;
+            }
+            [super setObjectValue:objectValue];
             break;
 
         case CPMinuteDateType:
-            dateValue.setMinutes(parseInt(anObjectValue));
+
+            if (!lengthString)
+            {
+                [self setStringValue:dateValue.getMinutes().toString()];
+                return;
+            }
+
+            [super setObjectValue:objectValue];
             break;
     }
 
-    [_datePicker setDateValue:dateValue];
-}
+    var newDateValue = [_datePickerElementView dateValue],
+        timeZone = [_datePicker timeZone];
 
-/*! 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)
+    if (timeZone)
     {
-        case CPMonthDateType:
-            return dateValue.getMonth() + 1;
-            break;
+        var secondsFromGMT = [timeZone secondsFromGMTForDate:newDateValue],
+            secondsFromGMTTimeZone = [timeZone secondsFromGMT];
 
-        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;
+        newDateValue.setSeconds(newDateValue.getSeconds() + secondsFromGMT - secondsFromGMTTimeZone);
     }
 
-    return [super objectValue];
+    [_datePicker setDateValue:newDateValue];
 }
 
+
 #pragma mark -
 #pragma mark Mouse event
 
@@ -1438,7 +1622,69 @@ var CPMonthDateType = 0,
 */
 - (void)makeDeselectable
 {
+    _firstEvent = YES;
     [self unsetThemeState:CPThemeStateSelected];
 }
 
-@end
\ No newline at end of file
+
+#pragma mark -
+#pragma mark Override
+
+/*!
+    We override this method to get all the time the good width
+*/
+- (CGSize)_minimumFrameSize
+{
+    var frameSize = [self frameSize],
+        contentInset = [self currentValueForThemeAttribute:@"content-inset"],
+        minSize = [self currentValueForThemeAttribute:@"min-size"],
+        maxSize = [self currentValueForThemeAttribute:@"max-size"],
+        lineBreakMode = [self lineBreakMode],
+        text = (_dateType == CPYearDateType) ? @"0000" : @"00",
+        textSize = CGSizeMakeCopy(frameSize),
+        font = [self currentValueForThemeAttribute:@"font"];
+
+    textSize.width -= contentInset.left + contentInset.right;
+    textSize.height -= contentInset.top + contentInset.bottom;
+
+    if (_dateType == CPAMPMDateType)
+        text = [self stringValue];
+
+    if (frameSize.width !== 0 &&
+        ![self isBezeled]     &&
+        (lineBreakMode === CPLineBreakByWordWrapping || lineBreakMode === CPLineBreakByCharWrapping))
+    {
+        textSize = [text sizeWithFont:font inWidth:textSize.width];
+    }
+    else
+    {
+        textSize = [text sizeWithFont:font];
+
+        // Account for possible fractional pixels at right edge
+        textSize.width += 1;
+    }
+
+    // Account for possible fractional pixels at bottom edge
+    textSize.height += 1;
+
+    frameSize.height = textSize.height + contentInset.top + contentInset.bottom;
+
+    if ([self isBezeled])
+    {
+        frameSize.height = MAX(frameSize.height, minSize.height);
+
+        if (maxSize.width > 0.0)
+            frameSize.width = MIN(frameSize.width, maxSize.width);
+
+        if (maxSize.height > 0.0)
+            frameSize.height = MIN(frameSize.height, maxSize.height);
+    }
+    else
+        frameSize.width = textSize.width + contentInset.left + contentInset.right;
+
+    frameSize.width = MAX(frameSize.width, minSize.width);
+
+    return frameSize;
+}
+
+@end
diff --git a/AppKit/CPDocument.j b/AppKit/CPDocument.j
index 5c316f801..7f0c79c28 100644
--- a/AppKit/CPDocument.j
+++ b/AppKit/CPDocument.j
@@ -244,11 +244,6 @@ var CPDocumentUntitledCount = 0;
 {
 }
 
-- (CPWindowController)firstEligibleExistingWindowController
-{
-    return nil;
-}
-
 // Creating and managing window controllers
 /*!
     Creates the window controller for this document.
@@ -261,6 +256,7 @@ var CPDocumentUntitledCount = 0;
 - (void)makeViewAndWindowControllers
 {
     var viewCibName = [self viewCibName],
+        windowCibName = [self windowCibName],
         viewController = nil,
         windowController = nil;
 
@@ -268,31 +264,21 @@ var CPDocumentUntitledCount = 0;
     if ([viewCibName length])
         viewController = [[CPViewController alloc] initWithCibName:viewCibName bundle:nil owner:self];
 
-    // If we have a view controller, check if we have a free window for it.
-    if (viewController)
-        windowController = [self firstEligibleExistingWindowController];
+    // From a cib if we have one.
+    if ([windowCibName length])
+        windowController = [[CPWindowController alloc] initWithWindowCibName:windowCibName owner:self];
 
-    // If not, create one.
-    if (!windowController)
+    // If not you get a standard window capable of displaying multiple documents and view
+    else if (viewController)
     {
-        var windowCibName = [self windowCibName];
+        var view = [viewController view],
+            viewFrame = [view frame];
 
-        // From a cib if we have one.
-        if ([windowCibName length])
-            windowController = [[CPWindowController alloc] initWithWindowCibName:windowCibName owner:self];
+        viewFrame.origin = CGPointMake(50, 50);
 
-        // If not you get a standard window capable of displaying multiple documents and view
-        else if (viewController)
-        {
-            var view = [viewController view],
-                viewFrame = [view frame];
+        var theWindow = [[CPWindow alloc] initWithContentRect:viewFrame styleMask:CPTitledWindowMask | CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask];
 
-            viewFrame.origin = CGPointMake(50, 50);
-
-            var theWindow = [[CPWindow alloc] initWithContentRect:viewFrame styleMask:CPTitledWindowMask | CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask];
-
-            windowController = [[CPWindowController alloc] initWithWindow:theWindow];
-        }
+        windowController = [[CPWindowController alloc] initWithWindow:theWindow];
     }
 
     if (windowController && viewController)
diff --git a/AppKit/CPDocumentController.j b/AppKit/CPDocumentController.j
index a36e96e4c..5551dd6f1 100644
--- a/AppKit/CPDocumentController.j
+++ b/AppKit/CPDocumentController.j
@@ -253,6 +253,14 @@ var CPSharedDocumentController = nil;
     return _documents;
 }
 
+/*!
+    Returns the CPDocument object associated with the main window.
+*/
+- (CPDocument)currentDocument
+{
+    return [[[CPApp mainWindow] windowController] document];
+}
+
 /*!
     Adds \c aDocument under the control of the receiver.
     @param aDocument the document to add
@@ -271,6 +279,33 @@ var CPSharedDocumentController = nil;
     [_documents removeObjectIdenticalTo:aDocument];
 }
 
+/*!
+    Returns the document object whose window controller
+    owns a specified window.
+*/
+- (CPDocument)documentForWindow:(CPWindow)aWindow
+{
+   return [[aWindow windowController] document];
+}
+
+/*!
+    Returns a Boolean value that indicates whether the receiver
+    has any documents with unsaved changes.
+*/
+- (BOOL)hasEditedDocuments
+{
+    var iter = [_documents objectEnumerator],
+        obj;
+
+    while ((obj = [iter nextObject]) !== nil)
+    {
+        if ([obj isDocumentEdited])
+            return YES;
+    }
+
+    return NO;
+}
+
 - (CPString)defaultType
 {
     return [_documentTypes[0] objectForKey:@"CPBundleTypeName"];
diff --git a/AppKit/CPEvent.j b/AppKit/CPEvent.j
index 478a08897..190065d4d 100644
--- a/AppKit/CPEvent.j
+++ b/AppKit/CPEvent.j
@@ -68,6 +68,11 @@ var _CPEventPeriodicEventPeriod         = 0,
     float               _deltaX;
     float               _deltaY;
     float               _deltaZ;
+
+#if PLATFORM(DOM)
+    BOOL                _suppressCappuccinoCut;
+    BOOL                _suppressCappuccinoPaste;
+#endif
 }
 
 /*!
@@ -473,6 +478,24 @@ var _CPEventPeriodicEventPeriod         = 0,
     return !firstResponderIsText;
 }
 
+/*!
+    Return YES if this event is a part of processing a browser controlled cut or paste event
+    where the browser will go ahead and do the work of cutting or pasting within the input
+    element after processing of this event. The implication is that it should not be done by
+    the CPTextField (or whatever else is controlling the input) since this would result in
+    nothing being cut (because the field already cut the text out), or a double paste
+    (because the field pasted as well as the browser).
+*/
+- (BOOL)_platformIsEffectingCutOrPaste
+{
+#if PLATFORM(DOM)
+    return _suppressCappuccinoCut || _suppressCappuccinoPaste;
+#else
+    return NO;
+#endif
+}
+
+
 /*!
     Generates periodic events every \c aPeriod seconds.
 
diff --git a/AppKit/CPFlashView.j b/AppKit/CPFlashView.j
index 071ad0ee2..13cc481a2 100644
--- a/AppKit/CPFlashView.j
+++ b/AppKit/CPFlashView.j
@@ -189,7 +189,7 @@ var IEFlashCLSID = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
     return @"CPFV_" + [self UID];
 }
 
-- (void)mouseMoved:(id)sommit
+- (void)mouseMoved:(CPEvent)sommit
 {
     [[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
 }
diff --git a/AppKit/CPFont.j b/AppKit/CPFont.j
index 5bfc16419..c9d53ebe2 100644
--- a/AppKit/CPFont.j
+++ b/AppKit/CPFont.j
@@ -208,7 +208,7 @@ following:
     var systemSize = String(_CPFontSystemFontSize),
         currentSize = String(CPFontCurrentSystemSize);
 
-    for (key in _CPSystemFontCache)
+    for (var key in _CPSystemFontCache)
     {
         if (_CPSystemFontCache.hasOwnProperty(key) &&
             (key.indexOf(systemSize) === 0 || key.indexOf(currentSize) === 0))
diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j
index cc9a9901f..e6b67317c 100644
--- a/AppKit/CPImage.j
+++ b/AppKit/CPImage.j
@@ -136,14 +136,19 @@ function CPAppKitImage(aFilename, aSize)
 
 /*!
     Initializes the image, by associating it with a filename. The image
-    denoted in \c aFilename is not actually loaded. It will
-    be loaded once needed.
+    denoted in \c aFilename is not actually loaded. It will be loaded
+    once needed.
+
     @param aFilename the file containing the image
     @param aSize the image's size
     @return the initialized image
 */
 - (id)initByReferencingFile:(CPString)aFilename size:(CGSize)aSize
 {
+    // Quietly return nil like in Cocoa, rather than crashing later.
+    if (aFilename === undefined || aFilename === nil)
+        return nil;
+
     self = [super init];
 
     if (self)
diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j
index a56f62c07..5f92e0fe9 100644
--- a/AppKit/CPImageView.j
+++ b/AppKit/CPImageView.j
@@ -87,26 +87,37 @@ var CPImageViewEmptyPlaceholderImage = nil;
     if (self)
     {
 #if PLATFORM(DOM)
-        _DOMImageElement = document.createElement("img");
-        _DOMImageElement.style.position = "absolute";
-        _DOMImageElement.style.left = "0px";
-        _DOMImageElement.style.top = "0px";
-
-        if ([CPPlatform supportsDragAndDrop])
-        {
-            _DOMImageElement.setAttribute("draggable", "true");
-            _DOMImageElement.style["-khtml-user-drag"] = "element";
-        }
-
-        CPDOMDisplayServerAppendChild(_DOMElement, _DOMImageElement);
-
-        _DOMImageElement.style.visibility = "hidden";
+        [self _createDOMImageElement];
 #endif
     }
 
     return self;
 }
 
+- (void)_createDOMImageElement
+{
+#if PLATFORM(DOM)
+    if (_DOMImageElement)
+        return;
+
+    _DOMImageElement = document.createElement("img");
+    _DOMImageElement.style.position = "absolute";
+    _DOMImageElement.style.left = "0px";
+    _DOMImageElement.style.top = "0px";
+
+    if ([CPPlatform supportsDragAndDrop])
+    {
+        _DOMImageElement.setAttribute("draggable", "true");
+        _DOMImageElement.style["-khtml-user-drag"] = "element";
+    }
+
+    _DOMImageElement.style.visibility = "hidden";
+    AppKitTagDOMElement(self, _DOMImageElement);
+
+    CPDOMDisplayServerAppendChild(_DOMElement, _DOMImageElement);
+#endif
+}
+
 /*!
     Returns the view's image.
 */
@@ -138,6 +149,9 @@ var CPImageViewEmptyPlaceholderImage = nil;
     var newImage = [self objectValue];
 
 #if PLATFORM(DOM)
+    if (!_DOMImageElement)
+        [self _createDOMImageElement];
+
     _DOMImageElement.src = newImage ? [newImage filename] : [CPImageViewEmptyPlaceholderImage filename];
 #endif
 
@@ -253,7 +267,7 @@ var CPImageViewEmptyPlaceholderImage = nil;
     [self setNeedsDisplay:YES];
 }
 
-- (unsigned)imageScaling
+- (CPUInteger)imageScaling
 {
     return [self currentValueForThemeAttribute:@"image-scaling"];
 }
@@ -488,7 +502,7 @@ var CPImageViewEmptyPlaceholderImage = nil;
     [_source setImage:image];
 }
 
-- (void)valueForBinding:(CPString)aBinding
+- (id)valueForBinding:(CPString)aBinding
 {
     var image = [_source image];
 
@@ -517,28 +531,12 @@ var CPImageViewImageKey          = @"CPImageViewImageKey",
 */
 - (id)initWithCoder:(CPCoder)aCoder
 {
-#if PLATFORM(DOM)
-    _DOMImageElement = document.createElement("img");
-    _DOMImageElement.style.position = "absolute";
-    _DOMImageElement.style.left = "0px";
-    _DOMImageElement.style.top = "0px";
-    _DOMImageElement.style.visibility = "hidden";
-    if ([CPPlatform supportsDragAndDrop])
-    {
-        _DOMImageElement.setAttribute("draggable", "true");
-        _DOMImageElement.style["-khtml-user-drag"] = "element";
-    }
-
-    if (typeof(appkit_tag_dom_elements) !== "undefined" && !!appkit_tag_dom_elements)
-        _DOMImageElement.setAttribute("data-cappuccino-view", [self className]);
-#endif
-
     self = [super initWithCoder:aCoder];
 
     if (self)
     {
 #if PLATFORM(DOM)
-        _DOMElement.appendChild(_DOMImageElement);
+        [self _createDOMImageElement];
 #endif
 
         [self setHasShadow:[aCoder decodeBoolForKey:CPImageViewHasShadowKey]];
@@ -564,17 +562,12 @@ var CPImageViewImageKey          = @"CPImageViewImageKey",
     // We do this in order to avoid encoding the _shadowView, which
     // should just automatically be created programmatically as needed.
     if (_shadowView)
-    {
-        var actualSubviews = _subviews;
-
-        _subviews = [_subviews copy];
-        [_subviews removeObjectIdenticalTo:_shadowView];
-    }
+        [_shadowView removeFromSuperview];
 
     [super encodeWithCoder:aCoder];
 
     if (_shadowView)
-        _subviews = actualSubviews;
+        [self addSubview:_shadowView];
 
     [aCoder encodeBool:_hasShadow forKey:CPImageViewHasShadowKey];
     [aCoder encodeInt:_imageAlignment forKey:CPImageViewImageAlignmentKey];
diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j
index 92a631c42..042b17e84 100644
--- a/AppKit/CPLevelIndicator.j
+++ b/AppKit/CPLevelIndicator.j
@@ -62,7 +62,7 @@ CPRatingLevelIndicatorStyle                 = 3;
     return "level-indicator";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"bezel-color": [CPNull null],
diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j
index 58630f9ab..53ff50570 100644
--- a/AppKit/CPMenu/CPMenu.j
+++ b/AppKit/CPMenu/CPMenu.j
@@ -278,7 +278,7 @@ var _CPMenuBarVisible               = NO,
     @param aMenuItem the item to insert
     @param anIndex the index in the menu to insert the item.
 */
-- (void)insertItem:(CPMenuItem)aMenuItem atIndex:(unsigned)anIndex
+- (void)insertItem:(CPMenuItem)aMenuItem atIndex:(CPUInteger)anIndex
 {
     [self insertObject:aMenuItem inItemsAtIndex:anIndex];
 }
@@ -291,7 +291,7 @@ var _CPMenuBarVisible               = NO,
     @param anIndex the index location in the menu for the new item
     @return the new menu item
 */
-- (CPMenuItem)insertItemWithTitle:(CPString)aTitle action:(SEL)anAction keyEquivalent:(CPString)aKeyEquivalent atIndex:(unsigned)anIndex
+- (CPMenuItem)insertItemWithTitle:(CPString)aTitle action:(SEL)anAction keyEquivalent:(CPString)aKeyEquivalent atIndex:(CPUInteger)anIndex
 {
     var item = [[CPMenuItem alloc] initWithTitle:aTitle action:anAction keyEquivalent:aKeyEquivalent];
 
@@ -335,7 +335,7 @@ var _CPMenuBarVisible               = NO,
     Removes the item at the specified index from the menu
     @param anIndex the index of the item to remove
 */
-- (void)removeItemAtIndex:(unsigned)anIndex
+- (void)removeItemAtIndex:(CPUInteger)anIndex
 {
     [self removeObjectFromItemsAtIndex:anIndex];
 }
@@ -355,7 +355,7 @@ var _CPMenuBarVisible               = NO,
     while (count--)
         [_items[count] setMenu:nil];
 
-    _highlightedIndex = CPNotFound;
+    [self _highlightItemAtIndex:CPNotFound];
 
     // Because we are changing _items directly, be sure to notify KVO
     [self willChangeValueForKey:@"items"];
@@ -621,7 +621,7 @@ var _CPMenuBarVisible               = NO,
 */
 - (void)update
 {
-    if (![self autoenablesItems])
+    if (!_autoenablesItems)
         return;
 
     var items = [self itemArray];
@@ -633,14 +633,24 @@ var _CPMenuBarVisible               = NO,
         if ([item hasSubmenu])
             continue;
 
-        var validator = [CPApp targetForAction:[item action] to:[item target] from:item];
+        // If there are enabled bindings for the item, they override anything else
+        var binder = [CPBinder getBinding:CPEnabledBinding forObject:item];
+
+        if (binder)
+        {
+            [binder setValueFor:CPEnabledBinding];
+            return;
+        }
+
+        var validator = [CPApp targetForAction:[item action] to:[item target] from:item],
+            shouldBeEnabled = YES;
 
         if (!validator)
         {
             // If targetForAction: returns nil, it could be that there is no action.
             // If there is an action and nil is returned, no valid target could be found.
             if ([item action] || [item target])
-                [item setEnabled:NO];
+                shouldBeEnabled = NO;
             else
             {
                 // Check to see if there is a target binding with an invalid selector
@@ -655,16 +665,18 @@ var _CPMenuBarVisible               = NO,
                         selector = [options valueForKey:CPSelectorNameBindingOption];
 
                     if (target && selector && ![target respondsToSelector:CPSelectorFromString(selector)])
-                        [item setEnabled:NO];
+                        shouldBeEnabled = NO;
                 }
             }
         }
         else if (![validator respondsToSelector:[item action]])
-            [item setEnabled:NO];
+            shouldBeEnabled = NO;
         else if ([validator respondsToSelector:@selector(validateMenuItem:)])
-            [item setEnabled:[validator validateMenuItem:item]];
+            shouldBeEnabled = [validator validateMenuItem:item];
         else if ([validator respondsToSelector:@selector(validateUserInterfaceItem:)])
-            [item setEnabled:[validator validateUserInterfaceItem:item]];
+            shouldBeEnabled = [validator validateUserInterfaceItem:item];
+
+        [item setEnabled:shouldBeEnabled];
     }
 
     [[_menuWindow _menuView] tile];
@@ -843,6 +855,9 @@ var _CPMenuBarVisible               = NO,
 
 + (void)popUpContextMenu:(CPMenu)aMenu withEvent:(CPEvent)anEvent forView:(CPView)aView withFont:(CPFont)aFont
 {
+    // This is needed when we are making several rights click
+    [[_CPMenuManager sharedMenuManager] cancelActiveMenu];
+
     [aMenu _menuWillOpen];
 
     if (!aFont)
@@ -851,8 +866,6 @@ var _CPMenuBarVisible               = NO,
     var theWindow = [aView window],
         menuWindow = [_CPMenuWindow menuWindowWithMenu:aMenu font:aFont];
 
-    [_CPMenuWindow poolMenuWindow:menuWindow];
-
     [menuWindow setBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle];
 
     var constraintRect = [CPMenu _constraintRectForView:aView],
@@ -1048,7 +1061,7 @@ var _CPMenuBarVisible               = NO,
     Sends the action of the menu item at the specified index.
     @param anIndex the index of the item
 */
-- (void)performActionForItemAtIndex:(unsigned)anIndex
+- (void)performActionForItemAtIndex:(CPUInteger)anIndex
 {
     var item = _items[anIndex];
 
@@ -1151,6 +1164,7 @@ var _CPMenuBarVisible               = NO,
             return;
 
     [aMenuItem setMenu:self];
+    [self _highlightItemAtIndex:CPNotFound];
     [_items insertObject:aMenuItem atIndex:anIndex];
 
     [[CPNotificationCenter defaultCenter]
@@ -1165,6 +1179,7 @@ var _CPMenuBarVisible               = NO,
         return;
 
     [[_items objectAtIndex:anIndex] setMenu:nil];
+    [self _highlightItemAtIndex:CPNotFound];
     [_items removeObjectAtIndex:anIndex];
 
     [[CPNotificationCenter defaultCenter]
@@ -1178,7 +1193,8 @@ var _CPMenuBarVisible               = NO,
 var CPMenuTitleKey              = @"CPMenuTitleKey",
     CPMenuNameKey               = @"CPMenuNameKey",
     CPMenuItemsKey              = @"CPMenuItemsKey",
-    CPMenuShowsStateColumnKey   = @"CPMenuShowsStateColumnKey";
+    CPMenuShowsStateColumnKey   = @"CPMenuShowsStateColumnKey",
+    CPMenuAutoEnablesItemsKey   = @"CPMenuAutoEnablesItemsKey";
 
 @implementation CPMenu (CPCoding)
 
@@ -1200,7 +1216,7 @@ var CPMenuTitleKey              = @"CPMenuTitleKey",
 
         _showsStateColumn = ![aCoder containsValueForKey:CPMenuShowsStateColumnKey] || [aCoder decodeBoolForKey:CPMenuShowsStateColumnKey];
 
-        _autoenablesItems = YES;
+        _autoenablesItems = ![aCoder containsValueForKey:CPMenuAutoEnablesItemsKey] || [aCoder decodeBoolForKey:CPMenuAutoEnablesItemsKey];
 
         [self setMinimumWidth:0];
     }
@@ -1223,6 +1239,9 @@ var CPMenuTitleKey              = @"CPMenuTitleKey",
 
     if (!_showsStateColumn)
         [aCoder encodeBool:_showsStateColumn forKey:CPMenuShowsStateColumnKey];
+
+    if (!_autoenablesItems)
+        [aCoder encodeBool:_autoenablesItems forKey:CPMenuAutoEnablesItemsKey];
 }
 
 @end
diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j
index dd5b7abaf..4712a7e7e 100644
--- a/AppKit/CPMenu/_CPMenuManager.j
+++ b/AppKit/CPMenu/_CPMenuManager.j
@@ -407,6 +407,15 @@ var STICKY_TIME_INTERVAL            = 0.4,
         [menu cancelTracking];
 }
 
+- (void)cancelActiveMenu
+{
+    if (CPApp._activeMenu)
+    {
+        [self completeTracking];
+        _menuContainerStack = [];
+    }
+}
+
 - (void)completeTracking
 {
     var trackingMenu = [self trackingMenu];
diff --git a/AppKit/CPMenu/_CPMenuWindow.j b/AppKit/CPMenu/_CPMenuWindow.j
index 19cf4d6f7..ddf53a7dd 100644
--- a/AppKit/CPMenu/_CPMenuWindow.j
+++ b/AppKit/CPMenu/_CPMenuWindow.j
@@ -72,7 +72,8 @@ _CPMenuWindowAttachedMenuBackgroundStyle    = 2;
 
 + (void)poolMenuWindow:(_CPMenuWindow)aMenuWindow
 {
-    if (!aMenuWindow || _CPMenuWindowPool.length >= _CPMenuWindowPoolCapacity)
+    // FIXME :the poolMenuWindow is called too many times somewhere....
+    if (!aMenuWindow || _CPMenuWindowPool.length >= _CPMenuWindowPoolCapacity || [_CPMenuWindowPool containsObject:aMenuWindow])
         return;
 
     _CPMenuWindowPool.push(aMenuWindow);
@@ -434,7 +435,7 @@ _CPMenuWindowAttachedMenuBackgroundStyle    = 2;
     return "menu-view";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"menu-window-more-above-image": [CPNull null],
diff --git a/AppKit/CPMenuItem/CPMenuItem.j b/AppKit/CPMenuItem/CPMenuItem.j
index 4db407605..480043bc1 100644
--- a/AppKit/CPMenuItem/CPMenuItem.j
+++ b/AppKit/CPMenuItem/CPMenuItem.j
@@ -166,6 +166,9 @@ var CPMenuItemStringRepresentationDictionary = @{
     if (_isEnabled === isEnabled)
         return;
 
+    if (!isEnabled && [self isHighlighted])
+        [_menu _highlightItemAtIndex:CPNotFound];
+
     _isEnabled = !!isEnabled;
 
     [_menuItemView setDirty];
diff --git a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j
index 8d213511d..265b78867 100644
--- a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j
+++ b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j
@@ -49,7 +49,7 @@
     return "menu-item-bar-view";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"horizontal-margin": 9.0,
@@ -84,25 +84,25 @@
     return self;
 }
 
-- (CPColor)setTextColor:(CPColor)aColor
+- (void)setTextColor:(CPColor)aColor
 {
     _textColor = aColor;
     [self setNeedsLayout];
 }
 
-- (CPColor)setTextShadowColor:(CPColor)aColor
+- (void)setTextShadowColor:(CPColor)aColor
 {
     _textShadowColor = aColor;
     [self setNeedsLayout];
 }
 
-- (CPColor)setHighlightTextColor:(CPColor)aColor
+- (void)setHighlightTextColor:(CPColor)aColor
 {
     _highlightTextColor = aColor;
     [self setNeedsLayout];
 }
 
-- (CPColor)setHighlightTextShadowColor:(CPColor)aColor
+- (void)setHighlightTextShadowColor:(CPColor)aColor
 {
     _highlightTextShadowColor = aColor;
     [self setNeedsLayout];
diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j
index 5a71538b2..2fc534b24 100644
--- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j
+++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j
@@ -45,7 +45,7 @@
     return "menu-item-standard-view";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"submenu-indicator-color": [CPNull null],
@@ -336,6 +336,11 @@
     }
 }
 
+- (BOOL)isHighlighted
+{
+    return _highlighted;
+}
+
 @end
 
 @implementation _CPMenuItemSubmenuIndicatorView : CPView
diff --git a/AppKit/CPMenuItem/_CPMenuItemView.j b/AppKit/CPMenuItem/_CPMenuItemView.j
index 9dc244b44..7156db2ed 100644
--- a/AppKit/CPMenuItem/_CPMenuItemView.j
+++ b/AppKit/CPMenuItem/_CPMenuItemView.j
@@ -34,7 +34,7 @@
 @implementation _CPMenuItemView : CPView
 {
     CPMenuItem              _menuItem;
-    CPView                  _view;
+    CPView                  _view       @accessors(property=view, readonly);
 
     CPFont                  _font;
     CPColor                 _textColor;
@@ -53,7 +53,7 @@
     return "menu-item-view";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{};
 }
@@ -112,7 +112,6 @@
             _view = menuItemView;
         }
     }
-
     else if ([_menuItem menu] == [CPApp mainMenu])
     {
         if (![_view isKindOfClass:[_CPMenuItemMenuBarView class]])
diff --git a/AppKit/CPObjectController.j b/AppKit/CPObjectController.j
index 497d35aed..ebdfcb43e 100644
--- a/AppKit/CPObjectController.j
+++ b/AppKit/CPObjectController.j
@@ -51,7 +51,7 @@
     CPCountedSet    _observedKeys;
 }
 
-+ (id)initialize
++ (void)initialize
 {
     if (self !== [CPObjectController class])
         return;
@@ -572,7 +572,7 @@ var CPObjectControllerContentKey                        = @"CPObjectControllerCo
     }
 }
 
-- (void)insertObject:(id)anObject atIndex:(unsigned)anIndex
+- (void)insertObject:(id)anObject atIndex:(CPUInteger)anIndex
 {
     for (var i = 0, count = [_observationProxies count]; i < count; i++)
     {
@@ -592,7 +592,7 @@ var CPObjectControllerContentKey                        = @"CPObjectControllerCo
     [super insertObject:anObject atIndex:anIndex];
 }
 
-- (void)removeObjectAtIndex:(unsigned)anIndex
+- (void)removeObjectAtIndex:(CPUInteger)anIndex
 {
     var currentObject = [self objectAtIndex:anIndex];
 
@@ -614,7 +614,7 @@ var CPObjectControllerContentKey                        = @"CPObjectControllerCo
     [super removeObjectAtIndex:anIndex];
 }
 
-- (_CPObservableArray)objectsAtIndexes:(CPIndexSet)theIndexes
+- (CPArray)objectsAtIndexes:(CPIndexSet)theIndexes
 {
     return [_CPObservableArray arrayWithArray:[super objectsAtIndexes:theIndexes]];
 }
@@ -629,7 +629,7 @@ var CPObjectControllerContentKey                        = @"CPObjectControllerCo
    [self removeObjectAtIndex:[self count]];
 }
 
-- (void)replaceObjectAtIndex:(unsigned)anIndex withObject:(id)anObject
+- (void)replaceObjectAtIndex:(CPUInteger)anIndex withObject:(id)anObject
 {
     var currentObject = [self objectAtIndex:anIndex];
 
diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j
index bc69b5d3f..220c50202 100644
--- a/AppKit/CPOutlineView.j
+++ b/AppKit/CPOutlineView.j
@@ -88,6 +88,57 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 
 #define SHOULD_SELECT_ITEM(anOutlineView, anItem) (!((anOutlineView)._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldSelectItem_) || [(anOutlineView)._outlineViewDelegate outlineView:(anOutlineView) shouldSelectItem:(anItem)])
 
+
+@protocol CPOutlineViewDelegate 
+
+@optional
+- (BOOL)outlineView:(CPOutlineView)anOutlineView isGroupItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldCollapseItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldEditTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldExpandItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldReorderColumn:(CPInteger)columnIndex toColumn:(CPInteger)newColumnIndex;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldSelectItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldSelectTableColumn:(CPTableColumn)aTableColumn;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldShowOutlineDisclosureControlForItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldShowViewExpansionForTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldTrackView:(CPView)aView forTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldTypeSelectForEvent:(CPEvent)anEvent withCurrentSearchString:(CPString)searchString;
+- (BOOL)selectionShouldChangeInOutlineView:(CPOutlineView)anOutlineView;
+- (CPIndexSet)outlineView:(CPOutlineView)anOutlineView selectionIndexesForProposedSelection:(CPIndexSet)proposedSelectionIndexes;
+- (CPMenu)outlineView:(CPOutlineView)anOutlineView menuForTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (CPString)outlineView:(CPOutlineView)anOutlineView toolTipForView:(CPView)aView rect:(CGRect)aRect tableColumn:(CPTableColumn)aTableColumn item:(id)anItem mouseLocation:(CGPoint)mouseLocation;
+- (CPString)outlineView:(CPOutlineView)anOutlineView typeSelectStringForTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (CPView)outlineView:(CPOutlineView)anOutlineView dataViewForTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (CPView)outlineView:(CPOutlineView)anOutlineView viewForTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (float)outlineView:(CPOutlineView)anOutlineView heightOfRowByItem:(id)anItem;
+- (float)outlineView:(CPOutlineView)anOutlineView sizeToFitWidthOfColumn:(CPTableColumn)aTableColumn;
+- (id)outlineView:(CPOutlineView)anOutlineView nextTypeSelectMatchFromItem:(id)startItem toItem:(id)endItem forString:(CPString)searchString;
+- (void)outlineView:(CPOutlineView)anOutlineView didClickTableColumn:(CPTableColumn)aTableColumn;
+- (void)outlineView:(CPOutlineView)anOutlineView didDragTableColumn:(CPTableColumn)aTableColumn;
+- (void)outlineView:(CPOutlineView)anOutlineView mouseDownInHeaderOfTableColumn:(CPTableColumn)aTableColumn;
+- (void)outlineView:(CPOutlineView)anOutlineView willDisplayOutlineView:(CPView)aView forTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+- (void)outlineView:(CPOutlineView)anOutlineView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)aTableColumn item:(id)anItem;
+
+@end
+
+
+@protocol CPOutlineViewDataSource 
+
+@optional
+- (BOOL)outlineView:(CPOutlineView)anOutlineView acceptDrop:(id /**/)info item:(id)anItem childIndex:(CPInteger)anIndex;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView shouldDeferDisplayingChildrenOfItem:(id)anItem;
+- (BOOL)outlineView:(CPOutlineView)anOutlineView writeItems:(CPArray)items toPasteboard:(CPPasteboard)pboard;
+- (CPArray)outlineView:(CPOutlineView)anOutlineView namesOfPromisedFilesDroppedAtDestination:(CPURL)dropDestination forDraggedItems:(CPArray)items;
+- (CPDragOperation)outlineView:(CPOutlineView)anOutlineView validateDrop:(id /**/)info proposedItem:(id)anItem proposedChildIndex:(CPInteger)anIndex;
+- (CPDragOperation)outlineView:(CPOutlineView)anOutlineView validateDrop:(id /**/)info proposedRow:(int)theRow proposedDropOperation:(CPTableViewDropOperation)theOperation;
+- (id)outlineView:(CPOutlineView)anOutlineView itemForPersistentObject:(id)anObject;
+- (id)outlineView:(CPOutlineView)anOutlineView objectValueforTableColumn:(CPTableColumn)aTableColumn byItem:(id)anItem;
+- (id)outlineView:(CPOutlineView)anOutlineView persistentObjectForItem:(id)anItem;
+- (void)outlineView:(CPOutlineView)anOutlineView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn byItem:(id)anItem;
+- (void)outlineView:(CPOutlineView)anOutlineView sortDescriptorsDidChange:(CPArray)oldDescriptors;
+
+@end
+
 /*!
     @ingroup appkit
     @class CPOutlineView
@@ -105,34 +156,34 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 */
 @implementation CPOutlineView : CPTableView
 {
-    id              _outlineViewDataSource;
-    id              _outlineViewDelegate;
-    CPTableColumn   _outlineTableColumn;
+    id     _outlineViewDataSource;
+    id       _outlineViewDelegate;
+    CPTableColumn                   _outlineTableColumn;
 
-    float           _indentationPerLevel;
-    BOOL            _indentationMarkerFollowsDataView;
+    float                           _indentationPerLevel;
+    BOOL                            _indentationMarkerFollowsDataView;
 
-    CPInteger       _implementedOutlineViewDataSourceMethods;
-    CPInteger       _implementedOutlineViewDelegateMethods;
+    CPInteger                       _implementedOutlineViewDataSourceMethods;
+    CPInteger                       _implementedOutlineViewDelegateMethods;
 
-    Object          _rootItemInfo;
-    CPMutableArray  _itemsForRows;
-    Object          _itemInfosForItems;
+    Object                          _rootItemInfo;
+    CPMutableArray                  _itemsForRows;
+    Object                          _itemInfosForItems;
 
-    CPControl       _disclosureControlPrototype;
-    CPArray         _disclosureControlsForRows;
-    CPData          _disclosureControlData;
-    CPArray         _disclosureControlQueue;
+    CPControl                       _disclosureControlPrototype;
+    CPArray                         _disclosureControlsForRows;
+    CPData                          _disclosureControlData;
+    CPArray                         _disclosureControlQueue;
 
-    BOOL            _shouldRetargetItem;
-    id              _retargetedItem;
+    BOOL                            _shouldRetargetItem;
+    id                              _retargetedItem;
 
-    BOOL            _shouldRetargetChildIndex;
-    CPInteger       _retargedChildIndex;
-    CPTimer         _dragHoverTimer;
-    id              _dropItem;
+    BOOL                            _shouldRetargetChildIndex;
+    CPInteger                       _retargedChildIndex;
+    CPTimer                         _dragHoverTimer;
+    id                              _dropItem;
 
-    BOOL            _coalesceSelectionNotificationState;
+    BOOL                            _coalesceSelectionNotificationState;
 }
 
 - (id)initWithFrame:(CGRect)aFrame
@@ -218,7 +269,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     If you want the drag to begin you should return YES and place the drag data on the pboard.
     @code - (BOOL)outlineView:(CPOutlineView)outlineView writeItems:(CPArray)items toPasteboard:(CPPasteboard)pboard; @endcode
 */
-- (void)setDataSource:(id)aDataSource
+- (void)setDataSource:(id )aDataSource
 {
     if (_outlineViewDataSource === aDataSource)
         return;
@@ -352,6 +403,10 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 */
 - (void)expandItem:(id)anItem expandChildren:(BOOL)shouldExpandChildren
 {
+    if ([self _delegateRespondsToShouldExpandItem])
+        if ([_outlineViewDelegate outlineView:self shouldExpandItem:anItem] == NO)
+            return;
+
     var itemInfo = null;
 
     if (!anItem)
@@ -427,6 +482,10 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     if (!anItem)
         return;
 
+    if ([self _delegateRespondsToShouldCollapseItem])
+        if ([_outlineViewDelegate outlineView:self shouldCollapseItem:anItem] == NO)
+            return;
+
     var itemInfo = _itemInfosForItems[[anItem UID]];
 
     if (!itemInfo)
@@ -721,16 +780,25 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 
 /*!
     @ignore
-    Select or deselect rows, this is overridden because we need to change the color or the outline control.
+    Select or deselect rows, this is overridden because we need to change the color of the outline control.
 */
-- (void)_performSelection:(BOOL)select forRow:(CPInteger)rowIndex context:(id)context
+- (void)_setSelectedRowIndexes:(CPIndexSet)rows
 {
-    [super _performSelection:select forRow:rowIndex context:context];
+    if (_disclosureControlsForRows.length)
+    {
+        var indexes = [_selectedRowIndexes copy];
+        [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, _itemsForRows.length - _disclosureControlsForRows.length)];
+        [[_disclosureControlsForRows objectsAtIndexes:indexes] makeObjectsPerformSelector:@selector(unsetThemeState:) withObject:CPThemeStateSelected];
+    }
 
-    var control = _disclosureControlsForRows[rowIndex],
-        selector = select ? @"setThemeState:" : @"unsetThemeState:";
+    [super _setSelectedRowIndexes:rows];
 
-    [control performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelected];
+    if (_disclosureControlsForRows.length)
+    {
+        var indexes = [_selectedRowIndexes copy];
+        [indexes removeIndexesInRange:CPMakeRange(_disclosureControlsForRows.length, _itemsForRows.length - _disclosureControlsForRows.length)];
+        [[_disclosureControlsForRows objectsAtIndexes:indexes] makeObjectsPerformSelector:@selector(setThemeState:) withObject:CPThemeStateSelected];
+    }
 }
 
 /*!
@@ -809,7 +877,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     @code - (int)outlineView:(CPOutlineView)outlineView heightOfRowByItem:(id)anItem; @endcode
 
 */
-- (void)setDelegate:(id)aDelegate
+- (void)setDelegate:(id )aDelegate
 {
     if (_outlineViewDelegate === aDelegate)
         return;
@@ -1061,7 +1129,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     @ignore
     We need to offset the dataview and add the disclosure triangle.
 */
-- (CPView)_dragViewForColumn:(int)theColumnIndex event:(CPEvent)theDragEvent offset:(CGPoint)theDragViewOffset
+- (CPView)_dragViewForColumn:(CPInteger)theColumnIndex event:(CPEvent)theDragEvent offset:(CGPoint)theDragViewOffset
 {
     var dragView = [[_CPColumnDragView alloc] initWithLineColor:[self gridColor]],
         tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex],
@@ -1194,7 +1262,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 /*!
     @ignore
 */
-- (id)_parentItemForUpperRow:(int)theUpperRowIndex andLowerRow:(int)theLowerRowIndex atMouseOffset:(CGPoint)theOffset
+- (id)_parentItemForUpperRow:(CPInteger)theUpperRowIndex andLowerRow:(CPInteger)theLowerRowIndex atMouseOffset:(CGPoint)theOffset
 {
     if (_shouldRetargetItem)
         return _retargetedItem;
@@ -1224,7 +1292,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
 /*!
     @ignore
 */
-- (CGRect)_rectForDropHighlightViewBetweenUpperRow:(int)theUpperRowIndex andLowerRow:(int)theLowerRowIndex offset:(CGPoint)theOffset
+- (CGRect)_rectForDropHighlightViewBetweenUpperRow:(CPInteger)theUpperRowIndex andLowerRow:(CPInteger)theLowerRowIndex offset:(CGPoint)theOffset
 {
     // Call super and the update x to reflect the current indentation level
     var rect = [super _rectForDropHighlightViewBetweenUpperRow:theUpperRowIndex andLowerRow:theLowerRowIndex offset:theOffset],
@@ -1540,12 +1608,12 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     [super keyDown:anEvent];
 }
 
-- (CPView)_viewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
+- (CPView)_sendDelegateViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
 {
     return [_outlineViewDelegate outlineView:self viewForTableColumn:aTableColumn item:[self itemAtRow:aRow]];
 }
 
-- (CPView)_dataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
+- (CPView)_sendDelegateDataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
 {
     return [_outlineViewDelegate outlineView:self dataViewForTableColumn:aTableColumn item:[self itemAtRow:aRow]];
 }
@@ -1565,6 +1633,34 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff  = 0,
     return _implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_dataViewForTableColumn_item_;
 }
 
+- (BOOL)_delegateRespondsToShouldExpandItem
+{
+    return _implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldExpandItem_;
+}
+
+- (BOOL)_delegateRespondsToShouldCollapseItem
+{
+    return _implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldCollapseItem_;
+}
+
+/*!
+    @ignore
+    Return YES if the delegate implements outlineView:selectionIndexesForProposedSelection
+*/
+- (BOOL)_delegateRespondsToSelectionIndexesForProposedSelection
+{
+    return _implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_selectionIndexesForProposedSelection_;
+}
+
+/*!
+    @ignore
+    Return YES if the delegate implements outlineView:shouldSelectItem:
+*/
+- (BOOL)_delegateRespondsToShouldSelectRow
+{
+    return _implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldSelectItem_;
+}
+
 @end
 
 // FIX ME: We're using with() here because Safari fails if we use anOutlineView._itemInfosForItems or whatever...
@@ -1762,7 +1858,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return [_outlineView._outlineViewDataSource outlineView:_outlineView writeItems:items toPasteboard:thePasteboard];
 }
 
-- (int)_childIndexForDropOperation:(CPTableViewDropOperation)theDropOperation row:(int)theRow offset:(CGPoint)theOffset
+- (int)_childIndexForDropOperation:(CPTableViewDropOperation)theDropOperation row:(CPInteger)theRow offset:(CGPoint)theOffset
 {
     if (_outlineView._shouldRetargetChildIndex)
         return _outlineView._retargedChildIndex;
@@ -1786,7 +1882,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return childIndex;
 }
 
-- (void)_parentItemForDropOperation:(CPTableViewDropOperation)theDropOperation row:(int)theRow offset:(CGPoint)theOffset
+- (void)_parentItemForDropOperation:(CPTableViewDropOperation)theDropOperation row:(CPInteger)theRow offset:(CGPoint)theOffset
 {
     if (theDropOperation === CPTableViewDropAbove)
         return [_outlineView _parentItemForUpperRow:theRow - 1 andLowerRow:theRow atMouseOffset:theOffset]
@@ -1794,8 +1890,8 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return [_outlineView itemAtRow:theRow];
 }
 
-- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id < CPDraggingInfo >)theInfo
-    proposedRow:(int)theRow proposedDropOperation:(CPTableViewDropOperation)theOperation
+- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id /*< CPDraggingInfo >*/)theInfo
+    proposedRow:(CPInteger)theRow proposedDropOperation:(CPTableViewDropOperation)theOperation
 {
     if (!(_outlineView._implementedOutlineViewDataSourceMethods & CPOutlineViewDataSource_outlineView_validateDrop_proposedItem_proposedChildIndex_))
         return CPDragOperationNone;
@@ -1814,7 +1910,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return [_outlineView._outlineViewDataSource outlineView:_outlineView validateDrop:theInfo proposedItem:parentItem proposedChildIndex:childIndex];
 }
 
-- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id )theInfo row:(int)theRow dropOperation:(CPTableViewDropOperation)theOperation
+- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id /**/)theInfo row:(CPInteger)theRow dropOperation:(CPTableViewDropOperation)theOperation
 {
     if (!(_outlineView._implementedOutlineViewDataSourceMethods & CPOutlineViewDataSource_outlineView_acceptDrop_item_childIndex_))
         return NO;
@@ -1858,7 +1954,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return self;
 }
 
-- (BOOL)tableView:(CPTableView)theTableView shouldSelectRow:(int)theRow
+- (BOOL)tableView:(CPTableView)theTableView shouldSelectRow:(CPInteger)theRow
 {
     return SHOULD_SELECT_ITEM(_outlineView, [_outlineView itemAtRow:theRow]);
 }
@@ -1868,7 +1964,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return SELECTION_SHOULD_CHANGE(_outlineView);
 }
 
-- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aColumn row:(int)aRow
+- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow
 {
     if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldEditTableColumn_item_))
         return [_outlineView._outlineViewDelegate outlineView:_outlineView shouldEditTableColumn:aColumn item:[_outlineView itemAtRow:aRow]];
@@ -1876,7 +1972,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return NO;
 }
 
-- (float)tableView:(CPTableView)theTableView heightOfRow:(int)theRow
+- (float)tableView:(CPTableView)theTableView heightOfRow:(CPInteger)theRow
 {
     if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_heightOfRowByItem_))
         return [_outlineView._outlineViewDelegate outlineView:_outlineView heightOfRowByItem:[_outlineView itemAtRow:theRow]];
@@ -1884,7 +1980,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return [theTableView rowHeight];
 }
 
-- (void)tableView:(CPTableView)aTableView willDisplayView:(id)aView forTableColumn:(CPTableColumn)aTableColumn row:(int)aRowIndex
+- (void)tableView:(CPTableView)aTableView willDisplayView:(id)aView forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex
 {
     if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_willDisplayView_forTableColumn_item_))
     {
@@ -1893,7 +1989,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     }
 }
 
-- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(int)aRow
+- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(CPInteger)aRow
 {
     if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_isGroupItem_))
         return [_outlineView._outlineViewDelegate outlineView:_outlineView isGroupItem:[_outlineView itemAtRow:aRow]];
@@ -1901,7 +1997,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return NO;
 }
 
-- (CPMenu)tableView:(CPTableView)aTableView menuForTableColumn:(CPTableColumn)aTableColumn row:(int)aRow
+- (CPMenu)tableView:(CPTableView)aTableView menuForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
 {
     if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_menuForTableColumn_item_))
     {
@@ -1914,6 +2010,22 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return [_outlineView menu] || [[_outlineView class] defaultMenu];
 }
 
+- (CPIndexSet)tableView:(CPTableView)aTableView selectionIndexesForProposedSelection:(CPIndexSet)anIndexSet
+{
+    if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_selectionIndexesForProposedSelection_))
+        return [_outlineView._outlineViewDelegate outlineView:_outlineView selectionIndexesForProposedSelection:anIndexSet];
+
+    return anIndexSet;
+}
+
+- (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn
+{
+    if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldSelectTableColumn_))
+        return [_outlineView._outlineViewDelegate outlineView:_outlineView shouldSelectTableColumn:aTableColumn];
+
+    return YES;
+}
+
 @end
 
 @implementation CPDisclosureButton : CPButton
@@ -1931,7 +2043,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     return self;
 }
 
-- (void)setState:(CPState)aState
+- (void)setState:(CPInteger)aState
 {
     [super setState:aState];
 
diff --git a/AppKit/CPPasteboard.j b/AppKit/CPPasteboard.j
index 0e943dbaa..e93d1ddfa 100644
--- a/AppKit/CPPasteboard.j
+++ b/AppKit/CPPasteboard.j
@@ -191,10 +191,12 @@ var CPPasteboards = nil,
     _owners = @{};
     _provided = @{};
 
-    var count = _types.length;
-
-    while (count--)
-        [_owners setObject:anOwner forKey:_types[count]];
+    if (anOwner)
+    {
+        var count = _types.length;
+        while (count--)
+            [_owners setObject:anOwner forKey:_types[count]];
+    }
 
     if (_nativePasteboard && shouldUpdate)
     {
@@ -205,6 +207,7 @@ var CPPasteboards = nil,
         _nativePasteboard.declareTypes_(nativeTypes);
         _changeCount = _nativePasteboard.changeCount();
     }
+
     return ++_changeCount;
 }
 
@@ -243,6 +246,10 @@ var CPPasteboards = nil,
 */
 - (void)setString:(CPString)aString forType:(CPString)aType
 {
+    // Putting a non-string on the string pasteboard can lead to strange crashes.
+    if (aString && aString.isa && ![aString isKindOfClass:CPString])
+        [CPException raise:CPInvalidArgumentException reason:"CPPasteboard setString:forType: must be called with a string."];
+
     [self setPropertyList:aString forType:aType];
 }
 
diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j
index 08800bf1b..01b1d7532 100644
--- a/AppKit/CPPopUpButton.j
+++ b/AppKit/CPPopUpButton.j
@@ -279,7 +279,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
     Selects the item at the specified index
     @param anIndex the index of the item to select
 */
-- (void)setObjectValue:(int)anIndex
+- (void)setObjectValue:(id)anIndex
 {
     var indexOfSelectedItem = [self objectValue];
 
@@ -344,7 +344,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
     Returns the item at the specified index or \c nil if the item does not exist.
     @param anIndex the index of the item to obtain
 */
-- (CPMenuItem)itemAtIndex:(unsigned)anIndex
+- (CPMenuItem)itemAtIndex:(CPUInteger)anIndex
 {
     return [[self menu] itemAtIndex:anIndex];
 }
@@ -353,7 +353,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
     Returns the title of the item at the specified index or \c nil if no item exists.
     @param anIndex the index of the item
 */
-- (CPString)itemTitleAtIndex:(unsigned)anIndex
+- (CPString)itemTitleAtIndex:(CPUInteger)anIndex
 {
     return [[[self menu] itemAtIndex:anIndex] title];
 }
@@ -838,7 +838,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
     [self _setContentValuesIfNeeded:contentArray];
 }
 
-- (void)valueForBinding:(CPString)aBinding
+- (id)valueForBinding:(CPString)aBinding
 {
     return [self _content];
 }
@@ -910,7 +910,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
 {
 }
 
-- (void)setValue:(id)aValue forBinding:(CPString)aBinding
+- (void)setValue:(CPArray)aValue forBinding:(CPString)aBinding
 {
     [super _setContent:aValue];
 }
diff --git a/AppKit/CPPopover.j b/AppKit/CPPopover.j
index cc2048d5e..760e4edab 100644
--- a/AppKit/CPPopover.j
+++ b/AppKit/CPPopover.j
@@ -238,6 +238,7 @@ Set the behavior of the CPPopover. It can be:
         _popoverWindow = [[_CPPopoverWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:[self styleMaskForBehavior]];
     }
 
+    [_popoverWindow setPlatformWindow:[[positioningView window] platformWindow]];
     [_popoverWindow setAppearance:_appearance];
     [_popoverWindow setAnimates:_animates];
     [_popoverWindow setDelegate:self];
diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j
index 3953b790d..446578c7c 100644
--- a/AppKit/CPRadio.j
+++ b/AppKit/CPRadio.j
@@ -152,7 +152,7 @@ CPRadioImageOffset = 4.0;
         [_radioGroup _setSelectedRadio:self];
 }
 
-- (void)sendAction:(SEL)anAction to:(id)anObject
+- (BOOL)sendAction:(SEL)anAction to:(id)anObject
 {
     [super sendAction:anAction to:anObject];
 
diff --git a/AppKit/CPResponder.j b/AppKit/CPResponder.j
index 1bf73056d..08e3db3ac 100644
--- a/AppKit/CPResponder.j
+++ b/AppKit/CPResponder.j
@@ -356,7 +356,7 @@ CPDeleteForwardKeyCode  = 46;
 var CPResponderNextResponderKey = @"CPResponderNextResponderKey",
     CPResponderMenuKey = @"CPResponderMenuKey";
 
-@implementation CPResponder (CPCoding)
+@implementation CPResponder (CPCoding) 
 
 /*!
     Initializes the responder with data from a coder.
diff --git a/AppKit/CPRuleEditor/CPPredicateEditor.j b/AppKit/CPRuleEditor/CPPredicateEditor.j
index 097d4f1b1..16cf1f685 100644
--- a/AppKit/CPRuleEditor/CPPredicateEditor.j
+++ b/AppKit/CPRuleEditor/CPPredicateEditor.j
@@ -484,7 +484,7 @@
 
 #pragma mark RuleEditor delegate methods
 
-- (int)_queryNumberOfChildrenOfItem:(id)rowItem withRowType:(int)type
+- (int)_queryNumberOfChildrenOfItem:(id)rowItem withRowType:(CPRuleEditorRowType)type
 {
     if (rowItem == nil)
     {
@@ -494,7 +494,7 @@
     return [[rowItem children] count];
 }
 
-- (id)_queryChild:(int)childIndex ofItem:(id)rowItem withRowType:(int)type
+- (id)_queryChild:(int)childIndex ofItem:(id)rowItem withRowType:(CPRuleEditorRowType)type
 {
     if (rowItem == nil)
     {
@@ -505,7 +505,7 @@
     return [[rowItem children] objectAtIndex:childIndex];
 }
 
-- (id)_queryValueForItem:(id)rowItem inRow:(int)rowIndex
+- (id)_queryValueForItem:(id)rowItem inRow:(CPInteger)rowIndex
 {
     return [rowItem displayValue];
 }
@@ -516,7 +516,7 @@ var CPPredicateTemplatesKey = @"CPPredicateTemplates";
 
 @implementation CPPredicateEditor (CPCoding)
 
-- (id)initWithCoder:(id)aCoder
+- (id)initWithCoder:(CPCoder)aCoder
 {
     self = [super initWithCoder:aCoder];
 
@@ -531,7 +531,7 @@ var CPPredicateTemplatesKey = @"CPPredicateTemplates";
     return self;
 }
 
-- (void)encodeWithCoder:(id)aCoder
+- (void)encodeWithCoder:(CPCoder)aCoder
 {
     [super encodeWithCoder:aCoder];
     [aCoder encodeObject:_allTemplates forKey:CPPredicateTemplatesKey];
diff --git a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j
index 21e6043f5..194d27e56 100644
--- a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j
+++ b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j
@@ -27,8 +27,7 @@
 @import "CPMenuItem.j"
 @import "CPTextField.j"
 
-// NOTE: CPDatePicker is not implemented yet
-@class CPDatePicker
+@import "CPDatePicker.j"
 
 
 CPUndefinedAttributeType     = 0;
@@ -488,7 +487,36 @@ CPTransformableAttributeType = 1800;
 
 - (id)copy
 {
-    return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:self]];
+    var views = [CPArray array];
+
+    var copy = [[[self class] alloc] init];
+    [copy _setTemplateType:_templateType];
+    [copy _setOptions:_predicateOptions];
+    [copy _setModifier:_predicateModifier];
+    [copy _setLeftAttributeType:_leftAttributeType];
+    [copy _setRightAttributeType:_rightAttributeType];
+    [copy setLeftIsWildcard:_leftIsWildcard];
+    [copy setRightIsWildcard:_rightIsWildcard];
+
+    [_views enumerateObjectsUsingBlock:function(aView, idx, stop)
+    {
+        var vcopy;
+
+        if ([aView implementsSelector:@selector(copy)])
+        {
+            vcopy = [aView copy];
+        }
+        else
+        {
+            vcopy = [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:aView]];
+        }
+
+        [views addObject:vcopy];
+    }];
+
+    [copy setTemplateViews:views];
+
+    return copy;
 }
 
 + (id)_operatorsForAttributeType:(CPAttributeType)attributeType
@@ -680,7 +708,7 @@ CPTransformableAttributeType = 1800;
         view = [[CPCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 26)];
     }
     else if (attributeType == CPDateAttributeType)
-        view = [[CPDatePicker alloc] initWithFrame:CGRectMake(0, 0, 150, 26)];
+        view = [[CPDatePicker alloc] initWithFrame:CGRectMake(0, 0, 180, 26)];
     else
         return nil;
 
@@ -702,12 +730,12 @@ CPTransformableAttributeType = 1800;
     return textField;
 }
 
-- (void)_setOptions:(unsigned int)options
+- (void)_setOptions:(unsigned)options
 {
     _predicateOptions = options;
 }
 
-- (void)_setModifier:(unsigned int)modifier
+- (void)_setModifier:(unsigned)modifier
 {
     _predicateModifier = modifier;
 }
@@ -797,5 +825,31 @@ var CPPredicateTemplateTypeKey = @"CPPredicateTemplateType",
     [coder encodeObject:_views forKey:CPPredicateTemplateViewsKey];
 }
 
+@end
+
+// Copy support for built-in types
+@implementation CPDatePicker (CPCopying)
+
+- (id)copy
+{
+    var ret = [[[self class] alloc] initWithFrame:[self frame]];
+
+    [ret setTextFont:[self textFont]];
+    [ret setMinDate:[self minDate]];
+    [ret setMaxDate:[self maxDate]];
+    [ret setTimeInterval:[self timeInterval]];
+    [ret setDatePickerMode:[self datePickerMode]];
+    [ret setDatePickerElements:[self datePickerElements]];
+    [ret setDatePickerStyle:[self datePickerStyle]];
+    [ret setLocale:[self locale]];
+    [ret setDateValue:[self dateValue]];
+    [ret setBackgroundColor:[self backgroundColor]];
+    [ret setDrawsBackground:[self drawsBackground]];
+    [ret setBordered:[self isBordered]];
+    [ret _init];
+
+    return ret;
+}
+
 @end
 /*! @endcond */
diff --git a/AppKit/CPRuleEditor/CPRuleEditor.j b/AppKit/CPRuleEditor/CPRuleEditor.j
index 50e2905b8..e5e6248eb 100644
--- a/AppKit/CPRuleEditor/CPRuleEditor.j
+++ b/AppKit/CPRuleEditor/CPRuleEditor.j
@@ -122,7 +122,7 @@ var CPRuleEditorItemPBoardType  = @"CPRuleEditorItemPBoardType",
     return @"rule-editor";
 }
 
-+ (id)themeAttributes
++ (CPDictionary)themeAttributes
 {
     return @{
             @"alternating-row-colors": [CPNull null],
@@ -461,7 +461,7 @@ var CPRuleEditorItemPBoardType  = @"CPRuleEditorItemPBoardType",
     @param row The index of a row in the receiver.
     @return The currently chosen items for row @a row.
 */
-- (id)criteriaForRow:(int)row
+- (id)criteriaForRow:(CPInteger)row
 {
     var rowcache = [self _rowCacheForIndex:row];
     if (rowcache)
@@ -480,7 +480,7 @@ var CPRuleEditorItemPBoardType  = @"CPRuleEditorItemPBoardType",
     @return The chosen values (strings, views, or menu items) for row row.
     @discussion The values returned are the same as those returned from the delegate method -#ruleEditor:displayValueForCriterion:inRow:
 */
-- (CPMutableArray)displayValuesForRow:(int)row
+- (CPMutableArray)displayValuesForRow:(CPInteger)row
 {
     var rowcache = [self _rowCacheForIndex:row];
     if (rowcache)
@@ -503,7 +503,7 @@ var CPRuleEditorItemPBoardType  = @"CPRuleEditorItemPBoardType",
     @param rowIndex The index of a row in the receiver.
     @return The index of the parent of the row at @a rowIndex. If the row at @a rowIndex is a root row, returns @c -1.
 */
-- (int)parentRowForRow:(int)rowIndex
+- (int)parentRowForRow:(CPInteger)rowIndex
 {
     if (rowIndex < 0 || rowIndex >= [self numberOfRows])
         [CPException raise:CPRangeException reason:_cmd + @" row " + rowIndex + " is out of range"];
@@ -544,7 +544,7 @@ TODO: implement
     @return The type of the row at @a rowIndex.
     @warning Raises a @c CPRangeException if rowIndex is less than @c 0 or greater than or equal to the number of rows.
 */
-- (CPRuleEditorRowType)rowTypeForRow:(int)rowIndex
+- (CPRuleEditorRowType)rowTypeForRow:(CPInteger)rowIndex
 {
     if (rowIndex < 0 || rowIndex > [self numberOfRows])
         [CPException raise:CPRangeException reason:_cmd + @"row " + rowIndex + " is out of range"];
@@ -565,7 +565,7 @@ TODO: implement
     @return The immediate subrows of the row at @a rowIndex.
     @discussion Rows are numbered starting at @c 0.
 */
-- (CPIndexSet)subrowIndexesForRow:(int)rowIndex
+- (CPIndexSet)subrowIndexesForRow:(CPInteger)rowIndex
 {
     var object;
 
@@ -691,7 +691,7 @@ TODO: implement
     @note Currently, @a shouldAnimate has no effect, rows are always animated when calling this method.
     @see addRow:
 */
-- (void)insertRowAtIndex:(int)rowIndex withType:(unsigned int)rowType asSubrowOfRow:(int)parentRow animate:(BOOL)shouldAnimate
+- (void)insertRowAtIndex:(int)rowIndex withType:(unsigned int)rowType asSubrowOfRow:(CPInteger)parentRow animate:(BOOL)shouldAnimate
 {
 /*
     TODO: raise exceptions if parentRow is greater than or equal to rowIndex, or if rowIndex would fall amongst the children of some other parent, or if the nesting mode forbids this configuration.
@@ -1313,7 +1313,7 @@ TODO: implement
     return [_boundArrayOwner mutableArrayValueForKey:_boundArrayKeyPath];
 }
 
-- (BOOL)_nextUnusedItems:(CPArray)items andValues:(CPArray)values forRow:(int)rowIndex forRowType:(unsigned int)type
+- (BOOL)_nextUnusedItems:(CPArray)items andValues:(CPArray)values forRow:(CPInteger)rowIndex forRowType:(unsigned int)type
 {
     var parentItem = [items lastObject], // if empty items array, this is NULL aka the root item;
         childrenCount = [self _queryNumberOfChildrenOfItem:parentItem withRowType:type],
@@ -1375,7 +1375,7 @@ TODO: implement
     return YES;
 }
 
-- (CPMutableArray)_getItemsAndValuesToAddForRow:(int)rowIndex ofType:(CPRuleEditorRowType)type
+- (CPMutableArray)_getItemsAndValuesToAddForRow:(CPInteger)rowIndex ofType:(CPRuleEditorRowType)type
 {
     //var cachedItemsAndValues = _itemsAndValuesToAddForRowType[type];
     //if (cachedItemsAndValues)
@@ -1418,7 +1418,7 @@ TODO: implement
     [self insertRowAtIndex:insertIndex withType:type asSubrowOfRow:parentRowIndex animate:YES];
 }
 
-- (id)_insertNewRowAtIndex:(int)insertIndex ofType:(CPRuleEditorRowType)rowtype withParentRow:(int)parentRowIndex
+- (id)_insertNewRowAtIndex:(int)insertIndex ofType:(CPRuleEditorRowType)rowtype withParentRow:(CPInteger)parentRowIndex
 {
     var row = [[[self rowClass] alloc] init],
         itemsandvalues = [self _getItemsAndValuesToAddForRow:insertIndex ofType:rowtype],
@@ -1520,7 +1520,7 @@ TODO: implement
     }
 }
 
-- (void)_changedItem:(id)fromItem toItem:(id)toItem inRow:(int)aRow atCriteriaIndex:(int)fromItemIndex
+- (void)_changedItem:(id)fromItem toItem:(id)toItem inRow:(CPInteger)aRow atCriteriaIndex:(int)fromItemIndex
 {
     var criteria = [self criteriaForRow:aRow],
         displayValues = [self displayValuesForRow:aRow],
@@ -1684,7 +1684,7 @@ TODO: implement
     [super bind:aBinding toObject:observableController withKeyPath:aKeyPath options:options];
 }
 
-- (void)unbind:(id)object
+- (void)unbind:(CPString)object
 {
     _rowClass = [_CPRuleEditorRowObject class];
     [super unbind:object];
@@ -2005,7 +2005,7 @@ TODO: implement
     return [_ruleDelegate ruleEditor:self child:childIndex forCriterion:item withRowType:type];
 }
 
-- (id)_queryValueForItem:(id)item inRow:(int)row
+- (id)_queryValueForItem:(id)item inRow:(CPInteger)row
 {
     return [_ruleDelegate ruleEditor:self displayValueForCriterion:item inRow:row];
 }
@@ -2026,12 +2026,12 @@ TODO: implement
     _alignmentGridWidth = width;
 }
 
-- (BOOL)_validateItem:(id)item value:(id)value inRow:(int)row
+- (BOOL)_validateItem:(id)item value:(id)value inRow:(CPInteger)row
 {
     return [self _queryCanSelectItem:item displayValue:value inRow:row];
 }
 
-- (BOOL)_queryCanSelectItem:(id)item displayValue:(id)value inRow:(int)row
+- (BOOL)_queryCanSelectItem:(id)item displayValue:(id)value inRow:(CPInteger)row
 {
     return YES;
 }
@@ -2128,7 +2128,7 @@ TODO: implement
     return YES;
 }
 
-- (CPDragOperation)draggingEntered:(id < CPDraggingInfo >)sender
+- (CPDragOperation)draggingEntered:(id /*< CPDraggingInfo >*/)sender
 {
     if ([sender draggingSource] === self)
     {
@@ -2158,7 +2158,7 @@ TODO: implement
     _subviewIndexOfDropLine = CPNotFound;
 }
 
-- (CPDragOperation)draggingUpdated:(id )sender
+- (CPDragOperation)draggingUpdated:(id /**/)sender
 {
     var point = [self convertPoint:[sender draggingLocation] fromView:nil],
         y = point.y + _sliceHeight / 2,
@@ -2195,12 +2195,12 @@ TODO: implement
     return CPDragOperationMove;
 }
 
-- (BOOL)prepareForDragOperation:(id < CPDraggingInfo >)sender
+- (BOOL)prepareForDragOperation:(id /*< CPDraggingInfo >*/)sender
 {
     return (_subviewIndexOfDropLine !== CPNotFound);
 }
 
-- (BOOL)performDragOperation:(id < CPDraggingInfo >)info
+- (BOOL)performDragOperation:(id /*< CPDraggingInfo >*/)info
 {
     var aboveInsertIndexCount = 0,
         object,
@@ -2262,7 +2262,7 @@ TODO: implement
 {
 }
 
-- (void)_setWindow:(id)window
+- (void)_setWindow:(CPWindow)window
 {
     [super _setWindow:window];
 }
@@ -2279,7 +2279,7 @@ TODO: implement
 
 - (void)_postRowCountChangedNotificationOfType:(CPString)notificationName indexes:indexes
 {
-    var userInfo = @{ "indexes": indexes };
+    var userInfo = indexes === nil ? @{} : @{ "indexes": indexes };
     [[CPNotificationCenter defaultCenter] postNotificationName:notificationName object:self userInfo:userInfo];
 }
 
@@ -2325,7 +2325,7 @@ TODO: implement
     return YES;
 }
 
-- (void)_getAllAvailableItems:(id)items values:(id)values asChildrenOfItem:(id)parentItem inRow:(int)aRow
+- (void)_getAllAvailableItems:(id)items values:(id)values asChildrenOfItem:(id)parentItem inRow:(CPInteger)aRow
 {
     var type,
         indexofCriterion,
@@ -2426,7 +2426,7 @@ var CPRuleEditorAlignmentGridWidthKey       = @"CPRuleEditorAlignmentGridWidth",
     return self;
 }
 
-- (void)encodeWithCoder:(id)coder
+- (void)encodeWithCoder:(CPCoder)coder
 {
     [super encodeWithCoder:coder];
 
@@ -2481,7 +2481,7 @@ var CriteriaKey         = @"criteria",
     return "<" + [self className] + ">\nsubrows = " + [subrows description] + "\ncriteria = " + [criteria description] + "\ndisplayValues = " + [displayValues description];
 }
 
-- (id)initWithCoder:(id)coder
+- (id)initWithCoder:(CPCoder)coder
 {
     self = [super init];
     if (self !== nil)
@@ -2495,7 +2495,7 @@ var CriteriaKey         = @"criteria",
     return self;
 }
 
-- (void)encodeWithCoder:(id)coder
+- (void)encodeWithCoder:(CPCoder)coder
 {
     [coder encodeObject:subrows forKey:SubrowsKey];
     [coder encodeObject:criteria forKey:CriteriaKey];
@@ -2534,7 +2534,7 @@ var CPBoundArrayKey = @"CPBoundArray";
     return self;
 }
 
-- (id)initWithCoder:(id)coder
+- (id)initWithCoder:(CPCoder)coder
 {
     if (self = [super init])
         boundArray = [coder decodeObjectForKey:CPBoundArrayKey];
@@ -2542,7 +2542,7 @@ var CPBoundArrayKey = @"CPBoundArray";
     return self;
 }
 
-- (void)encodeWithCoder:(id)coder
+- (void)encodeWithCoder:(CPCoder)coder
 {
     [coder encodeObject:boundArray forKey:CPBoundArrayKey];
 }
diff --git a/AppKit/CPRuleEditor/_CPRuleEditorPopUpButton.j b/AppKit/CPRuleEditor/_CPRuleEditorPopUpButton.j
index 3b48eff50..d70c6d6f3 100644
--- a/AppKit/CPRuleEditor/_CPRuleEditorPopUpButton.j
+++ b/AppKit/CPRuleEditor/_CPRuleEditorPopUpButton.j
@@ -86,7 +86,7 @@ else if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
     return self;
 }
 
-- (id)hitTest:(CGPoint)point
+- (CPView)hitTest:(CGPoint)point
 {
     if (!CGRectContainsPoint([self frame], point) || ![self sliceIsEditable])
         return nil;
@@ -100,12 +100,12 @@ else if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
     return ![superview isKindOfClass:[_CPRuleEditorViewSlice]] || [superview isEditable];
 }
 
-- (BOOL)trackMouse:(CPEvent)theEvent
+- (void)trackMouse:(CPEvent)theEvent
 {
     if (![self sliceIsEditable])
-        return NO;
+        return;
 
-    return [super trackMouse:theEvent];
+    [super trackMouse:theEvent];
 }
 
 - (CGRect)contentRectForBounds:(CGRect)bounds
diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j
index bb00c8e21..20b573790 100644
--- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j
+++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j
@@ -522,7 +522,7 @@ var CONTROL_HEIGHT = 16.,
     return self;
 }
 
-- (id)hitTest:(CGPoint)point
+- (CPView)hitTest:(CGPoint)point
 {
     if (!CGRectContainsPoint([self frame], point))
         return nil;
diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j
index f8ce6820b..439489982 100644
--- a/AppKit/CPScrollView.j
+++ b/AppKit/CPScrollView.j
@@ -34,34 +34,44 @@
 
 
 /*! @ignore */
-var _isSystemUsingOverlayScrollers = function()
+var _isBrowserUsingOverlayScrollers = function()
 {
 #if PLATFORM(DOM)
-    var inner = document.createElement('p'),
-        outer = document.createElement('div');
+    /*
+        Even if the system supports overlay (Lion) scrollers,
+        the browser (e.g. FireFox *cough*) may not.
 
-    inner.style.width = "100%";
-    inner.style.height = "200px";
+        To determine if the browser is using overlay scrollbars,
+        we put a 

element inside a shorter

and set its + overflow to scroll. If the browser is using visible scrollers, + the outer div's clientWidth will less than the offsetWidth, because + clientWidth does not include scrollbars, whereas offsetWidth does. + So if clientWidth === offsetWidth, the scrollers must be overlay. + Even IE gets this right. + */ + var outer = document.createElement('div'), + inner = document.createElement('p'); + // position it absolute so it doesn't affect existing DOM elements outer.style.position = "absolute"; outer.style.top = "0px"; outer.style.left = "0px"; outer.style.visibility = "hidden"; outer.style.width = "200px"; outer.style.height = "150px"; - outer.style.overflow = "hidden"; - outer.appendChild (inner); + outer.style.overflow = "scroll"; - document.body.appendChild (outer); - var w1 = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var w2 = inner.offsetWidth; - if (w1 == w2) - w2 = outer.clientWidth; + inner.style.width = "100%"; + inner.style.height = "200px"; + outer.appendChild(inner); - document.body.removeChild (outer); + document.body.appendChild(outer); - return (w1 - w2 == 0); + var usingOverlayScrollers = outer.clientWidth === outer.offsetWidth; + + document.body.removeChild(outer); + + return usingOverlayScrollers; #else return NO; #endif @@ -130,8 +140,8 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay, var globalValue = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPScrollersGlobalStyle"]; - if (globalValue == nil || globalValue == -1) - CPScrollerStyleGlobal = _isSystemUsingOverlayScrollers() ? CPScrollerStyleOverlay : CPScrollerStyleLegacy + if (globalValue === nil || globalValue === -1) + CPScrollerStyleGlobal = _isBrowserUsingOverlayScrollers() ? CPScrollerStyleOverlay : CPScrollerStyleLegacy else CPScrollerStyleGlobal = globalValue; } diff --git a/AppKit/CPScroller.j b/AppKit/CPScroller.j index e5a19a0f8..6561af112 100644 --- a/AppKit/CPScroller.j +++ b/AppKit/CPScroller.j @@ -108,7 +108,7 @@ CPThemeStateScrollerKnobDark = CPThemeState("scroller-knob-dark"); return "scroller"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"scroller-width": 7.0, @@ -182,6 +182,7 @@ CPThemeStateScrollerKnobDark = CPThemeState("scroller-knob-dark"); _allowFadingOut = YES; _isMouseOver = NO; _style = CPScrollerStyleOverlay; + var paramAnimFadeOut = @{ CPViewAnimationTargetKey: self, CPViewAnimationEffectKey: CPViewAnimationFadeOutEffect, diff --git a/AppKit/CPSearchField.j b/AppKit/CPSearchField.j index 4fea175d5..d7346f9ed 100644 --- a/AppKit/CPSearchField.j +++ b/AppKit/CPSearchField.j @@ -458,7 +458,7 @@ var RECENT_SEARCH_PREFIX = @" "; [self sendAction:[self action] to:[self target]]; } -- (void)sendAction:(SEL)anAction to:(id)anObject +- (BOOL)sendAction:(SEL)anAction to:(id)anObject { [super sendAction:anAction to:anObject]; diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index 28f8bdc95..3bf94a0c2 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -56,7 +56,7 @@ CPSegmentSwitchTrackingMomentary = 2; return "segmented-control"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"alignment": CPCenterTextAlignment, diff --git a/AppKit/CPShadowView.j b/AppKit/CPShadowView.j index 942477ecf..5fcc5c26c 100644 --- a/AppKit/CPShadowView.j +++ b/AppKit/CPShadowView.j @@ -47,7 +47,7 @@ CPThemeStateShadowViewHeavy = CPThemeState("shadowview-style-heavy"); return "shadow-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"bezel-color": [CPNull null], diff --git a/AppKit/CPSlider.j b/AppKit/CPSlider.j index b9b7e92da..2190118d2 100644 --- a/AppKit/CPSlider.j +++ b/AppKit/CPSlider.j @@ -49,7 +49,7 @@ CPCircularSlider = 1; return "slider"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"knob-color": [CPNull null], diff --git a/AppKit/CPSliderColorPicker.j b/AppKit/CPSliderColorPicker.j index 38aa8427c..7345042ea 100644 --- a/AppKit/CPSliderColorPicker.j +++ b/AppKit/CPSliderColorPicker.j @@ -55,7 +55,6 @@ CPTextField _hexLabel; CPTextField _hexValue; - CPTextField _hexValue; CPTextField _redValue; CPTextField _greenValue; CPTextField _blueValue; @@ -146,7 +145,7 @@ [_hueLabel setTextColor:[CPColor blackColor]]; _hueSlider = [[CPSlider alloc] initWithFrame:CGRectMake(15, 143, aFrame.size.width - 70, 20)]; - [_hueSlider setMaxValue:359.0]; + [_hueSlider setMaxValue:0.999]; [_hueSlider setMinValue:0.0]; [_hueSlider setTarget:self]; [_hueSlider setAction:@selector(sliderChanged:)]; @@ -165,7 +164,7 @@ [_saturationLabel setTextColor:[CPColor blackColor]]; _saturationSlider = [[CPSlider alloc] initWithFrame:CGRectMake(15, 168, aFrame.size.width - 70, 20)]; - [_saturationSlider setMaxValue:100.0]; + [_saturationSlider setMaxValue:1.0]; [_saturationSlider setMinValue:0.0]; [_saturationSlider setTarget:self]; [_saturationSlider setAction:@selector(sliderChanged:)]; @@ -184,7 +183,7 @@ [_brightnessLabel setTextColor:[CPColor blackColor]]; _brightnessSlider = [[CPSlider alloc] initWithFrame:CGRectMake(15, 194, aFrame.size.width - 70, 20)]; - [_brightnessSlider setMaxValue:100.0]; + [_brightnessSlider setMaxValue:1.0]; [_brightnessSlider setMinValue:0.0]; [_brightnessSlider setTarget:self]; [_brightnessSlider setAction:@selector(sliderChanged:)]; @@ -282,6 +281,9 @@ - (void)setColor:(CPColor)aColor { + if (!aColor) + [CPException raise:CPInvalidArgumentException reason:"aColor can't be nil"]; + [self updateRGBSliders:aColor]; [self updateHSBSliders:aColor]; [self updateHex:aColor]; @@ -313,9 +315,9 @@ - (void)updateLabels { - [_hueValue setStringValue:ROUND([_hueSlider floatValue])]; - [_saturationValue setStringValue:ROUND([_saturationSlider floatValue])]; - [_brightnessValue setStringValue:ROUND([_brightnessSlider floatValue])]; + [_hueValue setStringValue:ROUND([_hueSlider floatValue] * 360.0)]; + [_saturationValue setStringValue:ROUND([_saturationSlider floatValue] * 100.0)]; + [_brightnessValue setStringValue:ROUND([_brightnessSlider floatValue] * 100.0)]; [_redValue setStringValue:ROUND([_redSlider floatValue] * 255)]; [_greenValue setStringValue:ROUND([_greenSlider floatValue] * 255)]; @@ -363,15 +365,15 @@ [self sliderChanged:_blueSlider]; break; - case _hueValue: [_hueSlider setFloatValue:MAX(MIN(ROUND(value), 360), 0)]; + case _hueValue: [_hueSlider setFloatValue:MAX(MIN(ROUND(value), 360) / 360.0, 0)]; [self sliderChanged:_hueSlider]; break; - case _saturationValue: [_saturationSlider setFloatValue:MAX(MIN(ROUND(value), 100), 0)]; + case _saturationValue: [_saturationSlider setFloatValue:MAX(MIN(ROUND(value), 100) / 100.0, 0)]; [self sliderChanged:_saturationSlider]; break; - case _brightnessValue: [_brightnessSlider setFloatValue:MAX(MIN(ROUND(value), 100), 0)]; + case _brightnessValue: [_brightnessSlider setFloatValue:MAX(MIN(ROUND(value), 100) / 100.0, 0)]; [self sliderChanged:_brightnessSlider]; break; } diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 7e62a4d5d..15201a59a 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -103,7 +103,7 @@ var ShouldSuppressResizeNotifications = 1, return @"splitview"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"divider-thickness": 1.0, @@ -995,7 +995,7 @@ The sum of the views and the sum of the dividers should be equal to the size of @param unsigned int - The divider index the button bar will be assigned to. */ // FIXME Should be renamed to setButtonBar:ofDividerAtIndex:. -- (void)setButtonBar:(CPButtonBar)aButtonBar forDividerAtIndex:(unsigned)dividerIndex +- (void)setButtonBar:(CPButtonBar)aButtonBar forDividerAtIndex:(CPUInteger)dividerIndex { if (!aButtonBar) { diff --git a/AppKit/CPStepper.j b/AppKit/CPStepper.j index 0e7fc7586..ba5da1462 100644 --- a/AppKit/CPStepper.j +++ b/AppKit/CPStepper.j @@ -213,7 +213,7 @@ Set the current value of the stepper. @param aValue a float containing the value */ -- (void)setDoubleValue:(float)aValue +- (void)setDoubleValue:(double)aValue { if (aValue > _maxValue) [super setDoubleValue:_valueWraps ? _minValue : _maxValue]; @@ -267,7 +267,7 @@ return @"stepper"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"bezel-color-up-button": [CPNull null], diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index b6874a01b..6aa303cae 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -33,10 +33,22 @@ CPNoTabsBezelBorder = 4; //Displays no tabs and has a bezeled border. CPNoTabsLineBorder = 5; //Has no tabs and displays a line border. CPNoTabsNoBorder = 6; //Displays no tabs and no border. -var CPTabViewDidSelectTabViewItemSelector = 1, - CPTabViewShouldSelectTabViewItemSelector = 2, - CPTabViewWillSelectTabViewItemSelector = 4, - CPTabViewDidChangeNumberOfTabViewItemsSelector = 8; +var CPTabViewDidSelectTabViewItemSelector = 1 << 1, + CPTabViewShouldSelectTabViewItemSelector = 1 << 2, + CPTabViewWillSelectTabViewItemSelector = 1 << 3, + CPTabViewDidChangeNumberOfTabViewItemsSelector = 1 << 4; + + +@protocol CPTabViewDelegate + +@optional +- (BOOL)tabView:(CPTabView)tabView shouldSelectTabViewItem:(CPTabViewItem)tabViewItem; +- (void)tabView:(CPTabView)tabView didSelectTabViewItem:(CPTabViewItem)tabViewItem; +- (void)tabView:(CPTabView)tabView willSelectTabViewItem:(CPTabViewItem)tabViewItem; +- (void)tabViewDidChangeNumberOfTabViewItems:(CPTabView)tabView; + +@end + /*! @ingroup appkit @@ -48,18 +60,18 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ @implementation CPTabView : CPView { - CPArray _items; + CPArray _items; - CPSegmentedControl _tabs; - CPBox _box; + CPSegmentedControl _tabs; + CPBox _box; - CPNumber _selectedIndex; + CPNumber _selectedIndex; - CPTabViewType _type; - CPFont _font; + CPTabViewType _type; + CPFont _font; - id _delegate; - unsigned _delegateSelectors; + id _delegate; + unsigned _delegateSelectors; } - (id)initWithFrame:(CGRect)aFrame @@ -107,7 +119,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, @param aTabViewItem the item to insert @param anIndex the index for the item */ -- (void)insertTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(unsigned)anIndex +- (void)insertTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(CPUInteger)anIndex { [_items insertObject:aTabViewItem atIndex:anIndex]; @@ -183,7 +195,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, Returns the CPTabViewItem at the specified index. @return a tab view item, or nil */ -- (CPTabViewItem)tabViewItemAtIndex:(unsigned)anIndex +- (CPTabViewItem)tabViewItemAtIndex:(CPUInteger)anIndex { return [_items objectAtIndex:anIndex]; } @@ -270,7 +282,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, Selects the item at the specified index. @param anIndex the index of the item to display. */ -- (BOOL)selectTabViewItemAtIndex:(unsigned)anIndex +- (BOOL)selectTabViewItemAtIndex:(CPUInteger)anIndex { if (anIndex === _selectedIndex) return; @@ -405,7 +417,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, Sets the delegate for this tab view. @param aDelegate the tab view's delegate */ -- (void)setDelegate:(id)aDelegate +- (void)setDelegate:(id )aDelegate { if (_delegate == aDelegate) return; diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 823fdc73a..951cf45e4 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -416,7 +416,7 @@ CPTableColumnUserResizingMask = 1 << 1; to be invoked with row equal to -1 in cases where no actual row is involved but the table view needs to get some generic cell info. */ -- (id)dataViewForRow:(int)aRowIndex +- (id)dataViewForRow:(CPInteger)aRowIndex { return [self dataView]; } @@ -595,7 +595,7 @@ CPTableColumnUserResizingMask = 1 << 1; @implementation CPTableColumn (Bindings) -+ (id)_binderClassForBinding:(CPString)aBinding ++ (Class)_binderClassForBinding:(CPString)aBinding { if (aBinding == CPValueBinding) return [CPTableColumnValueBinder class]; @@ -828,7 +828,7 @@ var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", /*! @ignore */ -- (id)dataCellForRow:(int)row +- (id)dataCellForRow:(CPInteger)row { [CPException raise:CPUnsupportedMethodException reason:@"dataCellForRow: is not supported. Use -dataViewForRow:row instead."]; diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 25c14845a..d22dc4f71 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -43,7 +43,7 @@ return @"columnHeader"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"background-color": [CPNull null], @@ -53,11 +53,11 @@ @"text-color": [CPNull null], @"font": [CPNull null], @"text-shadow-color": [CPNull null], - @"text-shadow-offset": CGSizeMakeZero(), + @"text-shadow-offset": CGSizeMakeZero() }; } -- (void)initWithFrame:(CGRect)frame +- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; @@ -229,6 +229,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal CGPoint _previousTrackingLocation; int _activeColumn; int _pressedColumn; + int _lastDragDestinationColumnIndex; BOOL _isResizing; BOOL _isDragging; @@ -245,11 +246,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal return @"tableHeaderRow"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"background-color": [CPNull null], @"divider-color": [CPColor grayColor], + @"divider-thickness": 1.0 }; } @@ -285,7 +287,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal return [_tableView columnAtPoint:CGPointMake(aPoint.x, aPoint.y)]; } -- (CGRect)headerRectOfColumn:(int)aColumnIndex +- (CGRect)headerRectOfColumn:(CPInteger)aColumnIndex { var headerRect = CGRectMakeCopy([self bounds]), columnRect = [_tableView rectOfColumn:aColumnIndex]; @@ -306,7 +308,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal return _drawsColumnLines; } -- (CGRect)_cursorRectForColumn:(int)column +- (CGRect)_cursorRectForColumn:(CPInteger)column { if (column == -1 || !([_tableView._tableColumns[column] resizingMask] & CPTableColumnUserResizingMask)) return CGRectMakeZero(); @@ -332,7 +334,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal var headerView = [_tableView._tableColumns[column] headerView]; [headerView setThemeState:CPThemeStateHighlighted]; - if (_tableView._editingColumn == column) + if (_tableView._editingCellIndex || _tableView._editingColumn == column) [[self window] makeFirstResponder:_tableView]; } @@ -381,7 +383,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal _mouseDownLocation = currentLocation; _activeColumn = columnIndex; - [_tableView _sendDelegateDidMouseDownInHeader:columnIndex]; + [_tableView _sendDelegateMouseDownInHeaderOfTableColumn:columnIndex]; if (shouldResize) [self startResizingTableColumn:columnIndex at:currentLocation]; @@ -415,12 +417,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES]; } -- (void)startTrackingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (void)startTrackingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { + _lastDragDestinationColumnIndex = -1; [self _setPressedColumn:aColumnIndex]; } -- (BOOL)continueTrackingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (BOOL)continueTrackingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { if ([self _shouldDragTableColumn:aColumnIndex at:aPoint]) { @@ -441,21 +444,21 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal return YES; } -- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (BOOL)_shouldStopTrackingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { return _isTrackingColumn && _activeColumn === aColumnIndex && CGRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint); } -- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (void)stopTrackingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { [self _setPressedColumn:CPNotFound]; [self _updateResizeCursor:[CPApp currentEvent]]; } -- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (BOOL)_shouldDragTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { - return [_tableView allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0; + return ABS(aPoint.x - _mouseDownLocation.x) >= 10.0 && [_tableView _sendDelegateShouldReorderColumn:aColumnIndex toColumn:-1]; } - (CGRect)_headerRectOfLastVisibleColumn @@ -501,11 +504,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal [dragWindow setFrame:frame]; } -- (void)_moveColumn:(int)aFromIndex toColumn:(int)aToIndex +- (void)_moveColumn:(CPInteger)aFromIndex toColumn:(CPInteger)aToIndex { - [_tableView moveColumn:aFromIndex toColumn:aToIndex]; - _activeColumn = aToIndex; - _pressedColumn = _activeColumn; + if ([_tableView _sendDelegateShouldReorderColumn:aFromIndex toColumn:aToIndex]) + { + [_tableView moveColumn:aFromIndex toColumn:aToIndex]; + _activeColumn = aToIndex; + _pressedColumn = _activeColumn; + } } - (void)draggedView:(CPView)aView beganAt:(CGPoint)aPoint @@ -541,14 +547,21 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal var hoveredColumn = [self columnAtPoint:hoverPoint]; - if (hoveredColumn !== -1) + if (hoveredColumn !== _lastDragDestinationColumnIndex && hoveredColumn !== -1) { var columnRect = [self headerRectOfColumn:hoveredColumn], columnCenterPoint = [self convertPoint:CGPointMake(CGRectGetMidX(columnRect), CGRectGetMidY(columnRect)) fromView:self]; + if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x) + { [self _moveColumn:_activeColumn toColumn:hoveredColumn]; + _lastDragDestinationColumnIndex = hoveredColumn; + } else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x) + { [self _moveColumn:_activeColumn toColumn:hoveredColumn]; + _lastDragDestinationColumnIndex = hoveredColumn; + } } _previousTrackingLocation = aPoint; @@ -568,7 +581,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal [_tableView _enqueueDraggingViews]; } -- (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (BOOL)shouldResizeTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { if (_isResizing) return YES; @@ -579,7 +592,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal return [_tableView allowsColumnResizing] && CGRectContainsPoint([self _cursorRectForColumn:aColumnIndex], aPoint); } -- (void)startResizingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (void)startResizingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { _isResizing = YES; @@ -589,7 +602,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal [_tableView setDisableAutomaticResizing:YES]; } -- (void)continueResizingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (void)continueResizingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex], newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x; @@ -609,7 +622,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal } } -- (void)stopResizingTableColumn:(int)aColumnIndex at:(CGPoint)aPoint +- (void)stopResizingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex]; [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth]; @@ -667,7 +680,8 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal - (void)layoutSubviews { var tableColumns = [_tableView tableColumns], - count = [tableColumns count]; + count = [tableColumns count], + lineThickness = [self currentValueForThemeAttribute:@"divider-thickness"]; for (var i = 0; i < count; i++) { @@ -677,7 +691,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal // Make space for the gridline on the right. frame.origin.x -= 0.5; - frame.size.width -= 1.0; + frame.size.width -= lineThickness; frame.size.height -= 0.5; // Note: we're not adding in intercell spacing here. This setting only affects the regular // table cell data views, not the header. Verified in Cocoa on March 29th, 2011. @@ -702,9 +716,10 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal tableColumns = [_tableView tableColumns], exposedTableColumns = _tableView._exposedColumns, firstIndex = [exposedTableColumns firstIndex], - exposedRange = CPMakeRange(firstIndex, [exposedTableColumns lastIndex] - firstIndex + 1); + exposedRange = CPMakeRange(firstIndex, [exposedTableColumns lastIndex] - firstIndex + 1), + lineThickness = [self currentValueForThemeAttribute:@"divider-thickness"]; - CGContextSetLineWidth(context, 1); + CGContextSetLineWidth(context, lineThickness); CGContextSetStrokeColor(context, [self currentValueForThemeAttribute:@"divider-color"]); [exposedColumnIndexes getIndexes:columnsArray maxCount:-1 inIndexRange:exposedRange]; @@ -723,8 +738,8 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal columnMaxX = CGRectGetMaxX(columnToStroke); - CGContextMoveToPoint(context, FLOOR(columnMaxX) - 0.5, ROUND(CGRectGetMinY(columnToStroke))); - CGContextAddLineToPoint(context, FLOOR(columnMaxX) - 0.5, ROUND(CGRectGetMaxY(columnToStroke)) - 1.0); + CGContextMoveToPoint(context, FLOOR(columnMaxX) - 0.5 * lineThickness, ROUND(CGRectGetMinY(columnToStroke))); + CGContextAddLineToPoint(context, FLOOR(columnMaxX) - 0.5 * lineThickness, ROUND(CGRectGetMaxY(columnToStroke)) - 1.0); } CGContextClosePath(context); diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 01f5e6765..33f79aad5 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -58,31 +58,31 @@ var CPTableViewDataSource_numberOfRowsInTableView_ CPTableViewDataSource_tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes_ = 1 << 4, CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_ = 1 << 5, CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_ = 1 << 6, - CPTableViewDataSource_tableView_sortDescriptorsDidChange_ = 1 << 7; var CPTableViewDelegate_selectionShouldChangeInTableView_ = 1 << 0, CPTableViewDelegate_tableView_viewForTableColumn_row_ = 1 << 1, - CPTableViewDelegate_tableView_dataViewForTableColumn_row_ = 1 << 21, - CPTableViewDelegate_tableView_didClickTableColumn_ = 1 << 2, - CPTableViewDelegate_tableView_didDragTableColumn_ = 1 << 3, - CPTableViewDelegate_tableView_heightOfRow_ = 1 << 4, - CPTableViewDelegate_tableView_isGroupRow_ = 1 << 5, - CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_ = 1 << 6, - CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_ = 1 << 7, - CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_ = 1 << 8, - CPTableViewDelegate_tableView_shouldEditTableColumn_row_ = 1 << 9, - CPTableViewDelegate_tableView_shouldSelectRow_ = 1 << 10, - CPTableViewDelegate_tableView_shouldSelectTableColumn_ = 1 << 11, - CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_ = 1 << 12, - CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_ = 1 << 13, - CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_ = 1 << 14, - CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_ = 1 << 15, - CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_ = 1 << 16, - CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_ = 1 << 17, - CPTableViewDelegate_tableViewSelectionDidChange_ = 1 << 18, - CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 19, - CPTableViewDelegate_tableViewMenuForTableColumn_Row_ = 1 << 20; + CPTableViewDelegate_tableView_dataViewForTableColumn_row_ = 1 << 2, + CPTableViewDelegate_tableView_didClickTableColumn_ = 1 << 3, + CPTableViewDelegate_tableView_didDragTableColumn_ = 1 << 4, + CPTableViewDelegate_tableView_heightOfRow_ = 1 << 5, + CPTableViewDelegate_tableView_isGroupRow_ = 1 << 6, + CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_ = 1 << 7, + CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_ = 1 << 8, + CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_ = 1 << 9, + CPTableViewDelegate_tableView_shouldEditTableColumn_row_ = 1 << 10, + CPTableViewDelegate_tableView_shouldSelectRow_ = 1 << 11, + CPTableViewDelegate_tableView_shouldSelectTableColumn_ = 1 << 12, + CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_ = 1 << 13, + CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_ = 1 << 14, + CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_ = 1 << 15, + CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_ = 1 << 16, + CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_ = 1 << 17, + CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_ = 1 << 18, + CPTableViewDelegate_tableViewSelectionDidChange_ = 1 << 19, + CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 20, + CPTableViewDelegate_tableViewMenuForTableColumn_row_ = 1 << 21, + CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_ = 1 << 22; //CPTableViewDraggingDestinationFeedbackStyles CPTableViewDraggingDestinationFeedbackStyleNone = -1; @@ -116,8 +116,54 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; #define NUMBER_OF_COLUMNS() (_tableColumns.length) #define UPDATE_COLUMN_RANGES_IF_NECESSARY() if (_dirtyTableColumnRangeIndex !== CPNotFound) [self _recalculateTableColumnRanges]; +#define FULL_ROW_HEIGHT() (_rowHeight + _intercellSpacing.height) +#define ROW_BOTTOM(__heightInfo) (__heightInfo.y + __heightInfo.height + _intercellSpacing.height) +#define HAS_VARIABLE_ROW_HEIGHTS() (_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_) +@protocol CPTableViewDataSource + +@optional +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id )info row:(CPInteger)aRowIndex dropOperation:(CPTableViewDropOperation)operation; +- (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard; +- (CPArray)tableView:(CPTableView)aTableView namesOfPromisedFilesDroppedAtDestination:(CPURL)dropDestination forDraggedRowsWithIndexes:(CPIndexSet)anIndexSet; +- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id )info proposedRow:(CPInteger)aRowIndex proposedDropOperation:(CPTableViewDropOperation)anOperation; +- (CPInteger)numberOfRowsInTableView:(CPTableView)aTableView; +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObjectValue forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (void)tableView:(CPTableView)aTableView sortDescriptorsDidChange:(CPArray)oldDescriptors; + +@end + +@protocol CPTableViewDelegate + +@optional +- (BOOL)selectionShouldChangeInTableView:(CPTableView)aTableView; +- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(CPInteger)aRowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableView row:(CPInteger)aRowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldReorderColumn:(CPInteger)columnIndex toColumn:(NSInteger)newColumnIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)aRowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn; +- (BOOL)tableView:(CPTableView)aTableView shouldShowViewExpansionForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldTrackView:(CPView)aView forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldTypeSelectForEvent:(CPEvent)anEvent withCurrentSearchString:(CPString)searchString; +- (CPIndexSet)tableView:(CPTableView)aTableView selectionIndexesForProposedSelection:(CPIndexSet)proposedSelectionIndexes; +- (CPInteger)tableView:(CPTableView)aTableView nextTypeSelectMatchFromRow:(CPInteger)startRow toRow:(CPInteger)endRow forString:(CPString)searchString; +- (CPMenu)tableViewMenuForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (CPString)tableView:(CPTableView)aTableView toolTipForView:(CPView)aView rect:(CGRect)aRect tableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex mouseLocation:(CGPoint)mouseLocation; +- (CPString)tableView:(CPTableView)aTableView typeSelectStringForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (CPView)tableView:(CPTableView)aTableView dataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (CPView)tableView:(CPTableView)aTableView viewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (float)tableView:(CPTableView)aTableView heightOfRow:(CPInteger)aRowIndex; +- (void)tableView:(CPTableView)aTableView didClickTableColumn:(CPTableColumn)aTableColumn; +- (void)tableView:(CPTableView)aTableView didDragTableColumn:(CPTableColumn)aTableColumn; +- (void)tableView:(CPTableView)aTableView mouseDownInHeaderOfTableColumn:(CPTableColumn)aTableColumn; +- (void)tableView:(CPTableView)aTableView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex; +- (void)tableViewSelectionDidChange:(CPNotification)aNotification; +- (void)tableViewSelectionIsChanging:(CPNotification)aNotification; + +@end + @implementation _CPTableDrawView : CPView { CPTableView _tableView; @@ -170,106 +216,106 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; */ @implementation CPTableView : CPControl { - id _dataSource; - CPInteger _implementedDataSourceMethods; + id _dataSource; + CPInteger _implementedDataSourceMethods; - id _delegate; - CPInteger _implementedDelegateMethods; + id _delegate; + CPInteger _implementedDelegateMethods; - CPArray _tableColumns; - CPArray _tableColumnRanges; - CPInteger _dirtyTableColumnRangeIndex; - CPInteger _numberOfHiddenColumns; + CPArray _tableColumns; + CPArray _tableColumnRanges; + CPInteger _dirtyTableColumnRangeIndex; + CPInteger _numberOfHiddenColumns; - BOOL _reloadAllRows; - Object _objectValues; + BOOL _reloadAllRows; + Object _objectValues; - CGRect _exposedRect; - CPIndexSet _exposedRows; - CPIndexSet _exposedColumns; + CGRect _exposedRect; + CPIndexSet _exposedRows; + CPIndexSet _exposedColumns; - Object _dataViewsForTableColumns; - Object _cachedDataViews; - CPDictionary _archivedDataViews; - Object _unavailable_custom_cibs; + Object _dataViewsForTableColumns; + Object _cachedDataViews; + CPDictionary _archivedDataViews; + Object _unavailable_custom_cibs; //Configuring Behavior - BOOL _allowsColumnReordering; - BOOL _allowsColumnResizing; - BOOL _allowsColumnSelection; - BOOL _allowsMultipleSelection; - BOOL _allowsEmptySelection; + BOOL _allowsColumnReordering; + BOOL _allowsColumnResizing; + BOOL _allowsColumnSelection; + BOOL _allowsMultipleSelection; + BOOL _allowsEmptySelection; - CPArray _sortDescriptors; + CPArray _sortDescriptors; //Setting Display Attributes - CGSize _intercellSpacing; - float _rowHeight; + CGSize _intercellSpacing; + float _rowHeight; - BOOL _usesAlternatingRowBackgroundColors; - CPArray _alternatingRowBackgroundColors; + BOOL _usesAlternatingRowBackgroundColors; + CPArray _alternatingRowBackgroundColors; - unsigned _selectionHighlightStyle; - CPColor _unfocusedSelectionHighlightColor; - CPDictionary _unfocusedSourceListSelectionColor; - CPTableColumn _currentHighlightedTableColumn; - unsigned _gridStyleMask; + unsigned _selectionHighlightStyle; + CPColor _unfocusedSelectionHighlightColor; + CPDictionary _unfocusedSourceListSelectionColor; + CPTableColumn _currentHighlightedTableColumn; + unsigned _gridStyleMask; - unsigned _numberOfRows; - CPIndexSet _groupRows; + unsigned _numberOfRows; + CPIndexSet _groupRows; - CPArray _cachedRowHeights; + CPArray _cachedRowHeights; // Persistence - CPString _autosaveName; - BOOL _autosaveTableColumns; + CPString _autosaveName; + BOOL _autosaveTableColumns; - CPTableHeaderView _headerView; - _CPCornerView _cornerView; + CPTableHeaderView _headerView; + _CPCornerView _cornerView; - CPIndexSet _selectedColumnIndexes; - CPIndexSet _selectedRowIndexes; - CPInteger _selectionAnchorRow; - CPInteger _lastSelectedRow; - CPIndexSet _previouslySelectedRowIndexes; - CGPoint _startTrackingPoint; - CPDate _startTrackingTimestamp; - BOOL _trackingPointMovedOutOfClickSlop; - CGPoint _editingCellIndex; - CPInteger _editingRow; - CPInteger _editingColumn; + CPIndexSet _selectedColumnIndexes; + CPIndexSet _selectedRowIndexes; + CPInteger _selectionAnchorRow; + CPInteger _lastSelectedRow; + CPIndexSet _previouslySelectedRowIndexes; + CGPoint _startTrackingPoint; + CPDate _startTrackingTimestamp; + BOOL _trackingPointMovedOutOfClickSlop; + CGPoint _editingCellIndex; + CPInteger _editingRow; + CPInteger _editingColumn; - _CPTableDrawView _tableDrawView; + _CPTableDrawView _tableDrawView; - SEL _doubleAction; - CPInteger _clickedRow; - CPInteger _clickedColumn; - unsigned _columnAutoResizingStyle; + SEL _doubleAction; + CPInteger _clickedRow; + CPInteger _clickedColumn; + unsigned _columnAutoResizingStyle; - int _lastTrackedRowIndex; - CGPoint _originalMouseDownPoint; - BOOL _verticalMotionCanDrag; - unsigned _destinationDragStyle; - BOOL _isSelectingSession; - CPIndexSet _draggedRowIndexes; - BOOL _wasSelectionBroken; + int _lastTrackedRowIndex; + CGPoint _originalMouseDownPoint; + BOOL _verticalMotionCanDrag; + unsigned _destinationDragStyle; + BOOL _isSelectingSession; + CPIndexSet _draggedRowIndexes; + BOOL _wasSelectionBroken; _CPDropOperationDrawingView _dropOperationFeedbackView; - CPDragOperation _dragOperationDefaultMask; - int _retargetedDropRow; - CPDragOperation _retargetedDropOperation; - CPArray _draggingViews; + CPDragOperation _dragOperationDefaultMask; + int _retargetedDropRow; + CPDragOperation _retargetedDropOperation; + CPArray _draggingViews; - BOOL _disableAutomaticResizing @accessors(property=disableAutomaticResizing); - BOOL _lastColumnShouldSnap; - BOOL _implementsCustomDrawRow; - BOOL _isViewBased; - BOOL _contentBindingExpicitelySet; + BOOL _disableAutomaticResizing @accessors(property=disableAutomaticResizing); + BOOL _lastColumnShouldSnap; + BOOL _implementsCustomDrawRow; + BOOL _isViewBased; + BOOL _contentBindingExplicitlySet; - SEL _viewForTableColumnRowSelector; + SEL _viewForTableColumnRowSelector; - CPTableColumn _draggedColumn; - CPArray _differedColumnDataToRemove; + CPTableColumn _draggedColumn; + CPArray _differedColumnDataToRemove; } /*! @@ -283,11 +329,12 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; /*! @ignore */ -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"alternating-row-colors": [CPNull null], @"grid-color": [CPNull null], + @"grid-line-thickness": 1.0, @"highlighted-grid-color": [CPNull null], @"selection-color": [CPNull null], @"sourcelist-selection-color": [CPNull null], @@ -296,6 +343,18 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; @"selection-radius": [CPNull null], @"image-generic-file": [CPNull null], @"default-row-height": 25.0, + @"dropview-on-background-color": [CPNull null], + @"dropview-on-border-color": [CPNull null], + @"dropview-on-border-width": [CPNull null], + @"dropview-on-border-radius": [CPNull null], + @"dropview-on-selected-background-color": [CPNull null], + @"dropview-on-selected-border-color": [CPNull null], + @"dropview-on-selected-border-width": [CPNull null], + @"dropview-on-selected-border-radius": [CPNull null], + @"dropview-above-border-color": [CPNull null], + @"dropview-above-border-width": [CPNull null], + @"dropview-above-selected-border-color": [CPNull null], + @"dropview-above-selected-border-width": [CPNull null] }; } @@ -343,7 +402,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; _retargetedDropOperation = nil; _dragOperationDefaultMask = nil; _destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular; - _contentBindingExpicitelySet = NO; + _contentBindingExplicitlySet = NO; [self setBackgroundColor:[CPColor whiteColor]]; [self _init]; @@ -437,14 +496,14 @@ Returns the number of rows in the tableview Returns the object value for each dataview. Each dataview will be sent a setObjectValue: method which will contain the object you return from this datasource method. @anchor objectValueForTable @code -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRowIndex; +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRowIndex; @endcode @section editing Editing: Sets the data object for an item in a given row and column. This needs to be implemented if you want inline editing support @code -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex; +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex; @endcode @@ -459,9 +518,9 @@ The tableview will call this method if you click the tableheader. You should sor @note In order for the tableview to receive drops don't forget to first register the tableview for drag types like you do with every other view. Return the drag operation (move, copy, etc) that should be performed if a registered drag type is over the tableview - The data source can retarget a drop if you want by calling
-(void)setDropRow:(int)aRow dropOperation:(CPTableViewDropOperation)anOperation;
+ The data source can retarget a drop if you want by calling
-(void)setDropRow:(CPInteger)aRow dropOperation:(CPTableViewDropOperation)anOperation;
@code -- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(CPDraggingInfo)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)operation; +- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(CPDraggingInfo)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)operation; @endcode Returns YES if the drop operation is allowed otherwise NO. This method is invoked by the tableview after a drag should begin, but before it is started. If you don't want the drag to being return NO. If you want the drag to begin you should return YES and place the drag data on the pboard. @@ -471,7 +530,7 @@ Returns YES if the drop operation is allowed otherwise NO. This method is invoke Return YES if the operation was successful otherwise return NO. The data source should incorporate the data from the dragging pasteboard in this method implementation. To get this data use the draggingPasteboard method on the CPDraggingInfo object. @code -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(CPDraggingInfo)info row:(int)row dropOperation:(CPTableViewDropOperation)operation; +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(CPDraggingInfo)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation; @endcode NOT YET IMPLEMENTED @@ -479,7 +538,7 @@ NOT YET IMPLEMENTED - (CPArray)tableView:(CPTableView)aTableView namesOfPromisedFilesDroppedAtDestination:(CPURL)dropDestination forDraggedRowsWithIndexes:(CPIndexSet)indexSet; @endcode */ -- (void)setDataSource:(id)aDataSource +- (void)setDataSource:(id )aDataSource { if (_dataSource === aDataSource) return; @@ -1043,6 +1102,8 @@ NOT YET IMPLEMENTED else _dirtyTableColumnRangeIndex = MIN(index, _dirtyTableColumnRangeIndex); + [_tableColumns removeObject:aTableColumn]; + [self setNeedsLayout]; } @@ -1110,7 +1171,7 @@ NOT YET IMPLEMENTED @param theColumnIndex The current index of the column to move. @param theToIndex The new index for the moved column. */ -- (void)moveColumn:(int)theColumnIndex toColumn:(int)theToIndex +- (void)moveColumn:(CPInteger)theColumnIndex toColumn:(CPInteger)theToIndex { [self _moveColumn:theColumnIndex toColumn:theToIndex]; [self _autosave]; @@ -1255,7 +1316,8 @@ NOT YET IMPLEMENTED - (void)selectRowIndexes:(CPIndexSet)rows byExtendingSelection:(BOOL)shouldExtendSelection { if ([rows isEqualToIndexSet:_selectedRowIndexes] || - (([rows firstIndex] != CPNotFound && [rows firstIndex] < 0) || [rows lastIndex] >= [self numberOfRows])) + (([rows firstIndex] != CPNotFound && [rows firstIndex] < 0) || [rows lastIndex] >= [self numberOfRows]) || + [self numberOfColumns] <= 0) return; // We deselect all columns when selecting rows. @@ -1304,7 +1366,7 @@ NOT YET IMPLEMENTED for (var identifier in _dataViewsForTableColumns) { - var dataViewsInTableColumn = _dataViewsForTableColumns[identifier] + var dataViewsInTableColumn = _dataViewsForTableColumns[identifier]; for (var i = 0; i < selectInfo.length; ++i) { @@ -1497,8 +1559,7 @@ NOT YET IMPLEMENTED { if (_allowsMultipleSelection) { - if (_implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_ && - ![_delegate selectionShouldChangeInTableView:self]) + if (![self _sendDelegateSelectionShouldChangeInTableView]) return; if ([[self selectedColumnIndexes] count]) @@ -1512,8 +1573,7 @@ NOT YET IMPLEMENTED { if ([self allowsEmptySelection]) { - if (_implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_ && - ![_delegate selectionShouldChangeInTableView:self]) + if (![self _sendDelegateSelectionShouldChangeInTableView]) return; [self deselectAll]; @@ -1545,13 +1605,17 @@ NOT YET IMPLEMENTED _numberOfRows = [[destination valueForKeyPath:keyPath] count]; } - else if (_dataSource && (_implementedDataSourceMethods & CPTableViewDataSource_numberOfRowsInTableView_)) - _numberOfRows = [_dataSource numberOfRowsInTableView:self] || 0; else { - if (_dataSource) - CPLog(@"no content binding established and data source " + [_dataSource description] + " does not implement numberOfRowsInTableView:"); - _numberOfRows = 0; + _numberOfRows = [self _sendDataSourceNumberOfRowsInTableView]; + + if (!_numberOfRows) + { + if (_dataSource && ![self _dataSourceRespondsToNumberOfRowsinTableView]) + CPLog(@"no content binding established and data source " + [_dataSource description] + " does not implement numberOfRowsInTableView:"); + + _numberOfRows = 0; + } } return _numberOfRows; @@ -1686,13 +1750,14 @@ NOT YET IMPLEMENTED [self setNeedsLayout]; } -// Complexity: -// O(Columns) /*! @ignore */ - (void)_recalculateTableColumnRanges { + // Complexity: + // O(Columns) + if (_dirtyTableColumnRangeIndex < 0) return; @@ -1725,8 +1790,6 @@ NOT YET IMPLEMENTED _dirtyTableColumnRangeIndex = CPNotFound; } -// Complexity: -// O(1) /*! Returns a CGRect with the location and size of the column If aColumnIndex lies outside the range of the table columns a CGZeroRect is returned @@ -1735,15 +1798,16 @@ NOT YET IMPLEMENTED */ - (CGRect)rectOfColumn:(CPInteger)aColumnIndex { - // Convert e.g. "0" to 0. + // Complexity: + // O(1) + + // Coerce aColumnIndex to a number in case it is a string. aColumnIndex = +aColumnIndex; if (aColumnIndex < 0 || aColumnIndex >= NUMBER_OF_COLUMNS()) return CGRectMakeZero(); - var column = [[self tableColumns] objectAtIndex:aColumnIndex]; - - if ([column isHidden]) + if ([[_tableColumns objectAtIndex:aColumnIndex] isHidden]) return CGRectMakeZero(); UPDATE_COLUMN_RANGES_IF_NECESSARY(); @@ -1753,52 +1817,65 @@ NOT YET IMPLEMENTED return CGRectMake(range.location, 0.0, range.length, CGRectGetHeight([self bounds])); } -// Complexity: -// O(1) /*! @ignore Returns a CGRect with the location and size of the row @param aRowIndex the index of the row to return the rect of - @param checkRange if YES this method will return a zero rect if the aRowIndex is outside of the range of valid indices + @param checkRange if YES this method will return a zero rect if aRowIndex is outside of the range of valid indices */ - (CGRect)_rectOfRow:(CPInteger)aRowIndex checkRange:(BOOL)checkRange { - var lastIndex = [self numberOfRows] - 1; + // Complexity: + // O(1) - if (checkRange && (aRowIndex > lastIndex || aRowIndex < 0)) + var lastIndex = [self numberOfRows] - 1, + validIndex = aRowIndex >= 0 && aRowIndex <= lastIndex; + + if (checkRange && !validIndex) return CGRectMakeZero(); - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_) - { - var rowToLookUp = MIN(aRowIndex, lastIndex); + var y = 0, + height, + fixedHeightRows = 0; - // if the row doesn't exist - if (rowToLookUp !== CPNotFound) + if (HAS_VARIABLE_ROW_HEIGHTS()) + { + [self _populateRowHeightCacheIfNeeded]; + + // If the index is valid, we use the y and height of the given row. + // If the index is invalid, we start from the bottom of the last row and use the default row height. + var heightInfo; + + if (validIndex) { - var y = _cachedRowHeights[rowToLookUp].heightAboveRow, - height = _cachedRowHeights[rowToLookUp].height + _intercellSpacing.height, - rowDelta = aRowIndex - rowToLookUp; + heightInfo = _cachedRowHeights[aRowIndex]; + y = heightInfo.y; + height = heightInfo.height + _intercellSpacing.height; } else { - y = aRowIndex * (_rowHeight + _intercellSpacing.height); - height = _rowHeight + _intercellSpacing.height; - } + height = FULL_ROW_HEIGHT(); - // if we need the rect of a row past the last index - if (rowDelta > 0) - { - y += rowDelta * (_rowHeight + _intercellSpacing.height); - height = _rowHeight + _intercellSpacing.height; + if (_numberOfRows > 0) + { + heightInfo = _cachedRowHeights[lastIndex]; + y = ROW_BOTTOM(heightInfo); + + // y is now at the top of the first row beyond the last valid row. + // Add the height of any rows beyond that. + fixedHeightRows = aRowIndex - _numberOfRows; + } } } else { - var y = aRowIndex * (_rowHeight + _intercellSpacing.height), - height = _rowHeight + _intercellSpacing.height; + fixedHeightRows = aRowIndex; + height = FULL_ROW_HEIGHT(); } + y += fixedHeightRows * FULL_ROW_HEIGHT(); + return CGRectMake(0.0, y, CGRectGetWidth([self bounds]), height); } @@ -1812,8 +1889,6 @@ NOT YET IMPLEMENTED return [self _rectOfRow:aRowIndex checkRange:YES]; } -// Complexity: -// O(1) /*! Returns a range of indices for the rows that lie wholly or partially within the vertical boundaries of a given rectangle. @@ -1821,6 +1896,9 @@ NOT YET IMPLEMENTED */ - (CPRange)rowsInRect:(CGRect)aRect { + // Complexity: + // O(1) + // If we have no rows, then we won't intersect anything. if (_numberOfRows <= 0) return CPMakeRange(0, 0); @@ -1846,33 +1924,30 @@ NOT YET IMPLEMENTED return CPMakeRange(firstRow, lastRow - firstRow + 1); } -/*! - @ignore - When we draw the row backgrounds we don't want an index bounding our range. +/* + Return the range of rows that lie wholly or partially within aRect. + If the bottom of the last real row is above the bottom of aRect, + synthesized rows of the default height are added to fill aRect. */ -- (CPRange)_unboundedRowsInRect:(CGRect)aRect +- (CPRange)_exposedRowsInRect:(CGRect)aRect { - var boundedRange = [self rowsInRect:aRect], - lastRow = CPMaxRange(boundedRange), - rectOfLastRow = [self _rectOfRow:lastRow checkRange:NO], - bottom = CGRectGetMaxY(aRect), - bottomOfBoundedRows = CGRectGetMaxY(rectOfLastRow); + var rowRange = [self rowsInRect:aRect], + lastRealRow = CPMaxRange(rowRange) - 1, + rectOfLastRealRow = [self _rectOfRow:lastRealRow checkRange:NO], + bottomOfRealRows = CGRectGetMaxY(rectOfLastRealRow), + rectBottom = CGRectGetMaxY(aRect); - // we only have to worry about the rows below the last... - if (bottom <= bottomOfBoundedRows) - return boundedRange; + // If the bottom of the last real row is at or below the bottom of aRect, we are done + if (bottomOfRealRows >= rectBottom) + return rowRange; - var numberOfNewRows = CEIL(bottom - bottomOfBoundedRows) / ([self rowHeight] + _intercellSpacing.height); + var numberOfSynthesizedRows = CEIL((rectBottom - bottomOfRealRows) / FULL_ROW_HEIGHT()); - boundedRange.length += numberOfNewRows + 1; + rowRange.length += numberOfSynthesizedRows; - return boundedRange; + return rowRange; } -// Complexity: -// O(lg Columns) if table view contains no hidden columns -// O(Columns) if table view contains hidden columns - /*! Returns the indexes of the receiver's columns that intersect the specified rectangle. @@ -1880,6 +1955,10 @@ NOT YET IMPLEMENTED */ - (CPIndexSet)columnIndexesInRect:(CGRect)aRect { + // Complexity: + // O(log numberOfColumns) if table view contains no hidden columns + // O(numberOfColumns) if table view contains hidden columns + var column = MAX(0, [self columnAtPoint:CGPointMake(aRect.origin.x, 0.0)]), lastColumn = [self columnAtPoint:CGPointMake(CGRectGetMaxX(aRect), 0.0)]; @@ -1890,7 +1969,6 @@ NOT YET IMPLEMENTED if (_numberOfHiddenColumns <= 0) return [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(column, lastColumn - column + 1)]; - // var indexSet = [CPIndexSet indexSet]; for (; column <= lastColumn; ++column) @@ -1904,9 +1982,6 @@ NOT YET IMPLEMENTED return indexSet; } -// Complexity: -// O(lg Columns) if table view contains now hidden columns -// O(Columns) if table view contains hidden columns /*! Returns the index of a column at a given point. If no column is there CPNotFound is returned. @@ -1914,6 +1989,10 @@ NOT YET IMPLEMENTED */ - (CPInteger)columnAtPoint:(CGPoint)aPoint { + // Complexity: + // O(log numberOfColumns) if table view contains no hidden columns + // O(numberOfColumns) if table view contains hidden columns + var bounds = [self bounds]; if (!CGRectContainsPoint(bounds, aPoint)) @@ -1953,42 +2032,54 @@ NOT YET IMPLEMENTED return CPNotFound; } -//Complexity -// O(1) for static row height -// 0(lg Rows) for variable row heights /*! - Returns the index of a row at a particular point. If no row exists CPNotFound is returned. + Returns the index of a row at a particular point. If no row exists at that point -1 is returned. @param aPoint a CGPoint */ - (CPInteger)rowAtPoint:(CGPoint)aPoint { - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_) + // Complexity: + // O(1) for fixed height rows or point out of bounds + // O(log numberOfRows) for variable height rows + + // aPoint.x must be within our bounds + var bounds = [self bounds]; + + if (aPoint.x < CGRectGetMinX(bounds) || aPoint.x >= CGRectGetMaxX(bounds)) + return -1; + + // aPoint.x is in bounds, now we just have to check aPoint.y + + if (HAS_VARIABLE_ROW_HEIGHTS()) { - return [_cachedRowHeights indexOfObject:aPoint - inSortedRange:nil - options:0 - usingComparator:function(aPoint, rowCache) - { - var upperBound = rowCache.heightAboveRow; + // First make sure aPoint.y is above the bottom of the last row, otherwise we might + // search the (potentially large number of) rows for nothing. + var heightInfo = [_cachedRowHeights lastObject]; - if (aPoint.y < upperBound) - return CPOrderedAscending; + if (!heightInfo || aPoint.y >= ROW_BOTTOM(heightInfo)) + return -1; - if (aPoint.y > upperBound + rowCache.height + _intercellSpacing.height) - return CPOrderedDescending; + return [_cachedRowHeights indexOfObject:aPoint + inSortedRange:nil + options:0 + usingComparator:function(aPoint, heightInfo) + { + if (aPoint.y < heightInfo.y) + return CPOrderedAscending; - return CPOrderedSame; - }]; + if (aPoint.y > ROW_BOTTOM(heightInfo)) + return CPOrderedDescending; + + return CPOrderedSame; + }]; } + else + { + var row = FLOOR(aPoint.y / FULL_ROW_HEIGHT()); - var y = aPoint.y, - row = FLOOR(y / (_rowHeight + _intercellSpacing.height)); - - if (row >= _numberOfRows) - return CPNotFound; - - return row; + return row >= _numberOfRows ? -1 : row; + } } /*! @@ -2331,14 +2422,14 @@ NOT YET IMPLEMENTED if (hangingSelections > 0) { - + // For optimal performance, only send a notification if indices were actually removed. var previousSelectionCount = [_selectedRowIndexes count]; + [_selectedRowIndexes removeIndexesInRange:CPMakeRange(_numberOfRows, hangingSelections)]; if (![_selectedRowIndexes containsIndex:[self selectedRow]]) _lastSelectedRow = CPNotFound; - // For optimal performance, only send a notification if indices were actually removed. if (previousSelectionCount > [_selectedRowIndexes count]) [self _noteSelectionDidChange]; } @@ -2346,6 +2437,14 @@ NOT YET IMPLEMENTED [self tile]; } +/* + Populates the row height cache if necessary. +*/ +- (void)_populateRowHeightCacheIfNeeded +{ + if ([self numberOfRows] !== _cachedRowHeights.length) + [self noteHeightOfRowsWithIndexesChanged:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, _numberOfRows)]]; +} /*! Informs the receiver that the rows specified in indexSet have changed height. @@ -2354,24 +2453,29 @@ NOT YET IMPLEMENTED */ - (void)noteHeightOfRowsWithIndexesChanged:(CPIndexSet)anIndexSet { - if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_)) + if (!HAS_VARIABLE_ROW_HEIGHTS()) return; - // this method will update the height of those rows, but since the cached array also contains - // the height above the row it needs to recalculate for the rows below it too - var i = [anIndexSet firstIndex], - count = _numberOfRows - i, - heightAbove = (i > 0) ? _cachedRowHeights[i - 1].height + _cachedRowHeights[i - 1].heightAboveRow + _intercellSpacing.height : 0; + // Update the height of the given rows by calling the delegate. Since the row height cache also contains + // y coordinates, we have to update the y coordinates of all rows below the first valid row in the range. + var i = [anIndexSet indexGreaterThanOrEqualToIndex:0]; - for (; i < count; i++) + if (i === CPNotFound) + return; + + var y = i < _cachedRowHeights.length ? _cachedRowHeights[i].y : 0; + + for (var count = [self numberOfRows]; i < count; ++i) { - // update the cache if the user told us to + var height; + if ([anIndexSet containsIndex:i]) - var height = [_delegate tableView:self heightOfRow:i]; + height = [self _sendDelegateHeightOfRow:i]; + else + height = _cachedRowHeights[i].height || _rowHeight; // in case the cache entry is empty - _cachedRowHeights[i] = {"height":height, "heightAboveRow":heightAbove}; - - heightAbove += height + _intercellSpacing.height; + _cachedRowHeights[i] = {y:y, height:height}; + y += height + _intercellSpacing.height; } } @@ -2383,20 +2487,18 @@ NOT YET IMPLEMENTED UPDATE_COLUMN_RANGES_IF_NECESSARY(); var width = _tableColumnRanges.length > 0 ? CPMaxRange([_tableColumnRanges lastObject]) : 0.0, - superview = [self superview]; + superview = [self superview], + height = 0; - if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_)) - var height = (_rowHeight + _intercellSpacing.height) * _numberOfRows; - else if ([self numberOfRows] === 0) - var height = 0; - else + if (!HAS_VARIABLE_ROW_HEIGHTS()) + height = FULL_ROW_HEIGHT() * _numberOfRows; + else if (_numberOfRows > 0) { - // if this is the fist run we need to populate the cache - if ([self numberOfRows] !== _cachedRowHeights.length) - [self noteHeightOfRowsWithIndexesChanged:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self numberOfRows])]]; + [self _populateRowHeightCacheIfNeeded]; - var heightObject = _cachedRowHeights[_cachedRowHeights.length - 1], - height = heightObject.heightAboveRow + heightObject.height + _intercellSpacing.height; + var heightInfo = _cachedRowHeights[_cachedRowHeights.length - 1]; + + height = ROW_BOTTOM(heightInfo); } if ([superview isKindOfClass:[CPClipView class]]) @@ -2602,12 +2704,12 @@ The autoresizingMask of the returned view will automatically be set to CPViewNot Called when the tableview is about to display a dataview @code -- (void)tableView:(CPTableView)aTableView willDisplayView:(id)aView forTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex; +- (void)tableView:(CPTableView)aTableView willDisplayView:(id)aView forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex; @endcode Group rows are a way to separate a groups of data in a tableview. Return YES if the given row is a group row, otherwise NO. @code -- (BOOL)tableView:(CPTableView)tableView isGroupRow:(int)row; +- (BOOL)tableView:(CPTableView)tableView isGroupRow:(CPInteger)row; @endcode @@ -2615,7 +2717,7 @@ Group rows are a way to separate a groups of data in a tableview. Return YES if Return YES if the dataview at a given index and column should be edited, otherwise NO. @code -- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex; @endcode @@ -2623,7 +2725,7 @@ Return YES if the dataview at a given index and column should be edited, otherwi Return the height of the row at a given index. Only implement this if you want variable row heights. Otherwise use setRowHeight: on the tableview. @code -- (float)tableView:(CPTableView)tableView heightOfRow:(int)row; +- (float)tableView:(CPTableView)tableView heightOfRow:(CPInteger)row; @endcode @@ -2637,7 +2739,7 @@ Return YES if the selection of the tableview should change, otherwise NO to keep Return YES if the row at a given index should be selected, other NO to deny the selection. @code -- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)rowIndex; +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)rowIndex; @endcode Return YES if the table column given should be selected, otherwise NO to deny the selection. @@ -2645,7 +2747,7 @@ Return YES if the table column given should be selected, otherwise NO to deny th - (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn; @endcode -Informs the delegate that the tableview is in the process of chaining the selection. +Informs the delegate that the tableview is in the process of changing the selection. This usually happens when the user is dragging their mouse across rows. @code - (void)tableViewSelectionIsChanging:(CPNotification)aNotification @@ -2660,8 +2762,10 @@ Informs the delegate that the tableview selection has changed. @section movingandresizingcolumns Moving and Resizing Columns: Return YES if the column at a given index should move to a new column index, otherwise NO. +When a column is initially dragged by the user, the delegate is first called with a newColumnIndex value of -1 + @code -- (BOOL)tableView:(CPTableView)tableView shouldReorderColumn:(int)columnIndex toColumn:(int)newColumnIndex; +- (BOOL)tableView:(CPTableView)tableView shouldReorderColumn:(CPInteger)columnIndex toColumn:(CPInteger)newColumnIndex; @endcode @@ -2701,7 +2805,7 @@ Notify the delegate that the user has clicked the table header of a column. Called when the user right-clicks on the tableview. -1 is passed for the row or column if the user doesn't right click on a real row or column Return a CPMenu that should be displayed if the user right-clicks. If you do not implement this the tableview will call super on menuForEvent @code -- (CPMenu)tableView:(CPTableView)aTableView menuForTableColumn:(CPTableColumn)aColumn row:(int)aRow; +- (CPMenu)tableView:(CPTableView)aTableView menuForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow; @endcode @@ -2713,7 +2817,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)tableViewDeleteKeyPressed:(CPTableView)aTableView; @endcode */ -- (void)setDelegate:(id)aDelegate +- (void)setDelegate:(id )aDelegate { if (_delegate === aDelegate) return; @@ -2812,7 +2916,10 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _implementedDelegateMethods |= CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_; if ([_delegate respondsToSelector:@selector(tableView:menuForTableColumn:row:)]) - _implementedDelegateMethods |= CPTableViewDelegate_tableViewMenuForTableColumn_Row_; + _implementedDelegateMethods |= CPTableViewDelegate_tableViewMenuForTableColumn_row_; + + if ([_delegate respondsToSelector:@selector(tableView:shouldReorderColumn:toColumn:)]) + _implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_; if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)]) [defaultCenter @@ -2854,94 +2961,48 @@ Your delegate can implement this method to avoid subclassing the tableview to ad /*! @ignore */ -- (void)_sendDelegateDidClickColumn:(int)column +- (void)_didClickTableColumn:(CPInteger)clickedColumn modifierFlags:(unsigned)modifierFlags { - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_didClickTableColumn_) - [_delegate tableView:self didClickTableColumn:_tableColumns[column]]; -} - -/*! - @ignore -*/ -- (void)_sendDelegateDidDragColumn:(int)column -{ - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_didDragTableColumn_) - [_delegate tableView:self didDragTableColumn:_tableColumns[column]]; -} - -- (void)_sendDelegateDidMouseDownInHeader:(int)column -{ - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_) - [_delegate tableView:self mouseDownInHeaderOfTableColumn:_tableColumns[column]]; -} - -/* - @ignore -*/ -- (BOOL)_sendDelegateDeleteKeyPressed -{ - if ([_delegate respondsToSelector: @selector(tableViewDeleteKeyPressed:)]) - { - [_delegate tableViewDeleteKeyPressed:self]; - return YES; - } - - return NO; -} - - -/*! - @ignore -*/ -- (void)_sendDataSourceSortDescriptorsDidChange:(CPArray)oldDescriptors -{ - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_sortDescriptorsDidChange_) - [_dataSource tableView:self sortDescriptorsDidChange:oldDescriptors]; -} - - -/*! - @ignore -*/ -- (void)_didClickTableColumn:(int)clickedColumn modifierFlags:(unsigned)modifierFlags -{ - [self _sendDelegateDidClickColumn:clickedColumn]; - [self _changeSortDescriptorsForClickOnColumn:clickedColumn]; if (_allowsColumnSelection) { - [self _noteSelectionIsChanging]; - if (modifierFlags & CPPlatformActionKeyMask) + if ([self _sendDelegateSelectionShouldChangeInTableView] && [self _sendDelegateShouldSelectTableColumn:clickedColumn]) { - if ([self isColumnSelected:clickedColumn]) - [self deselectColumn:clickedColumn]; - else if ([self allowsMultipleSelection] == YES) - [self selectColumnIndexes:[CPIndexSet indexSetWithIndex:clickedColumn] byExtendingSelection:YES]; + [self _noteSelectionIsChanging]; + if (modifierFlags & CPPlatformActionKeyMask) + { + if ([self isColumnSelected:clickedColumn]) + [self deselectColumn:clickedColumn]; + else if ([self allowsMultipleSelection] == YES) + [self selectColumnIndexes:[CPIndexSet indexSetWithIndex:clickedColumn] byExtendingSelection:YES]; - return; + return; + } + else if (modifierFlags & CPShiftKeyMask) + { + // should be from clickedColumn to lastClickedColum with extending:(direction == previous selection) + var startColumn = MIN(clickedColumn, [_selectedColumnIndexes lastIndex]), + endColumn = MAX(clickedColumn, [_selectedColumnIndexes firstIndex]); + + [self selectColumnIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(startColumn, endColumn - startColumn + 1)] + byExtendingSelection:YES]; + + return; + } + else + [self selectColumnIndexes:[CPIndexSet indexSetWithIndex:clickedColumn] byExtendingSelection:NO]; } - else if (modifierFlags & CPShiftKeyMask) - { - // should be from clickedColumn to lastClickedColum with extending:(direction == previous selection) - var startColumn = MIN(clickedColumn, [_selectedColumnIndexes lastIndex]), - endColumn = MAX(clickedColumn, [_selectedColumnIndexes firstIndex]); - - [self selectColumnIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(startColumn, endColumn - startColumn + 1)] - byExtendingSelection:YES]; - - return; - } - else - [self selectColumnIndexes:[CPIndexSet indexSetWithIndex:clickedColumn] byExtendingSelection:NO]; } + + [self _sendDelegateDidClickTableColumn:clickedColumn]; } // From GNUSTEP /*! @ignore */ -- (void)_changeSortDescriptorsForClickOnColumn:(int)column +- (void)_changeSortDescriptorsForClickOnColumn:(CPInteger)column { var tableColumn = [_tableColumns objectAtIndex:column], newMainSortDescriptor = [tableColumn sortDescriptorPrototype]; @@ -3048,7 +3109,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad */ - (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes atPoint:(CGPoint)mouseDownPoint { - return [rowIndexes count] > 0 && [self numberOfRows] > 0; + return [rowIndexes count] > 0 && [self numberOfRows] > 0 && [self numberOfColumns] > 0; } /*! @@ -3121,7 +3182,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad // Copy the dataviews add them to a transparent drag view and use that drag view // to make it appear we are dragging images of those rows (as you would do in regular Cocoa) */ -- (CPView)_dragViewForColumn:(int)theColumnIndex event:(CPEvent)theDragEvent offset:(CGPoint)theDragViewOffset +- (CPView)_dragViewForColumn:(CPInteger)theColumnIndex event:(CPEvent)theDragEvent offset:(CGPoint)theDragViewOffset { var dragView = [[_CPColumnDragView alloc] initWithLineColor:[self gridColor]], tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex], @@ -3315,21 +3376,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad return _sortDescriptors; } -- (BOOL)_dataSourceRespondsToObjectValueForTableColumn -{ - return _implementedDataSourceMethods & CPTableViewDataSource_tableView_objectValueForTableColumn_row_; -} - -- (BOOL)_delegateRespondsToDataViewForTableColumn -{ - return _implementedDelegateMethods & CPTableViewDelegate_tableView_dataViewForTableColumn_row_; -} - -- (BOOL)_delegateRespondsToViewForTableColumn -{ - return _implementedDelegateMethods & CPTableViewDelegate_tableView_viewForTableColumn_row_; -} - /*! @ignore */ @@ -3351,7 +3397,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad { if ([self _dataSourceRespondsToObjectValueForTableColumn]) { - objectValue = [_dataSource tableView:self objectValueForTableColumn:aTableColumn row:aRowIndex]; + objectValue = [self _sendDataSourceObjectValueForTableColumn:aTableColumn row:aRowIndex]; tableColumnObjectValues[aRowIndex] = objectValue; } else if (!_isViewBased && ![self infoForBinding:@"content"]) @@ -3436,6 +3482,24 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [self setNeedsDisplay:YES]; + // if we have any columns to remove do that here + if ([_differedColumnDataToRemove count]) + { + for (var i = 0; i < _differedColumnDataToRemove.length; i++) + { + var data = _differedColumnDataToRemove[i], + column = data.column, + tableColumnUID = [column UID], + dataViews = _dataViewsForTableColumns[tableColumnUID]; + + for (var j = 0; j < [dataViews count]; j++) + { + [self _enqueueReusableDataView:[dataViews objectAtIndex:j]]; + } + } + [_differedColumnDataToRemove removeAllObjects]; + } + // Now clear all the leftovers // FIXME: this could be faster! for (var identifier in _cachedDataViews) @@ -3446,21 +3510,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad while (count--) [dataViews[count] removeFromSuperview]; } - - // if we have any columns to remove do that here - if ([_differedColumnDataToRemove count]) - { - for (var i = 0; i < _differedColumnDataToRemove.length; i++) - { - var data = _differedColumnDataToRemove[i], - column = data.column; - - [column setHidden:data.shouldBeHidden]; - [_tableColumns removeObject:column]; - } - [_differedColumnDataToRemove removeAllObjects]; - } - } /*! @@ -3565,24 +3614,20 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [dataView unsetThemeState:CPThemeStateSelectedDataView]; // FIX ME: for performance reasons we might consider diverging from cocoa and moving this to the reloadData method - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_isGroupRow_) + if ([self _sendDelegateIsGroupRow:row]) { - if ([_delegate tableView:self isGroupRow:row]) - { - [_groupRows addIndex:row]; - [dataView setThemeState:CPThemeStateGroupRow]; - } - else - { - [_groupRows removeIndexesInRange:CPMakeRange(row, 1)]; - [dataView unsetThemeState:CPThemeStateGroupRow]; - } + [_groupRows addIndex:row]; + [dataView setThemeState:CPThemeStateGroupRow]; - [self setNeedsDisplay:YES]; + } + else + { + [_groupRows removeIndexesInRange:CPMakeRange(row, 1)]; + [dataView unsetThemeState:CPThemeStateGroupRow]; } - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_) - [_delegate tableView:self willDisplayView:dataView forTableColumn:tableColumn row:row]; + [self _sendDelegateWillDisplayView:dataView forTableColumn:tableColumn row:row]; + [self setNeedsDisplay:YES]; if ([dataView superview] !== self) [self addSubview:dataView]; @@ -3620,13 +3665,13 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)_setObjectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow forView:(CPView)aDataView { - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_objectValueForTableColumn_row_) + if ([self _dataSourceRespondsToObjectValueForTableColumn]) [aDataView setObjectValue:[self _objectValueForTableColumn:aTableColumn row:aRow]]; // This gives the table column an opportunity to apply its bindings. // It will override the value set above if there is a binding. - if (_contentBindingExpicitelySet) + if (_contentBindingExplicitlySet) [self _prepareContentBindedDataView:aDataView forRow:aRow]; else // For both cell-based and view-based @@ -3695,8 +3740,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _editingCellIndex = nil; - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) - [_dataSource tableView:self setObjectValue:[sender objectValue] forTableColumn:sender.tableViewEditedColumnObj row:sender.tableViewEditedRowIndex]; + [self _sendDataSourceSetObjectValue:[sender objectValue] forTableColumn:sender.tableViewEditedColumnObj row:sender.tableViewEditedRowIndex]; // Allow the column binding to do a reverse set. Note that we do this even if the data source method above // is implemented. @@ -3739,19 +3783,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _editingCellIndex = nil; } -/*! - @ignore -*/ -- (CPView)_viewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow -{ - return [_delegate tableView:self viewForTableColumn:aTableColumn row:aRow]; -} - -- (CPView)_dataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow -{ - return [_delegate tableView:self dataViewForTableColumn:aTableColumn row:aRow]; -} - /*! @ignore */ @@ -3785,7 +3816,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad Returns a view with the specified identifier. @param identifier The view identifier. Must not be nil. - @param owner The owner of the CIB that may be loaded and instituted to create a new view with the particular identifier. + @param owner The owner of the CIB that may be loaded and instantiated to create a new view with the particular identifier. @return A view for the row. @discussion @@ -3799,7 +3830,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad return nil; var view, - // See if we have some reusable view available + // See if we have some reusable views available reusableViews = _cachedDataViews[anIdentifier]; if (reusableViews && reusableViews.length) @@ -3857,9 +3888,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)_updateIsViewBased { if ([self _delegateRespondsToViewForTableColumn]) - _viewForTableColumnRowSelector = @selector(_viewForTableColumn:row:); + _viewForTableColumnRowSelector = @selector(_sendDelegateViewForTableColumn:row:); else if ([self _delegateRespondsToDataViewForTableColumn]) - _viewForTableColumnRowSelector = @selector(_dataViewForTableColumn:row:); + _viewForTableColumnRowSelector = @selector(_sendDelegateDataViewForTableColumn:row:); _isViewBased = (_viewForTableColumnRowSelector !== nil || _archivedDataViews !== nil); } @@ -3999,9 +4030,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad return; } - var exposedRows = [self _unboundedRowsInRect:aRect], + var exposedRows = [self _exposedRowsInRect:aRect], firstRow = FLOOR(exposedRows.location / colorCount) * colorCount, - lastRow = CPMaxRange(exposedRows), + lastRow = CPMaxRange(exposedRows) - 1, colorIndex = 0, groupRowRects = []; @@ -4037,7 +4068,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)drawGridInClipRect:(CGRect)aRect { var context = [[CPGraphicsContext currentContext] graphicsPort], - gridStyleMask = [self gridStyleMask]; + gridStyleMask = [self gridStyleMask], + lineThickness = [self currentValueForThemeAttribute:@"grid-line-thickness"]; if (!(gridStyleMask & (CPTableViewSolidHorizontalGridLineMask | CPTableViewSolidVerticalGridLineMask))) return; @@ -4046,10 +4078,10 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (gridStyleMask & CPTableViewSolidHorizontalGridLineMask) { - var exposedRows = [self _unboundedRowsInRect:aRect], + var exposedRows = [self _exposedRowsInRect:aRect], row = exposedRows.location, lastRow = CPMaxRange(exposedRows) - 1, - rowY = -0.5, + rowY = -lineThickness / 2, minX = CGRectGetMinX(aRect), maxX = CGRectGetMaxX(aRect); @@ -4057,7 +4089,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad { // grab each row rect and add the top and bottom lines var rowRect = [self _rectOfRow:row checkRange:NO], - rowY = CGRectGetMaxY(rowRect) - 0.5; + rowY = CGRectGetMaxY(rowRect) - lineThickness / 2; CGContextMoveToPoint(context, minX, rowY); CGContextAddLineToPoint(context, maxX, rowY); @@ -4065,8 +4097,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (_rowHeight > 0.0) { - var rowHeight = _rowHeight + _intercellSpacing.height, - totalHeight = CGRectGetMaxY(aRect); + var rowHeight = FULL_ROW_HEIGHT(), + totalHeight = CGRectGetMaxY(aRect) - lineThickness / 2; while (rowY < totalHeight) { @@ -4093,7 +4125,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad for (; columnArrayIndex < columnArrayCount; ++columnArrayIndex) { var columnRect = [self rectOfColumn:columnsArray[columnArrayIndex]], - columnX = CGRectGetMaxX(columnRect) - 0.5; + columnX = CGRectGetMaxX(columnRect) - lineThickness / 2; CGContextMoveToPoint(context, columnX, minY); CGContextAddLineToPoint(context, columnX, maxY); @@ -4102,6 +4134,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad CGContextClosePath(context); CGContextSetStrokeColor(context, [self gridColor]); + CGContextSetLineWidth(context, lineThickness); CGContextStrokePath(context); } @@ -4452,9 +4485,15 @@ Your delegate can implement this method to avoid subclassing the tableview to ad // If the user clicks outside a row then deselect everything. if (row < 0 && _allowsEmptySelection) - [self selectRowIndexes:[CPIndexSet indexSet] byExtendingSelection:NO]; + { + if ([self _sendDelegateSelectionShouldChangeInTableView]) + { + var indexSet = [self _sendDelegateSelectionIndexesForProposedSelection:[CPIndexSet indexSet]]; - [self _noteSelectionIsChanging]; + [self _noteSelectionIsChanging]; + [self selectRowIndexes:indexSet byExtendingSelection:NO]; + } + } if ([self mouseDownFlags] & CPShiftKeyMask) _selectionAnchorRow = (ABS([_selectedRowIndexes firstIndex] - row) < ABS([_selectedRowIndexes lastIndex] - row)) ? @@ -4466,12 +4505,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _startTrackingPoint = aPoint; _startTrackingTimestamp = new Date(); - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) + if ([self _dataSourceRespondsToSetObjectValueForTableColumnRow]) _trackingPointMovedOutOfClickSlop = NO; // if the table has drag support then we use mouseUp to select a single row. // otherwise it uses mouse down. - if (row >= 0 && !(_implementedDataSourceMethods & CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_)) + if (row >= 0 && !([self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard])) [self _updateSelectionWithMouseAtRow:row]; return YES; @@ -4482,7 +4521,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad */ - (CPMenu)menuForEvent:(CPEvent)theEvent { - if (!(_implementedDelegateMethods & CPTableViewDelegate_tableViewMenuForTableColumn_Row_)) + if (!([self _delegateRespondsToMenuForTableColumnRow])) return [super menuForEvent:theEvent]; var location = [self convertPoint:[theEvent locationInWindow] fromView:nil], @@ -4490,7 +4529,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad column = [self columnAtPoint:location], tableColumn = [[self tableColumns] objectAtIndex:column]; - return [_delegate tableView:self menuForTableColumn:tableColumn row:row]; + return [self _sendDelegateMenuForTableColumn:tableColumn row:row]; } /* @@ -4517,7 +4556,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad // begin the drag is the datasource lets us, we've move at least +-3px vertical or horizontal, // or we're dragging from selected rows and we haven't begun a drag session - if (!_isSelectingSession && _implementedDataSourceMethods & CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_) + if (!_isSelectingSession && [self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard]) { if (row >= 0 && (ABS(_startTrackingPoint.x - aPoint.x) > 3 || (_verticalMotionCanDrag && ABS(_startTrackingPoint.y - aPoint.y) > 3)) || ([_selectedRowIndexes containsIndex:row])) @@ -4530,7 +4569,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad //ask the datasource for the data var pboard = [CPPasteboard pasteboardWithName:CPDragPboard]; - if ([self canDragRowsWithIndexes:_draggedRowIndexes atPoint:aPoint] && [_dataSource tableView:self writeRowsWithIndexes:_draggedRowIndexes toPasteboard:pboard]) + if ([self canDragRowsWithIndexes:_draggedRowIndexes atPoint:aPoint] && [self _sendDataSourceWriteRowsWithIndexes:_draggedRowIndexes toPasteboard:pboard]) { var currentEvent = [CPApp currentEvent], offset = CGPointMakeZero(), @@ -4576,7 +4615,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [self _updateSelectionWithMouseAtRow:row]; } - if ((_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) + if ([self _dataSourceRespondsToSetObjectValueForTableColumnRow] && !_trackingPointMovedOutOfClickSlop) { var CLICK_SPACE_DELTA = 5.0; // Stolen from AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -4603,7 +4642,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad rowIndex, shouldEdit = YES; - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_) + if ([self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard]) { rowIndex = [self rowAtPoint:aPoint]; @@ -4624,7 +4663,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (!_isViewBased && mouseIsUp && !_trackingPointMovedOutOfClickSlop && ([[CPApp currentEvent] clickCount] > 1) - && ((_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) + && ([self _dataSourceRespondsToSetObjectValueForTableColumnRow] || [self infoForBinding:@"content"])) { columnIndex = [self columnAtPoint:lastPoint]; @@ -4639,9 +4678,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (rowIndex !== -1) { - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldEditTableColumn_row_) - shouldEdit = [_delegate tableView:self shouldEditTableColumn:column row:rowIndex]; - if (shouldEdit) + if ([self _sendDelegateShouldEditTableColumn:column row:rowIndex]) { [self editColumn:columnIndex row:rowIndex withEvent:nil select:YES]; return; @@ -4680,7 +4717,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad for (; i < count; i++) { if ([[[sender draggingPasteboard] types] containsObject:[draggedTypes objectAtIndex: i]]) - return [self _validateDrop:sender proposedRow:row proposedDropOperation:dropOperation]; + return [self _sendDataSourceValidateDrop:sender proposedRow:row proposedDropOperation:dropOperation]; } return CPDragOperationNone; @@ -4773,18 +4810,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad /*! @ignore */ -- (void)_validateDrop:(id)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)dropOperation -{ - if (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_) - return [_dataSource tableView:self validateDrop:info proposedRow:row proposedDropOperation:dropOperation]; - - return CPDragOperationNone; -} - -/*! - @ignore -*/ -- (CGRect)_rectForDropHighlightViewOnRow:(int)theRowIndex +- (CGRect)_rectForDropHighlightViewOnRow:(CPInteger)theRowIndex { if (theRowIndex >= [self numberOfRows]) theRowIndex = [self numberOfRows] - 1; @@ -4795,7 +4821,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad /*! @ignore */ -- (CGRect)_rectForDropHighlightViewBetweenUpperRow:(int)theUpperRowIndex andLowerRow:(int)theLowerRowIndex offset:(CGPoint)theOffset +- (CGRect)_rectForDropHighlightViewBetweenUpperRow:(CPInteger)theUpperRowIndex andLowerRow:(CPInteger)theLowerRowIndex offset:(CGPoint)theOffset { if (theLowerRowIndex > [self numberOfRows]) theLowerRowIndex = [self numberOfRows]; @@ -4815,7 +4841,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad dropOperation = [self _proposedDropOperationAtPoint:location], numberOfRows = [self numberOfRows], row = [self _proposedRowAtPoint:location], - dragOperation = [self _validateDrop:sender proposedRow:row proposedDropOperation:dropOperation]; + dragOperation = [self _sendDataSourceValidateDrop:sender proposedRow:row proposedDropOperation:dropOperation]; if (_retargetedDropRow !== nil) row = _retargetedDropRow; @@ -4855,7 +4881,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad // actual validation is called in draggingUpdated: [_dropOperationFeedbackView removeFromSuperview]; - return (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_); + return [self _dataSourceRespondsToValidateDropProposedRowProposedDropOperation]; } /* @@ -4870,7 +4896,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (row === nil) var row = [self _proposedRowAtPoint:location]; - return [_dataSource tableView:self acceptDrop:sender row:row dropOperation:operation]; + return [self _sendDataSourceAcceptDrop:sender row:row dropOperation:operation]; } /* @@ -4881,15 +4907,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [self reloadData]; } -/* - This method is sent to the data source for convenience... -*/ -- (void)draggedImage:(CPImage)anImage endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation -{ - if ([_dataSource respondsToSelector:@selector(tableView:didEndDraggedImage:atPosition:operation:)]) - [_dataSource tableView:self didEndDraggedImage:anImage atPosition:aLocation operation:anOperation]; -} - /* @ignore We're using this because we drag views instead of images so we can get the rows themselves to actually drag. @@ -4942,6 +4959,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad } else if (_allowsMultipleSelection) { + if (_selectionAnchorRow == CPNotFound) + _selectionAnchorRow = [self numberOfRows] - 1; + newSelection = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(MIN(aRow, _selectionAnchorRow), ABS(aRow - _selectionAnchorRow) + 1)]; shouldExtendSelection = [self mouseDownFlags] & CPShiftKeyMask && ((_lastSelectedRow == [_selectedRowIndexes lastIndex] && aRow > _lastSelectedRow) || @@ -4955,14 +4975,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if ([newSelection isEqualToIndexSet:_selectedRowIndexes]) return; - if (_implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_ && - ![_delegate selectionShouldChangeInTableView:self]) + if (![self _sendDelegateSelectionShouldChangeInTableView]) return; - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_) - newSelection = [_delegate tableView:self selectionIndexesForProposedSelection:newSelection]; + newSelection = [self _sendDelegateSelectionIndexesForProposedSelection:newSelection]; - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectRow_) + if (![self _delegateRespondsToSelectionIndexesForProposedSelection] && [self _delegateRespondsToShouldSelectRow]) { var indexArray = []; @@ -4974,7 +4992,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad { var index = indexArray[indexCount]; - if (![_delegate tableView:self shouldSelectRow:index]) + if (![self _sendDelegateShouldSelectRow:index]) [newSelection removeIndex:index]; } @@ -4990,6 +5008,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if ([newSelection isEqualToIndexSet:_selectedRowIndexes]) return; + [self _noteSelectionIsChanging]; [self selectRowIndexes:newSelection byExtendingSelection:shouldExtendSelection]; _lastSelectedRow = [newSelection containsIndex:aRow] ? aRow : [newSelection lastIndex]; @@ -5070,7 +5089,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad /*! @ignore */ -- (id)hitTest:(CGPoint)aPoint +- (CPView)hitTest:(CGPoint)aPoint { var hit = [super hitTest:aPoint]; @@ -5195,8 +5214,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad */ - (void)_moveSelectionWithEvent:(CPEvent)theEvent upward:(BOOL)shouldGoUpward { - if (_implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_ && ![_delegate selectionShouldChangeInTableView:self]) + if (![self _sendDelegateSelectionShouldChangeInTableView]) return; + var selectedIndexes = [self selectedRowIndexes]; if ([selectedIndexes count] > 0) @@ -5233,14 +5253,21 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (i >= [self numberOfRows] || i < 0) return; - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectRow_) + if (![self _delegateRespondsToSelectionIndexesForProposedSelection] && [self _delegateRespondsToShouldSelectRow]) { + var shouldSelect = [self _sendDelegateShouldSelectRow:i]; - while (![_delegate tableView:self shouldSelectRow:i] && (i < [self numberOfRows] && i > 0)) - shouldGoUpward ? i-- : i++; //check to see if the row can be selected if it can't be then see if the next row can be selected + /* If shouldSelect returns NO it means this row cannot be selected. + The proper behaviour is to then try to see if the next/previous + row(s) can be selected, until we hit the first one that can be. + */ + while (!shouldSelect && (i < [self numberOfRows] && i > 0)) + { + shouldGoUpward ? --i : ++i; //check to see if the row can be selected. If it can't be then see if the next row can be selected. + shouldSelect = [self _sendDelegateShouldSelectRow:i]; + } - // If the index still can be selected after the loop then just return. - if (![_delegate tableView:self shouldSelectRow:i]) + if (!shouldSelect) return; } @@ -5275,6 +5302,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad var differedLastSelectedRow = i; } + selectedIndexes = [self _sendDelegateSelectionIndexesForProposedSelection:selectedIndexes]; + [self selectRowIndexes:selectedIndexes byExtendingSelection:extend]; // we differ because selectRowIndexes: does its own thing which would set the wrong index @@ -5287,9 +5316,498 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @end +@implementation CPTableView (TableViewDataSource) + +/*! + @ignore + Return YES if the dataSource implements tableView:objectValueForTableColumn:row +*/ +- (BOOL)_dataSourceRespondsToObjectValueForTableColumn +{ + return _implementedDataSourceMethods & CPTableViewDataSource_tableView_objectValueForTableColumn_row_; +} + +/*! + @ignore + Return YES if the dataSource implements tableView:writeRowsWithIndexes:toPasteboard: +*/ +- (BOOL)_dataSourceRespondsToWriteRowsWithIndexesToPasteboard +{ + return _implementedDataSourceMethods & CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_; +} + +/*! + @ignore + Return YES if the dataSource implements tableView:setObjectValue:forTableColumn:row: +*/ +- (BOOL)_dataSourceRespondsToSetObjectValueForTableColumnRow +{ + return CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_; +} + +/*! + @ignore + Return YES if the dataSource implements tableView:validateDrop:proposedRow:proposedDropOperation:; +*/ +- (BOOL)_dataSourceRespondsToValidateDropProposedRowProposedDropOperation +{ + return _implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_; +} + +/*! + @ignore + Return YES if the dataSource implements numberOfRowsInTableView +*/ +- (BOOL)_dataSourceRespondsToNumberOfRowsinTableView +{ + return _implementedDataSourceMethods & CPTableViewDataSource_numberOfRowsInTableView_; +} + +/*! + @ignore + Return the number of rows of the tableView + By default return 0. +*/ +- (int)_sendDataSourceNumberOfRowsInTableView +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_numberOfRowsInTableView_)) + return 0; + + return [_dataSource numberOfRowsInTableView:self]; +} + +/*! + @ignore + Return the objectValue for the given column and row. + By default return nil. +*/ +- (id)_sendDataSourceObjectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_objectValueForTableColumn_row_)) + return nil; + + return [_dataSource tableView:self objectValueForTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Call the method tableView:setObjectValue:ForTableColum:row: of the dataSource +*/ +- (void)_sendDataSourceSetObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_)) + return; + + [_dataSource tableView:self setObjectValue:anObject forTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Call the method tableView:sortDescriptorsDidChange: of the dataSource +*/ +- (void)_sendDataSourceSortDescriptorsDidChange:(CPArray)descriptors +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_sortDescriptorsDidChange_)) + return; + + [_dataSource tableView:self sortDescriptorsDidChange:descriptors]; +} + +/*! + @ignore + Return if the drop is accepted or not for the given dropOperation, info and row. By default return NO. +*/ +- (BOOL)_sendDataSourceAcceptDrop:(id)info row:(CPInteger)aRowIndex dropOperation:(CPTableViewDropOperation)operation +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_acceptDrop_row_dropOperation_)) + return NO; + + return [_dataSource tableView:self acceptDrop:info row:aRowIndex dropOperation:operation]; +} + +/*! + @ignore + Return the dragOperation for the given row and dropOperation. By default return CPDragOperationNone. +*/ +- (CPDragOperation)_sendDataSourceValidateDrop:(id)info proposedRow:(CPInteger)aRowIndex proposedDropOperation:(CPTableViewDropOperation)operation +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_)) + return CPDragOperationNone; + + return [_dataSource tableView:self validateDrop:info proposedRow:aRowIndex proposedDropOperation:operation]; +} + +/*! + @ignore + Return a boolean for writeRowsWithIndexes:toPasteroard for the given pasteboard and row. By default return NO +*/ +- (BOOL)_sendDataSourceWriteRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_)) + return NO; + + return [_dataSource tableView:self writeRowsWithIndexes:rowIndexes toPasteboard:pboard]; +} + +/* + This method is sent to the data source for convenience... +*/ +- (void)draggedImage:(CPImage)anImage endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation +{ + if ([_dataSource respondsToSelector:@selector(tableView:didEndDraggedImage:atPosition:operation:)]) + [_dataSource tableView:self didEndDraggedImage:anImage atPosition:aLocation operation:anOperation]; +} + + +#pragma mark - +#pragma mark DataSource methods to implement + +/*! + @ignore + Not yet implemented +*/ +- (CPArray)_sendDataSourceNamesOfPromisedFilesDroppedAtDestination:(CPURL)dropDestination forDraggedRowsWithIndexes:(CPIndexSet)indexSet +{ + if (!(_implementedDataSourceMethods & CPTableViewDataSource_tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes_)) + return []; + + return [_dataSource tableView:self namesOfPromisedFilesDroppedAtDestination:dropDestination forDraggedRowsWithIndexes:indexSet]; +} + +@end + + +@implementation CPTableView (TableViewDelegate) + +/*! + @ignore + Return YES if the delegate implements tableView:dataViewFortableColumn:row: +*/ +- (BOOL)_delegateRespondsToDataViewForTableColumn +{ + return _implementedDelegateMethods & CPTableViewDelegate_tableView_dataViewForTableColumn_row_; +} + +/*! + @ignore + Return YES if the delegate implements tableView:viewFortableColumn:row: +*/ +- (BOOL)_delegateRespondsToViewForTableColumn +{ + return _implementedDelegateMethods & CPTableViewDelegate_tableView_viewForTableColumn_row_; +} + +/*! + @ignore + Return YES if the delegate implements tableView:shouldSelectRow: +*/ +- (BOOL)_delegateRespondsToShouldSelectRow +{ + return _implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectRow_; +} + +/*! + @ignore + Return YES if the delegate implements tableView:selectionShouldChangeInTableView +*/ +- (BOOL)_delegateRespondsToSelectionShouldChangeInTableView +{ + return _implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_; +} + +/*! + @ignore + Return YES if the delegate implements tableView:selectionIndexesForProposedSelection +*/ +- (BOOL)_delegateRespondsToSelectionIndexesForProposedSelection +{ + return _implementedDelegateMethods & CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_; +} + +/*! + @ignore + Return YES if the delegate implements tableView:menuForTableColumn:row +*/ +- (BOOL)_delegateRespondsToMenuForTableColumnRow +{ + return _implementedDelegateMethods & CPTableViewDelegate_tableViewMenuForTableColumn_row_; +} + +/*! + @ignore + Call the delegate didClickTableColumn with the given tableColumn +*/ +- (void)_sendDelegateDidClickTableColumn:(CPInteger)column +{ + if (_implementedDelegateMethods & CPTableViewDelegate_tableView_didClickTableColumn_) + [_delegate tableView:self didClickTableColumn:_tableColumns[column]]; +} + +/*! + @ignore + Call the delegate didDragTableColumn with the given tableColumn +*/ +- (void)_sendDelegateDidDragTableColumn:(CPInteger)column +{ + if (_implementedDelegateMethods & CPTableViewDelegate_tableView_didDragTableColumn_) + [_delegate tableView:self didDragTableColumn:_tableColumns[column]]; +} + +/*! + @ignore + Call the delegate mouseDownInHeaderOfTableColumn with the given tableColumn +*/ +- (void)_sendDelegateMouseDownInHeaderOfTableColumn:(CPInteger)column +{ + if (_implementedDelegateMethods & CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_) + [_delegate tableView:self mouseDownInHeaderOfTableColumn:_tableColumns[column]]; +} + +/* + @ignore + Call the delegate tableViewDeleteKeyPressed +*/ +- (BOOL)_sendDelegateDeleteKeyPressed +{ + if ([_delegate respondsToSelector: @selector(tableViewDeleteKeyPressed:)]) + { + [_delegate tableViewDeleteKeyPressed:self]; + return YES; + } + + return NO; +} + +/*! + @ignore + Return if the selection should change. By default return YES +*/ +- (BOOL)_sendDelegateSelectionShouldChangeInTableView +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_selectionShouldChangeInTableView_)) + return YES; + + return [_delegate selectionShouldChangeInTableView:self]; +} + +/*! + @ignore + Return if the given row is a group or not. By default return NO. +*/ +- (BOOL)_sendDelegateIsGroupRow:(CPInteger)anIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_isGroupRow_)) + return NO; + + return [_delegate tableView:self isGroupRow:anIndex]; +} + +/*! + @ignore + Return is we should select the given row. By Default return YES +*/ +- (BOOL)_sendDelegateShouldSelectRow:(CPInteger)anIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectRow_)) + return YES; + + return [_delegate tableView:self shouldSelectRow:anIndex]; +} + +/*! + @ignore + Call the delegate tableView:willDisplayView:forTableColumn:row: +*/ +- (void)_sendDelegateWillDisplayView:(id)aCell forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_)) + return; + + [_delegate tableView:self willDisplayView:aCell forTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Return a CPMenu for the given tableColumn and row. By default return the menu of super. +*/ +- (CPMenu)_sendDelegateMenuForTableColumn:(CPTableColumn)aTableColumn row:aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableViewMenuForTableColumn_row_)) + return nil; + + return [_delegate tableView:self menuForTableColumn:aTableColumn row:aRowIndex]; +} + +/* + @ignore + Returns YES if the column at columnIndex can be reordered. + It can be possible if column reordering is allowed and if the tableview + delegate also accept the reordering +*/ +- (BOOL)_sendDelegateShouldReorderColumn:(CPInteger)columnIndex toColumn:(CPInteger)newColumnIndex +{ + if ([self allowsColumnReordering] && + _implementedDelegateMethods & CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_) + { + return [_delegate tableView:self shouldReorderColumn:columnIndex toColumn:newColumnIndex]; + } + + return [self allowsColumnReordering]; +} + +/*! + @ignore + Return the height of the given row. By default return [self rowHeight]. +*/ +- (float)_sendDelegateHeightOfRow:(CPInteger)anIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_heightOfRow_)) + return [self rowHeight]; + + return [_delegate tableView:self heightOfRow:anIndex]; +} + +/*! + @ignore + Return a boolean to know if we should or not edit the given row. By default return YES. +*/ +- (BOOL)_sendDelegateShouldEditTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldEditTableColumn_row_)) + return YES; + + return [_delegate tableView:self shouldEditTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Return a new CPIndexSet instead of the proposedSelection. By default return the proposedSelection. +*/ +- (CPIndexSet)_sendDelegateSelectionIndexesForProposedSelection:(CPIndexSet)anIndexSet +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_)) + return anIndexSet; + + return [_delegate tableView:self selectionIndexesForProposedSelection:anIndexSet]; +} + +/*! + @ignore + Return a view for the given tableColumn and row. By default return nil. +*/ +- (CPView)_sendDelegateViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_viewForTableColumn_row_)) + return nil; + + return [_delegate tableView:self viewForTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Return a view for the given tableColumn and row. By default return nil. +*/ +- (CPView)_sendDelegateDataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_dataViewForTableColumn_row_)) + return nil; + + return [_delegate tableView:self dataViewForTableColumn:aTableColumn row:aRowIndex]; +} + + +#pragma mark - +#pragma mark Delegate methods to implement + +/*! + @ignore + Not yet implemented ! +*/ +- (BOOL)_sendDelegateShouldSelectTableColumn:(CPTableColumn)aTableColumn +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectTableColumn_)) + return YES; + + return [_delegate tableView:self shouldSelectTableColumn:aTableColumn]; +} + +/*! + @ignore + Not yet implemented +*/ +- (CPString)_sendDelegateToolTipForView:(id)aView rect:(CGRect)aRect tableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex mouseLocation:(CGPoint)aPoint +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_)) + return nil; + + return [_delegate tableView:self toolTipForView:aView rect:aRect tableColumn:aTableColumn row:aRowIndex mouseLocation:aPoint]; +} + +/*! + @ignore + Not yet implemented +*/ +- (BOOL)_sendDelegateShouldTrackView:(id)aView forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_)) + return YES; + + return [_delegate tableView:self shouldTrackView:aView forTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Not yet implemented +*/ +- (BOOL)_sendDelegateShouldShowViewExpansionForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_)) + return YES; + + return [_delegate tableView:self shouldShowViewExpansionForTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Not yet implemented +*/ +- (BOOL)_sendDelegateShouldTypeSelectForEvent:(CPEvent)anEvent withCurrentSearchString:(CPString)aString +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_)) + return NO; + + return [_delegate tableView:self shouldTypeSelectForEvent:anEvent withCurrentSearchString:aString]; +} + +/*! + @ignore + Not yet implemented +*/ +- (CPString)_sendDelegateTypeSelectStringForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRowIndex +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_)) + return nil; + + return [_delegate tableView:self typeSelectStringForTableColumn:aTableColumn row:aRowIndex]; +} + +/*! + @ignore + Not yet implemented ! +*/ +- (int)_sendDelegateNextTypeSelectMatchFromRow:(CPInteger)aRowIndex toRow:(CPInteger)aSecondRowIndex forString:(CPString)aString +{ + if (!(_implementedDelegateMethods & CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_)) + return -1; + + return [_delegate tableView:self nextTypeSelectMatchFromRow:aRowIndex toRow:aSecondRowIndex forString:aString]; +} + +@end + @implementation CPTableView (Bindings) -+ (id)_binderClassForBinding:(CPString)aBinding ++ (Class)_binderClassForBinding:(CPString)aBinding { if (aBinding == @"content") return [CPTableContentBinder class]; @@ -5316,11 +5834,11 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if ([[self infoForBinding:@"content"] objectForKey:CPObservedObjectKey] !== destination) { [super bind:@"content" toObject:destination withKeyPath:@"arrangedObjects" options:nil]; - _contentBindingExpicitelySet = NO; + _contentBindingExplicitlySet = NO; } // If the content binding was set manually assume the user is taking manual control of establishing bindings. - if (!_contentBindingExpicitelySet) + if (!_contentBindingExplicitlySet) { if ([[self infoForBinding:@"selectionIndexes"] objectForKey:CPObservedObjectKey] !== destination) [self bind:@"selectionIndexes" toObject:destination withKeyPath:@"selectionIndexes" options:nil]; @@ -5335,7 +5853,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [super bind:aBinding toObject:anObject withKeyPath:aKeyPath options:options]; if (aBinding == @"content") - _contentBindingExpicitelySet = YES; + _contentBindingExplicitlySet = YES; } @end @@ -5346,7 +5864,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad id _content @accessors(property=content); } -- (void)setValueFor:(id)aBinding +- (void)setValueFor:(CPString)aBinding { var destination = [_info objectForKey:CPObservedObjectKey], keyPath = [_info objectForKey:CPObservedKeyPathKey]; @@ -5515,13 +6033,19 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", if (tableView._destinationDragStyle === CPTableViewDraggingDestinationFeedbackStyleNone || isBlinking) return; - var context = [[CPGraphicsContext currentContext] graphicsPort]; - - CGContextSetStrokeColor(context, [CPColor colorWithHexString:@"4886ca"]); - CGContextSetLineWidth(context, 3); + var context = [[CPGraphicsContext currentContext] graphicsPort], + borderRadius, + borderColor, + borderWidth, + backgroundColor; if (currentRow === -1) { + borderColor = [tableView valueForThemeAttribute:@"dropview-on-border-color"]; + borderWidth = [tableView valueForThemeAttribute:@"dropview-on-border-width"]; + + CGContextSetStrokeColor(context, borderColor); + CGContextSetLineWidth(context, borderWidth); CGContextStrokeRect(context, [self bounds]); } @@ -5533,16 +6057,24 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", if ([selectedRows containsIndex:currentRow]) { - CGContextSetLineWidth(context, 2); - CGContextSetStrokeColor(context, [CPColor whiteColor]); + borderRadius = [tableView valueForThemeAttribute:@"dropview-on-selected-border-radius"]; + borderColor = [tableView valueForThemeAttribute:@"dropview-on-selected-border-color"]; + borderWidth = [tableView valueForThemeAttribute:@"dropview-on-selected-border-width"]; + backgroundColor = [tableView valueForThemeAttribute:@"dropview-on-selected-background-color"]; } else { - CGContextSetFillColor(context, [CPColor colorWithRed:72 / 255 green:134 / 255 blue:202 / 255 alpha:0.25]); - CGContextFillRoundedRectangleInRect(context, newRect, 8, YES, YES, YES, YES); + borderRadius = [tableView valueForThemeAttribute:@"dropview-on-border-radius"]; + borderColor = [tableView valueForThemeAttribute:@"dropview-on-border-color"]; + borderWidth = [tableView valueForThemeAttribute:@"dropview-on-border-width"]; + backgroundColor = [tableView valueForThemeAttribute:@"dropview-on-background-color"]; } - CGContextStrokeRoundedRectangleInRect(context, newRect, 8, YES, YES, YES, YES); + CGContextSetStrokeColor(context, borderColor); + CGContextSetLineWidth(context, borderWidth); + CGContextSetFillColor(context, backgroundColor); + CGContextFillRoundedRectangleInRect(context, newRect, borderRadius, YES, YES, YES, YES); + CGContextStrokeRoundedRectangleInRect(context, newRect, borderRadius, YES, YES, YES, YES); } else if (dropOperation === CPTableViewDropAbove) @@ -5554,28 +6086,23 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", if ([selectedRows containsIndex:currentRow - 1] || [selectedRows containsIndex:currentRow]) { - CGContextSetStrokeColor(context, [CPColor whiteColor]); - CGContextSetLineWidth(context, 4); - //draw the circle thing - CGContextStrokeEllipseInRect(context, CGRectMake(aRect.origin.x + 4, aRect.origin.y + 4, 8, 8)); - //then draw the line - CGContextBeginPath(context); - CGContextMoveToPoint(context, 10, aRect.origin.y + 8); - CGContextAddLineToPoint(context, aRect.size.width - aRect.origin.y - 8, aRect.origin.y + 8); - CGContextStrokePath(context); - - CGContextSetStrokeColor(context, [CPColor colorWithHexString:@"4886ca"]); - CGContextSetLineWidth(context, 3); + borderColor = [tableView valueForThemeAttribute:@"dropview-above-selected-border-color"]; + borderWidth = [tableView valueForThemeAttribute:@"dropview-above-selected-border-width"]; + } + else + { + borderColor = [tableView valueForThemeAttribute:@"dropview-above-border-color"]; + borderWidth = [tableView valueForThemeAttribute:@"dropview-above-border-width"]; } - //draw the circle thing - CGContextStrokeEllipseInRect(context, CGRectMake(aRect.origin.x + 4, aRect.origin.y + 4, 8, 8)); - //then draw the line + CGContextSetStrokeColor(context, borderColor); + CGContextSetLineWidth(context, borderWidth); + CGContextStrokeEllipseInRect(context, CGRectMake(aRect.origin.x + 4, aRect.origin.y + 4, 8, 8)); // circle + CGContextBeginPath(context); CGContextMoveToPoint(context, 10, aRect.origin.y + 8); CGContextAddLineToPoint(context, aRect.size.width - aRect.origin.y - 8, aRect.origin.y + 8); CGContextStrokePath(context); - //CGContextStrokeLineSegments(context, [aRect.origin.x + 8, aRect.origin.y + 8, 300 , aRect.origin.y + 8]); } } @@ -5659,13 +6186,13 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", [self setThemeState:CPThemeStateTableDataView]; } -- (void)setThemeState:(CPThemeState)aState +- (BOOL)setThemeState:(CPThemeState)aState { [super setThemeState:aState]; [self recursivelyPerformSelector:@selector(setThemeState:) withObject:aState startingFrom:self]; } -- (void)unsetThemeState:(CPThemeState)aState +- (BOOL)unsetThemeState:(CPThemeState)aState { [super unsetThemeState:aState]; [self recursivelyPerformSelector:@selector(unsetThemeState:) withObject:aState startingFrom:self]; diff --git a/AppKit/CPText.j b/AppKit/CPText.j index 3bda6b40b..dda60f133 100644 --- a/AppKit/CPText.j +++ b/AppKit/CPText.j @@ -28,3 +28,14 @@ CPFormFeedCharacter = "\u000c"; CPCarriageReturnCharacter = "\u000d"; CPBackTabCharacter = "\u0019"; CPDeleteCharacter = "\u007f"; + +CPIllegalTextMovement = 0; +CPOtherTextMovement = 0; +CPReturnTextMovement = 16; +CPTabTextMovement = 17; +CPBacktabTextMovement = 18; +CPLeftTextMovement = 19; +CPRightTextMovement = 20; +CPUpTextMovement = 21; +CPDownTextMovement = 22; +CPCancelTextMovement = 23; \ No newline at end of file diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 6acd12975..ba023101b 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -209,7 +209,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return "textfield"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"bezel-inset": CGInsetMakeZero(), @@ -218,7 +218,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); }; } -/* @ignore */ #if PLATFORM(DOM) - (DOMElement)_inputElement { @@ -352,8 +351,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); else [self unsetThemeState:CPThemeStateEditable]; - // We only allow first responder status if the field is editable and enabled. - if (!shouldBeEditable && [[self window] firstResponder] === self) + // We only allow first responder status if the field is enable, and editable or selectable. + if (!(shouldBeEditable && ![self isSelectable]) && [[self window] firstResponder] === self) [[self window] makeFirstResponder:nil]; if (shouldBeEditable) @@ -378,7 +377,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); { [super setEnabled:shouldBeEnabled]; - // We only allow first responder status if the field is editable and enabled. + // We only allow first responder status if the field is enabled. if (!shouldBeEnabled && [[self window] firstResponder] === self) [[self window] makeFirstResponder:nil]; } @@ -529,30 +528,36 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return _textFieldBackgroundColor; } -/* @ignore */ +/*! @ignore */ - (BOOL)acceptsFirstResponder { - return [self isEditable] && [self isEnabled] && [self _isWithinUsablePlatformRect]; + return [self isEnabled] && ([self isEditable] || [self isSelectable]) && [self _isWithinUsablePlatformRect]; } -/* @ignore */ +/*! @ignore */ - (BOOL)becomeFirstResponder { + if (![self isEnabled]) + return NO; + // As long as we are the first responder we need to monitor the key status of our window. [self _setObserveWindowKeyNotifications:YES]; _isEditing = NO; - if ([[self window] isKeyWindow]) + if ([[self window] isKeyWindow] && [self isEditable]) return [self _becomeFirstKeyResponder]; return YES; } -/*! +/* A text field can be the first responder without necessarily being the focus of keyboard input. For example, it might be the first responder of window A but window B is the main and key window. It's important we don't put a focused input field into a text field in a non-key window, even if that field is the first responder, because the key window might also have a first responder text field which the user will expect to receive keyboard input. Since a first responder but non-key window text field can't receive input it should not even look like an active text field (Cocoa has a "slightly active" text field look it uses when another window is the key window, but Cappuccino doesn't today.) + + It's also possible for a text field to be non-editable but selectable in which case it can also become the first responder - + this is what allows text to be copied from it. */ - (BOOL)_becomeFirstKeyResponder { @@ -561,6 +566,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (![self _isWithinUsablePlatformRect]) return NO; + // A selectable but non-editable text field may be the first responder, but never the + // first key responder (first key responder indicating editability.) + if (![self isEditable]) + return NO; + [self setThemeState:CPThemeStateEditing]; [self _updatePlaceholderState]; @@ -677,28 +687,30 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return YES; } -/* @ignore */ +/*! @ignore */ - (BOOL)resignFirstResponder { #if PLATFORM(DOM) - - var element = [self _inputElement], - newValue = element.value, - error = @""; - - if (newValue !== _stringValue) + // We might have been the first responder without actually editing. + if (_isEditing && CPTextFieldInputOwner === self) { - [self _setStringValue:newValue]; - } + var element = [self _inputElement], + newValue = element.value, + error = @""; - // If there is a formatter, always give it a chance to reject the resignation, - // even if the value has not changed. - if ([self _valueIsValid:newValue] === NO) - { - element.focus(); - return NO; - } + if (newValue !== _stringValue) + { + [self _setStringValue:newValue]; + } + // If there is a formatter, always give it a chance to reject the resignation, + // even if the value has not changed. + if ([self _valueIsValid:newValue] === NO) + { + element.focus(); + return NO; + } + } #endif // When we are no longer the first responder we don't worry about the key status of our window anymore. @@ -707,10 +719,13 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _resignFirstKeyResponder]; _isEditing = NO; - [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:nil]]; + if ([self isEditable]) + { + [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:@{"CPTextMovement": [self _currentTextMovement]}]]; - if ([self sendsActionOnEndEditing]) - [self sendAction:[self action] to:[self target]]; + if ([self sendsActionOnEndEditing]) + [self sendAction:[self action] to:[self target]]; + } [self textDidBlur:[CPNotification notificationWithName:CPTextFieldDidBlurNotification object:self userInfo:nil]]; @@ -783,9 +798,14 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)_windowDidBecomeKey:(CPNotification)aNotification { - if ([[self window] isKeyWindow] && [[self window] firstResponder] === self) + if (!([self isEnabled] && [self isEditable])) + return; + + var wind = [self window]; + + if ([wind isKeyWindow] && [wind firstResponder] === self) if (![self _becomeFirstKeyResponder]) - [[self window] makeFirstResponder:nil]; + [wind makeFirstResponder:nil]; } - (BOOL)_valueIsValid:(CPString)aValue @@ -820,13 +840,24 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); } /*! - Only text fields that can become first responder accepts first mouse. + Only text fields that can become first responder accept first mouse. */ - (BOOL)acceptsFirstMouse:(CPEvent)anEvent { return [self acceptsFirstResponder]; } +- (void)_didEdit +{ + if (!_isEditing) + { + _isEditing = YES; + [self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]]; + } + + [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]]; +} + - (void)mouseDown:(CPEvent)anEvent { // Don't track! (ever?) @@ -853,7 +884,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)mouseUp:(CPEvent)anEvent { - if (![self isSelectable] && (![self isEditable] || ![self isEnabled])) + if (![self isEnabled] || !([self isSelectable] || [self isEditable])) [[self nextResponder] mouseUp:anEvent]; else if ([self isSelectable]) { @@ -865,13 +896,22 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); CPTextFieldCachedSelectStartFunction = nil CPTextFieldCachedDragFunction = nil; } + + // TODO clickCount === 2 should select the clicked word. + + if ([[CPApp currentEvent] clickCount] === 3) + { + [self selectText:nil]; + return; + } + return [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:YES]; } } - (void)mouseDragged:(CPEvent)anEvent { - if (![self isSelectable] && (![self isEditable] || ![self isEnabled])) + if (![self isEnabled] || !([self isSelectable] || [self isEditable])) [[self nextResponder] mouseDragged:anEvent]; else if ([self isSelectable]) return [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:YES]; @@ -879,26 +919,21 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)keyUp:(CPEvent)anEvent { -#if PLATFORM(DOM) + if (!([self isEnabled] && [self isEditable])) + return; +#if PLATFORM(DOM) var newValue = [self _inputElement].value; if (newValue !== _stringValue) { [self _setStringValue:newValue]; - if (!_isEditing) - { - _isEditing = YES; - [self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]]; - } - - [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]]; + [self _didEdit]; } -#endif - [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; +#endif } - (void)keyDown:(CPEvent)anEvent @@ -931,11 +966,15 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)insertNewline:(id)sender { + if (!([self isEnabled] && [self isEditable])) + return; + var newValue = [self _inputElement].value; if (newValue !== _stringValue) { [self _setStringValue:newValue]; + [self _didEdit]; } if ([self _valueIsValid:_stringValue]) @@ -948,7 +987,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (_isEditing) { _isEditing = NO; - [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:nil]]; + [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:@{"CPTextMovement": [self _currentTextMovement]}]]; } // If there is no target action, or the sendAction call returns @@ -974,6 +1013,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)_insertCharacterIgnoringFieldEditor:(CPString)aCharacter { + if (!([self isEnabled] && [self isEditable])) + return; + #if PLATFORM(DOM) var oldValue = _stringValue, @@ -986,13 +1028,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // NOTE: _stringValue is now the current input element value if (oldValue !== _stringValue) { - if (!_isEditing) - { - _isEditing = YES; - [self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]]; - } - - [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]]; + [self _didEdit]; } #endif @@ -1035,7 +1071,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); } /* - @ignore Sets the internal string value without updating the value in the input element. This should only be invoked when the underlying text element's value has changed. */ @@ -1044,8 +1079,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return [self _setStringValue:aValue isNewValue:YES errorDescription:nil]; } -/* - @ignore +/*! Sets the internal string value without updating the value in the input element. If there is a formatter and formatting fails, returns NO. Otherwise returns YES. */ @@ -1104,10 +1138,13 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); value = undefined; [super setObjectValue:value]; + _stringValue = (value === nil || value === undefined) ? @"" : String(value); } + else + _stringValue = formattedString; } - - _stringValue = [self stringValue]; + else + _stringValue = [self stringValue]; #if PLATFORM(DOM) @@ -1241,22 +1278,29 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)_selectText:(id)sender immediately:(BOOL)immediately { // Selecting the text in a field makes it the first responder - if (([self isEditable] || [self isSelectable])) + if ([self isEditable] || [self isSelectable]) { var wind = [self window]; #if PLATFORM(DOM) - var element = [self _inputElement]; - - if ([wind firstResponder] === self) + if ([self isEditable]) { - if (immediately) - element.select(); - else - window.setTimeout(function() { element.select(); }, 0); + var element = [self _inputElement]; + + if ([wind firstResponder] === self) + { + if (immediately) + element.select(); + else + window.setTimeout(function() { element.select(); }, 0); + } + else if (wind !== nil && [wind makeFirstResponder:self]) + [self _selectText:sender immediately:immediately]; + } + else + { + [self setSelectedRange:CPMakeRange(0, _stringValue.length)]; } - else if (wind !== nil && [wind makeFirstResponder:self]) - [self _selectText:sender immediately:immediately]; #else // Even if we can't actually select the text we need to preserve the first // responder side effect. @@ -1269,36 +1313,70 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)copy:(id)sender { - if (![CPPlatform isBrowser]) + // First write to the Cappuccino clipboard. + var stringToCopy = nil; + + if ([self isEditable]) { var selectedRange = [self selectedRange]; if (selectedRange.length < 1) return; - var pasteboard = [CPPasteboard generalPasteboard], - stringForPasting = [_stringValue substringWithRange:selectedRange]; + stringToCopy = [_stringValue substringWithRange:selectedRange]; + } + else + { + // selectedRange won't work if we're displaying our text using a
. Instead we have to ask the browser + // what's selected and hope it's right in a Cappuccino context as well. +#if PLATFORM(DOM) + stringToCopy = [[[self window] platformWindow] _selectedText]; +#endif + } - [pasteboard declareTypes:[CPStringPboardType] owner:nil]; - [pasteboard setString:stringForPasting forType:CPStringPboardType]; + var pasteboard = [CPPasteboard generalPasteboard]; + + [pasteboard declareTypes:[CPStringPboardType] owner:nil]; + [pasteboard setString:stringToCopy forType:CPStringPboardType]; + + if ([CPPlatform isBrowser]) + { + // Then also allow the browser to capture the copied text into the system clipboard. + [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; } } - (void)cut:(id)sender { - if (![CPPlatform isBrowser]) + if (![self isEnabled]) + return; + + [self copy:sender]; + + if (![self isEditable]) + return; + + if (![[CPApp currentEvent] _platformIsEffectingCutOrPaste]) { - [self copy:sender]; [self deleteBackward:sender]; } - // If we don't have an oninput listener, we won't detect the change made by the cut and need to fake a key up "soon". - else if (!CPFeatureIsCompatible(CPInputOnInputEventFeature)) - [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(keyUp:) userInfo:nil repeats:NO]; + else + { + // Allow the browser's standard cut handling. This should also result in the deleteBackward: happening. + [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; + + // If we don't have an oninput listener, we won't detect the change made by the cut and need to fake a key up "soon". + if (!CPFeatureIsCompatible(CPInputOnInputEventFeature)) + [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(keyUp:) userInfo:nil repeats:NO]; + } } - (void)paste:(id)sender { - if (![CPPlatform isBrowser]) + if (!([self isEnabled] && [self isEditable])) + return; + + if (![[CPApp currentEvent] _platformIsEffectingCutOrPaste]) { var pasteboard = [CPPasteboard generalPasteboard]; @@ -1312,15 +1390,24 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString]; [self setStringValue:newValue]; + [self _didEdit]; [self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)]; } // If we don't have an oninput listener, we won't detect the change made by the cut and need to fake a key up "soon". - else if (!CPFeatureIsCompatible(CPInputOnInputEventFeature)) - [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(keyUp:) userInfo:nil repeats:NO]; + else + { + // Allow the browser's standard paste handling. + [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; + + if (!CPFeatureIsCompatible(CPInputOnInputEventFeature)) + [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(keyUp:) userInfo:nil repeats:NO]; + } } - (CPRange)selectedRange { + // TODO Need a way to figure out the selected range if we're not using an input. Need + // to get whole document selection and somehow see which part is inside of this text field. if ([[self window] firstResponder] !== self) return CPMakeRange(0, 0); @@ -1364,35 +1451,48 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); #if PLATFORM(DOM) - var inputElement = [self _inputElement]; - - try + if (![self isEditable]) { - if ([inputElement.selectionStart isKindOfClass:CPNumber]) - { - inputElement.selectionStart = aRange.location; - inputElement.selectionEnd = CPMaxRange(aRange); - } - else - { - // browsers which don't support selectionStart/selectionEnd (aka IE). - var theDocument = inputElement.ownerDocument || inputElement.document, - existingRange = theDocument.selection.createRange(), - range = inputElement.createTextRange(); + // No input element - selectable text field only. + var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"bezel-view"]; - if (range.inRange(existingRange)) + if (contentView) + [contentView setSelectedRange:aRange]; + } + else + { + // Input element + var inputElement = [self _inputElement]; + + try + { + if ([inputElement.selectionStart isKindOfClass:CPNumber]) { - range.collapse(true); - range.move('character', aRange.location); - range.moveEnd('character', aRange.length); - range.select(); + inputElement.selectionStart = aRange.location; + inputElement.selectionEnd = CPMaxRange(aRange); + } + else + { + // browsers which don't support selectionStart/selectionEnd (aka IE). + var theDocument = inputElement.ownerDocument || inputElement.document, + existingRange = theDocument.selection.createRange(), + range = inputElement.createTextRange(); + + if (range.inRange(existingRange)) + { + range.collapse(true); + range.move('character', aRange.location); + range.moveEnd('character', aRange.length); + range.select(); + } } } + catch (e) + { + } } - catch (e) - { - } - #endif } @@ -1403,18 +1503,84 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)deleteBackward:(id)sender { + if (!([self isEnabled] && [self isEditable])) + return; + var selectedRange = [self selectedRange]; - if (selectedRange.length < 2) - return; + if (selectedRange.length < 1) + { + if (selectedRange.location < 1) + return; - selectedRange.location += 1; - selectedRange.length -= 1; + // Delete a single element backward from the insertion point if there's no selection. + selectedRange.location -= 1; + selectedRange.length += 1; + } var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""]; [self setStringValue:newValue]; [self setSelectedRange:CPMakeRange(selectedRange.location, 0)]; + [self _didEdit]; + +#if PLATFORM(DOM) + // Since we just performed the deletion manually, we don't need the browser to do anything else. + // (Previously we would allow the event to propagate for the browser to delete 1 character only, + // and we'd delete the rest manually. But this meant that if deleteBackward: was called without + // it being a browser backspace event, 1 character would be left behind.) + [[[self window] platformWindow] _propagateCurrentDOMEvent:NO]; +#endif +} + +- (void)delete:(id)sender +{ + if (!([self isEnabled] && [self isEditable])) + return; + + // delete: only works when there's a selection (as opposed to deleteForward: and deleteBackward:). + var selectedRange = [self selectedRange]; + + if (selectedRange.length < 1) + return; + + var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""]; + + [self setStringValue:newValue]; + [self setSelectedRange:CPMakeRange(selectedRange.location, 0)]; + [self _didEdit]; + +#if PLATFORM(DOM) + // Since we just performed the deletion manually, we don't need the browser to do anything else. + [[[self window] platformWindow] _propagateCurrentDOMEvent:NO]; +#endif +} + +- (void)deleteForward:(id)sender +{ + if (!([self isEnabled] && [self isEditable])) + return; + + var selectedRange = [self selectedRange]; + + if (selectedRange.length < 1) + { + if (selectedRange.location + 1 >= _stringValue.length) + return; + + selectedRange.length += 1; + } + + var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""]; + + [self setStringValue:newValue]; + [self setSelectedRange:CPMakeRange(selectedRange.location, 0)]; + [self _didEdit]; + +#if PLATFORM(DOM) + // Since we just performed the deletion manually, we don't need the browser to do anything else. + [[[self window] platformWindow] _propagateCurrentDOMEvent:NO]; +#endif } #pragma mark Setting the Delegate @@ -1581,6 +1747,41 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); } } +#pragma mark Overrides + +- (void)viewDidHide +{ + [super viewDidHide]; + + if ([[self window] firstResponder] === self) + [self _resignFirstKeyResponder]; +} + +- (void)viewDidUnhide +{ + [super viewDidUnhide]; + + if ([self isEditable] && [[self window] firstResponder] === self) + [self _becomeFirstKeyResponder]; +} + +- (BOOL)validateUserInterfaceItem:(id /**/)anItem +{ + var theAction = [anItem action]; + + if (![self isEditable] && (theAction == @selector(cut:) || theAction == @selector(paste:) || theAction == @selector(delete:))) + return NO; + + // FIXME - [self selectedRange] is always empty if we're not an editable field, so we must assume yes here. + if (![self isEditable]) + return YES; + + if (theAction == @selector(copy:) || theAction == @selector(cut:) || theAction == @selector(delete:)) + return [self selectedRange].length; + + return YES; +} + #pragma mark Private - (BOOL)_isWithinUsablePlatformRect @@ -1588,8 +1789,13 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // 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]], + var wind = [self window]; + + // If the field is not yet within a window, it can't be first responder + if (!wind) + return NO; + + var frame = [self convertRectToBase:[self bounds]], usableRect = [[wind platformWindow] usableContentFrame]; frame.origin = [wind convertBaseToGlobal:frame.origin]; @@ -1677,7 +1883,7 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", @implementation _CPTextFieldValueBinder : CPBinder -- (void)_updatePlaceholdersWithOptions:(CPDictionary)options forBinding:(CPBinder)aBinding +- (void)_updatePlaceholdersWithOptions:(CPDictionary)options forBinding:(CPString)aBinding { [super _updatePlaceholdersWithOptions:options]; diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j old mode 100755 new mode 100644 index 1498d2033..05fa8e13d --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -34,6 +34,8 @@ @import "CPWindow_Constants.j" @global CPApp +@global CPTextFieldDidFocusNotification +@global CPTextFieldDidBlurNotification #if PLATFORM(DOM) @@ -96,7 +98,7 @@ CPTokenFieldDeleteButtonType = 1; return "tokenfield"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"editor-inset": CGInsetMakeZero() }; } @@ -392,6 +394,8 @@ CPTokenFieldDeleteButtonType = 1; element.focus(); CPTokenFieldInputOwner = self; }, 0.0); + + [self textDidFocus:[CPNotification notificationWithName:CPTextFieldDidFocusNotification object:self userInfo:nil]]; }, 0.0); [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; @@ -424,12 +428,14 @@ CPTokenFieldDeleteButtonType = 1; if (_shouldNotifyTarget) { _shouldNotifyTarget = NO; - [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:nil]]; + [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:@{"CPTextMovement": [self _currentTextMovement]}]]; if ([self sendsActionOnEndEditing]) [self sendAction:[self action] to:[self target]]; } + [self textDidBlur:[CPNotification notificationWithName:CPTextFieldDidBlurNotification object:self userInfo:nil]]; + return YES; } @@ -639,7 +645,7 @@ CPTokenFieldDeleteButtonType = 1; [[self _tokens] makeObjectsPerformSelector:@selector(setEditable:) withObject:shouldBeEditable]; } -- (void)sendAction:(SEL)anAction to:(id)anObject +- (BOOL)sendAction:(SEL)anAction to:(id)anObject { _shouldNotifyTarget = NO; [super sendAction:anAction to:anObject]; @@ -647,7 +653,7 @@ CPTokenFieldDeleteButtonType = 1; // Incredible hack to disable supers implementation // so it cannot change our object value and break the tokenfield -- (void)_setStringValue:(id)aValue +- (BOOL)_setStringValue:(CPString)aValue { } @@ -1535,7 +1541,7 @@ CPTokenFieldDeleteButtonType = 1; { } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { var attributes = [CPButton themeAttributes]; @@ -1565,7 +1571,7 @@ CPTokenFieldDeleteButtonType = 1; { } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { var attributes = [CPButton themeAttributes]; diff --git a/AppKit/CPToolbar.j b/AppKit/CPToolbar.j index 8f1974f34..1506df9e8 100644 --- a/AppKit/CPToolbar.j +++ b/AppKit/CPToolbar.j @@ -30,6 +30,13 @@ @global CPApp +var CPToolbarDelegate_toolbar_itemForItemIdentifier_willBeInsertedIntoToolbar_ = 1 << 0, + CPToolbarDelegate_toolbarAllowedItemIdentifiers_ = 1 << 1, + CPToolbarDelegate_toolbarDefaultItemIdentifiers_ = 1 << 2, + CPToolbarDelegate_toolbarDidRemoveItem_ = 1 << 3, + CPToolbarDelegate_toolbarSelectableItemIdentifiers_ = 1 << 4, + CPToolbarDelegate_toolbarWillAddItem_ = 1 << 5; + /* @global @group CPToolbarDisplayMode @@ -59,6 +66,20 @@ CPToolbarSizeModeSmall = 2; var CPToolbarsByIdentifier = nil, CPToolbarConfigurationsByIdentifier = nil; + +@protocol CPToolbarDelegate + +@optional +- (CPToolbarItem)toolbar:(CPToolbar)toolbar itemForItemIdentifier:(CPString)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; +- (CPArray)toolbarAllowedItemIdentifiers:(CPToolbar)toolbar; +- (CPArray)toolbarDefaultItemIdentifiers:(CPToolbar)toolbar; +- (void)toolbarDidRemoveItem:(CPNotification)notification; +- (CPArray)toolbarSelectableItemIdentifiers:(CPToolbar)toolbar; +- (void)toolbarWillAddItem:(CPNotification)notification; + +@end + + /*! @ingroup appkit @class CPToolbar @@ -89,14 +110,15 @@ var CPToolbarsByIdentifier = nil, @implementation CPToolbar : CPObject { CPString _identifier; - CPToolbarDisplayMode _displayMode @accessors(property=displayMode); + CPToolbarDisplayMode _displayMode @accessors(property=displayMode); BOOL _showsBaselineSeparator; BOOL _allowsUserCustomization; BOOL _isVisible; - int _sizeMode @accessors(property=sizeMode); + CPToolbarSizeMode _sizeMode @accessors(property=sizeMode); int _desiredHeight; - id _delegate; + id _delegate; + unsigned _implementedDelegateMethods; CPArray _itemIdentifiers; @@ -165,15 +187,6 @@ var CPToolbarsByIdentifier = nil, return self; } - -/*! - Sets the toolbar's display mode. NOT YET IMPLEMENTED. -*/ -- (void)setDisplayMode:(CPToolbarDisplayMode)aDisplayMode -{ - -} - /*! Returns the toolbar's identifier */ @@ -248,6 +261,25 @@ var CPToolbarsByIdentifier = nil, return; _delegate = aDelegate; + _implementedDelegateMethods = 0; + + if ([_delegate respondsToSelector:@selector(toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbar_itemForItemIdentifier_willBeInsertedIntoToolbar_; + + if ([_delegate respondsToSelector:@selector(toolbarAllowedItemIdentifiers:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbarAllowedItemIdentifiers_; + + if ([_delegate respondsToSelector:@selector(toolbarDefaultItemIdentifiers:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbarDefaultItemIdentifiers_; + + if ([_delegate respondsToSelector:@selector(toolbarDidRemoveItem:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbarDidRemoveItem_; + + if ([_delegate respondsToSelector:@selector(toolbarSelectableItemIdentifiers:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbarSelectableItemIdentifiers_; + + if ([_delegate respondsToSelector:@selector(toolbarWillAddItem:)]) + _implementedDelegateMethods |= CPToolbarDelegate_toolbarWillAddItem_; [self _reloadToolbarItems]; } @@ -298,9 +330,9 @@ var CPToolbarsByIdentifier = nil, // _defaultItems may have been loaded from Cib _itemIdentifiers = [_defaultItems valueForKey:@"itemIdentifier"] || []; - if ([_delegate respondsToSelector:@selector(toolbarDefaultItemIdentifiers:)]) + if ([self _delegateRespondsToToolbarDefaultItemIdentifiers]) { - var itemIdentifiersFromDelegate = [_delegate toolbarDefaultItemIdentifiers:self]; + var itemIdentifiersFromDelegate = [self _sendDelegateToolbarDefaultItemIdentifiers]; // If we get items both from the Cib and from the delegate method, put the delegate items before the // Cib ones. @@ -325,7 +357,7 @@ var CPToolbarsByIdentifier = nil, item = [_identifiedItems objectForKey:identifier]; if (!item && _delegate) - item = [_delegate toolbar:self itemForItemIdentifier:identifier willBeInsertedIntoToolbar:YES]; + item = [self _sendDelegateItemForItemIdentifier:identifier willBeInsertedIntoToolbar:YES]; item = [item copy]; @@ -403,12 +435,14 @@ var CPToolbarsByIdentifier = nil, - (id)_itemForItemIdentifier:(CPString)identifier willBeInsertedIntoToolbar:(BOOL)toolbar { var item = [_identifiedItems objectForKey:identifier]; + if (!item) { item = [CPToolbarItem _standardItemWithItemIdentifier:identifier]; + if (_delegate && !item) { - item = [[_delegate toolbar:self itemForItemIdentifier:identifier willBeInsertedIntoToolbar:toolbar] copy]; + item = [[self _sendDelegateItemForItemIdentifier:identifier willBeInsertedIntoToolbar:toolbar] copy]; if (!item) [CPException raise:CPInvalidArgumentException reason:@"Toolbar delegate " + _delegate + " returned nil toolbar item for identifier " + identifier]; @@ -433,11 +467,11 @@ var CPToolbarsByIdentifier = nil, /* @ignore */ - (id)_defaultToolbarItems { - if (!_defaultItems && [_delegate respondsToSelector:@selector(toolbarDefaultItemIdentifiers:)]) + if (!_defaultItems && [self _delegateRespondsToToolbarDefaultItemIdentifiers]) { _defaultItems = []; - var identifiers = [_delegate toolbarDefaultItemIdentifiers:self], + var identifiers = [self _sendDelegateToolbarDefaultItemIdentifiers], index = 0, count = [identifiers count]; @@ -603,7 +637,7 @@ var _CPToolbarItemInfoMake = function(anIndex, aView, aLabel, aMinWidth) return @"toolbar-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"item-margin": 10.0, @@ -1225,7 +1259,7 @@ var LABEL_MARGIN = 2.0; [_labelField setTextShadowColor:[self FIXME_labelShadowColor]]; } -- (void)sendAction:(SEL)anAction to:(id)aSender +- (BOOL)sendAction:(SEL)anAction to:(id)aSender { [CPApp sendAction:anAction to:aSender from:_toolbarItem]; } @@ -1249,3 +1283,89 @@ var LABEL_MARGIN = 2.0; } @end + + +@implementation CPToolbar (CPToolbarDelegate) + +/* + @ignore + Return YES if the delegate implements toolbarDefaultItemIdentifiers: +*/ +- (BOOL)_delegateRespondsToToolbarDefaultItemIdentifiers +{ + return _implementedDelegateMethods & CPToolbarDelegate_toolbarDefaultItemIdentifiers_; +} + +/*! + @ignore + Call the delegate toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: +*/ +- (CPToolbarItem)_sendDelegateItemForItemIdentifier:(CPString)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag +{ + if (!(_implementedDelegateMethods & CPToolbarDelegate_toolbar_itemForItemIdentifier_willBeInsertedIntoToolbar_)) + return nil; + + return [_delegate toolbar:self itemForItemIdentifier:itemIdentifier willBeInsertedIntoToolbar:flag]; +} + +/*! + @ignore + Call the delegate toolbarAllowedItemIdentifiers: +*/ +- (CPArray)_sendDelegateToolbarAllowedItemIdentifiers +{ + if (!(_implementedDelegateMethods & CPToolbarDelegate_toolbarAllowedItemIdentifiers_)) + return []; + + return [_delegate toolbarAllowedItemIdentifiers:self]; +} + +/*! + @ignore + Call the delegate toolbarDefaultItemIdentifiers: +*/ +- (CPArray)_sendDelegateToolbarDefaultItemIdentifiers +{ + if (!(_implementedDelegateMethods & CPToolbarDelegate_toolbarDefaultItemIdentifiers_)) + return []; + + return [_delegate toolbarDefaultItemIdentifiers:self]; +} + +/*! + @ignore + Call the delegate toolbarDidRemoveItem: +*/ +- (void)_sendDelegateToolbarDidRemoveItem:(CPNotification)notification +{ + if (!(_delegate & CPToolbarDelegate_toolbarDidRemoveItem_)) + return; + + [_delegate toolbarDidRemoveItem:notification]; +} + +/*! + @ignore + Call the delegate toolbarSelectableItemIdentifiers: +*/ +- (CPArray)_sendDelegateToolbarSelectableItemIdentifiers +{ + if (!(_implementedDelegateMethods & CPToolbarDelegate_toolbarSelectableItemIdentifiers_)) + return []; + + return [_delegate toolbarSelectableItemIdentifiers:self]; +} + +/*! + @ignore + Call the delegate toolbarWillAddItem: +*/ +- (void)_sendDelegateToolbarWillAddItem:(CPNotification)notification +{ + if (!(_delegate & CPToolbarDelegate_toolbarWillAddItem_)) + return; + + [_delegate toolbarWillAddItem:notification]; +} + +@end diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 81996df20..f19638cf1 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -43,6 +43,26 @@ @global appkit_tag_dom_elements +#if PLATFORM(DOM) + +if (typeof(appkit_tag_dom_elements) !== "undefined" && appkit_tag_dom_elements) +{ + AppKitTagDOMElement = function(owner, element) + { + element.setAttribute("data-cappuccino-view", [owner className]); + element.setAttribute("data-cappuccino-uid", [owner UID]); + } +} +else +{ + AppKitTagDOMElement = function(owner, element) + { + // By default, do nothing. + } +} + +#endif + /* @global @group CPViewAutoresizingMasks @@ -179,6 +199,11 @@ var CPViewFlags = { }, _CPViewFullScreenModeState _fullScreenModeState; + // Zoom Support + BOOL _isScaled; + CGSize _hierarchyScaleSize; + CGSize _scaleSize; + // Layout Support BOOL _needsLayout; JSObject _ephemeralSubviews; @@ -317,15 +342,17 @@ var CPViewFlags = { }, _isHidden = NO; _hitTests = YES; + _hierarchyScaleSize = CGSizeMake(1.0 , 1.0); + _scaleSize = CGSizeMake(1.0, 1.0); + _isScaled = NO; + #if PLATFORM(DOM) _DOMElement = DOMElementPrototype.cloneNode(false); + AppKitTagDOMElement(self, _DOMElement); CPDOMDisplayServerSetStyleLeftTop(_DOMElement, NULL, CGRectGetMinX(aFrame), CGRectGetMinY(aFrame)); CPDOMDisplayServerSetStyleSize(_DOMElement, width, height); - if (typeof(appkit_tag_dom_elements) !== "undefined" && !!appkit_tag_dom_elements) - _DOMElement.setAttribute("data-cappuccino-view", [self className]); - _DOMImageParts = []; _DOMImageSizes = []; #endif @@ -379,9 +406,9 @@ var CPViewFlags = { }, #if PLATFORM(DOM) if (_DOMElement.addEventListener) { - _DOMElement.addEventListener("mouseover", _toolTipFunctionIn, NO); - _DOMElement.addEventListener("keypress", _toolTipFunctionOut, NO); - _DOMElement.addEventListener("mouseout", _toolTipFunctionOut, NO); + _DOMElement.addEventListener("mouseover", _toolTipFunctionIn, YES); + _DOMElement.addEventListener("keypress", _toolTipFunctionOut, YES); + _DOMElement.addEventListener("mouseout", _toolTipFunctionOut, YES); } else if (_DOMElement.attachEvent) { @@ -406,9 +433,9 @@ var CPViewFlags = { }, #if PLATFORM(DOM) if (_DOMElement.removeEventListener) { - _DOMElement.removeEventListener("mouseover", _toolTipFunctionIn, NO); - _DOMElement.removeEventListener("keypress", _toolTipFunctionOut, NO); - _DOMElement.removeEventListener("mouseout", _toolTipFunctionOut, NO); + _DOMElement.removeEventListener("mouseover", _toolTipFunctionIn, YES); + _DOMElement.removeEventListener("keypress", _toolTipFunctionOut, YES); + _DOMElement.removeEventListener("mouseout", _toolTipFunctionOut, YES); } else if (_DOMElement.detachEvent) { @@ -549,6 +576,13 @@ var CPViewFlags = { }, } [aSubview setNextResponder:self]; + [aSubview _scaleSizeUnitSquareToSize:[self _hierarchyScaleSize]]; + + // If the subview is not hidden and one of its ancestors is hidden, + // notify the subview that it is now hidden. + if (![aSubview isHidden] && [self isHiddenOrHasHiddenAncestor]) + [aSubview _notifyViewDidHide]; + [aSubview viewDidMoveToSuperview]; [self didAddSubview:aSubview]; @@ -581,6 +615,12 @@ var CPViewFlags = { }, #if PLATFORM(DOM) CPDOMDisplayServerRemoveChild(_superview._DOMElement, _DOMElement); #endif + + // If the view is not hidden and one of its ancestors is hidden, + // notify the view that it is now unhidden. + if (!_isHidden && [_superview isHiddenOrHasHiddenAncestor]) + [self _notifyViewDidUnhide]; + _superview = nil; [self _setWindow:nil]; @@ -936,8 +976,8 @@ var CPViewFlags = { }, if (YES) { - _bounds.size.width = aSize.width; - _bounds.size.height = aSize.height; + _bounds.size.width = aSize.width * 1 / _scaleSize.width; + _bounds.size.height = aSize.height * 1 / _scaleSize.height; } if (_layer) @@ -950,7 +990,7 @@ var CPViewFlags = { }, [self setNeedsDisplay:YES]; #if PLATFORM(DOM) - CPDOMDisplayServerSetStyleSize(_DOMElement, size.width, size.height); + [self _setDisplayServerSetStyleSize:size]; if (_DOMContentsElement) { @@ -1059,6 +1099,19 @@ var CPViewFlags = { }, [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; } +/*! + This method is used to set the width and height of the _DOMElement. It cares about the scale of the view. + When scaling, for instance with a size (0.5, 0.5), the bounds of the view will be multiply by 2. It's why we multiply by the inverse of the scaling. + The view will finally keep the same proportion for the user on the screen. +*/ +- (void)_setDisplayServerSetStyleSize:(CGSize)aSize +{ +#if PLATFORM(DOM) + var scale = [self scaleSize]; + CPDOMDisplayServerSetStyleSize(_DOMElement, aSize.width * 1 / scale.width, aSize.height * 1 / scale.height); +#endif +} + /*! Sets the receiver's bounds. The bounds define the size and location of the receiver inside it's frame. Posts a CPViewBoundsDidChangeNotification to the default notification center if the receiver is configured to do so. @@ -1359,6 +1412,7 @@ var CPViewFlags = { }, // FIXME: Should we return to visibility? This breaks in FireFox, Opera, and IE. // _DOMElement.style.visibility = (_isHidden = aFlag) ? "hidden" : "visible"; _isHidden = aFlag; + #if PLATFORM(DOM) _DOMElement.style.display = _isHidden ? "none" : "block"; #endif @@ -1394,6 +1448,7 @@ var CPViewFlags = { }, [self viewDidHide]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyViewDidHide]; } @@ -1403,6 +1458,7 @@ var CPViewFlags = { }, [self viewDidUnhide]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyViewDidUnhide]; } @@ -1553,15 +1609,42 @@ var CPViewFlags = { }, */ - (CPView)hitTest:(CGPoint)aPoint { - if (_isHidden || !_hitTests || !CGRectContainsPoint(_frame, aPoint)) + if (_isHidden || !_hitTests) + return nil; + + var frame = _frame, + sizeScale = [self _hierarchyScaleSize]; + + if (_isScaled) + frame = CGRectApplyAffineTransform(_frame, CGAffineTransformMakeScale([_superview _hierarchyScaleSize].width, [_superview _hierarchyScaleSize].height)); + else + frame = CGRectApplyAffineTransform(_frame, CGAffineTransformMakeScale(sizeScale.width, sizeScale.height)); + + if (!CGRectContainsPoint(frame, aPoint)) return nil; var view = nil, i = _subviews.length, - adjustedPoint = CGPointMake(aPoint.x - CGRectGetMinX(_frame), aPoint.y - CGRectGetMinY(_frame)); + adjustedPoint = CGPointMake(aPoint.x - CGRectGetMinX(frame), aPoint.y - CGRectGetMinY(frame)); if (_inverseBoundsTransform) - adjustedPoint = CGPointApplyAffineTransform(adjustedPoint, _inverseBoundsTransform); + { + var affineTransform = CGAffineTransformMakeCopy(_inverseBoundsTransform); + + if (_isScaled) + { + affineTransform.tx *= [_superview _hierarchyScaleSize].width; + affineTransform.ty *= [_superview _hierarchyScaleSize].height; + } + else + { + affineTransform.tx *= sizeScale.width; + affineTransform.ty *= sizeScale.height; + } + + adjustedPoint = CGPointApplyAffineTransform(adjustedPoint, affineTransform); + } + while (i--) if (view = [_subviews[i] hitTest:adjustedPoint]) @@ -1882,6 +1965,9 @@ var CPViewFlags = { }, */ - (CGPoint)convertPoint:(CGPoint)aPoint fromView:(CPView)aView { + if (aView === self) + return aPoint; + return CGPointApplyAffineTransform(aPoint, _CPViewGetTransform(aView, self)); } @@ -1892,7 +1978,7 @@ var CPViewFlags = { }, */ - (CGPoint)convertPointFromBase:(CGPoint)aPoint { - return CGPointApplyAffineTransform(aPoint, _CPViewGetTransform(nil, self)); + return [self convertPoint:aPoint fromView:nil]; } /*! @@ -1903,9 +1989,13 @@ var CPViewFlags = { }, */ - (CGPoint)convertPoint:(CGPoint)aPoint toView:(CPView)aView { + if (aView === self) + return aPoint; + return CGPointApplyAffineTransform(aPoint, _CPViewGetTransform(self, aView)); } + /*! Converts the point from the receiver’s coordinate system to the base coordinate system. @param aPoint A point specifying a location in the coordinate system of the receiver @@ -1913,7 +2003,7 @@ var CPViewFlags = { }, */ - (CGPoint)convertPointToBase:(CGPoint)aPoint { - return CGPointApplyAffineTransform(aPoint, _CPViewGetTransform(self, nil)); + return [self convertPoint:aPoint toView:nil]; } /*! @@ -1924,6 +2014,9 @@ var CPViewFlags = { }, */ - (CGSize)convertSize:(CGSize)aSize fromView:(CPView)aView { + if (aView === self) + return aSize; + return CGSizeApplyAffineTransform(aSize, _CPViewGetTransform(aView, self)); } @@ -1935,6 +2028,9 @@ var CPViewFlags = { }, */ - (CGSize)convertSize:(CGSize)aSize toView:(CPView)aView { + if (aView === self) + return aSize; + return CGSizeApplyAffineTransform(aSize, _CPViewGetTransform(self, aView)); } @@ -1946,6 +2042,9 @@ var CPViewFlags = { }, */ - (CGRect)convertRect:(CGRect)aRect fromView:(CPView)aView { + if (self === aView) + return aRect; + return CGRectApplyAffineTransform(aRect, _CPViewGetTransform(aView, self)); } @@ -1956,7 +2055,7 @@ var CPViewFlags = { }, */ - (CGRect)convertRectFromBase:(CGRect)aRect { - return CGRectApplyAffineTransform(aRect, _CPViewGetTransform(nil, self)); + return [self convertRect:aRect fromView:nil]; } /*! @@ -1967,6 +2066,9 @@ var CPViewFlags = { }, */ - (CGRect)convertRect:(CGRect)aRect toView:(CPView)aView { + if (self === aView) + return aRect; + return CGRectApplyAffineTransform(aRect, _CPViewGetTransform(self, aView)); } @@ -1977,7 +2079,7 @@ var CPViewFlags = { }, */ - (CGRect)convertRectToBase:(CGRect)aRect { - return CGRectApplyAffineTransform(aRect, _CPViewGetTransform(self, nil)); + return [self convertRect:aRect toView:nil]; } /*! @@ -2122,6 +2224,88 @@ setBoundsOrigin: } +// Scaling + +/*! + Scales the receiver’s coordinate system so that the unit square scales to the specified dimensions. + The bounds of the receiver will change, for instance if the given size is (0.5, 0.5) the width and height of the bounds will be multiply by 2. + You must call setNeedsDisplay: to redraw the view. + @param aSize, the size corresponding the new unit scales +*/ +- (void)scaleUnitSquareToSize:(CGSize)aSize +{ + if (!aSize) + return; + + // Reset the bounds + var bounds = CGRectMakeCopy([self bounds]); + bounds.size.width *= _scaleSize.width; + bounds.size.height *= _scaleSize.height; + + [self willChangeValueForKey:@"scaleSize"]; + _scaleSize = CGSizeMakeCopy([self scaleSize]); + _scaleSize.height *= aSize.height; + _scaleSize.width *= aSize.width; + [self didChangeValueForKey:@"scaleSize"]; + _isScaled = YES; + + _hierarchyScaleSize = CGSizeMakeCopy([self _hierarchyScaleSize]); + _hierarchyScaleSize.height *= aSize.height; + _hierarchyScaleSize.width *= aSize.width; + + var scaleAffine = CGAffineTransformMakeScale(1.0 / _scaleSize.width, 1.0 / _scaleSize.height), + newBounds = CGRectApplyAffineTransform(CGRectMakeCopy(bounds), scaleAffine); + + [self setBounds:newBounds]; + + [_subviews makeObjectsPerformSelector:@selector(_scaleSizeUnitSquareToSize:) withObject:aSize]; +} + +/*! + @ignore + Set the _hierarchyScaleSize and call all of the subviews to set their _hierarchyScaleSize +*/ +- (void)_scaleSizeUnitSquareToSize:(CGSize)aSize +{ + _hierarchyScaleSize = CGSizeMakeCopy([_superview _hierarchyScaleSize]); + + if (_isScaled) + { + _hierarchyScaleSize.width *= _scaleSize.width; + _hierarchyScaleSize.height *= _scaleSize.height; + } + + [_subviews makeObjectsPerformSelector:@selector(_scaleSizeUnitSquareToSize:) withObject:aSize]; +} + +/*! + Return the _hierarchyScaleSize, this is a CGSize with the real zoom of the view (depending with his parents) +*/ +- (CGSize)_hierarchyScaleSize +{ + return _hierarchyScaleSize || CGSizeMake(1.0, 1.0); +} + +/*! + Make a zoom in css +*/ +- (void)_applyCSSScalingTranformations +{ +#if PLATFORM(DOM) + if (_isScaled) + { + var scale = [self scaleSize], + browserPropertyTransform = CPBrowserStyleProperty(@"transform"), + browserPropertyTransformOrigin = CPBrowserStyleProperty(@"transformOrigin"); + + self._DOMElement.style[browserPropertyTransform] = 'scale(' + scale.width + ', ' + scale.height + ')'; + self._DOMElement.style[browserPropertyTransformOrigin] = '0 0'; + + [self _setDisplayServerSetStyleSize:[self frameSize]]; + } +#endif +} + // Displaying /*! @@ -2130,7 +2314,10 @@ setBoundsOrigin: - (void)setNeedsDisplay:(BOOL)aFlag { if (aFlag) + { + [self _applyCSSScalingTranformations]; [self setNeedsDisplayInRect:[self bounds]]; + } } /*! @@ -2223,6 +2410,9 @@ setBoundsOrigin: var graphicsPort = CGBitmapGraphicsContextCreate(); #if PLATFORM(DOM) + var width = CGRectGetWidth(_frame), + height = CGRectGetHeight(_frame); + _DOMContentsElement = graphicsPort.DOMElement; _DOMContentsElement.style.zIndex = -100; @@ -2231,13 +2421,10 @@ setBoundsOrigin: _DOMContentsElement.style.position = "absolute"; _DOMContentsElement.style.visibility = "visible"; - _DOMContentsElement.width = ROUND(CGRectGetWidth(_frame)); - _DOMContentsElement.height = ROUND(CGRectGetHeight(_frame)); + CPDOMDisplayServerSetSize(_DOMContentsElement, width, height); - _DOMContentsElement.style.top = "0px"; - _DOMContentsElement.style.left = "0px"; - _DOMContentsElement.style.width = ROUND(CGRectGetWidth(_frame)) + "px"; - _DOMContentsElement.style.height = ROUND(CGRectGetHeight(_frame)) + "px"; + CPDOMDisplayServerSetStyleLeftTop(_DOMContentsElement, NULL, 0.0, 0.0); + CPDOMDisplayServerSetStyleSize(_DOMContentsElement, width, height); // The performance implications of this aren't clear, but without this subviews might not be redrawn when this // view moves. @@ -2527,14 +2714,18 @@ setBoundsOrigin: - (CPView)nextValidKeyView { var result = [self nextKeyView], - firstResult = result; + resultUID = [result UID], + unsuitableResults = {}; while (result && ![result canBecomeKeyView]) { + unsuitableResults[resultUID] = 1; result = [result nextKeyView]; - // Cycled. - if (result === firstResult) + resultUID = [result UID]; + + // Did we get back to a key view we already ruled out due to ![result canBecomeKeyView]? + if (unsuitableResults[resultUID]) return nil; } @@ -2660,6 +2851,40 @@ setBoundsOrigin: @end + +@implementation CPView (Scaling) + +/*! + Set the zoom of the view. This will call scaleUnitSquareToSize: and setNeedsDisplay: + This method doesn't care about the last zoom you set in the view + @param aSize, the size corresponding the new unit scales +*/ +- (void)setScaleSize:(CGSize)aSize +{ + if (CGSizeEqualToSize(_scaleSize, aSize)) + return; + + var size = CGSizeMakeZero(), + scale = CGSizeMakeCopy([self scaleSize]); + + size.height = aSize.height / scale.height; + size.width = aSize.width / scale.width; + + [self scaleUnitSquareToSize:size]; + [self setNeedsDisplay:YES]; +} + + +/*! + Return the scaleSize of the view, this scaleSize is used to scale in css +*/ +- (CGSize)scaleSize +{ + return _scaleSize || CGSizeMake(1.0, 1.0); +} + +@end + @implementation CPView (Theming) #pragma mark Theme States @@ -3038,7 +3263,10 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", CPViewWindowKey = @"CPViewWindowKey", CPViewNextKeyViewKey = @"CPViewNextKeyViewKey", CPViewPreviousKeyViewKey = @"CPViewPreviousKeyViewKey", - CPReuseIdentifierKey = @"CPReuseIdentifierKey"; + CPReuseIdentifierKey = @"CPReuseIdentifierKey", + CPViewScaleKey = @"CPViewScaleKey", + CPViewSizeScaleKey = @"CPViewSizeScaleKey", + CPViewIsScaledKey = @"CPViewIsScaledKey"; @implementation CPView (CPCoding) @@ -3055,6 +3283,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", // a more "elegant" way to do this...? #if PLATFORM(DOM) _DOMElement = DOMElementPrototype.cloneNode(false); + AppKitTagDOMElement(self, _DOMElement); #endif // Also decode these "early". @@ -3104,13 +3333,17 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", if (_toolTip) [self _installToolTipEventHandlers]; + _scaleSize = [aCoder containsValueForKey:CPViewScaleKey] ? [aCoder decodeSizeForKey:CPViewScaleKey] : CGSizeMake(1.0, 1.0); + _hierarchyScaleSize = [aCoder containsValueForKey:CPViewSizeScaleKey] ? [aCoder decodeSizeForKey:CPViewSizeScaleKey] : CGSizeMake(1.0, 1.0); + _isScaled = [aCoder containsValueForKey:CPViewIsScaledKey] ? [aCoder decodeBoolForKey:CPViewIsScaledKey] : NO; + // DOM SETUP #if PLATFORM(DOM) _DOMImageParts = []; _DOMImageSizes = []; CPDOMDisplayServerSetStyleLeftTop(_DOMElement, NULL, CGRectGetMinX(_frame), CGRectGetMinY(_frame)); - CPDOMDisplayServerSetStyleSize(_DOMElement, CGRectGetWidth(_frame), CGRectGetHeight(_frame)); + [self _setDisplayServerSetStyleSize:_frame.size]; var index = 0, count = _subviews.length; @@ -3233,6 +3466,10 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", if (_identifier) [aCoder encodeObject:_identifier forKey:CPReuseIdentifierKey]; + + [aCoder encodeSize:[self scaleSize] forKey:CPViewScaleKey]; + [aCoder encodeSize:[self _hierarchyScaleSize] forKey:CPViewSizeScaleKey]; + [aCoder encodeBool:_isScaled forKey:CPViewIsScaledKey]; } @end @@ -3262,12 +3499,26 @@ var _CPViewGetTransform = function(/*CPView*/ fromView, /*CPView */ toView) { var frame = view._frame; + if (view._isScaled) + { + var affineZoom = CGAffineTransformMakeScale(view._scaleSize.width, view._scaleSize.height); + CGAffineTransformConcatTo(transform, affineZoom, transform); + } + transform.tx += CGRectGetMinX(frame); transform.ty += CGRectGetMinY(frame); if (view._boundsTransform) { - CGAffineTransformConcatTo(transform, view._boundsTransform, transform); + var inverseBoundsTransform = CGAffineTransformMakeCopy(view._boundsTransform); + + if (view._isScaled) + { + var affineZoom = CGAffineTransformMakeScale(view._scaleSize.width, view._scaleSize.height); + CGAffineTransformConcatTo(inverseBoundsTransform, affineZoom, inverseBoundsTransform); + } + + CGAffineTransformConcatTo(transform, inverseBoundsTransform, transform); } view = view._superview; @@ -3275,50 +3526,64 @@ var _CPViewGetTransform = function(/*CPView*/ fromView, /*CPView */ toView) // If we hit toView, then we're done. if (view === toView) + { return transform; - + } else if (fromView && toView) { fromWindow = [fromView window]; toWindow = [toView window]; if (fromWindow && toWindow && fromWindow !== toWindow) - { sameWindow = NO; - - var frame = [fromWindow frame]; - - transform.tx += CGRectGetMinX(frame); - transform.ty += CGRectGetMinY(frame); - } } } // FIXME: For now we can do things this way, but eventually we need to do them the "hard" way. - var view = toView; + var view = toView, + transform2 = CGAffineTransformMakeIdentity(); - while (view) + while (view && view != fromView) { - var frame = view._frame; + var frame = CGRectMakeCopy(view._frame); - transform.tx -= CGRectGetMinX(frame); - transform.ty -= CGRectGetMinY(frame); + // FIXME : For now we don't care about rotate transform and so on + if (view._isScaled) + { + transform2.a *= 1 / view._scaleSize.width; + transform2.d *= 1 / view._scaleSize.height; + } + + transform2.tx += CGRectGetMinX(frame) * transform2.a; + transform2.ty += CGRectGetMinY(frame) * transform2.d; if (view._boundsTransform) { - CGAffineTransformConcatTo(transform, view._inverseBoundsTransform, transform); + var inverseBoundsTransform = CGAffineTransformMakeIdentity(); + inverseBoundsTransform.tx -= view._inverseBoundsTransform.tx * transform2.a; + inverseBoundsTransform.ty -= view._inverseBoundsTransform.ty * transform2.d; + + CGAffineTransformConcatTo(transform2, inverseBoundsTransform, transform2); } view = view._superview; } - if (!sameWindow) - { - var frame = [toWindow frame]; + transform2.tx = -transform2.tx; + transform2.ty = -transform2.ty; - transform.tx -= CGRectGetMinX(frame); - transform.ty -= CGRectGetMinY(frame); + if (view === fromView) + { + // toView is inside of fromView + return transform2; } + + CGAffineTransformConcatTo(transform, transform2, transform); + + return transform; + + + /* var views = [], view = toView; diff --git a/AppKit/CPViewAnimation.j b/AppKit/CPViewAnimation.j index 85f76e2a2..f90ca2f99 100644 --- a/AppKit/CPViewAnimation.j +++ b/AppKit/CPViewAnimation.j @@ -105,7 +105,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOutEffect"; [super startAnimation]; } -- (void)setCurrentProgress:(CPAnimationProgress)progress +- (void)setCurrentProgress:(float)progress { [super setCurrentProgress:progress]; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index ccac5bf02..a86734ba5 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -248,7 +248,7 @@ CPTexturedBackgroundWindowMask @param aStyleMask a style mask @return the initialized window */ -- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned int)aStyleMask +- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned)aStyleMask { self = [super init]; @@ -735,6 +735,10 @@ CPTexturedBackgroundWindowMask } } +/* + Constrain a frame so that the window remains at least partially visible on screen, + moving or resizing the frame as necessary. +*/ - (CGRect)_constrainFrame:(CGRect)aFrame toUsableScreenWidth:(BOOL)constrainWidth andHeight:(BOOL)constrainHeight { var frame = CGRectMakeCopy(aFrame); @@ -759,7 +763,7 @@ CPTexturedBackgroundWindowMask if (CGRectGetWidth(frame) > usableWidth) { frame.origin.x = CGRectGetMinX(usableRect); - frame.size.width = usableWidth; + frame.size.width = MAX(usableWidth, _minSize.width); } } @@ -778,13 +782,20 @@ CPTexturedBackgroundWindowMask if (CGRectGetHeight(frame) > usableHeight) { frame.origin.y = CGRectGetMinY(usableRect); - frame.size.height = usableHeight; + frame.size.height = MAX(usableHeight, _minSize.height); } } return frame; } +/* + Constrain the origin of a frame such that: + + - The window view's minimum resize width is kept onscreen at the left/right of the window. + - The top of the window is kept below the top of the usable content. + - The top of the contentView + CPWindowMinVisibleVerticalMargin is kept above the bottom of the usable content. +*/ - (CGRect)_constrainOriginOfFrame:(CGRect)aFrame { var frame = CGRectMakeCopy(aFrame); @@ -792,19 +803,20 @@ CPTexturedBackgroundWindowMask if (!_constrainsToUsableScreen || !_isVisible) return frame; - /* - - CPWindowMinVisibleHorizontalMargin is kept onscreen at the left/right of the window. - - The top of the window is kept below the top of the usable content. - - The top of the contentView + CPWindowMinVisibleVerticalMargin is kept above the bottom of the usable content. - */ var usableRect = [_platformWindow usableContentFrame], - maxUsableY = CGRectGetMaxY(usableRect) - CGRectGetMinY([_contentView frame]) - CPWindowMinVisibleVerticalMargin; + minimumSize = [_windowView _minimumResizeSize]; - frame.origin.x = MAX(frame.origin.x, CGRectGetMinX(usableRect) + CPWindowMinVisibleHorizontalMargin - CGRectGetWidth(frame)); - frame.origin.x = MIN(frame.origin.x, CGRectGetMaxX(usableRect) - CPWindowMinVisibleHorizontalMargin); + // First constrain x so that at least CPWindowMinVisibleHorizontalMargin is visible on the right + frame.origin.x = MAX(frame.origin.x, CGRectGetMinX(usableRect) + minimumSize.width - CGRectGetWidth(frame)); + // Now constrain x so that at least CPWindowMinVisibleHorizontalMargin is visible on the left + frame.origin.x = MIN(frame.origin.x, CGRectGetMaxX(usableRect) - minimumSize.width); + + // Now constrain y so that it is below the top of the usable content frame.origin.y = MAX(frame.origin.y, CGRectGetMinY(usableRect)); - frame.origin.y = MIN(frame.origin.y, maxUsableY); + + // Finally constrain y so that at least CPWindowMinVisibleHorizontalMargin is visible at the bottom + frame.origin.y = MIN(frame.origin.y, CGRectGetMaxY(usableRect) - CGRectGetMinY([_contentView frame]) - CPWindowMinVisibleVerticalMargin); return frame; } @@ -985,6 +997,7 @@ CPTexturedBackgroundWindowMask [_platformWindow moveWindow:self fromLevel:_level toLevel:aLevel]; _level = aLevel; + [_childWindows makeObjectsPerformSelector:@selector(setLevel:) withObject:_level]; if ([self _sharesChromeWithPlatformWindow]) [_platformWindow setLevel:aLevel]; @@ -1020,6 +1033,23 @@ CPTexturedBackgroundWindowMask [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowResizeStyleGlobalChangeNotification object:nil]; } +/*! + If set to NO, platform window (virtual screen) resizes will not attempt to move/resize user windows. + to the usable area. +*/ ++ (void)setConstrainWindowsToUsableScreen:(BOOL)shouldConstrain +{ + CPWindowConstrainToScreen = shouldConstrain; +} + +/*! + Return whether platform window (virtual screen) resizes constrain user windows to the usable area. +*/ ++ (BOOL)constrainWindowsToUsableScreen +{ + return CPWindowConstrainToScreen; +} + - (void)_didReceiveResizeStyleChange:(CPNotification)aNotification { [_windowView setShowsResizeIndicator:_styleMask & CPResizableWindowMask]; @@ -1669,11 +1699,17 @@ CPTexturedBackgroundWindowMask switch (type) { case CPLeftMouseDown: + + // This is needed when a doubleClick occurs when the sheet is closing or opening + if (!_parentWindow) + return; + [_windowView mouseDown:anEvent]; // -dw- if the window is clicked, the sheet should come to front, and become key, // and the window should be immediately behind [sheet makeKeyAndOrderFront:self]; + return; case CPMouseMoved: @@ -2465,7 +2501,7 @@ CPTexturedBackgroundWindowMask // If this has an owner, dump it! [[aToolbar _window] setToolbar:nil]; - // This is no longer out toolbar. + // This is no longer our toolbar. [_toolbar _setWindow:nil]; _toolbar = aToolbar; @@ -2530,6 +2566,7 @@ CPTexturedBackgroundWindowMask [childWindow setParentWindow:self]; [childWindow _setChildOrdering:orderingMode]; + [childWindow setLevel:[self level]]; if ([self isVisible] && ![childWindow isVisible]) [childWindow orderWindow:orderingMode relativeTo:_windowNumber]; @@ -2755,14 +2792,21 @@ CPTexturedBackgroundWindowMask } // The sheet starts hidden just above the top of a clip rect + // TODO : Make properly for the -1 in endY var sheetFrame = [sheet frame], sheetShadowFrame = sheet._hasShadow ? [sheet._shadowView frame] : sheetFrame, frame = [self frame], originX = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), startFrame = CGRectMake(originX, -sheetShadowFrame.size.height, sheetFrame.size.width, sheetFrame.size.height), - endY = [_windowView bodyOffset] - [[self contentView] frame].origin.y, + endY = -1 + [_windowView bodyOffset] - [[self contentView] frame].origin.y, endFrame = CGRectMake(originX, endY, sheetFrame.size.width, sheetFrame.size.height); + if (_toolbar && [_windowView showsToolbar] && [self isFullPlatformWindow]) + { + endY += [[_toolbar _toolbarView] frameSize].height; + endFrame = CGRectMake(originX, endY, sheetFrame.size.width, sheetFrame.size.height); + } + // Move the sheet offscreen before ordering front so it doesn't appear briefly [sheet setFrameOrigin:CGPointMake(0, -13000)]; @@ -3260,7 +3304,8 @@ var keyViewComparator = function(lhs, rhs, context) if ([self isFullPlatformWindow]) return [self setFrame:[_platformWindow visibleFrame]]; - if (_autoresizingMask === CPWindowNotSizable) + // If this window is constrainable and we are globally ignoring constraining, ignore the platform resize + if ((_constrainsToUsableScreen && !CPWindowConstrainToScreen) || _autoresizingMask === CPWindowNotSizable) return; var frame = [_platformWindow contentBounds], @@ -3282,7 +3327,7 @@ var keyViewComparator = function(lhs, rhs, context) if (_autoresizingMask & CPWindowHeightSizable) newFrame.size.height += dY; - [self setFrame:newFrame]; + [self _setFrame:newFrame display:YES animate:NO constrainWidth:YES constrainHeight:YES]; } /* diff --git a/AppKit/CPWindow/CPWindow_Constants.j b/AppKit/CPWindow/CPWindow_Constants.j index 1025e72e6..a9a2c3327 100644 --- a/AppKit/CPWindow/CPWindow_Constants.j +++ b/AppKit/CPWindow/CPWindow_Constants.j @@ -194,3 +194,5 @@ CPStandardWindowShadowStyle = 0; CPMenuWindowShadowStyle = 1; CPPanelWindowShadowStyle = 2; CPCustomWindowShadowStyle = 3; + +CPWindowConstrainToScreen = YES; diff --git a/AppKit/CPWindow/_CPBorderlessBridgeWindowView.j b/AppKit/CPWindow/_CPBorderlessBridgeWindowView.j index b726343bb..26fe1fe6f 100644 --- a/AppKit/CPWindow/_CPBorderlessBridgeWindowView.j +++ b/AppKit/CPWindow/_CPBorderlessBridgeWindowView.j @@ -32,7 +32,7 @@ return @"bordeless-bridge-window-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"toolbar-background-color": [CPColor grayColor], diff --git a/AppKit/CPWindow/_CPDocModalWindowView.j b/AppKit/CPWindow/_CPDocModalWindowView.j index 775b9542d..c1219c22c 100644 --- a/AppKit/CPWindow/_CPDocModalWindowView.j +++ b/AppKit/CPWindow/_CPDocModalWindowView.j @@ -33,7 +33,7 @@ return @"doc-modal-window-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"body-color": [CPColor whiteColor], diff --git a/AppKit/CPWindow/_CPPopoverWindowView.j b/AppKit/CPWindow/_CPPopoverWindowView.j index 958bb7b34..b337be625 100644 --- a/AppKit/CPWindow/_CPPopoverWindowView.j +++ b/AppKit/CPWindow/_CPPopoverWindowView.j @@ -28,11 +28,7 @@ @global CPPopoverAppearanceMinimal -var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10), - _CPPopoverWindowViewRadius = 5.0, - _CPPopoverWindowViewStrokeWidth = 1.0, - _CPPopoverWindowViewShadowSize = CGSizeMake(0, 6), - _CPPopoverWindowViewShadowBlur = 15.0; +var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); /*! @ignore @@ -54,13 +50,17 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10), return @"popover-window-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"background-gradient": [CPNull null], @"background-gradient-hud": [CPNull null], @"stroke-color": [CPNull null], @"stroke-color-hud": [CPNull null], + @"border-radius": 5.0, + @"stroke-width": 1.0, + @"shadow-size": CGSizeMake(0, 6), + @"shadow-blur": 15.0 }; } @@ -156,15 +156,15 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10), [super drawRect:aRect]; var context = [[CPGraphicsContext currentContext] graphicsPort], - radius = _CPPopoverWindowViewRadius, + radius = [self valueForThemeAttribute:@"border-radius"], arrowWidth = _cursorSize.width, arrowHeight = _cursorSize.height, - strokeWidth = _CPPopoverWindowViewStrokeWidth, + strokeWidth = [self valueForThemeAttribute:@"stroke-width"], halfStrokeWidth = strokeWidth / 2.0, strokeColor, shadowColor = [[CPColor blackColor] colorWithAlphaComponent:.2], - shadowSize = _CPPopoverWindowViewShadowSize, - shadowBlur = _CPPopoverWindowViewShadowBlur, + shadowSize = [self valueForThemeAttribute:@"shadow-size"], + shadowBlur = [self valueForThemeAttribute:@"shadow-blur"], gradient, frame = [self bounds]; diff --git a/AppKit/CPWindow/_CPShadowWindowView.j b/AppKit/CPWindow/_CPShadowWindowView.j index d7095a750..cd0cec03c 100644 --- a/AppKit/CPWindow/_CPShadowWindowView.j +++ b/AppKit/CPWindow/_CPShadowWindowView.j @@ -41,7 +41,7 @@ return @"shadow-window-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{}; } diff --git a/AppKit/CPWindow/_CPStandardWindowView.j b/AppKit/CPWindow/_CPStandardWindowView.j index b2c68ef6a..d8ea56ceb 100644 --- a/AppKit/CPWindow/_CPStandardWindowView.j +++ b/AppKit/CPWindow/_CPStandardWindowView.j @@ -29,6 +29,8 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; @implementation _CPTexturedWindowHeadView : CPView { + BOOL _isSheet @accessors(setter=setSheet:); + _CPWindowView _parentView; CPView _gradientView; CPView _solidView; @@ -39,7 +41,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; return @"textured-window-head-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{}; } @@ -66,10 +68,11 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; [super layoutSubviews]; var gradientHeight = [[CPTheme defaultTheme] valueForAttributeWithName:@"gradient-height" forClass:_CPStandardWindowView], - bounds = [self bounds]; + bounds = [self bounds], + bezelHeadColor = [[CPTheme defaultTheme] valueForAttributeWithName:_isSheet ? @"bezel-head-sheet-color" : @"bezel-head-color" inState:[_parentView themeState] forClass:_CPStandardWindowView]; [_gradientView setFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(bounds), gradientHeight)]; - [_gradientView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"bezel-head-color" inState:[_parentView themeState] forClass:_CPStandardWindowView]]; + [_gradientView setBackgroundColor:bezelHeadColor]; [_solidView setFrame:CGRectMake(0.0, gradientHeight, CGRectGetWidth(bounds), CGRectGetHeight(bounds) - gradientHeight)]; [_solidView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"solid-color" forClass:_CPStandardWindowView]]; @@ -97,6 +100,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; CPButton _minimizeButton; BOOL _isDocumentEdited; + BOOL _isSheet; } + (CPString)defaultThemeClass @@ -104,12 +108,13 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; return @"standard-window-view"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"gradient-height": [CPNull null], @"solid-color": [CPNull null], @"bezel-head-color": [CPNull null], + @"bezel-head-sheet-color": [CPNull null], @"divider-color": [CPColor blackColor], @"body-color": [CPColor whiteColor], @"title-bar-height": 32, @@ -224,7 +229,14 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; width = CGRectGetWidth(bounds), headHeight = [self toolbarMaxY]; + if (_isSheet && _toolbarView && [self showsToolbar]) + { + headHeight = [_toolbarView frameSize].height; + [_toolbarView setFrameOrigin:CGPointMake(0.0, 0.0)]; + } + [_headView setFrameSize:CGSizeMake(width, headHeight)]; + [_dividerView setFrame:CGRectMake(0.0, headHeight, width, _CPStandardWindowViewDividerViewHeight)]; var dividerMinY = 0, @@ -312,12 +324,26 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; { [super _enableSheet:enable inWindow:parentWindow]; - [_headView setHidden:enable]; - [_dividerView setHidden:enable]; + _isSheet = enable; + [_headView setSheet:enable]; + + if (_toolbarView && [self showsToolbar]) + { + [_headView setHidden:NO]; + [_dividerView setHidden:NO]; + } + else + { + [_headView setHidden:enable]; + [_dividerView setHidden:enable]; + } + [_closeButton setHidden:enable]; [_minimizeButton setHidden:enable]; [_titleField setHidden:enable]; + [[self window] setMovable:!enable]; + if (enable) { [_bodyView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"body-color" forClass:_CPDocModalWindowView]]; @@ -333,12 +359,13 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; var theWindow = [self window], frame = [theWindow frame], dividerHeight = [_dividerView frame].size.height, - dy; + dy = [self toolbarMaxY] + dividerHeight; + + if (_toolbarView && [self showsToolbar]) + dy = [[CPTheme defaultTheme] valueForAttributeWithName:@"gradient-height" forClass:_CPStandardWindowView]; if (enable) - dy = -[_headView frame].size.height; - else - dy = [self toolbarMaxY] + dividerHeight; + dy = -dy; var newHeight = CGRectGetHeight(frame) + dy, newWidth = CGRectGetWidth(frame); diff --git a/AppKit/CPWindow/_CPToolTipWindowView.j b/AppKit/CPWindow/_CPToolTipWindowView.j index 423725fb7..b06c77863 100644 --- a/AppKit/CPWindow/_CPToolTipWindowView.j +++ b/AppKit/CPWindow/_CPToolTipWindowView.j @@ -38,7 +38,7 @@ return @"tooltip"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"stroke-color": [CPColor colorWithHexString:@"E3E3E3"], diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 8cd74b0e3..0ffd01121 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -81,7 +81,7 @@ _CPWindowViewResizeSlop = 3; return "window"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"title-bar-height": 25, @@ -631,7 +631,38 @@ _CPWindowViewResizeSlop = 3; newHeight = startHeight; } - [theWindow _setFrame:CGRectMake(newX, newY, newWidth, newHeight) display:YES animate:NO constrainWidth:NO constrainHeight:NO]; + // When resizing, we always constrain to the usable screen. + frame = CGRectMake(newX, newY, newWidth, newHeight); + + var constrainedFrame = [theWindow _constrainOriginOfFrame:frame], + dx = constrainedFrame.origin.x - frame.origin.x, + dy = constrainedFrame.origin.y - frame.origin.y; + + // When resizing from the left or top, we adjust the origin and size. + switch (_resizeRegion) + { + case _CPWindowViewResizeRegionBottomLeft: + case _CPWindowViewResizeRegionLeft: + case _CPWindowViewResizeRegionTopLeft: + case _CPWindowViewResizeRegionTop: + case _CPWindowViewResizeRegionTopRight: + frame.origin = constrainedFrame.origin; + frame.size.width -= dx; + frame.size.height -= dy; + } + + // When resizing from the right or bottom, we only adjust the size. + switch (_resizeRegion) + { + case _CPWindowViewResizeRegionTopRight: + case _CPWindowViewResizeRegionRight: + case _CPWindowViewResizeRegionBottomRight: + case _CPWindowViewResizeRegionBottom: + frame.size.width += dx; + frame.size.height += dy; + } + + [theWindow _setFrame:frame display:YES animate:NO constrainWidth:NO constrainHeight:NO]; [self setCursorForLocation:location resizing:YES]; } @@ -683,7 +714,7 @@ _CPWindowViewResizeSlop = 3; [theWindow _setAttachedSheetFrameOrigin]; [sheet._windowView _adjustShadowViewSize]; } - else if (theWindow._isSheet) + else if (theWindow && theWindow._isSheet) [self _adjustShadowViewSize]; } @@ -742,7 +773,9 @@ _CPWindowViewResizeSlop = 3; - (BOOL)showsToolbar { - return YES; + var styleMaskWindow = [[self window] styleMask]; + + return styleMaskWindow & CPBorderlessWindowMask || styleMaskWindow & CPTitledWindowMask || styleMaskWindow & CPHUDBackgroundWindowMask || styleMaskWindow & CPBorderlessBridgeWindowMask; } - (CGSize)toolbarOffset @@ -926,7 +959,8 @@ _CPWindowViewResizeSlop = 3; - (CGSize)_minimumResizeSize { - return CGSizeMake(0, _CPWindowViewMinContentHeight); + // Leave at least 4px so there is something visible. + return CGSizeMake(4, _CPWindowViewMinContentHeight); } - (int)bodyOffset diff --git a/AppKit/Cib/CPCibLoading.j b/AppKit/Cib/CPCibLoading.j index 8a46e670f..91ae95ed3 100644 --- a/AppKit/Cib/CPCibLoading.j +++ b/AppKit/Cib/CPCibLoading.j @@ -63,8 +63,8 @@ var CPCibOwner = @"CPCibOwner"; + (CPCib)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable loadDelegate:aDelegate { return ([[CPCib alloc] - initWithContentsOfURL:anAbsolutePath - loadDelegate:[[_CPCibLoadDelegate alloc] + initWithContentsOfURL:anAbsolutePath + loadDelegate:[[_CPCibLoadDelegate alloc] initWithLoadDelegate:aDelegate externalNameTable:aNameTable]]); } @@ -84,9 +84,9 @@ var CPCibOwner = @"CPCibOwner"; - (CPCib)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable loadDelegate:(id)aDelegate { return ([[CPCib alloc] - initWithCibNamed:aFileName - bundle:self - loadDelegate:[[_CPCibLoadDelegate alloc] + initWithCibNamed:aFileName + bundle:self + loadDelegate:[[_CPCibLoadDelegate alloc] initWithLoadDelegate:aDelegate externalNameTable:aNameTable]]); } diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index d929cd0c7..63bb24a4f 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -35,7 +35,10 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", _CPCibCustomResourceResourceNameKey = @"_CPCibCustomResourceResourceNameKey", - _CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey"; + _CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey", + + _CPCibCustomResourceTemplateImageMap = nil; + @implementation _CPCibCustomResource : CPObject { @@ -45,6 +48,16 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", CPBundle _bundle; } ++ (void)initialize +{ + if (self !== [_CPCibCustomResource class]) + return; + + _CPCibCustomResourceTemplateImageMap = @{ + "CPAddTemplate": "button-image-plus", + "CPRemoveTemplate": "button-image-minus" + }; +} + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize { return [[self alloc] initWithClassName:@"CPImage" resourceName:aResourceName properties:@{ @"size": aSize }]; @@ -98,12 +111,12 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", (![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources])) if (_className === @"CPImage") { - if (_resourceName == "CPAddTemplate") - return [[CPTheme defaultTheme] valueForAttributeWithName:@"button-image-plus" forClass:[CPButtonBar class]]; - else if (_resourceName == "CPRemoveTemplate") - return [[CPTheme defaultTheme] valueForAttributeWithName:@"button-image-minus" forClass:[CPButtonBar class]]; + var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName]; - return [self imageFromCoder:aCoder]; + if (templateImage) + return [[CPTheme defaultTheme] valueForAttributeWithName:templateImage forClass:[CPButtonBar class]]; + else + return [self imageFromCoder:aCoder]; } return self; @@ -176,6 +189,11 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", return [_properties objectForKey:@"size"]; } +- (BOOL)isSingleImage +{ + return YES; +} + - (BOOL)isThreePartImage { return NO; diff --git a/AppKit/Cib/_CPCibCustomView.j b/AppKit/Cib/_CPCibCustomView.j index 2ea71fe79..f8acf1226 100644 --- a/AppKit/Cib/_CPCibCustomView.j +++ b/AppKit/Cib/_CPCibCustomView.j @@ -48,7 +48,7 @@ @end -var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; +var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; @implementation _CPCibCustomView (CPCoding) diff --git a/AppKit/Cib/_CPCibWindowTemplate.j b/AppKit/Cib/_CPCibWindowTemplate.j index 869469626..6ae9be3cf 100644 --- a/AppKit/Cib/_CPCibWindowTemplate.j +++ b/AppKit/Cib/_CPCibWindowTemplate.j @@ -87,12 +87,17 @@ - (id)_cibInstantiate { - var windowClass = CPClassFromString([self windowClass]), - theWindow = [[windowClass alloc] initWithContentRect:_windowRect styleMask:_windowStyleMask]; + var windowClass = CPClassFromString([self windowClass]); -/* if (!windowClass) - [NSException raise:NSInvalidArgumentException format:@"Unable to locate NSWindow class %@, using NSWindow",_windowClass]; - class=[NSWindow class];*/ + if (!windowClass) + { +#if DEBUG + CPLog.warn("Unknown class \"%@\" in cib file, using CPWindow instead.", [self windowClass]); +#endif + windowClass = [CPWindow class]; + } + + var theWindow = [[windowClass alloc] initWithContentRect:_windowRect styleMask:_windowStyleMask]; if (_minSize) [theWindow setMinSize:_minSize]; @@ -103,12 +108,11 @@ //[result setHidesOnDeactivate:(_wtFlags&0x80000000)?YES:NO]; [theWindow setTitle:_windowTitle]; - // FIXME: we can't autoresize yet... + var contentViewAutoresizesSubviews = [_windowView autoresizesSubviews]; + [_windowView setAutoresizesSubviews:NO]; - [theWindow setContentView:_windowView]; - - [_windowView setAutoresizesSubviews:YES]; + [_windowView setAutoresizesSubviews:contentViewAutoresizesSubviews]; if ([_viewClass isKindOfClass:[CPToolbar class]]) [theWindow setToolbar:_viewClass]; diff --git a/AppKit/CoreAnimation/CALayer.j b/AppKit/CoreAnimation/CALayer.j index 066ff8437..dbe2c3dee 100644 --- a/AppKit/CoreAnimation/CALayer.j +++ b/AppKit/CoreAnimation/CALayer.j @@ -687,7 +687,7 @@ if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex) @param aLayer the layer to insert @param anIndex the index to insert the layer at */ -- (void)insertSublayer:(CALayer)aLayer atIndex:(unsigned)anIndex +- (void)insertSublayer:(CALayer)aLayer atIndex:(CPUInteger)anIndex { if (!aLayer) return; diff --git a/AppKit/CoreAnimation/CAMediaTimingFunction.j b/AppKit/CoreAnimation/CAMediaTimingFunction.j index 77d953921..a80306b42 100644 --- a/AppKit/CoreAnimation/CAMediaTimingFunction.j +++ b/AppKit/CoreAnimation/CAMediaTimingFunction.j @@ -75,7 +75,7 @@ var CAMediaNamedTimingFunctions = nil; return self; } -- (void)getControlPointAtIndex:(unsigned)anIndex values:(float/*[2]*/)reference +- (void)getControlPointAtIndex:(CPUInteger)anIndex values:(float/*[2]*/)reference { if (anIndex == 0) { diff --git a/AppKit/CoreGraphics/CGContextCanvas.j b/AppKit/CoreGraphics/CGContextCanvas.j index 892813d3d..628afd27e 100644 --- a/AppKit/CoreGraphics/CGContextCanvas.j +++ b/AppKit/CoreGraphics/CGContextCanvas.j @@ -43,7 +43,7 @@ var CANVAS_LINECAP_TABLE = [ "butt", "round", "square" ], #define _CGContextFillRectCanvas(aContext, aRect) aContext.fillRect(CGRectGetMinX(aRect), CGRectGetMinY(aRect), CGRectGetWidth(aRect), CGRectGetHeight(aRect)) #define _CGContextClipCanvas(aContext) aContext.clip() -// In Cocoa, all primitives excepts rects cannot be added to the context's path +// In Cocoa, all primitives excepts rects and arcs cannot be added to the context's path // until a move to point has been done, because an empty path has no current point. var hasPath = function(aContext, methodName) { @@ -113,12 +113,12 @@ function CGContextSetBlendMode(aContext, aBlendMode) function CGContextAddArc(aContext, x, y, radius, startAngle, endAngle, clockwise) { - if (!hasPath(aContext, "CGContextAddArc")) - return; - // Despite the documentation saying otherwise, the last parameter is anti-clockwise not clockwise. // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes#Arcs _CGContextAddArcCanvas(aContext, x, y, radius, startAngle, endAngle, !clockwise); + + // AddArc implicitly starts a path + aContext.hasPath = YES; } function CGContextAddArcToPoint(aContext, x1, y1, x2, y2, radius) @@ -470,7 +470,7 @@ var scale_rotate = function(a, b, c, d) var rotate_scale = function(a, b, c, d) { - var sign = (a * d < 0.0 || b * c > 0.0) ? -1.0 : 1.0; + var sign = (a * d < 0.0 || b * c > 0.0) ? -1.0 : 1.0, a1 = (ATAN2(sign * b, sign * a) + ATAN2(-c, d)) / 2.0, cos = COS(a1), sin = SIN(a1); @@ -596,7 +596,6 @@ function CGContextDrawLinearGradient(aContext, aGradient, aStartPoint, anEndPoin { var colors = aGradient.colors, count = colors.length, - linearGradient = aContext.createLinearGradient(aStartPoint.x, aStartPoint.y, anEndPoint.x, anEndPoint.y); while (count--) @@ -607,6 +606,20 @@ function CGContextDrawLinearGradient(aContext, aGradient, aStartPoint, anEndPoin aContext.hasPath = NO; } +function CGContextDrawRadialGradient(aContext, aGradient, aStartCenter, aStartRadius, anEndCenter, anEndRadius, options) +{ + var colors = aGradient.colors, + count = colors.length, + linearGradient = aContext.createRadialGradient(aStartCenter.x, aStartCenter.y, aStartRadius, anEndCenter.x, anEndCenter.y, anEndRadius); + + while (count--) + linearGradient.addColorStop(aGradient.locations[count], to_string(colors[count])); + + aContext.fillStyle = linearGradient; + aContext.fill(); + aContext.hasPath = NO; +} + function CGBitmapGraphicsContextCreate() { var DOMElement = document.createElement("canvas"), diff --git a/AppKit/CoreGraphics/CGPath.j b/AppKit/CoreGraphics/CGPath.j index 05d1651d8..45c5d9062 100644 --- a/AppKit/CoreGraphics/CGPath.j +++ b/AppKit/CoreGraphics/CGPath.j @@ -120,12 +120,14 @@ function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, The ending point of the arc becomes the new current point of the path. */ var arcEndX = x + aRadius * COS(anEndAngle), - arcEndY = y + aRadius * SIN(anEndAngle); + arcEndY = y + aRadius * SIN(anEndAngle), + arcStartX = x + aRadius * COS(aStartAngle), + arcStartY = y + aRadius * SIN(aStartAngle); if (aPath.count) { - if (aPath.current.x !== arcEndX || aPath.current.y !== arcEndY) - CGPathAddLineToPoint(aPath, aTransform, arcEndX, arcEndY); + if (aPath.current.x !== x || aPath.current.y !== y) + CGPathAddLineToPoint(aPath, aTransform, arcStartX, arcStartY); } else { @@ -136,7 +138,7 @@ function CGPathAddArc(aPath, aTransform, x, y, aRadius, aStartAngle, anEndAngle, } aPath.current = CGPointMake(arcEndX, arcEndY); - aPath.elements[aPath.count++] = { type:kCGPathElementAddArc, x:x, y:y, radius:aRadius, startAngle:aStartAngle, endAngle:anEndAngle, clockwise:isClockwise }; + aPath.elements[aPath.count++] = { type:kCGPathElementAddArc, x:x, y:y, radius:aRadius, startAngle:aStartAngle, endAngle:anEndAngle, isClockwise:isClockwise }; } function CGPathAddArcToPoint(aPath, aTransform, x1, y1, x2, y2, aRadius) @@ -233,7 +235,7 @@ function CGPathAddPath(aPath, aTransform, anotherPath) case kCGPathElementAddArc: CGPathAddArc(aPath, aTransform, element.x, element.y, element.radius, element.startAngle, - element.endAngle, element.clockwise); + element.endAngle, element.isClockwise); break; case kCGPathElementAddArcToPoint: @@ -438,7 +440,7 @@ function CGPathEqualToPath(aPath, anotherPath) element.radius !== anotherElement.radius || element.startAngle !== anotherElement.startAngle || element.endAngle !== anotherElement.endAngle || - element.clockwise !== anotherElement.clockwise) + element.isClockwise !== anotherElement.isClockwise) { return NO; } @@ -608,7 +610,23 @@ function CGPathGetBoundingBox(aPath) return CGRectMake(ox, oy, rx - ox, ry - oy); } +function CGPathContainsPoint(aPath, aTransform, point, eoFill) +{ + if (!aPath.count) + return NO; + + if (aTransform) + point = CGPointApplyAffineTransform(point, aTransform); + + var context = CGBitmapGraphicsContextCreate(); + + CGContextBeginPath(context); + CGContextAddPath(context, aPath); + CGContextClosePath(context); + + return context.isPointInPath(point.x, point.y); +} + /*! @} -*/ - +*/ \ No newline at end of file diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index d75858dca..628293117 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -26,6 +26,7 @@ @import "CPPlatform.j" @class CPMenu +@class CPPlatformPasteboard @global CPApp @@ -33,46 +34,42 @@ var PrimaryPlatformWindow = NULL; @implementation CPPlatformWindow : CPObject { - CGRect _contentRect; + CGRect _contentRect; - CPInteger _level; - BOOL _hasShadow; - unsigned _shadowStyle; - CPString _title; + CPInteger _level; + BOOL _hasShadow; + unsigned _shadowStyle; + CPString _title; #if PLATFORM(DOM) - DOMWindow _DOMWindow; + DOMWindow _DOMWindow; - DOMElement _DOMBodyElement; - DOMElement _DOMFocusElement; - DOMElement _DOMEventGuard; - DOMElement _DOMScrollingElement; - id _hideDOMScrollingElementTimeout; + DOMElement _DOMBodyElement; + DOMElement _DOMFocusElement; + DOMElement _DOMEventGuard; + DOMElement _DOMScrollingElement; + id _hideDOMScrollingElementTimeout; - CPArray _windowLevels; - CPDictionary _windowLayers; + CPArray _windowLevels; + CPDictionary _windowLayers; - BOOL _mouseIsDown; - BOOL _mouseDownIsRightClick; - CGPoint _lastMouseEventLocation; - CPWindow _mouseDownWindow; - CPTimeInterval _lastMouseUp; - CPTimeInterval _lastMouseDown; + BOOL _mouseIsDown; + BOOL _mouseDownIsRightClick; + CGPoint _lastMouseEventLocation; + CPWindow _mouseDownWindow; + CPTimeInterval _lastMouseUp; + CPTimeInterval _lastMouseDown; - Object _charCodes; - unsigned _keyCode; - unsigned _lastKey; - BOOL _capsLockActive; - BOOL _ignoreNativeCopyOrCutEvent; - BOOL _ignoreNativePastePreparation; + Object _charCodes; + unsigned _keyCode; + unsigned _lastKey; + BOOL _capsLockActive; - BOOL _DOMEventMode; + BOOL _DOMEventMode; - // Native Pasteboard Support - DOMElement _DOMPasteboardElement; - CPEvent _pasteboardKeyDownEvent; + CPPlatformPasteboard _platformPasteboard; - CPString _overriddenEventType; + CPString _overriddenEventType; #endif } diff --git a/AppKit/Platform/DOM/CPDOMWindowLayer.j b/AppKit/Platform/DOM/CPDOMWindowLayer.j index 5ef90849d..dbd67f499 100644 --- a/AppKit/Platform/DOM/CPDOMWindowLayer.j +++ b/AppKit/Platform/DOM/CPDOMWindowLayer.j @@ -23,6 +23,7 @@ @import @import +@import "CGGeometry.j" @implementation CPDOMWindowLayer : CPObject { @@ -78,7 +79,7 @@ aWindow._isVisible = NO; } -- (void)insertWindow:(CPWindow)aWindow atIndex:(unsigned)anIndex +- (void)insertWindow:(CPWindow)aWindow atIndex:(CPUInteger)anIndex { // We will have to adjust the z-index of all windows starting at this index. var count = [_windows count], diff --git a/AppKit/Platform/DOM/CPPlatformPasteboard.j b/AppKit/Platform/DOM/CPPlatformPasteboard.j new file mode 100644 index 000000000..014d00d06 --- /dev/null +++ b/AppKit/Platform/DOM/CPPlatformPasteboard.j @@ -0,0 +1,528 @@ +/* + * CPPlatformPasteboard.j + * AppKit + * + * Created by Alexander Ljungberg. + * Copyright 2013, SlevenBits Ltd. + * + * 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 "CPCompatibility.j" +@import "CPEvent.j" +@import "CPPasteboard.j" +@import "CPPlatform.j" +@import "CPPlatformWindow+DOMKeys.j" + +@global CPApp +@global CPPlatformWindow + +// From CPPlatformWindow+DOM.j +@global _CPDOMEventStop + +#if PLATFORM(DOM) + +#define SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent) anEvent._suppressCappuccinoCut = YES +#define SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent) anEvent._suppressCappuccinoPaste = YES + +var hasEditableTarget = function(aDOMEvent) +{ + var target = aDOMEvent.target || aDOMEvent.srcElement; + + if (!target) + return NO; + + if (target.contentEditable == "true") + return YES; + + var nodeName = target.nodeName.toUpperCase(); + + return nodeName === "INPUT" || nodeName == "TEXTAREA"; +} + +/* + * This class encapsulates copy and paste related functionality for the + * DOM environment. While originally all of this code was apread out in a + * dozen places in CPPlatformWindow+DOM.j, this class serves to collect + * and isolate that code for easier testing and maintenance. + */ +@implementation CPPlatformPasteboard : CPObject +{ + DOMWindow _DOMWindow; + + DOMElement _DOMPasteboardElement; + + BOOL supportsNativeCopyAndPaste; + BOOL hasBugWhichPreventsNonEditablePaste; + BOOL hasBugWhichPreventsNonEditablePasteRedirect; + + CPEvent _lastKeyDownEvent; + BOOL currentEventIsNativePasteEvent; + BOOL currentEventIsNativeCopyOrCutEvent; + BOOL currentEventShouldBeSuppressed; + BOOL currentEventShouldDefinitelyBubble; + BOOL currentEventShouldDefinitelyNotBubble; + + BOOL _ignoreNativeCopyOrCutEvent; + BOOL _ignoreNativePastePreparation; +} + +- (id)init +{ + if (self = [super init]) + { + supportsNativeCopyAndPaste = CPFeatureIsCompatible(CPJavaScriptClipboardEventsFeature); + hasBugWhichPreventsNonEditablePaste = CPPlatformHasBug(CPJavaScriptPasteRequiresEditableTarget); + hasBugWhichPreventsNonEditablePasteRedirect = CPPlatformHasBug(CPJavaScriptPasteCantRefocus); + } + + return self; +} + +- (void)setDOMWindow:(DOMWindow)aDOMWindow +{ + if (_DOMWindow === aDOMWindow) + return; + + if (_DOMWindow) + [self destroyDOMElements]; + + _DOMWindow = aDOMWindow; + + if (_DOMWindow) + [self createDOMElements]; +} + +- (void)createDOMElements +{ + var theDocument = _DOMWindow.document, + _DOMBodyElement = theDocument.getElementById("cappuccino-body") || theDocument.body; + + // Create Native Pasteboard handler. + _DOMPasteboardElement = theDocument.createElement("textarea"); + + _DOMPasteboardElement.style.position = "absolute"; + _DOMPasteboardElement.style.top = "-10000px"; + _DOMPasteboardElement.style.zIndex = "999"; + _DOMPasteboardElement.className = "cpdontremove"; + + _DOMBodyElement.appendChild(_DOMPasteboardElement); + + _DOMPasteboardElement.blur(); + + var copyEventCallback = function (anEvent) { return [self beforeCopyEvent:anEvent]; }, + nativeBeforeClipboardEventCallback = function (anEvent) { return [self nativeBeforeClipboardEvent:anEvent]; }, + nativeCopyOrCutEventCallback = function (anEvent) { return [self nativeCopyOrCutEvent:anEvent]; }, + pasteEventCallback = function (anEvent) { return [self beforePasteEvent:anEvent]; }, + nativePasteEventCallback = function (anEvent) { return [self nativePasteEvent:anEvent]; }; + + if (theDocument.addEventListener) + { + if (supportsNativeCopyAndPaste) + { + _DOMWindow.addEventListener("beforecopy", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.addEventListener("beforecut", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.addEventListener("beforepaste", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.addEventListener("copy", nativeCopyOrCutEventCallback, NO); + _DOMWindow.addEventListener("cut", nativeCopyOrCutEventCallback, NO); + _DOMWindow.addEventListener("paste", nativePasteEventCallback, NO); + } + else + { + theDocument.addEventListener("beforepaste", pasteEventCallback, NO); + theDocument.addEventListener("beforecopy", copyEventCallback, NO); + theDocument.addEventListener("beforecut", copyEventCallback, NO); + } + + _DOMWindow.addEventListener("unload", function() + { + if (supportsNativeCopyAndPaste) + { + _DOMWindow.removeEventListener("beforecopy", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.removeEventListener("beforecut", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.removeEventListener("beforepaste", nativeBeforeClipboardEventCallback, NO); + _DOMWindow.removeEventListener("copy", nativeCopyOrCutEventCallback, NO); + _DOMWindow.removeEventListener("cut", nativeCopyOrCutEventCallback, NO); + _DOMWindow.removeEventListener("paste", nativePasteEventCallback, NO); + } + else + { + theDocument.removeEventListener("beforepaste", pasteEventCallback, NO); + theDocument.removeEventListener("beforecopy", copyEventCallback, NO); + theDocument.removeEventListener("beforecut", copyEventCallback, NO); + } + }, NO); + } + else + { + // TODO If we wanted IE 8 and lower copy and paste it'd go here. + } +} + +- (void)destroyDOMElements +{ + var theDocument = _DOMWindow.document, + _DOMBodyElement = theDocument.getElementById("cappuccino-body") || theDocument.body; + + _DOMBodyElement.removeChild(_DOMPasteboardElement); + _DOMPasteboardElement = nil; +} + +- (void)windowMaySendKeyEvent:(CPEvent)anEvent +{ + // Reset our opinions. + currentEventIsNativePasteEvent = NO; + currentEventIsNativeCopyOrCutEvent = NO; + currentEventShouldBeSuppressed = NO; + currentEventShouldDefinitelyNotBubble = NO; + currentEventShouldDefinitelyBubble = NO; + + if (!anEvent) + return; + + if ([anEvent type] !== CPKeyDown) + { + // Reset these flags on key up. + _ignoreNativePastePreparation = NO; + _ignoreNativeCopyOrCutEvent = NO; + return; + } + + var modifierFlags = [anEvent modifierFlags]; + + if (!(modifierFlags & (CPControlKeyMask | CPCommandKeyMask))) + return; + + _lastKeyDownEvent = anEvent; + + var aDOMEvent = anEvent._DOMEvent, + characters = [anEvent characters], + mayRequireDOMPasteboardElement = [self _mayRequireDOMPasteboardElementHack:aDOMEvent flags:modifierFlags]; + + if (characters === "v" && mayRequireDOMPasteboardElement) + { + if (supportsNativeCopyAndPaste && hasBugWhichPreventsNonEditablePaste && hasBugWhichPreventsNonEditablePasteRedirect && !hasEditableTarget(aDOMEvent)) + { + // You can't paste from the system clipboard into a non-editable area in Safari, neither using native + // copy and paste nor our _DOMPasteboardElement hack. We will paste from the Cappuccino pasteboard only + // and allow Safari to "beep" to indicate something went wrong. + + // The key down will not result in a paste event being sent by Safari, so it's not a paste event. + currentEventIsNativePasteEvent = NO; + // Yes to get the beep. + currentEventShouldDefinitelyBubble = YES; + } + else if (!(supportsNativeCopyAndPaste || hasBugWhichPreventsNonEditablePaste) && !_ignoreNativePastePreparation) + { + // We don't support native copy and paste so we must focus the _DOMPasteboardElement to receive the + // paste content. This needs to be done at keyDown time (or in the case of modern Safari, before the keyDown, + // which unfortunately isn't possible. See above.) + _DOMPasteboardElement.focus(); + _DOMPasteboardElement.select(); + _DOMPasteboardElement.value = ""; + _DOMWindow.setNativeTimeout(function () { [self _checkDOMPasteboardElement]; }, 0); + + currentEventIsNativePasteEvent = YES; + } + else if (supportsNativeCopyAndPaste) + currentEventIsNativePasteEvent = YES; + + if (currentEventIsNativePasteEvent) + { + // We need the event to propagate or nothing will be pasted. + currentEventShouldDefinitelyBubble = YES; + + // And we don't send the keydown because either our native paste envent handler will send it, + // or the _checkDOMPasteboardElement check will. + currentEventShouldBeSuppressed = YES; + } + } + else if ((characters == "c" || characters == "x") && mayRequireDOMPasteboardElement) + { + currentEventIsNativeCopyOrCutEvent = YES; + + // If _ignoreNativeCopyOrCutEvent, we already handled the copy/cut in beforeCopyEvent:. + // If supportsNativeCopyAndPaste, we will be handling it in the nativebeforeCopyEvent: handler. + // In both of those cases we don't want to send the event on keydown too, or we'll get 2X copy/cut operations. + if (supportsNativeCopyAndPaste || _ignoreNativeCopyOrCutEvent) + currentEventShouldBeSuppressed = YES; + } + + if (!currentEventShouldBeSuppressed) + { + if (characters === "v") + SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent); + else if (characters === "x") + SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent); + } +} + +- (BOOL)windowShouldSuppressKeyEvent +{ + return currentEventShouldBeSuppressed; +} + +- (void)windowDidSendKeyEvent:(CPEvent)anEvent +{ + // Now that the copy event has been sent through the Cappuccino event stack, we can load any Cappuccino + // pasteboard string into our DOMPasteboardElement hack, if necessary. + if (!supportsNativeCopyAndPaste && currentEventIsNativeCopyOrCutEvent) + [self _primeDOMPasteboardElement]; +} + +- (BOOL)windowShouldStopPropagation +{ + return currentEventShouldDefinitelyNotBubble; +} + +- (BOOL)windowShouldNotStopPropagation +{ + return currentEventShouldDefinitelyBubble; +} + +- (CPEvent)_fakeClipboardEvent:(DOMEvent)aDOMEvent type:(CPString)aType +{ + var keyCode = aType === "x" ? CPKeyCodes.X : (aType === "c" ? CPKeyCodes.C : CPKeyCodes.V), + characters = aType, + timestamp = [CPEvent currentTimestamp], // fake event, might as well use current timestamp + windowNumber = [[CPApp keyWindow] windowNumber], + modifierFlags = CPPlatformActionKeyMask, + location = [_lastKeyDownEvent locationInWindow], + anEvent = [CPEvent keyEventWithType:CPKeyDown location:location modifierFlags:modifierFlags + timestamp:timestamp windowNumber:windowNumber context:nil + characters:characters charactersIgnoringModifiers:characters isARepeat:NO keyCode:keyCode]; + + anEvent._data1 = @{ "simulated": YES }; + anEvent._DOMEvent = aDOMEvent; + + return anEvent; +} + +- (void)beforeCopyEvent:(DOMEvent)aDOMEvent +{ + if ([self _mayRequireDOMPasteboardElementHack:aDOMEvent flags:CPPlatformActionKeyMask] && !_ignoreNativeCopyOrCutEvent) + { + // we have to send out a fake copy or cut event so that we can force the copy/cut mechanisms to take place + var anEvent = [self _fakeClipboardEvent:aDOMEvent type:(aDOMEvent.type === "beforecut" ? "x" : "c")]; + + [CPApp sendEvent:anEvent]; + + // Once we've sent it, we can load the copy information into the pasteboard hack. + [self _primeDOMPasteboardElement]; + + //then we have to IGNORE the real keyboard event to prevent a double copy + //safari also sends the beforecopy event twice, so we additionally check here and prevent two events + _ignoreNativeCopyOrCutEvent = YES; + } + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; +} + +- (boolean)beforePasteEvent:(DOMEvent)aDOMEvent +{ + // Set up to capture the paste in a temporary input field. We'll send the event after capture. + if ([self _mayRequireDOMPasteboardElementHack:aDOMEvent flags:CPPlatformActionKeyMask]) + { + _DOMPasteboardElement.focus(); + _DOMPasteboardElement.select(); + _DOMPasteboardElement.value = ""; + + _ignoreNativePastePreparation = YES; + } + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; +} + +/* +Return true if the event may be a copy and paste event, but the target is not an input or text area. +*/ +- (void)_mayRequireDOMPasteboardElementHack:(DOMEvent)aDOMEvent flags:(unsigned)modifierFlags +{ + return !hasEditableTarget(aDOMEvent) && (modifierFlags & CPPlatformActionKeyMask); +} + +- (void)_primeDOMPasteboardElement +{ + var pasteboard = [CPPasteboard generalPasteboard], + types = [pasteboard types]; + + if (types.length) + { + if ([types indexOfObjectIdenticalTo:CPStringPboardType] !== CPNotFound) + _DOMPasteboardElement.value = [pasteboard stringForType:CPStringPboardType]; + else + _DOMPasteboardElement.value = [pasteboard _generateStateUID]; + + _DOMPasteboardElement.focus(); + _DOMPasteboardElement.select(); + + window.setNativeTimeout(function() { [self _clearDOMPasteboardElement]; }, 0); + } +} + +- (void)_checkDOMPasteboardElement +{ + if (supportsNativeCopyAndPaste) + { + [self _clearDOMPasteboardElement]; + return; + } + + var value = _DOMPasteboardElement.value; + + if ([value length]) + { + var pasteboard = [CPPasteboard generalPasteboard]; + + if ([pasteboard _stateUID] != value) + { + [pasteboard declareTypes:[CPStringPboardType] owner:self]; + [pasteboard setString:value forType:CPStringPboardType]; + } + } + + [self _clearDOMPasteboardElement]; + + [CPApp sendEvent:[self _fakeClipboardEvent:nil type:@"v"]]; + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; +} + +- (void)_clearDOMPasteboardElement +{ + _DOMPasteboardElement.value = ""; + _DOMPasteboardElement.blur(); +} + +- (boolean)nativeBeforeClipboardEvent:(DOMEvent)aDOMEvent +{ + // Our job here is to return "false" if the given clipboard operation should be enabled even in a situation where + // the browser might normally grey the option out. + + // Allow these fields to do their own thing. + if (hasEditableTarget(aDOMEvent)) + return true; + + var returnValue = YES; + + switch (aDOMEvent.type) + { + case "beforecopy": + returnValue = !([CPApp targetForAction:@selector(copy:)]); + break; + case "beforecut": + returnValue = !([CPApp targetForAction:@selector(cut:)]); + break; + case "beforepaste": + returnValue = !([CPApp targetForAction:@selector(paste:)]); + break; + } + + if (!returnValue) + _CPDOMEventStop(aDOMEvent, self); + + return returnValue; +} + +- (boolean)nativePasteEvent:(DOMEvent)aDOMEvent +{ + // This shouldn't happen. + if (!supportsNativeCopyAndPaste) + return; + + var value; + if (aDOMEvent.clipboardData && aDOMEvent.clipboardData.setData) + value = aDOMEvent.clipboardData.getData('text/plain'); + else + value = _DOMWindow.clipboardData.getData("Text"); + + if ([value length]) + { + var pasteboard = [CPPasteboard generalPasteboard]; + + if ([pasteboard _stateUID] != value) + { + [pasteboard declareTypes:[CPStringPboardType] owner:self]; + [pasteboard setString:value forType:CPStringPboardType]; + } + } + + var anEvent = [self _fakeClipboardEvent:aDOMEvent type:"v"], + platformWindow = [[anEvent window] platformWindow]; + + SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent); + + // By default we'll stop the native handling of the event since we're handling it ourselves. However, we need to + // stop it before we send the event so that the event can overrule our choice. CPTextField for instance wants the + // default handling when focused (which is to insert into the field). + [platformWindow _propagateCurrentDOMEvent:NO] + + [CPApp sendEvent:anEvent]; + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + if (![platformWindow _willPropagateCurrentDOMEvent]) + _CPDOMEventStop(aDOMEvent, self); + + return false; +} + +- (boolean)nativeCopyOrCutEvent:(DOMEvent)aDOMEvent +{ + // This shouldn't happen. + if (!supportsNativeCopyAndPaste) + return; + + var anEvent = [self _fakeClipboardEvent:aDOMEvent type:(aDOMEvent.type.indexOf("cut") != CPNotFound ? "x" : "c")], + platformWindow = [[anEvent window] platformWindow]; + + SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent); + + [platformWindow _propagateCurrentDOMEvent:NO] + + // Let the app react through copy: and cut: actions. + [CPApp sendEvent:anEvent]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + // If StopDOMEventPropagation was set to NO, we don't try to write to the system clipboard. The control that did this + // wants to use the default copy/cut functionality. + if (![platformWindow _willPropagateCurrentDOMEvent]) + { + // Now the app should have written whatever it wants to have copied to the Cappuccino clipboard. So now we need + // to write it to the system board. + _CPDOMEventStop(aDOMEvent, self); + + var pasteboard = [CPPasteboard generalPasteboard]; + + if ([[pasteboard types] containsObject:CPStringPboardType]) + { + var stringValue = [pasteboard stringForType:CPStringPboardType]; + + if (aDOMEvent.clipboardData && aDOMEvent.clipboardData.setData) + aDOMEvent.clipboardData.setData('text/plain', stringValue); + else + _DOMWindow.clipboardData.setData('Text', stringValue); + } + } + + return ![platformWindow _willPropagateCurrentDOMEvent]; +} + +@end + +#endif diff --git a/AppKit/Platform/DOM/CPPlatformString.j b/AppKit/Platform/DOM/CPPlatformString.j index f35c891f5..93b44f113 100644 --- a/AppKit/Platform/DOM/CPPlatformString.j +++ b/AppKit/Platform/DOM/CPPlatformString.j @@ -53,7 +53,7 @@ var DOMFixedWidthSpanElement = nil, style = DOMFlexibleWidthSpanElement.style; style.position = "absolute"; style.left = "-100000px"; - style.zIndex = -100000; + style.zIndex = -10000; style.visibility = "visible"; style.padding = "0px"; style.margin = "0px"; @@ -99,7 +99,7 @@ var DOMFixedWidthSpanElement = nil, DOMMetricsDivElement.className = "cpdontremove"; style = DOMMetricsDivElement.style; style.position = "absolute"; - style.left = "-10000px"; + style.left = "-100000px"; style.zIndex = -10000; style.width = "100000px"; style.whiteSpace = "nowrap"; diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 546c05871..e542da819 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -107,27 +107,29 @@ * P: undefined 80 undefined */ +@import @import @import @import @import -@import "CPCursor.j" +@import "CPApplication_Constants.j" @import "CPCompatibility.j" +@import "CPCursor.j" @import "CPDOMWindowLayer.j" @import "CPDragServer_Constants.j" @import "CPEvent.j" @import "CPPasteboard.j" @import "CPPlatform.j" -@import "CPPlatformWindow.j" +@import "CPPlatformPasteboard.j" @import "CPPlatformWindow+DOMKeys.j" +@import "CPPlatformWindow.j" @import "CPText.j" @import "CPWindow_Constants.j" @class CPDragServer @class _CPToolTip -@global CPApp @global _CPRunModalLoop // List of all open native windows @@ -135,7 +137,6 @@ var PlatformWindows = [CPSet set]; // Define up here so compressor knows about them. var CPDOMEventGetClickCount, - CPDOMEventStop, StopDOMEventPropagation, StopContextMenuDOMEventPropagation; @@ -196,11 +197,13 @@ var ModifierKeyCodes = [ CPKeyCodes.ALT, CPKeyCodes.SHIFT ], + supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop]; var resizeTimer = nil; #if PLATFORM(DOM) + @implementation CPPlatformWindow (DOM) - (id)_init @@ -215,6 +218,8 @@ var resizeTimer = nil; _windowLevels = []; _windowLayers = @{}; + _platformPasteboard = [CPPlatformPasteboard new]; + [self registerDOMWindow]; [self updateFromNativeContentRect]; @@ -301,19 +306,6 @@ var resizeTimer = nil; _DOMBodyElement.appendChild(_DOMFocusElement); - // Create Native Pasteboard handler. - _DOMPasteboardElement = theDocument.createElement("textarea"); - - _DOMPasteboardElement.style.position = "absolute"; - _DOMPasteboardElement.style.top = "-10000px"; - _DOMPasteboardElement.style.zIndex = "999"; - _DOMPasteboardElement.className = "cpdontremove"; - - _DOMBodyElement.appendChild(_DOMPasteboardElement); - - // Make sure the pastboard element is blurred. - _DOMPasteboardElement.blur(); - // Create a full screen div to protect against iframes and other elements // from consuming events during tracking // FIXME: multiple windows @@ -367,6 +359,8 @@ var resizeTimer = nil; [self createDOMElements]; [self _addLayers]; + [_platformPasteboard setDOMWindow:_DOMWindow]; + var theClass = [self class], dragEventImplementation = class_getMethodImplementation(theClass, @selector(dragEvent:)), @@ -376,17 +370,9 @@ var resizeTimer = nil; resizeEventImplementation = class_getMethodImplementation(theClass, resizeEventSelector), resizeEventCallback = function (anEvent) { resizeEventImplementation(self, nil, anEvent); }, - copyEventSelector = @selector(copyEvent:), - copyEventImplementation = class_getMethodImplementation(theClass, copyEventSelector), - copyEventCallback = function (anEvent) {copyEventImplementation(self, nil, anEvent); }, - - pasteEventSelector = @selector(pasteEvent:), - pasteEventImplementation = class_getMethodImplementation(theClass, pasteEventSelector), - pasteEventCallback = function (anEvent) {pasteEventImplementation(self, nil, anEvent); }, - keyEventSelector = @selector(keyEvent:), keyEventImplementation = class_getMethodImplementation(theClass, keyEventSelector), - keyEventCallback = function (anEvent) { keyEventImplementation(self, nil, anEvent); }, + keyEventCallback = function (anEvent) { return keyEventImplementation(self, nil, anEvent); }, mouseEventSelector = @selector(mouseEvent:), mouseEventImplementation = class_getMethodImplementation(theClass, mouseEventSelector), @@ -421,10 +407,6 @@ var resizeTimer = nil; theDocument.addEventListener("mousemove", mouseEventCallback, NO); theDocument.addEventListener("contextmenu", contextMenuEventCallback, NO); - theDocument.addEventListener("beforecopy", copyEventCallback, NO); - theDocument.addEventListener("beforecut", copyEventCallback, NO); - theDocument.addEventListener("beforepaste", pasteEventCallback, NO); - theDocument.addEventListener("keyup", keyEventCallback, NO); theDocument.addEventListener("keydown", keyEventCallback, NO); theDocument.addEventListener("keypress", keyEventCallback, NO); @@ -454,10 +436,6 @@ var resizeTimer = nil; theDocument.removeEventListener("keydown", keyEventCallback, NO); theDocument.removeEventListener("keypress", keyEventCallback, NO); - theDocument.removeEventListener("beforecopy", copyEventCallback, NO); - theDocument.removeEventListener("beforecut", copyEventCallback, NO); - theDocument.removeEventListener("beforepaste", pasteEventCallback, NO); - theDocument.removeEventListener("touchstart", touchEventCallback, NO); theDocument.removeEventListener("touchend", touchEventCallback, NO); theDocument.removeEventListener("touchmove", touchEventCallback, NO); @@ -473,6 +451,8 @@ var resizeTimer = nil; [PlatformWindows removeObject:self]; + [_platformPasteboard setDOMWindow:nil]; + self._DOMWindow = nil; }, NO); } @@ -494,7 +474,7 @@ var resizeTimer = nil; theDocument.onmousewheel = scrollEventCallback; _DOMBodyElement.ondrag = function () { return NO; }; - _DOMBodyElement.onselectstart = function () { return _DOMWindow.event.srcElement === _DOMPasteboardElement; }; + _DOMBodyElement.onselectstart = function () { return _DOMWindow.event.srcElement === _platformPasteboard._DOMPasteboardElement; }; _DOMWindow.attachEvent("onunload", function() { @@ -523,6 +503,8 @@ var resizeTimer = nil; [PlatformWindows removeObject:self]; + [_platformPasteboard setDOMWindow:nil]; + self._DOMWindow = nil; }, NO); } @@ -709,9 +691,7 @@ var resizeTimer = nil; StopDOMEventPropagation = NO; } - var isNativePasteEvent = NO, - isNativeCopyOrCutEvent = NO, - overrideCharacters = nil, + var overrideCharacters = nil, charactersIgnoringModifiers = @""; switch (aDOMEvent.type) @@ -753,31 +733,6 @@ var resizeTimer = nil; //we are simply going to skip all keypress events that use cmd/ctrl key //this lets us be consistent in all browsers and send on the keydown //which means we can cancel the event early enough, but only if sendEvent needs to - - var eligibleForCopyPaste = [self _validateCopyCutOrPasteEvent:aDOMEvent flags:modifierFlags]; - - // If this could be a native PASTE event, then we need to further examine it before - // sending a CPEvent. Select our element to see if anything gets pasted in it. - if (characters === "v" && eligibleForCopyPaste) - { - if (!_ignoreNativePastePreparation) - { - _DOMPasteboardElement.select(); - _DOMPasteboardElement.value = ""; - } - - isNativePasteEvent = YES; - } - - // However, of this could be a native COPY event, we need to let the normal event-process take place so it - // can capture our internal Cappuccino pasteboard. - else if ((characters == "c" || characters == "x") && eligibleForCopyPaste) - { - isNativeCopyOrCutEvent = YES; - - if (_ignoreNativeCopyOrCutEvent) - break; - } } else if (CPKeyCodes.firesKeyPressEvent(_keyCode, _lastKey, aDOMEvent.shiftKey, aDOMEvent.ctrlKey, aDOMEvent.altKey)) { @@ -823,12 +778,6 @@ var resizeTimer = nil; timestamp:timestamp windowNumber:windowNumber context:nil characters:characters charactersIgnoringModifiers:charactersIgnoringModifiers isARepeat:isARepeat keyCode:charCode]; - if (isNativePasteEvent) - { - _pasteboardKeyDownEvent = event; - window.setNativeTimeout(function () { [self _checkPasteboardElement] }, 0); - } - break; case "keyup": @@ -838,8 +787,6 @@ var resizeTimer = nil; _keyCode = -1; _lastKey = -1; _charCodes[keyCode] = nil; - _ignoreNativeCopyOrCutEvent = NO; - _ignoreNativePastePreparation = NO; // check for caps lock state if (keyCode === CPKeyCodes.CAPS_LOCK) @@ -864,127 +811,33 @@ var resizeTimer = nil; event = [CPEvent keyEventWithType:CPKeyUp location:location modifierFlags:modifierFlags timestamp: timestamp windowNumber:windowNumber context:nil characters:characters charactersIgnoringModifiers:charactersIgnoringModifiers isARepeat:NO keyCode:keyCode]; + break; } - if (event && !isNativePasteEvent) - { + if (event) event._DOMEvent = aDOMEvent; + [_platformPasteboard windowMaySendKeyEvent:event]; + + if (event && ![_platformPasteboard windowShouldSuppressKeyEvent]) + { [CPApp sendEvent:event]; - if (isNativeCopyOrCutEvent) - { - // If this is a native copy event, then check if the pasteboard has anything in it. - [self _primePasteboardElement]; - } + [_platformPasteboard windowDidSendKeyEvent:event]; } - if (StopDOMEventPropagation) - CPDOMEventStop(aDOMEvent, self); - - [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; -} - -- (void)copyEvent:(DOMEvent)aDOMEvent -{ - if ([self _validateCopyCutOrPasteEvent:aDOMEvent flags:CPPlatformActionKeyMask] && !_ignoreNativeCopyOrCutEvent) + var didStop = NO; + // Platform pasteboard can overrule the decision to stop propagation either way, or it might have no opinion. + if ([_platformPasteboard windowShouldStopPropagation] || (StopDOMEventPropagation && ![_platformPasteboard windowShouldNotStopPropagation])) { - // we have to send out a fake copy or cut event so that we can force the copy/cut mechanisms to take place - var cut = aDOMEvent.type === "beforecut", - keyCode = cut ? CPKeyCodes.X : CPKeyCodes.C, - characters = cut ? "x" : "c", - timestamp = [CPEvent currentTimestamp], // fake event, might as well use current timestamp - windowNumber = [[CPApp keyWindow] windowNumber], - modifierFlags = CPPlatformActionKeyMask, - location = _lastMouseEventLocation || CGPointMakeZero(), - event = [CPEvent keyEventWithType:CPKeyDown location:location modifierFlags:modifierFlags - timestamp:timestamp windowNumber:windowNumber context:nil - characters:characters charactersIgnoringModifiers:characters isARepeat:NO keyCode:keyCode]; - - event._DOMEvent = aDOMEvent; - [CPApp sendEvent:event]; - - [self _primePasteboardElement]; - - //then we have to IGNORE the real keyboard event to prevent a double copy - //safari also sends the beforecopy event twice, so we additionally check here and prevent two events - _ignoreNativeCopyOrCutEvent = YES; + didStop = YES; + _CPDOMEventStop(aDOMEvent, self); } [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; -} -- (void)pasteEvent:(DOMEvent)aDOMEvent -{ - if ([self _validateCopyCutOrPasteEvent:aDOMEvent flags:CPPlatformActionKeyMask]) - { - _DOMPasteboardElement.focus(); - _DOMPasteboardElement.select(); - _DOMPasteboardElement.value = ""; - _ignoreNativePastePreparation = YES; - } - - [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; -} - -- (void)_validateCopyCutOrPasteEvent:(DOMEvent)aDOMEvent flags:(unsigned)modifierFlags -{ - return ( - ((aDOMEvent.target || aDOMEvent.srcElement).nodeName.toUpperCase() !== "INPUT" && - (aDOMEvent.target || aDOMEvent.srcElement).nodeName.toUpperCase() !== "TEXTAREA" - ) || aDOMEvent.target === _DOMPasteboardElement - ) && - (modifierFlags & CPPlatformActionKeyMask); -} - -- (void)_primePasteboardElement -{ - var pasteboard = [CPPasteboard generalPasteboard], - types = [pasteboard types]; - - if (types.length) - { - if ([types indexOfObjectIdenticalTo:CPStringPboardType] != CPNotFound) - _DOMPasteboardElement.value = [pasteboard stringForType:CPStringPboardType]; - else - _DOMPasteboardElement.value = [pasteboard _generateStateUID]; - - _DOMPasteboardElement.focus(); - _DOMPasteboardElement.select(); - - window.setNativeTimeout(function() { [self _clearPasteboardElement]; }, 0); - } -} - -- (void)_checkPasteboardElement -{ - var value = _DOMPasteboardElement.value; - - if ([value length]) - { - var pasteboard = [CPPasteboard generalPasteboard]; - - if ([pasteboard _stateUID] != value) - { - [pasteboard declareTypes:[CPStringPboardType] owner:self]; - [pasteboard setString:value forType:CPStringPboardType]; - } - } - - [self _clearPasteboardElement]; - - [CPApp sendEvent:_pasteboardKeyDownEvent]; - - _pasteboardKeyDownEvent = nil; - - [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; -} - -- (void)_clearPasteboardElement -{ - _DOMPasteboardElement.value = ""; - _DOMPasteboardElement.blur(); + return !didStop; } - (void)scrollEvent:(DOMEvent)aDOMEvent @@ -1060,7 +913,7 @@ var resizeTimer = nil; { // Find the scroll delta var deltaX = _DOMScrollingElement.scrollLeft - 150, - deltaY = (_DOMScrollingElement.scrollTop - 150) || (aDOMEvent.deltaY===undefined?0: aDOMEvent.deltaY); + deltaY = (_DOMScrollingElement.scrollTop - 150) || (aDOMEvent.deltaY === undefined ? 0 : aDOMEvent.deltaY); // If we scroll super with momentum, // there are so many events going off that @@ -1081,7 +934,7 @@ var resizeTimer = nil; // We set StopDOMEventPropagation = NO on line 1008 //if (StopDOMEventPropagation) - // CPDOMEventStop(aDOMEvent, self); + // _CPDOMEventStop(aDOMEvent, self); // Reset the DOM elements scroll offset _DOMScrollingElement.scrollLeft = 150; @@ -1142,6 +995,10 @@ var resizeTimer = nil; [windows[windowCount] resizeWithOldPlatformWindowSize:oldSize]; } + [[CPNotificationCenter defaultCenter] postNotificationName:CPApplicationDidChangeScreenParametersNotification + object:CPApp + userInfo:nil]; + //window.liveResize = NO; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; @@ -1322,8 +1179,12 @@ var resizeTimer = nil; [CPApp sendEvent:event]; } + var didStop = NO; if (StopDOMEventPropagation && (!supportsNativeDragAndDrop || type !== "mousedown" && !isDragging)) - CPDOMEventStop(aDOMEvent, self); + { + didStop = YES; + _CPDOMEventStop(aDOMEvent, self); + } // If there are any tracking event listeners (listening for CPLeftMouseDraggedMask) // then show the event guard so we don't lose events to iframes @@ -1345,12 +1206,13 @@ var resizeTimer = nil; _DOMEventGuard.style.display = hasTrackingEventListener ? "" : "none"; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + return !didStop; } - (void)contextMenuEvent:(DOMEvent)aDOMEvent { if (StopContextMenuDOMEventPropagation) - CPDOMEventStop(aDOMEvent, self); + _CPDOMEventStop(aDOMEvent, self); return !StopContextMenuDOMEventPropagation; } @@ -1490,7 +1352,8 @@ var resizeTimer = nil; // relative to it or the furthest parent. var children = [aWindow childWindows], count = [children count], - parent = aWindow; + parent = aWindow, + parentLevel = [parent level]; for (var i = 0; i < count; ++i) { @@ -1501,6 +1364,10 @@ var resizeTimer = nil; if (!childWasVisible && ![child _hasBeenOrderedIn]) continue; + // If a user moved level of the child window, we should respect that + if ([child level] !== parentLevel) + continue; + var ordering = [child _childOrdering]; if ((ordering === CPWindowAbove && furthestParent._index > parent._index) || @@ -1641,6 +1508,44 @@ var resizeTimer = nil; return theWindow; } +/*! @ignore Return the selected text in the DOM window if known. */ +- (CPString)_selectedText +{ + if (_DOMWindow.getSelection) + return "" + _DOMWindow.getSelection(); + else if (_DOMWindow.document.getSelection) + return "" + _DOMWindow.document.getSelection(); + else if (_DOMWindow.selection) + return "" + _DOMWindow.selection.createRange().text; + else + return nil; +} + +/*! + Set the text selection range to the given range within the given element, which must be a child of + this DOM window. +*/ +- (void)setSelectedRange:(CPRange)aRange inElement:(DOMElement)anElement +{ + if (_DOMWindow.getSelection()) + { + var domRange = _DOMWindow.document.createRange(); + domRange.setStart(anElement.childNodes[0], aRange.location); + domRange.setEnd(anElement.childNodes[0], CPMaxRange(aRange)); + _DOMWindow.getSelection().removeAllRanges(); + _DOMWindow.getSelection().addRange(domRange); + } + else if (_DOMWindow.document.selection) + { + var domRange = _DOMWindow.document.body.createTextRange(); + domRange.moveToElementText(anElement); + domRange.collapse(true); + domRange.moveStart('character', aRange.location); + domRange.moveEnd('character', aRange.length); + domRange.select(); + } +} + /*! When using command (mac) or control (windows), keys are propagated to the browser by default. To prevent a character key from propagating (to prevent its default action, and instead use it @@ -1746,7 +1651,8 @@ var CPDOMEventGetClickCount = function(aComparisonEvent, aTimestamp, aLocation) ABS(comparisonLocation.y - aLocation.y) < CLICK_SPACE_DELTA) ? [aComparisonEvent clickCount] + 1 : 1; }; -var CPDOMEventStop = function(aDOMEvent, aPlatformWindow) +// Global. +_CPDOMEventStop = function(aDOMEvent, aPlatformWindow) { // IE Model aDOMEvent.cancelBubble = true; @@ -1758,12 +1664,6 @@ var CPDOMEventStop = function(aDOMEvent, aPlatformWindow) if (aDOMEvent.stopPropagation) aDOMEvent.stopPropagation(); - - if (aDOMEvent.type === CPDOMEventMouseDown) - { - aPlatformWindow._DOMFocusElement.focus(); - aPlatformWindow._DOMFocusElement.blur(); - } }; function CPWindowObjectList() diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index ed9f0cc15..c37ed8181 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -375,7 +375,7 @@ var themedButtonValues = nil, "themedMenuItemStandardView", "themedMenuItemMenuBarView", "themedToolbarView", - "themedBordelessBridgeWindowView", + "themedBorderlessBridgeWindowView", "themedWindowView", "themedBrowser", "themedRuleEditor", @@ -1097,7 +1097,7 @@ var themedButtonValues = nil, + (CPDatePicker)themedDatePicker { - var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40.0, 40.0, 170.0, 29.0)], bezelColor = PatternColor( [ @@ -1166,6 +1166,7 @@ var themedButtonValues = nil, [@"max-size", CGSizeMake(-1.0, 29.0)] ]; + [datePicker setDatePickerStyle:CPTextFieldDatePickerStyle]; [self registerThemeValues:themeValues forView:datePicker]; return datePicker; @@ -1173,7 +1174,7 @@ var themedButtonValues = nil, + (CPDatePicker)themedDatePickerCalendar { - var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40.0, 140.0, 276.0, 148.0)], arrowImageLeft = PatternImage("datepicker-calendar-arrow-left.png", 7.0, 10.0), arrowImageRight = PatternImage("datepicker-calendar-arrow-right.png", 7.0, 10.0), @@ -1183,17 +1184,26 @@ var themedButtonValues = nil, 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), + secondHandSize = CGSizeMake(89.0, 89.0), + secondHandImage = PatternImage("datepicker-clock-second-hand.png", secondHandSize.width, secondHandSize.height), - 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), + minuteHandSize = CGSizeMake(85.0, 85.0), + minuteHandImage = PatternImage("datepicker-clock-minute-hand.png", minuteHandSize.width, minuteHandSize.height), + + hourHandSize = CGSizeMake(47.0, 47.0), + hourHandImage = PatternImage("datepicker-clock-hour-hand.png", hourHandSize.width, hourHandSize.height), + + middleHandSize = CGSizeMake(13.0, 13.0), + middleHandImage = PatternImage("datepicker-clock-middle-hand.png", middleHandSize.width, middleHandSize.height), + + clockSize = CGSizeMake(122.0, 123.0), + clockImageColor = PatternColor("datepicker-clock.png", clockSize.width, clockSize.height), + + secondHandImageDisabled = PatternImage("datepicker-clock-second-hand-disabled.png", secondHandSize.width, secondHandSize.height), + minuteHandImageDisabled = PatternImage("datepicker-clock-minute-hand-disabled.png", minuteHandSize.width, minuteHandSize.height), + hourHandImageDisabled = PatternImage("datepicker-clock-hour-hand-disabled.png", hourHandSize.width, hourHandSize.height), + middleHandImageDisabled = PatternImage("datepicker-clock-middle-hand-disabled.png", middleHandSize.width, middleHandSize.height), + clockImageColorDisabled = PatternColor("datepicker-clock-disabled.png", clockSize.width, clockSize.height), themeValues = [ @@ -1204,7 +1214,7 @@ var themedButtonValues = nil, [@"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-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], @@ -1286,25 +1296,25 @@ var themedButtonValues = nil, [@"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-image", secondHandImage], + [@"hour-hand-image", hourHandImage], + [@"middle-hand-image", middleHandImage], + [@"minute-hand-image", minuteHandImage], - [@"second-hand-color", secondHandColorDisabled, CPThemeStateDisabled], - [@"hour-hand-color", hourHandColorDisabled, CPThemeStateDisabled], - [@"middle-hand-color", middleHandColorDisabled, CPThemeStateDisabled], - [@"minute-hand-color", minuteHandColorDisabled, CPThemeStateDisabled], + [@"second-hand-image", secondHandImageDisabled, CPThemeStateDisabled], + [@"hour-hand-image", hourHandImageDisabled, CPThemeStateDisabled], + [@"middle-hand-image", middleHandImageDisabled, CPThemeStateDisabled], + [@"minute-hand-image", minuteHandImageDisabled, 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)], + [@"second-hand-size", secondHandSize], + [@"hour-hand-size", hourHandSize], + [@"middle-hand-size", middleHandSize], + [@"minute-hand-size", minuteHandSize], [@"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-clock", clockSize], [@"size-calendar", CGSizeMake(141.0, 109.0)], [@"min-size-calendar", CGSizeMake(141.0, 148.0)], [@"max-size-calendar", CGSizeMake(141.0, 148.0)] @@ -1312,6 +1322,7 @@ var themedButtonValues = nil, ]; [datePicker setDatePickerStyle:CPClockAndCalendarDatePickerStyle]; + [datePicker setBackgroundColor:[CPColor whiteColor]]; [self registerThemeValues:themeValues forView:datePicker]; return datePicker; @@ -2071,15 +2082,32 @@ var themedButtonValues = nil, themedTableViewValues = [ - [@"alternating-row-colors", alternatingRowColors], - [@"grid-color", gridColor], - [@"highlighted-grid-color", [CPColor whiteColor]], - [@"selection-color", selectionColor], - [@"sourcelist-selection-color", sourceListSelectionColor], - [@"sort-image", sortImage], - [@"sort-image-reversed", sortImageReversed], - [@"image-generic-file", imageGenericFile], - [@"default-row-height", 23.0], + [@"alternating-row-colors", alternatingRowColors], + [@"grid-color", gridColor], + [@"highlighted-grid-color", [CPColor whiteColor]], + [@"selection-color", selectionColor], + [@"sourcelist-selection-color", sourceListSelectionColor], + [@"sort-image", sortImage], + [@"sort-image-reversed", sortImageReversed], + [@"image-generic-file", imageGenericFile], + [@"default-row-height", 23.0], + + [@"dropview-on-background-color", [CPColor colorWithRed:72 / 255 green:134 / 255 blue:202 / 255 alpha:0.25]], + [@"dropview-on-border-color", [CPColor colorWithHexString:@"4886ca"]], + [@"dropview-on-border-width", 3.0], + [@"dropview-on-border-radius", 8.0], + + [@"dropview-on-selected-background-color", [CPColor clearColor]], + [@"dropview-on-selected-border-color", [CPColor whiteColor]], + [@"dropview-on-selected-border-width", 2.0], + [@"dropview-on-selected-border-radius", 8.0], + + [@"dropview-above-border-color", [CPColor colorWithHexString:@"4886ca"]], + [@"dropview-above-border-width", 3.0], + + [@"dropview-above-selected-border-color", [CPColor colorWithHexString:@"8BB6F0"]], + [@"dropview-above-selected-border-width", 2.0], + ]; [self registerThemeValues:themedTableViewValues forView:tableview]; @@ -2687,6 +2715,7 @@ var themedButtonValues = nil, [ [@"gradient-height", 31.0], [@"bezel-head-color", bezelHeadColor], + [@"bezel-head-sheet-color", solidColor], [@"solid-color", solidColor], [@"title-font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize]], @@ -2750,7 +2779,7 @@ var themedButtonValues = nil, return docModalWindowView; } -+ (_CPBorderlessBridgeWindowView)themedBordelessBridgeWindowView ++ (_CPBorderlessBridgeWindowView)themedBorderlessBridgeWindowView { var bordelessBridgeWindowView = [[_CPBorderlessBridgeWindowView alloc] initWithFrame:CGRectMake(0,0,0,0)], @@ -2968,6 +2997,10 @@ var themedButtonValues = nil, themeValues = [ + [@"border-radius", 5.0], + [@"stroke-width", 1.0], + [@"shadow-size", CGSizeMake(0, 6)], + [@"shadow-blur", 15.0], [@"background-gradient", gradient], [@"background-gradient-hud", gradientHUD], [@"stroke-color", strokeColor], diff --git a/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd b/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd index ef95c237f..cc5464512 100755 Binary files a/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd and b/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-disabled.png b/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-disabled.png deleted file mode 100644 index d51da99d2..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-mixed-disabled.png b/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-mixed-disabled.png deleted file mode 100644 index 40da36f45..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-mixed-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-selected-disabled.png b/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-selected-disabled.png deleted file mode 100644 index ac6e5b322..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/HUD/check-box-image-selected-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/radio-image-disabled.png b/AppKit/Themes/Aristo2/Resources/HUD/radio-image-disabled.png deleted file mode 100644 index 1ccff2040..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/HUD/radio-image-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/radio-image-selected-disabled.png b/AppKit/Themes/Aristo2/Resources/HUD/radio-image-selected-disabled.png deleted file mode 100644 index ffbfc3b0b..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/HUD/radio-image-selected-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-center.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-center.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-divider.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-divider.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-left.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-left.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-right.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-disabled-right.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-divider.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-divider.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-right.png b/AppKit/Themes/Aristo2/Resources/HUD/segmented-control-bezel-highlighted-disabled-right.png old mode 100644 new mode 100755 diff --git a/AppKit/Themes/Aristo2/Resources/check-box-image-disabled.png b/AppKit/Themes/Aristo2/Resources/check-box-image-disabled.png deleted file mode 100644 index 443e3064d..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/check-box-image-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/check-box-image-mixed-disabled.png b/AppKit/Themes/Aristo2/Resources/check-box-image-mixed-disabled.png deleted file mode 100644 index 11659d82a..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/check-box-image-mixed-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/check-box-image-selected-disabled.png b/AppKit/Themes/Aristo2/Resources/check-box-image-selected-disabled.png deleted file mode 100644 index 3330a2c78..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/check-box-image-selected-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-center.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-center.png index 9bbc8c777..e7e66568d 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-left.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-left.png index 15b77ecc6..073176017 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-right.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-right.png index 2e909ccd2..bd87c2dd4 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-center.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-center.png index d2db37444..39a0bb883 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-center.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-center.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-center.png index 44bafedc2..15d80d800 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-left.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-left.png index 2e4b4cffb..208848182 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-right.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-right.png index b45c2e146..6cd0f0838 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-center.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-center.png index 3bf8be6a2..7e8d49711 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-center.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-left.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-left.png index 75c5ee3d6..e51504da9 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-left.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-right.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-right.png index 5d71c7272..dc17dcd9e 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-right.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-focused-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-left.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-left.png index bdc11d31d..acc3a01f5 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-left.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-right.png b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-right.png index 52987fd2b..0f5244861 100644 Binary files a/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-right.png and b/AppKit/Themes/Aristo2/Resources/combobox-bezel-no-border-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/knob-disabled.png b/AppKit/Themes/Aristo2/Resources/knob-disabled.png index 01b941d0d..3eb33f640 100644 Binary files a/AppKit/Themes/Aristo2/Resources/knob-disabled.png and b/AppKit/Themes/Aristo2/Resources/knob-disabled.png differ diff --git a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-center.png b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-center.png index eb6ef4daf..4a607d75d 100644 Binary files a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-left.png b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-left.png index 2e553b1f5..88cacab0f 100644 Binary files a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right-pullsdown.png b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right-pullsdown.png index 0f31a5952..df1f35ef0 100644 Binary files a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right-pullsdown.png and b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right-pullsdown.png differ diff --git a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right.png b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right.png index efa6a43a6..27794385f 100644 Binary files a/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/popup-bezel-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-center.png b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-center.png index eb6ef4daf..4a607d75d 100644 Binary files a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-left.png b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-left.png index 2e553b1f5..88cacab0f 100644 Binary files a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-right.png b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-right.png index 0f31a5952..df1f35ef0 100644 Binary files a/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/pulldown-bezel-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/radio-image-disabled.png b/AppKit/Themes/Aristo2/Resources/radio-image-disabled.png deleted file mode 100644 index fe5473392..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/radio-image-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/radio-image-selected-disabled.png b/AppKit/Themes/Aristo2/Resources/radio-image-selected-disabled.png deleted file mode 100644 index 78415e21f..000000000 Binary files a/AppKit/Themes/Aristo2/Resources/radio-image-selected-disabled.png and /dev/null differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-center.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-center.png index eb6ef4daf..6e4b8a5f1 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-divider.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-divider.png index 1080d4625..19cc838d9 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-divider.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-divider.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-left.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-left.png index 2e553b1f5..3e3e03542 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-right.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-right.png index 117cdd795..c38f59612 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-center.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-center.png index 746f31e3f..b33124ce1 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-center.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-divider.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-divider.png index 8658466dd..1c4c96884 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-divider.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-divider.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-left.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-left.png index 7bacd5c5e..73eea5f9a 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-left.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-right.png b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-right.png index 774e00456..23a985827 100644 Binary files a/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-right.png and b/AppKit/Themes/Aristo2/Resources/segmented-control-bezel-highlighted-disabled-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-center.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-center.png old mode 100644 new mode 100755 index 085b7ecca..4c572c117 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-center.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-left.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-left.png index efe97c37e..599ebe533 100644 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-left.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-right.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-right.png index d61be3b3d..7d8ea3d73 100644 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-right.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-down-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-center.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-center.png old mode 100644 new mode 100755 index 8fcc7b105..423c1f6d6 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-center.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-left.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-left.png index f948d846c..bc4d486b6 100644 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-left.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-right.png b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-right.png index 3e09a3852..5988597b4 100644 Binary files a/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-right.png and b/AppKit/Themes/Aristo2/Resources/stepper-bezel-big-disabled-up-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-center.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-center.png new file mode 100644 index 000000000..1a86f0428 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-left.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-left.png new file mode 100644 index 000000000..93aad32e6 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-right.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-right.png new file mode 100644 index 000000000..201e8fd64 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-bottom-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-center.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-center.png new file mode 100644 index 000000000..1a86f0428 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-left.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-left.png new file mode 100644 index 000000000..93aad32e6 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-right.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-right.png new file mode 100644 index 000000000..201e8fd64 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-center-right.png differ diff --git a/AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-center.png similarity index 64% rename from AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png rename to AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-center.png index 2fda06e9b..408bbde49 100644 Binary files a/AppKit/Themes/Aristo2/Resources/Aristo-11-06-07_501.png and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-center.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-left.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-left.png new file mode 100644 index 000000000..87ccfb2a6 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-left.png differ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-right.png b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-right.png new file mode 100644 index 000000000..a772da252 Binary files /dev/null and b/AppKit/Themes/Aristo2/Resources/window-standard-head-sheet-solid-top-right.png differ diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index 37a9bfae4..4b4bbf13b 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -63,7 +63,18 @@ var themedButtonValues = nil, themedProgressIndicator = nil, themedIndeterminateProgressIndicator = nil, themedCheckBoxValues = nil, - themedRadioButtonValues = nil; + themedRadioButtonValues = nil, + regularTextColor = [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], + regularTextShadowColor = [CPColor colorWithCalibratedWhite:1.0 alpha:0.2], + regularDisabledTextColor = [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:0.6], + regularDisabledTextShadowColor = [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:0.6], + + defaultTextColor = [CPColor whiteColor], + defaultTextShadowColor = [CPColor colorWithCalibratedWhite:0.0 alpha:0.3], + defaultDisabledTextColor = regularDisabledTextColor, + defaultDisabledTextShadowColor = regularDisabledTextShadowColor, + + placeholderColor = regularDisabledTextColor; @implementation Aristo2ThemeDescriptor : BKThemeDescriptor @@ -79,7 +90,7 @@ var themedButtonValues = nil, "themedMenuItemStandardView", "themedMenuItemMenuBarView", "themedToolbarView", - "themedBordelessBridgeWindowView", + "themedBorderlessBridgeWindowView", "themedWindowView", "themedBrowser", "themedRuleEditor", @@ -117,20 +128,27 @@ var themedButtonValues = nil, width: 12.0, height: 24.0, orientation: PatternIsHorizontal - }), - - defaultTextColor = [CPColor colorWithCalibratedRed:38.0 / 255.0 green:38.0 / 255.0 blue:38.0 / 255.0 alpha:1.0], - defaultDisabledTextColor = [CPColor colorWithCalibratedRed:38.0 / 255.0 green:38.0 / 255.0 blue:38.0 / 255.0 alpha:0.2]; + }); // Global themedButtonValues = [ [@"font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateBordered], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:1.0 alpha:0.3], CPThemeStateBordered], - [@"text-color", [CPColor whiteColor], CPThemeStateBordered | CPThemeStateDefault], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.2], CPThemeStateBordered | CPThemeStateDefault], - [@"text-shadow-offset", CGSizeMake(0.0, 1.0), CPThemeStateBordered], + [@"text-color", regularTextColor], + [@"text-shadow-color", regularTextShadowColor], + [@"text-shadow-color", regularTextShadowColor, CPThemeStateBordered], + [@"text-color", regularDisabledTextColor, CPThemeStateDisabled], + + [@"text-color", defaultTextColor, CPThemeStateBordered | CPThemeStateDefault], + [@"text-color", defaultTextColor, CPThemeStateDefault], + [@"text-shadow-color", defaultTextShadowColor, CPThemeStateBordered | CPThemeStateDefault], + + [@"text-color", defaultDisabledTextColor, CPThemeStateDefault | CPThemeStateDisabled], + [@"text-shadow-color", defaultDisabledTextShadowColor, CPThemeStateDefault | CPThemeStateDisabled], + + [@"text-shadow-offset", CGSizeMake(0.0, 0.0), CPThemeStateDefault | CPThemeStateDisabled], + [@"text-shadow-offset", CGSizeMake(0.0, 1.0), CPThemeStateBordered], + [@"line-break-mode", CPLineBreakByTruncatingTail], [@"bezel-color", bezelColor["@"]["@"], @@ -171,13 +189,7 @@ var themedButtonValues = nil, roundedBezelColor["default"]["disabled"], CPThemeStateBordered | CPThemeStateDefault | CPThemeStateDisabled | CPButtonStateBezelStyleRounded], - [@"content-inset", CGInsetMake(0.0, 10.0, 0.0, 10.0), CPThemeStateBordered | CPButtonStateBezelStyleRounded], - - [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateDisabled], - - [@"text-color", defaultTextColor, CPThemeStateDefault], - [@"text-color", defaultDisabledTextColor, CPThemeStateDefault | CPThemeStateDisabled], - + [@"content-inset", CGInsetMake(0.0, 10.0, 0.0, 10.0), CPThemeStateBordered | CPButtonStateBezelStyleRounded], [@"min-size", CGSizeMake(0.0, CPButtonDefaultHeight)], [@"max-size", CGSizeMake(-1.0, CPButtonDefaultHeight)], @@ -248,11 +260,11 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(0, 21.0 + 5.0, 0, 5.0), CPThemeStateBordered], [@"font", [CPFont boldSystemFontOfSize:12.0]], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], + [@"text-color", regularTextColor], + [@"text-shadow-color", regularTextShadowColor], - [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateBordered | CPThemeStateDisabled], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:0.6], CPThemeStateBordered | CPThemeStateDisabled], + [@"text-color", regularDisabledTextColor, CPThemeStateBordered | CPThemeStateDisabled], + [@"text-shadow-color", regularDisabledTextShadowColor, CPThemeStateBordered | CPThemeStateDisabled], [@"min-size", CGSizeMake(32.0, 25.0)], [@"max-size", CGSizeMake(-1.0, 25.0)] @@ -286,11 +298,11 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(0, 27.0 + 5.0, 0, 5.0), CPThemeStateBordered], [@"font", [CPFont boldSystemFontOfSize:12.0]], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], + [@"text-color", regularTextColor], + [@"text-shadow-color", regularTextShadowColor], - [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateBordered | CPThemeStateDisabled], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:0.6], CPThemeStateBordered | CPThemeStateDisabled], + [@"text-color", regularDisabledTextColor, CPThemeStateBordered | CPThemeStateDisabled], + [@"text-shadow-color", regularDisabledTextShadowColor, CPThemeStateBordered | CPThemeStateDisabled], [@"min-size", CGSizeMake(32.0, 25.0)], [@"max-size", CGSizeMake(-1.0, 25.0)] @@ -522,9 +534,7 @@ var themedButtonValues = nil, positions: "#", width: 9.0, height: 9.0 - }), - - placeholderColor = [CPColor colorWithCalibratedRed:189.0 / 255.0 green:199.0 / 255.0 blue:211.0 / 255.0 alpha:1.0]; + }); // Global for reuse by CPTokenField. themedTextFieldValues = @@ -534,6 +544,8 @@ var themedButtonValues = nil, [@"bezel-color", bezelFocusedColor, CPThemeStateBezeled | CPThemeStateEditing], [@"bezel-color", bezelColor["disabled"], CPThemeStateBezeled | CPThemeStateDisabled], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], CPThemeStateBezeled], + [@"text-color", regularDisabledTextColor, CPThemeStateBezeled | CPThemeStateDisabled], + [@"text-shadow-color", regularDisabledTextShadowColor, CPThemeStateBezeled | CPThemeStateDisabled], [@"content-inset", CGInsetMake(8.0, 7.0, 5.0, 10.0), CPThemeStateBezeled], [@"content-inset", CGInsetMake(8.0, 7.0, 5.0, 10.0), CPThemeStateBezeled | CPThemeStateEditing], @@ -558,7 +570,7 @@ var themedButtonValues = nil, [@"text-color", [CPColor colorWithCalibratedWhite:125.0 / 255.0 alpha:1.0], CPThemeStateTableDataView | CPThemeStateGroupRow], [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:1.0], CPThemeStateTableDataView | CPThemeStateGroupRow | CPThemeStateSelectedDataView], [@"text-shadow-color", [CPColor whiteColor], CPThemeStateTableDataView | CPThemeStateGroupRow], - [@"text-shadow-offset", CGSizeMake(0, 1), CPThemeStateTableDataView | CPThemeStateGroupRow], + [@"text-shadow-offset", CGSizeMake(0, 1), CPThemeStateTableDataView | CPThemeStateGroupRow], [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], CPThemeStateTableDataView | CPThemeStateGroupRow | CPThemeStateSelectedDataView], [@"font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize], CPThemeStateTableDataView | CPThemeStateGroupRow] ]; @@ -592,9 +604,7 @@ var themedButtonValues = nil, width: 13.0, height: 29.0, orientation: PatternIsHorizontal - }), - - placeholderColor = [CPColor colorWithCalibratedRed:189.0 / 255.0 green:199.0 / 255.0 blue:211.0 / 255.0 alpha:1.0]; + }); // Global for reuse by CPSearchField themedRoundedTextFieldValues = @@ -613,7 +623,9 @@ var themedButtonValues = nil, [@"bezel-inset", CGInsetMake(3.0, 4.0, 3.0, 4.0), CPTextFieldStateRounded | CPThemeStateBezeled], [@"bezel-inset", CGInsetMake(0.0, 1.0, 0.0, 1.0), CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateEditing], - [@"text-color", placeholderColor, CPTextFieldStateRounded | CPTextFieldStatePlaceholder], + [@"text-color", placeholderColor, CPTextFieldStateRounded | CPTextFieldStatePlaceholder], + [@"text-color", regularDisabledTextColor, CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateDisabled], + [@"text-shadow-color", regularDisabledTextShadowColor, CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateDisabled], [@"min-size", CGSizeMake(0.0, 29.0), CPTextFieldStateRounded | CPThemeStateBezeled], [@"max-size", CGSizeMake(-1.0, 29.0), CPTextFieldStateRounded | CPThemeStateBezeled] @@ -655,7 +667,7 @@ var themedButtonValues = nil, + (CPDatePicker)themedDatePicker { - var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40.0 ,40.0 ,170.0 ,29.0)], bezelColor = PatternColor( "textfield-bezel-square{state}{position}.png", @@ -707,6 +719,7 @@ var themedButtonValues = nil, [@"max-size", CGSizeMake(-1.0, 29.0)] ]; + [datePicker setDatePickerStyle:CPTextFieldDatePickerStyle]; [self registerThemeValues:themeValues forView:datePicker]; return datePicker; @@ -714,7 +727,7 @@ var themedButtonValues = nil, + (CPDatePicker)themedDatePickerCalendar { - var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40,140,300,29)], + var datePicker = [[CPDatePicker alloc] initWithFrame:CGRectMake(40.0, 140.0, 276.0 ,148.0)], arrowImageLeft = PatternImage("datepicker-calendar-arrow-left.png", 7.0, 10.0), arrowImageRight = PatternImage("datepicker-calendar-arrow-right.png", 7.0, 10.0), @@ -724,17 +737,26 @@ var themedButtonValues = nil, 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), + secondHandSize = CGSizeMake(89.0, 89.0), + secondHandImage = PatternImage("datepicker-clock-second-hand.png", secondHandSize.width, secondHandSize.height), - 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), + minuteHandSize = CGSizeMake(85.0, 85.0), + minuteHandImage = PatternImage("datepicker-clock-minute-hand.png", minuteHandSize.width, minuteHandSize.height), + + hourHandSize = CGSizeMake(47.0, 47.0), + hourHandImage = PatternImage("datepicker-clock-hour-hand.png", hourHandSize.width, hourHandSize.height), + + middleHandSize = CGSizeMake(13.0, 13.0), + middleHandImage = PatternImage("datepicker-clock-middle-hand.png", middleHandSize.width, middleHandSize.height), + + clockSize = CGSizeMake(122.0, 123.0), + clockImageColor = PatternColor("datepicker-clock.png", clockSize.width, clockSize.height), + + secondHandImageDisabled = PatternImage("datepicker-clock-second-hand-disabled.png", secondHandSize.width, secondHandSize.height), + minuteHandImageDisabled = PatternImage("datepicker-clock-minute-hand-disabled.png", minuteHandSize.width, minuteHandSize.height), + hourHandImageDisabled = PatternImage("datepicker-clock-hour-hand-disabled.png", hourHandSize.width, hourHandSize.height), + middleHandImageDisabled = PatternImage("datepicker-clock-middle-hand-disabled.png", middleHandSize.width, middleHandSize.height), + clockImageColorDisabled = PatternColor("datepicker-clock-disabled.png", clockSize.width, clockSize.height), themeValues = [ @@ -745,7 +767,7 @@ var themedButtonValues = nil, [@"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-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], @@ -827,31 +849,32 @@ var themedButtonValues = nil, [@"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-image", secondHandImage], + [@"hour-hand-image", hourHandImage], + [@"middle-hand-image", middleHandImage], + [@"minute-hand-image", minuteHandImage], - [@"second-hand-color", secondHandColorDisabled, CPThemeStateDisabled], - [@"hour-hand-color", hourHandColorDisabled, CPThemeStateDisabled], - [@"middle-hand-color", middleHandColorDisabled, CPThemeStateDisabled], - [@"minute-hand-color", minuteHandColorDisabled, CPThemeStateDisabled], + [@"second-hand-image", secondHandImageDisabled, CPThemeStateDisabled], + [@"hour-hand-image", hourHandImageDisabled, CPThemeStateDisabled], + [@"middle-hand-image", middleHandImageDisabled, CPThemeStateDisabled], + [@"minute-hand-image", minuteHandImageDisabled, 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)], + [@"second-hand-size", secondHandSize], + [@"hour-hand-size", hourHandSize], + [@"middle-hand-size", middleHandSize], + [@"minute-hand-size", minuteHandSize], [@"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-clock", clockSize], [@"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]; + [datePicker setBackgroundColor:[CPColor whiteColor]]; [self registerThemeValues:themeValues forView:datePicker]; return datePicker; @@ -1008,10 +1031,19 @@ var themedButtonValues = nil, bezelNoBorderColor = PatternColor( "combobox-bezel-no-border{state}{position}.png", { - states: ["", "focused", "disabled"], - width: 6.0, - height: 29.0, - rightWidth: 24.0, + states: ["", "disabled"], + width: 4.0, + height: 25.0, + rightWidth: 25.0, + orientation: PatternIsHorizontal + }), + + bezelNoBorderFocusedColor = PatternColor( + "combobox-bezel-no-border-focused{position}.png", + { + width: 9.0, + height: 31.0, + rightWidth: 27.0, orientation: PatternIsHorizontal }), @@ -1022,16 +1054,20 @@ var themedButtonValues = nil, [@"bezel-color", bezelColor["disabled"], CPThemeStateBezeled | CPComboBoxStateButtonBordered | CPThemeStateDisabled], [@"bezel-color", bezelNoBorderColor["@"], CPThemeStateBezeled], - [@"bezel-color", bezelNoBorderColor["focused"], CPThemeStateBezeled | CPThemeStateEditing], + [@"bezel-color", bezelNoBorderFocusedColor, CPThemeStateBezeled | CPThemeStateEditing], [@"bezel-color", bezelNoBorderColor["disabled"], CPThemeStateBezeled | CPThemeStateDisabled], [@"border-inset", CGInsetMake(3.0, 3.0, 3.0, 3.0), CPThemeStateBezeled], - [@"bezel-inset", CGInsetMake(0.0, 1.0, 0.0, 1.0), CPThemeStateBezeled | CPThemeStateEditing], + [@"bezel-inset", CGInsetMake(0.0, 1.0, 0.0, 1.0), CPThemeStateBezeled | CPThemeStateEditing | CPComboBoxStateButtonBordered], + [@"bezel-inset", CGInsetMake(3.0, 4.0, 3.0, 4.0), CPThemeStateBezeled | CPThemeStateDisabled | CPComboBoxStateButtonBordered], + + [@"bezel-inset", CGInsetMake(0.0, 4.0, 0.0, 1.0), CPThemeStateBezeled | CPThemeStateEditing], + [@"bezel-inset", CGInsetMake(3.0, 5.0, 3.0, 4.0), CPThemeStateBezeled | CPThemeStateDisabled], // The right border inset has to make room for the focus ring and popup button [@"content-inset", CGInsetMake(9.0, 26.0, 7.0, 10.0), CPThemeStateBezeled | CPComboBoxStateButtonBordered], - [@"content-inset", CGInsetMake(9.0, 24.0, 7.0, 10.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(9.0, 26.0, 7.0, 10.0), CPThemeStateBezeled], [@"content-inset", CGInsetMake(9.0, 24.0, 7.0, 10.0), CPThemeStateBezeled | CPThemeStateEditing], [@"popup-button-size", CGSizeMake(21.0, 23.0), CPThemeStateBezeled | CPComboBoxStateButtonBordered], @@ -1039,7 +1075,10 @@ var themedButtonValues = nil, // Because combo box uses a three-part bezel, the height is fixed [@"min-size", CGSizeMake(0, 31.0)], - [@"max-size", CGSizeMake(-1, 31.0)] + [@"max-size", CGSizeMake(-1, 31.0)], + + [@"text-color", regularDisabledTextColor, CPThemeStateBordered | CPThemeStateDisabled], + [@"text-shadow-color", regularDisabledTextShadowColor, CPThemeStateBordered | CPThemeStateDisabled], ]; [self registerThemeValues:overrides forView:combo inherit:themedTextFieldValues]; @@ -1053,8 +1092,8 @@ var themedButtonValues = nil, imageNormal = PatternImage("radio-image.png", 21.0, 21.0), imageSelected = PatternImage("radio-image-selected.png", 21.0, 21.0), imageSelectedHighlighted = PatternImage("radio-image-selected-highlighted.png", 21.0, 21.0), - imageSelectedDisabled = PatternImage("radio-image-selected-disabled.png", 21.0, 21.0), - imageDisabled = PatternImage("radio-image-disabled.png", 21.0, 21.0), + imageSelectedDisabled = PatternImage("radio-image-selected.png", 21.0, 21.0), + imageDisabled = PatternImage("radio-image.png", 21.0, 21.0), imageHighlighted = PatternImage("radio-image-highlighted.png", 21.0, 21.0); // Global @@ -1072,7 +1111,7 @@ var themedButtonValues = nil, [@"image", imageSelectedDisabled, CPThemeStateSelected | CPThemeStateDisabled], [@"image-offset", CPRadioImageOffset], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"text-color", regularDisabledTextColor, CPThemeStateDisabled], [@"min-size", CGSizeMake(21.0, 21.0)], [@"max-size", CGSizeMake(-1.0, -1.0)] @@ -1089,8 +1128,8 @@ var themedButtonValues = nil, imageNormal = PatternImage("check-box-image.png", 21.0, 21.0), imageSelected = PatternImage("check-box-image-selected.png", 21.0, 21.0), imageSelectedHighlighted = PatternImage("check-box-image-selected-highlighted.png", 21.0, 21.0), - imageSelectedDisabled = PatternImage("check-box-image-selected-disabled.png", 21.0, 21.0), - imageDisabled = PatternImage("check-box-image-disabled.png", 21.0, 21.0), + imageSelectedDisabled = PatternImage("check-box-image-selected.png", 21.0, 21.0), + imageDisabled = PatternImage("check-box-image.png", 21.0, 21.0), imageHighlighted = PatternImage("check-box-image-highlighted.png", 21.0, 21.0); // Global @@ -1108,7 +1147,7 @@ var themedButtonValues = nil, [@"image-offset", CPCheckBoxImageOffset], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], CPThemeStateNormal], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled], + [@"text-color", regularDisabledTextColor, CPThemeStateDisabled], [@"min-size", CGSizeMake(21.0, 21.0)], [@"max-size", CGSizeMake(-1.0, -1.0)] @@ -1129,7 +1168,7 @@ var themedButtonValues = nil, [button setState:CPMixedState]; var mixedHighlightedImage = PatternImage("check-box-image-mixed-highlighted.png", 21.0, 21.0), - mixedDisabledImage = PatternImage("check-box-image-mixed-disabled.png", 21.0, 21.0), + mixedDisabledImage = PatternImage("check-box-image-mixed.png", 21.0, 21.0), mixedImage = PatternImage("check-box-image-mixed.png", 21.0, 21.0), themeValues = @@ -1227,16 +1266,20 @@ var themedButtonValues = nil, [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal], [@"font", [CPFont boldSystemFontOfSize:12.0]], - [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]], - [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateDisabled], - [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:0.5], CPThemeStateDisabled | CPThemeStateSelected], - [@"text-color", [CPColor whiteColor], CPThemeStateSelected], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled], - [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled | CPThemeStateSelected], + [@"text-color", regularTextColor], + [@"text-color", regularDisabledTextColor, CPThemeStateDisabled], + + // The "default" button state is the same theme color as the "selected" segmented control state, so we can use + // the same text theme values. + [@"text-color", defaultTextColor, CPThemeStateSelected], + [@"text-color", defaultDisabledTextColor, CPThemeStateDisabled | CPThemeStateSelected], + [@"text-shadow-color", regularTextShadowColor], + [@"text-shadow-color", regularDisabledTextShadowColor, CPThemeStateDisabled], + [@"text-shadow-color", defaultDisabledTextShadowColor, CPThemeStateDisabled | CPThemeStateSelected], [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.2], CPThemeStateSelected], [@"text-shadow-offset", CGSizeMake(0.0, 1.0)], [@"text-shadow-offset", CGSizeMake(0.0, 1.0), CPThemeStateSelected], + [@"text-shadow-offset", CGSizeMake(0.0, 0.0), CPThemeStateSelected | CPThemeStateDisabled], [@"line-break-mode", CPLineBreakByTruncatingTail], [@"divider-thickness", 1.0], @@ -1514,15 +1557,31 @@ var themedButtonValues = nil, themedTableViewValues = [ - [@"alternating-row-colors", alternatingRowColors], - [@"grid-color", gridColor], - [@"highlighted-grid-color", [CPColor whiteColor]], - [@"selection-color", selectionColor], - [@"sourcelist-selection-color", sourceListSelectionColor], - [@"sort-image", sortImage], - [@"sort-image-reversed", sortImageReversed], - [@"image-generic-file", imageGenericFile], - [@"default-row-height", 25.0] + [@"alternating-row-colors", alternatingRowColors], + [@"grid-color", gridColor], + [@"highlighted-grid-color", [CPColor whiteColor]], + [@"selection-color", selectionColor], + [@"sourcelist-selection-color", sourceListSelectionColor], + [@"sort-image", sortImage], + [@"sort-image-reversed", sortImageReversed], + [@"image-generic-file", imageGenericFile], + [@"default-row-height", 25.0], + + [@"dropview-on-background-color", [CPColor colorWithRed:72 / 255 green:134 / 255 blue:202 / 255 alpha:0.25]], + [@"dropview-on-border-color", [CPColor colorWithHexString:@"4886ca"]], + [@"dropview-on-border-width", 3.0], + [@"dropview-on-border-radius", 8.0], + + [@"dropview-on-selected-background-color", [CPColor clearColor]], + [@"dropview-on-selected-border-color", [CPColor whiteColor]], + [@"dropview-on-selected-border-width", 2.0], + [@"dropview-on-selected-border-radius", 8.0], + + [@"dropview-above-border-color", [CPColor colorWithHexString:@"4886ca"]], + [@"dropview-above-border-width", 3.0], + + [@"dropview-above-selected-border-color", [CPColor colorWithHexString:@"8BB6F0"]], + [@"dropview-above-selected-border-width", 2.0], ]; [tableview setUsesAlternatingRowBackgroundColors:YES]; @@ -2070,6 +2129,14 @@ var themedButtonValues = nil, height: 1.0 }), + bezelSheetHeadColor = PatternColor( + "window-standard-head-sheet-solid{position}.png", + { + positions: "full", + width: 5.0, + height: 1.0 + }), + bezelColor = PatternColor( "window-standard{position}.png", { @@ -2104,6 +2171,7 @@ var themedButtonValues = nil, [@"bezel-head-color", bezelHeadColor["inactive"], CPThemeStateNormal], [@"bezel-head-color", bezelHeadColor["@"], CPThemeStateKeyWindow], [@"bezel-head-color", bezelHeadColor["@"], CPThemeStateMainWindow], + [@"bezel-head-sheet-color", bezelSheetHeadColor], [@"solid-color", solidColor], [@"title-font", [CPFont boldSystemFontOfSize:CPFontCurrentSystemSize]], @@ -2165,7 +2233,7 @@ var themedButtonValues = nil, return docModalWindowView; } -+ (_CPBorderlessBridgeWindowView)themedBordelessBridgeWindowView ++ (_CPBorderlessBridgeWindowView)themedBorderlessBridgeWindowView { var bordelessBridgeWindowView = [[_CPBorderlessBridgeWindowView alloc] initWithFrame:CGRectMake(0,0,0,0)], @@ -2334,7 +2402,7 @@ var themedButtonValues = nil, [@"menu-bar-title-color", [CPColor colorWithRed:0.051 green:0.2 blue:0.275 alpha:1.0]], [@"menu-bar-text-shadow-color", [CPColor whiteColor]], [@"menu-bar-title-shadow-color", [CPColor whiteColor]], - [@"menu-bar-highlight-color", [CPColor colorWithCalibratedRed:94.0 / 255.0 green:130.0 / 255.0 blue:186.0 / 255.0 alpha:1.0]], + [@"menu-bar-highlight-color", menuBarWindowBackgroundSelectedColor], [@"menu-bar-highlight-text-color", [CPColor whiteColor]], [@"menu-bar-highlight-text-shadow-color", [CPColor blackColor]], [@"menu-bar-height", 30.0], @@ -2385,6 +2453,10 @@ var themedButtonValues = nil, themeValues = [ + [@"border-radius", 5.0], + [@"stroke-width", 1.0], + [@"shadow-size", CGSizeMake(0, 6)], + [@"shadow-blur", 15.0], [@"background-gradient", gradient], [@"background-gradient-hud", gradientHUD], [@"stroke-color", strokeColor], @@ -2544,11 +2616,11 @@ var themedButtonValues = nil, var imageNormal = PatternImage("HUD/check-box-image.png", 21.0, 21.0), imageSelected = PatternImage("HUD/check-box-image-selected.png", 21.0, 21.0), imageSelectedHighlighted = PatternImage("HUD/check-box-image-selected-highlighted.png", 21.0, 21.0), - imageSelectedDisabled = PatternImage("HUD/check-box-image-selected-disabled.png", 21.0, 21.0), - imageDisabled = PatternImage("HUD/check-box-image-disabled.png", 21.0, 21.0), + imageSelectedDisabled = PatternImage("HUD/check-box-image-selected.png", 21.0, 21.0), + imageDisabled = PatternImage("HUD/check-box-image.png", 21.0, 21.0), imageHighlighted = PatternImage("HUD/check-box-image-highlighted.png", 21.0, 21.0), mixedHighlightedImage = PatternImage("HUD/check-box-image-mixed-highlighted.png", 21.0, 21.0), - mixedDisabledImage = PatternImage("HUD/check-box-image-mixed-disabled.png", 21.0, 21.0), + mixedDisabledImage = PatternImage("HUD/check-box-image-mixed.png", 21.0, 21.0), mixedImage = PatternImage("HUD/check-box-image-mixed.png", 21.0, 21.0), hudSpecific = @@ -2587,8 +2659,8 @@ var themedButtonValues = nil, imageNormal = PatternImage("HUD/radio-image.png", 21.0, 21.0), imageSelected = PatternImage("HUD/radio-image-selected.png", 21.0, 21.0), imageSelectedHighlighted = PatternImage("HUD/radio-image-selected-highlighted.png", 21.0, 21.0), - imageSelectedDisabled = PatternImage("HUD/radio-image-selected-disabled.png", 21.0, 21.0), - imageDisabled = PatternImage("HUD/radio-image-disabled.png", 21.0, 21.0), + imageSelectedDisabled = PatternImage("HUD/radio-image-selected.png", 21.0, 21.0), + imageDisabled = PatternImage("HUD/radio-image.png", 21.0, 21.0), imageHighlighted = PatternImage("HUD/radio-image-highlighted.png", 21.0, 21.0), hudSpecific = diff --git a/AppKit/Themes/BlendKit/BKShowcaseController.j b/AppKit/Themes/BlendKit/BKShowcaseController.j index 3c54cfae1..99e0d0b05 100644 --- a/AppKit/Themes/BlendKit/BKShowcaseController.j +++ b/AppKit/Themes/BlendKit/BKShowcaseController.j @@ -421,6 +421,9 @@ var ShowcaseCellBackgroundColor = nil, - (void)setRepresentedObject:(id)anObject { + if (!anObject) + return; + if (!_label) { _label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; diff --git a/AppKit/_CPAutocompleteMenu.j b/AppKit/_CPAutocompleteMenu.j index 04ee865e3..5dc6121f9 100644 --- a/AppKit/_CPAutocompleteMenu.j +++ b/AppKit/_CPAutocompleteMenu.j @@ -135,6 +135,16 @@ var _CPAutocompleteMenuMaximumHeight = 307; - (void)layoutSubviews { + /* + If the textField has no window, then we simply stop to layout the + subviews and close the _menuWindow. + */ + if (![textField window]) + { + [_menuWindow orderOut:self]; + return; + } + // TODO /* The autocompletion menu should be underneath the word/text being @@ -202,6 +212,8 @@ var _CPAutocompleteMenuMaximumHeight = 307; [self setIndexOfSelectedItem:indexOfSelectedItem]; [textField setThemeState:CPThemeStateAutocompleting]; + + [_menuWindow setPlatformWindow:[[textField window] platformWindow]]; [[textField window] addChildWindow:_menuWindow ordered:CPWindowAbove]; [self layoutSubviews]; @@ -256,7 +268,7 @@ var _CPAutocompleteMenuMaximumHeight = 307; return [contentArray count]; } -- (void)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row +- (void)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { return [contentArray objectAtIndex:row]; } @@ -270,7 +282,7 @@ var _CPAutocompleteMenuMaximumHeight = 307; @implementation _CPAutocompleteWindow : CPPanel -- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned int)aStyleMask +- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned)aStyleMask { if (self = [super initWithContentRect:aContentRect styleMask:aStyleMask]) _constrainsToUsableScreen = NO; diff --git a/AppKit/_CPCornerView.j b/AppKit/_CPCornerView.j index 02371b3c5..8f777f1bb 100644 --- a/AppKit/_CPCornerView.j +++ b/AppKit/_CPCornerView.j @@ -31,7 +31,7 @@ return @"cornerview"; } -+ (id)themeAttributes ++ (CPDictionary)themeAttributes { return @{ @"background-color": [CPNull null], diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index f42dfadca..63b9d60b6 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -40,7 +40,8 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, _CPImageAndTextViewFontChangedFlag = 1 << 7, _CPImageAndTextViewTextShadowColorChangedFlag = 1 << 8, _CPImageAndTextViewImagePositionChangedFlag = 1 << 9, - _CPImageAndTextViewImageScalingChangedFlag = 1 << 10; + _CPImageAndTextViewImageScalingChangedFlag = 1 << 10, + _CPImageAndTextViewTextUnderlineChangedFlag = 1 << 11; /* @ignore */ @implementation _CPImageAndTextView : CPView @@ -51,6 +52,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, CPLineBreakMode _lineBreakMode; CPColor _textColor; CPFont _font; + BOOL _textUnderline; CPColor _textShadowColor; CGSize _textShadowOffset; @@ -126,16 +128,25 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, #if PLATFORM(DOM) switch (_alignment) { - case CPLeftTextAlignment: _DOMElement.style.textAlign = "left"; - break; - case CPRightTextAlignment: _DOMElement.style.textAlign = "right"; - break; - case CPCenterTextAlignment: _DOMElement.style.textAlign = "center"; - break; - case CPJustifiedTextAlignment: _DOMElement.style.textAlign = "justify"; - break; - case CPNaturalTextAlignment: _DOMElement.style.textAlign = ""; - break; + case CPLeftTextAlignment: + _DOMElement.style.textAlign = "left"; + break; + + case CPRightTextAlignment: + _DOMElement.style.textAlign = "right"; + break; + + case CPCenterTextAlignment: + _DOMElement.style.textAlign = "center"; + break; + + case CPJustifiedTextAlignment: + _DOMElement.style.textAlign = "justify"; + break; + + case CPNaturalTextAlignment: + _DOMElement.style.textAlign = ""; + break; } #endif } @@ -209,7 +220,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, [self setNeedsLayout]; } -- (void)imageScaling +- (CPUInteger)imageScaling { return _imageScaling; } @@ -290,6 +301,22 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, return _textShadowOffset; } +- (void)setTextUnderline:(BOOL)aFlag +{ + if (_textUnderline === aFlag) + return; + + _textUnderline = aFlag; + _flags |= _CPImageAndTextViewTextUnderlineChangedFlag; + + [self setNeedsLayout]; +} + +- (BOOL)textUnderline +{ + return _textUnderline; +} + - (CGRect)textFrame { [self layoutIfNeeded]; @@ -384,30 +411,24 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, if (hasDOMTextElement) { _DOMElement.removeChild(_DOMTextElement); - _DOMTextElement = nil; - hasDOMTextElement = NO; } - else { _DOMTextElement = document.createElement("div"); var textStyle = _DOMTextElement.style; - textStyle.position = "absolute"; textStyle.whiteSpace = "pre"; - textStyle.zIndex = 200; textStyle.overflow = "hidden"; _DOMElement.appendChild(_DOMTextElement); - hasDOMTextElement = YES; // We have to set all these values now. - _flags |= _CPImageAndTextViewTextChangedFlag | _CPImageAndTextViewFontChangedFlag | _CPImageAndTextViewLineBreakModeChangedFlag; + _flags |= _CPImageAndTextViewTextChangedFlag | _CPImageAndTextViewFontChangedFlag | _CPImageAndTextViewLineBreakModeChangedFlag | _CPImageAndTextViewTextUnderlineChangedFlag; } } @@ -500,46 +521,49 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, } } + if (_flags & _CPImageAndTextViewTextUnderlineChangedFlag) + { + textStyle.textDecoration = _textUnderline ? "underline" : ""; + } + // Update the line break mode if necessary. if (_flags & _CPImageAndTextViewLineBreakModeChangedFlag) { switch (_lineBreakMode) { - case CPLineBreakByClipping: textStyle.overflow = "hidden"; - textStyle.textOverflow = "clip"; - textStyle.whiteSpace = "pre"; - textStyle.wordWrap = "normal"; - - break; + case CPLineBreakByClipping: + textStyle.overflow = "hidden"; + textStyle.textOverflow = "clip"; + textStyle.whiteSpace = "pre"; + textStyle.wordWrap = "normal"; + break; case CPLineBreakByTruncatingHead: case CPLineBreakByTruncatingMiddle: // Don't have support for these (yet?), so just degrade to truncating tail. - - case CPLineBreakByTruncatingTail: textStyle.textOverflow = "ellipsis"; - textStyle.whiteSpace = "nowrap"; - textStyle.overflow = "hidden"; - textStyle.wordWrap = "normal"; - - break; + case CPLineBreakByTruncatingTail: + textStyle.textOverflow = "ellipsis"; + textStyle.whiteSpace = "pre"; + textStyle.overflow = "hidden"; + textStyle.wordWrap = "normal"; + break; case CPLineBreakByCharWrapping: - case CPLineBreakByWordWrapping: textStyle.wordWrap = "break-word"; - try { - textStyle.whiteSpace = "pre"; - textStyle.whiteSpace = "-o-pre-wrap"; - textStyle.whiteSpace = "-pre-wrap"; - textStyle.whiteSpace = "-moz-pre-wrap"; - textStyle.whiteSpace = "pre-wrap"; - } - catch (e) { - //internet explorer doesn't like these properties - textStyle.whiteSpace = "pre"; - } - - textStyle.overflow = "hidden"; - textStyle.textOverflow = "clip"; - - break; + case CPLineBreakByWordWrapping: + textStyle.wordWrap = "break-word"; + try { + textStyle.whiteSpace = "pre"; + textStyle.whiteSpace = "-o-pre-wrap"; + textStyle.whiteSpace = "-pre-wrap"; + textStyle.whiteSpace = "-moz-pre-wrap"; + textStyle.whiteSpace = "pre-wrap"; + } + catch (e) { + //internet explorer doesn't like these properties + textStyle.whiteSpace = "pre"; + } + textStyle.overflow = "hidden"; + textStyle.textOverflow = "clip"; + break; } if (shadowStyle) @@ -630,9 +654,9 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, } if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature)) - imageStyle.filter = @"alpha(opacity=" + _shouldDimImage ? 35 : 100 + ")"; + imageStyle.filter = @"alpha(opacity=" + _shouldDimImage ? 50 : 100 + ")"; else - imageStyle.opacity = _shouldDimImage ? 0.35 : 1.0; + imageStyle.opacity = _shouldDimImage ? 0.5 : 1.0; _DOMImageElement.width = imageWidth; _DOMImageElement.height = imageHeight; @@ -719,7 +743,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, textRectHeight = _textSize.height; } - else //if (_verticalAlignment === CPBottomVerticalTextAlignment) + else // if (_verticalAlignment === CPBottomVerticalTextAlignment) { textRectY = textRectY + textRectHeight - _textSize.height; textRectHeight = _textSize.height; @@ -801,4 +825,11 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, [super setFrameSize:aSize]; } +- (void)setSelectedRange:(CPRange)aRange +{ +#if PLATFORM(DOM) + [[[self window] platformWindow] setSelectedRange:aRange inElement:_DOMTextElement]; +#endif +} + @end diff --git a/AppKit/_CPPopUpList.j b/AppKit/_CPPopUpList.j index 2dfbce85e..b6e400ff0 100644 --- a/AppKit/_CPPopUpList.j +++ b/AppKit/_CPPopUpList.j @@ -26,6 +26,7 @@ @import "_CPPopUpListDataSource.j" @class CPScrollView +@class CPApp @global CPLineBorder @@ -415,7 +416,7 @@ var ListColumnIdentifier = @"1"; /*! Selects a row and scrolls it to be visible. Returns YES if the selection actually changed. */ -- (BOOL)selectRow:(int)row +- (BOOL)selectRow:(CPInteger)row { if (row === [_tableView selectedRow]) return NO; @@ -793,7 +794,7 @@ var _CPPopUpListDataSourceKey = @"_CPPopUpListDataSourceKey", return MAX([_dataSource numberOfItemsInList:self], 1); } -- (id)tableView:(id)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return [_dataSource list:self displayValueForObjectValue:[_dataSource list:self objectValueForItemAtIndex:aRow]]; } @@ -852,11 +853,13 @@ var _CPPopUpListDataSourceKey = @"_CPPopUpListDataSourceKey", @implementation _CPPopUpPanel : CPPanel -- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned int)aStyleMask +- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned)aStyleMask { if (self = [super initWithContentRect:aContentRect styleMask:aStyleMask]) _constrainsToUsableScreen = NO; + [self _trapNextMouseDown]; + return self; } @@ -870,4 +873,28 @@ var _CPPopUpListDataSourceKey = @"_CPPopUpListDataSourceKey", return [super sendEvent:anEvent]; } +- (void)orderFront:(id)sender +{ + [self _trapNextMouseDown]; + [super orderFront:sender]; +} + +- (void)_mouseWasClicked:(CPEvent)anEvent +{ + var mouseWindow = [anEvent window], + rect = [[[self delegate] dataSource] bounds], + point = [[[self delegate] dataSource] convertPoint:[anEvent locationInWindow] fromView:nil]; + + if (mouseWindow != self && !CGRectContainsPoint(rect, point)) + [[self delegate] close]; + else + [self _trapNextMouseDown]; +} + +- (void)_trapNextMouseDown +{ + // Don't dequeue the event so clicks in controls will work + [CPApp setTarget:self selector:@selector(_mouseWasClicked:) forNextEventMatchingMask:CPLeftMouseDownMask untilDate:nil inMode:CPDefaultRunLoopMode dequeue:NO]; +} + @end diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index b16b35e67..2f7f5b4e4 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -399,7 +399,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 0, @param sender the sender of the action */ -- (IBAction)orderFront:(is)aSender +- (IBAction)orderFront:(id)aSender { if (![self isKeyWindow]) { @@ -410,7 +410,8 @@ var _CPPopoverWindow_shouldClose_ = 1 << 0, var transformOrigin = "50% 100%", frame = [self frame], preferredEdge = [_windowView preferredEdge], - posX, posY; + posX, + posY; switch (preferredEdge) { diff --git a/AppKit/_CPToolTip.j b/AppKit/_CPToolTip.j index a669d4cf0..96a9b7b9e 100644 --- a/AppKit/_CPToolTip.j +++ b/AppKit/_CPToolTip.j @@ -79,6 +79,7 @@ var _CPToolTipHeight = 24.0, var callbackFunction = function() { [_CPToolTip invalidateCurrentToolTipIfNeeded]; _CPToolTipCurrentToolTip = [_CPToolTip toolTipWithString:[aView toolTip]]; + [_CPToolTipCurrentToolTip setPlatformWindow:[[aView window] platformWindow]]; }; _CPToolTipCurrentToolTipTimer = [CPTimer scheduledTimerWithTimeInterval:_CPToolTipDelay @@ -202,7 +203,7 @@ var _CPToolTipHeight = 24.0, - (void)showToolTip { var mousePosition = [[CPApp currentEvent] globalLocation], - nativeRect = [[CPPlatformWindow primaryPlatformWindow] nativeContentRect]; + nativeRect = [[self platformWindow] nativeContentRect]; mousePosition.y += 20; diff --git a/AppKit/_CPToolbarItem.j b/AppKit/_CPToolbarItem.j index f3f4d1819..5d5600b47 100644 --- a/AppKit/_CPToolbarItem.j +++ b/AppKit/_CPToolbarItem.j @@ -642,22 +642,29 @@ var CPToolbarItemItemIdentifierKey = @"CPToolbarItemItemIdentifierKey", { switch (anItemIdentifier) { - case CPToolbarSeparatorItemIdentifier: return [_CPToolbarSeparatorItem new]; - case CPToolbarSpaceItemIdentifier: return [_CPToolbarSpaceItem new]; - case CPToolbarFlexibleSpaceItemIdentifier: return [_CPToolbarFlexibleSpaceItem new]; - case CPToolbarShowColorsItemIdentifier: return [_CPToolbarShowColorsItem new]; - case CPToolbarShowFontsItemIdentifier: return nil; - case CPToolbarCustomizeToolbarItemIdentifier: return nil; - case CPToolbarPrintItemIdentifier: return nil; + case CPToolbarSeparatorItemIdentifier: + return [_CPToolbarSeparatorItem new]; + + case CPToolbarSpaceItemIdentifier: + return [_CPToolbarSpaceItem new]; + + case CPToolbarFlexibleSpaceItemIdentifier: + return [_CPToolbarFlexibleSpaceItem new]; + + case CPToolbarShowColorsItemIdentifier: + return [_CPToolbarShowColorsItem new]; + + case CPToolbarShowFontsItemIdentifier: + return nil; + + case CPToolbarCustomizeToolbarItemIdentifier: + return nil; + + case CPToolbarPrintItemIdentifier: + return nil; } return nil; } @end - -/*@import "_CPToolbarFlexibleSpaceItem.j" -@import "_CPToolbarShowColorsItem.j" -@import "_CPToolbarSeparatorItem.j" -@import "_CPToolbarSpaceItem.j" -*/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1bde4969b..b32c82d6e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -598,7 +598,7 @@ Use descriptive parameter types, despite not being fully supported in JavaScript ##### Right: - - (char)characterAtIndex:(unsigned)anIndex; + - (char)characterAtIndex:(CPUInteger)anIndex; - (void)insertObject:(id)anObject; ##### Wrong: diff --git a/Foundation/CPArray+KVO.j b/Foundation/CPArray+KVO.j index 18a71a031..33fc4791f 100644 --- a/Foundation/CPArray+KVO.j +++ b/Foundation/CPArray+KVO.j @@ -197,7 +197,7 @@ [_proxyObject setValue:anObject forKey:_key]; } -- (unsigned)count +- (CPUInteger)count { if (_count) return _count(_proxyObject, _countSEL); @@ -205,7 +205,7 @@ return [[self _representedObject] count]; } -- (int)indexOfObject:(CPObject)anObject inRange:(CPRange)aRange +- (CPUInteger)indexOfObject:(id)anObject inRange:(CPRange)aRange { var index = aRange.location, count = aRange.length, @@ -222,12 +222,12 @@ return CPNotFound; } -- (int)indexOfObject:(CPObject)anObject +- (CPUInteger)indexOfObject:(id)anObject { return [self indexOfObject:anObject inRange:CPMakeRange(0, [self count])]; } -- (int)indexOfObjectIdenticalTo:(CPObject)anObject inRange:(CPRange)aRange +- (CPUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(CPRange)aRange { var index = aRange.location, count = aRange.length; @@ -239,12 +239,12 @@ return CPNotFound; } -- (int)indexOfObjectIdenticalTo:(CPObject)anObject +- (CPUInteger)indexOfObjectIdenticalTo:(id)anObject { return [self indexOfObjectIdenticalTo:anObject inRange:CPMakeRange(0, [self count])]; } -- (id)objectAtIndex:(unsigned)anIndex +- (id)objectAtIndex:(CPUInteger)anIndex { return [[self objectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]] firstObject]; } @@ -281,7 +281,7 @@ [self insertObjects:anArray atIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange([self count], count)]]; } -- (void)insertObject:(id)anObject atIndex:(unsigned)anIndex +- (void)insertObject:(id)anObject atIndex:(CPUInteger)anIndex { [self insertObjects:[anObject] atIndexes:[CPIndexSet indexSetWithIndex:anIndex]]; } @@ -378,7 +378,7 @@ [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:[self count] - 1]]; } -- (void)removeObjectAtIndex:(unsigned)anIndex +- (void)removeObjectAtIndex:(CPUInteger)anIndex { [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]]; } @@ -405,7 +405,7 @@ } } -- (void)replaceObjectAtIndex:(unsigned)anIndex withObject:(id)anObject +- (void)replaceObjectAtIndex:(CPUInteger)anIndex withObject:(id)anObject { [self replaceObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] withObjects:[anObject]] } @@ -564,7 +564,7 @@ /*! Registers an observer to receive key value observer notifications for the specified key-path relative to the objects at the indexes. */ -- (void)addObserver:(id)anObserver toObjectsAtIndexes:(CPIndexSet)indexes forKeyPath:(CPString)aKeyPath options:(unsigned)options context:(id)context +- (void)addObserver:(id)anObserver toObjectsAtIndexes:(CPIndexSet)indexes forKeyPath:(CPString)aKeyPath options:(CPKeyValueObservingOptions)options context:(id)context { var index = [indexes firstIndex]; diff --git a/Foundation/CPArray/CPMutableArray.j b/Foundation/CPArray/CPMutableArray.j index df9eed7cc..ec4a7769c 100644 --- a/Foundation/CPArray/CPMutableArray.j +++ b/Foundation/CPArray/CPMutableArray.j @@ -21,7 +21,7 @@ items. Because CPArray is backed by JavaScript arrays, this method ends up simply returning a regular array. */ -+ (CPArray)arrayWithCapacity:(unsigned)aCapacity ++ (CPArray)arrayWithCapacity:(CPUInteger)aCapacity { return [[self alloc] initWithCapacity:aCapacity]; } @@ -30,7 +30,7 @@ Initializes an array able to store at least \c aCapacity items. Because CPArray is backed by JavaScript arrays, this method ends up simply returning a regular array. */ -/*- (id)initWithCapacity:(unsigned)aCapacity +/*- (id)initWithCapacity:(CPUInteger)aCapacity { return self; }*/ @@ -63,7 +63,7 @@ @param anObject the object to insert into the array @param anIndex the location to insert \c anObject at */ -- (void)insertObject:(id)anObject atIndex:(int)anIndex +- (void)insertObject:(id)anObject atIndex:(CPUInteger)anIndex { _CPRaiseInvalidAbstractInvocation(self, _cmd); } @@ -93,7 +93,7 @@ [self insertObject:[objects objectAtIndex:index] atIndex:currentIndex]; } -- (unsigned)insertObject:(id)anObject inArraySortedByDescriptors:(CPArray)descriptors +- (CPUInteger)insertObject:(id)anObject inArraySortedByDescriptors:(CPArray)descriptors { var index, count = [descriptors count]; @@ -126,7 +126,7 @@ The current element at position \c anIndex will be removed from the array. @param anIndex the position in the array to place \c anObject */ -- (void)replaceObjectAtIndex:(int)anIndex withObject:(id)anObject +- (void)replaceObjectAtIndex:(CPUInteger)anIndex withObject:(id)anObject { _CPRaiseInvalidAbstractInvocation(self, _cmd); } @@ -241,7 +241,7 @@ Removes the object at \c anIndex. @param anIndex the location of the element to be removed */ -- (void)removeObjectAtIndex:(int)anIndex +- (void)removeObjectAtIndex:(CPUInteger)anIndex { _CPRaiseInvalidAbstractInvocation(self, _cmd); } @@ -322,7 +322,7 @@ @param anIndex the first index to swap from @param otherIndex the second index to swap from */ -- (void)exchangeObjectAtIndex:(unsigned)anIndex withObjectAtIndex:(unsigned)otherIndex +- (void)exchangeObjectAtIndex:(CPUInteger)anIndex withObjectAtIndex:(CPUInteger)otherIndex { if (anIndex === otherIndex) return; @@ -429,6 +429,9 @@ var sortArrayUsingFunction = function(array, aFunction, aContext) } } +// This is for speed +var CPMutableArrayNull = [CPNull null]; + // Observe that the sort descriptors has the reversed order by the caller var sortArrayUsingJSDescriptors = function(a, d) { @@ -451,7 +454,10 @@ var sortArrayUsingJSDescriptors = function(a, d) aUID, bUID, key, - dd; + dd, + value1, + value2, + cpNull = CPMutableArrayNull; if (dl < 0) return; @@ -519,7 +525,12 @@ var sortArrayUsingJSDescriptors = function(a, d) { dd = d[cn]; key = dd.k; - o = objj_msgSend(C1[key], dd.s, C2[key]); + value1 = C1[key]; + value2 = C2[key]; + if (value1 === nil || value1 === cpNull) + o = value2 === nil || value2 === cpNull ? CPOrderedSame : CPOrderedAscending; + else + o = value2 === nil || value2 === cpNull ? CPOrderedDescending : objj_msgSend(value1, dd.s, value2); if (o && !dd.a) o = -o; diff --git a/Foundation/CPArray/_CPArray.j b/Foundation/CPArray/_CPArray.j index 98759ea44..093023904 100755 --- a/Foundation/CPArray/_CPArray.j +++ b/Foundation/CPArray/_CPArray.j @@ -37,6 +37,8 @@ CPBinarySearchingFirstEqual = 1 << 8; CPBinarySearchingLastEqual = 1 << 9; CPBinarySearchingInsertionIndex = 1 << 10; +var CPArrayMaxDescriptionRecursion = 10; + var concat = Array.prototype.concat, join = Array.prototype.join, push = Array.prototype.push; @@ -120,7 +122,7 @@ var concat = Array.prototype.concat, @param aCount the number of objects in the JS Array @return a new CPArray containing the specified objects */ -+ (id)arrayWithObjects:(id)objects count:(unsigned)aCount ++ (id)arrayWithObjects:(id)objects count:(CPUInteger)aCount { return [[self alloc] initWithObjects:objects count:aCount]; } @@ -172,13 +174,13 @@ var concat = Array.prototype.concat, @param aCount the number of objects in \c objects @return the initialized CPArray */ -- (id)initWithObjects:(id)objects count:(unsigned)aCount +- (id)initWithObjects:(CPArray)objects count:(CPUInteger)aCount { FORWARD_TO_CONCRETE_CLASS(); } // FIXME: This should be defined in CPMutableArray, not here. -- (id)initWithCapacity:(unsigned)aCapacity +- (id)initWithCapacity:(CPUInteger)aCapacity { FORWARD_TO_CONCRETE_CLASS(); } @@ -201,7 +203,7 @@ var concat = Array.prototype.concat, /*! Returns the number of elements in the array */ -- (int)count +- (CPUInteger)count { _CPRaiseInvalidAbstractInvocation(self, _cmd); } @@ -236,7 +238,7 @@ var concat = Array.prototype.concat, Returns the object at index \c anIndex. @throws CPRangeException if \c anIndex is out of bounds */ -- (id)objectAtIndex:(int)anIndex +- (id)objectAtIndex:(CPUInteger)anIndex { _CPRaiseInvalidAbstractInvocation(self, _cmd); } @@ -874,6 +876,11 @@ var concat = Array.prototype.concat, Returns a human readable description of this array and it's elements. */ - (CPString)description +{ + return [self _descriptionWithMaximumDepth:CPArrayMaxDescriptionRecursion]; +} + +- (CPString)_descriptionWithMaximumDepth:(int)maximumDepth { var index = 0, count = [self count], @@ -887,7 +894,7 @@ var concat = Array.prototype.concat, var object = [self objectAtIndex:index]; // NOTE: replace(/^/mg, " ") inserts 4 spaces at the beginning of every line - description += CPDescriptionOfObject(object).replace(/^/mg, " "); + description += CPDescriptionOfObject(object, maximumDepth).replace(/^/mg, " "); if (index < count - 1) description += ",\n"; diff --git a/Foundation/CPArray/_CPJavaScriptArray.j b/Foundation/CPArray/_CPJavaScriptArray.j index dbb917930..c3765ad2e 100644 --- a/Foundation/CPArray/_CPJavaScriptArray.j +++ b/Foundation/CPArray/_CPJavaScriptArray.j @@ -19,7 +19,7 @@ var concat = Array.prototype.concat, return []; } -+ (CPArray)array ++ (id)array { return []; } @@ -107,7 +107,7 @@ var concat = Array.prototype.concat, return self; } -- (BOOL)count +- (CPUInteger)count { return self.length; } @@ -128,7 +128,7 @@ var concat = Array.prototype.concat, var ranges = indexes._ranges, count = ranges.length, result = [], - i = 0; + i = 0; for (; i < count; i++) { @@ -230,7 +230,7 @@ var concat = Array.prototype.concat, return join.call(self, aString); } -- (void)insertObject:(id)anObject atIndex:(int)anIndex +- (void)insertObject:(id)anObject atIndex:(CPUInteger)anIndex { if (anIndex > self.length || anIndex < 0) _CPRaiseRangeException(self, _cmd, anIndex, self.length); @@ -238,7 +238,7 @@ var concat = Array.prototype.concat, splice.call(self, anIndex, 0, anObject); } -- (void)removeObjectAtIndex:(int)anIndex +- (void)removeObjectAtIndex:(CPUInteger)anIndex { if (anIndex >= self.length || anIndex < 0) _CPRaiseRangeException(self, _cmd, anIndex, self.length); @@ -289,7 +289,7 @@ var concat = Array.prototype.concat, splice.call(self, aRange.location, aRange.length); } -- (void)replaceObjectAtIndex:(int)anIndex withObject:(id)anObject +- (void)replaceObjectAtIndex:(CPUInteger)anIndex withObject:(id)anObject { if (anIndex >= self.length || anIndex < 0) _CPRaiseRangeException(self, _cmd, anIndex, self.length); @@ -333,7 +333,7 @@ var concat = Array.prototype.concat, } -- (void)copy +- (id)copy { return slice.call(self, 0); } diff --git a/Foundation/CPAttributedString.j b/Foundation/CPAttributedString.j old mode 100644 new mode 100755 index 337ccc722..bbb37abe1 --- a/Foundation/CPAttributedString.j +++ b/Foundation/CPAttributedString.j @@ -149,7 +149,7 @@ { // index is the character index we're searching for, // while range is the actual range entry we're comparing against - if (CPLocationInRange(index, entry.range)) + if (CPLocationInRange(index, entry.range) || (!index && !CPMaxRange(entry.range))) return CPOrderedSame; else if (CPMaxRange(entry.range) <= index) return CPOrderedDescending; @@ -179,7 +179,7 @@ character at index \c anIndex. Returns an empty dictionary if index is out of bounds. */ -- (CPDictionary)attributesAtIndex:(unsigned)anIndex effectiveRange:(CPRangePointer)aRange +- (CPDictionary)attributesAtIndex:(CPUInteger)anIndex effectiveRange:(CPRangePointer)aRange { // find the range entry that contains anIndex. var entryIndex = [self _indexOfEntryWithIndex:anIndex]; @@ -219,7 +219,7 @@ character at index \c anIndex. Returns an empty dictionary if index is out of bounds. */ -- (CPDictionary)attributesAtIndex:(unsigned)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit +- (CPDictionary)attributesAtIndex:(CPUInteger)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit { var startingEntryIndex = [self _indexOfEntryWithIndex:anIndex]; @@ -295,7 +295,7 @@ @return the named attribute or \c nil is the attribute does not exist. */ -- (id)attribute:(CPString)attribute atIndex:(unsigned)index effectiveRange:(CPRangePointer)aRange +- (id)attribute:(CPString)attribute atIndex:(CPUInteger)index effectiveRange:(CPRangePointer)aRange { if (!attribute) { @@ -332,7 +332,7 @@ @return the named attribute or \c nil is the attribute does not exist. */ -- (id)attribute:(CPString)attribute atIndex:(unsigned)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit +- (id)attribute:(CPString)attribute atIndex:(CPUInteger)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit { var startingEntryIndex = [self _indexOfEntryWithIndex:anIndex]; @@ -413,7 +413,7 @@ comparisonAttributes = [aString attributesAtIndex:0 effectiveRange:comparisonRange], length = _string.length; - while (CPMaxRange(CPUnionRange(myRange, comparisonRange)) < length) + do { if (CPIntersectionRange(myRange, comparisonRange).length > 0 && ![myAttributes isEqualToDictionary:comparisonAttributes]) @@ -424,7 +424,7 @@ myAttributes = [self attributesAtIndex:CPMaxRange(myRange) effectiveRange:myRange]; else comparisonAttributes = [aString attributesAtIndex:CPMaxRange(comparisonRange) effectiveRange:comparisonRange]; - } + } while (CPMaxRange(CPUnionRange(myRange, comparisonRange)) < length); return YES; } @@ -526,38 +526,54 @@ if (!aString) aString = @""; - var startingIndex = [self _indexOfEntryWithIndex:aRange.location]; + var lastValidIndex = MAX(_rangeEntries.length - 1, 0), + startingIndex = [self _indexOfEntryWithIndex:aRange.location]; - if (startingIndex === CPNotFound) - _CPRaiseRangeException(self, _cmd, aRange.location, _string.length); + if (startingIndex < 0) + startingIndex = lastValidIndex; - var startingRangeEntry = _rangeEntries[startingIndex], - endingIndex = [self _indexOfEntryWithIndex:MAX(CPMaxRange(aRange) - 1, 0)]; + var endingIndex = [self _indexOfEntryWithIndex:CPMaxRange(aRange)]; - if (endingIndex === CPNotFound) - _CPRaiseRangeException(self, _cmd, MAX(CPMaxRange(aRange) - 1, 0), _string.length); + if (endingIndex < 0) + endingIndex = lastValidIndex; - var endingRangeEntry = _rangeEntries[endingIndex], - additionalLength = aString.length - aRange.length; + var additionalLength = aString.length - aRange.length, + patchPosition = startingIndex; _string = _string.substring(0, aRange.location) + aString + _string.substring(CPMaxRange(aRange)); + var originalLength = _rangeEntries[patchPosition].range.length; if (startingIndex === endingIndex) - startingRangeEntry.range.length += additionalLength; + _rangeEntries[patchPosition].range.length += additionalLength; else { - endingRangeEntry.range.length = CPMaxRange(endingRangeEntry.range) - CPMaxRange(aRange); - endingRangeEntry.range.location = CPMaxRange(aRange); + if (CPIntersectionRange(_rangeEntries[patchPosition].range, aRange).length < originalLength) + { + startingIndex++; + } - startingRangeEntry.range.length = CPMaxRange(aRange) - startingRangeEntry.range.location; + if (endingIndex > startingIndex) + { + var originalOffset= _rangeEntries[startingIndex].range.location, + offsetFromSplicing = CPMaxRange(_rangeEntries[endingIndex].range) - originalOffset; + _rangeEntries.splice(startingIndex, endingIndex - startingIndex); + _rangeEntries[startingIndex].range = CPMakeRange(originalOffset, offsetFromSplicing); + } - _rangeEntries.splice(startingIndex, endingIndex - startingIndex); + if (patchPosition !== startingIndex) + { + var lhsOffset = aString.length - CPIntersectionRange(_rangeEntries[patchPosition].range, aRange).length; + _rangeEntries[patchPosition].range.length = originalLength + lhsOffset; + var rhsOffset = aString.length - CPIntersectionRange(_rangeEntries[startingIndex].range, aRange).length; + _rangeEntries[startingIndex].range.location += lhsOffset; + _rangeEntries[startingIndex].range.length += rhsOffset; + patchPosition = startingIndex; + } else + _rangeEntries[patchPosition].range.length += additionalLength; } - endingIndex = startingIndex + 1; - - while (endingIndex < _rangeEntries.length) - _rangeEntries[endingIndex++].range.location += additionalLength; + for (var patchIndex = patchPosition + 1, l = _rangeEntries.length; patchIndex < l; patchIndex++) + _rangeEntries[patchIndex].range.location += additionalLength; } /*! @@ -587,6 +603,9 @@ endingEntryIndex = [self _indexOfRangeEntryForIndex:CPMaxRange(aRange) splitOnMaxIndex:YES], current = startingEntryIndex; + if (current < 0) + current = MAX(_rangeEntries.length - 1, 0); + if (endingEntryIndex === CPNotFound) endingEntryIndex = _rangeEntries.length; @@ -690,10 +709,10 @@ @param anIndex the index at which the insert is to occur. @exception CPRangeException If the index is out of bounds. */ -- (void)insertAttributedString:(CPAttributedString)aString atIndex:(unsigned)anIndex +- (void)insertAttributedString:(CPAttributedString)aString atIndex:(CPUInteger)anIndex { if (anIndex < 0 || anIndex > [self length]) - [CPException raise:CPRangeException reason:"tried to insert attributed string at an invalid index: "+anIndex]; + [CPException raise:CPRangeException reason:"tried to insert attributed string at an invalid index: " + anIndex]; var entryIndexOfNextEntry = [self _indexOfRangeEntryForIndex:anIndex splitOnMaxIndex:YES], otherRangeEntries = aString._rangeEntries, @@ -786,7 +805,7 @@ var a = _rangeEntries[current], b = _rangeEntries[current + 1]; - if ([a.attributes isEqualToDictionary:b.attributes]) + if (a && b && [a.attributes isEqualToDictionary:b.attributes]) { a.range.length = CPMaxRange(b.range) - a.range.location; _rangeEntries.splice(current + 1, 1); @@ -818,6 +837,50 @@ @end +var CPAttributedStringStringKey = "CPAttributedStringString", + CPAttributedStringRangesKey = "CPAttributedStringRanges", + CPAttributedStringAttributesKey = "CPAttributedStringAttributes"; + +@implementation CPAttributedString (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [self init]; + + if (self) + { + _string = [aCoder decodeObjectForKey:CPAttributedStringStringKey]; + var decodedRanges = [aCoder decodeObjectForKey:CPAttributedStringRangesKey], + decodedAttributes = [aCoder decodeObjectForKey:CPAttributedStringAttributesKey]; + + _rangeEntries = []; + + for (var i = 0, l = decodedRanges.length; i < l; i++) + _rangeEntries.push(makeRangeEntry(decodedRanges[i], decodedAttributes[i])); + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_string forKey:CPAttributedStringStringKey]; + + var rangesForEncoding = [], + dictsForEncoding = []; + + for (var i = 0, l = _rangeEntries.length; i < l; i++) + { + rangesForEncoding.push(_rangeEntries[i].range); + dictsForEncoding.push(_rangeEntries[i].attributes); + } + + [aCoder encodeObject:rangesForEncoding forKey:CPAttributedStringRangesKey]; + [aCoder encodeObject:dictsForEncoding forKey:CPAttributedStringAttributesKey]; +} + +@end + /*! @class CPMutableAttributedString @ingroup compatibility diff --git a/Foundation/CPByteCountFormatter.j b/Foundation/CPByteCountFormatter.j index 0d04b4c34..c04baaa8d 100644 --- a/Foundation/CPByteCountFormatter.j +++ b/Foundation/CPByteCountFormatter.j @@ -214,7 +214,7 @@ var CPByteCountFormatterUnits = [ @"bytes", @"KB", @"MB", @"GB", @"TB", @"PB" ]; return nil; } -- (BOOL)getObjectValue:(id)anObject forString:(CPString)aString errorDescription:(CPString)anError +- (BOOL)getObjectValue:(idRef)anObject forString:(CPString)aString errorDescription:(CPStringRef)anError { // Not implemented return NO; diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index 3563c5529..3c237d0e9 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -20,98 +20,2059 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@import "CPArray.j" @import "CPDate.j" @import "CPString.j" @import "CPFormatter.j" +@import "CPTimeZone.j" @import "CPLocale.j" +@class CPNull + +@global CPLocaleLanguageCode +@global CPLocaleCountryCode + CPDateFormatterNoStyle = 0; CPDateFormatterShortStyle = 1; CPDateFormatterMediumStyle = 2; CPDateFormatterLongStyle = 3; CPDateFormatterFullStyle = 4; +CPDateFormatterBehaviorDefault = 0; +CPDateFormatterBehavior10_0 = 1000; +CPDateFormatterBehavior10_4 = 1040; + +var defaultDateFormatterBehavior = CPDateFormatterBehavior10_4, + relativeDateFormating, + patternStringTokens; + /*! @ingroup foundation @class CPDateFormatter - * Not yet implemented. This is a stub class. * - CPDateFormatter takes a CPDate value and formats it as text for display. It also supports the converse, taking text and interpreting it as a CPDate by configurable formatting rules. */ @implementation CPDateFormatter : CPFormatter { - CPDateFormatterStyle _dateStyle @accessors(property=dateStyle); - CPLocale _locale @accessors(property=locale); + BOOL _allowNaturalLanguage @accessors(property=allowNaturalLanguage, readonly); + BOOL _doesRelativeDateFormatting @accessors(property=doesRelativeDateFormatting); + CPDate _defaultDate @accessors(property=defaultDate); + CPDate _twoDigitStartDate @accessors(property=twoDigitStartDate); + CPDateFormatterBehavior _formatterBehavior @accessors(property=formatterBehavior); + CPDateFormatterStyle _dateStyle @accessors(property=dateStyle); + CPDateFormatterStyle _timeStyle @accessors(property=timeStyle); + CPLocale _locale @accessors(property=locale); + CPString _AMSymbol @accessors(property=AMSymbol); + CPString _dateFormat @accessors(property=dateFormat); + CPString _PMSymbol @accessors(property=PMSymbol); + CPTimeZone _timeZone @accessors(property=timeZone); + + CPDictionary _symbols; } + ++ (void)initialize +{ + if (self !== [CPDateFormatter class]) + return; + + relativeDateFormating = @{ + @"fr" : [@"demain", 1, @"apr" + String.fromCharCode(233) + @"s-demain", 2, @"apr" + String.fromCharCode(233) + @"s-apr" + String.fromCharCode(233) + @"s-demain", 3, @"hier", -1, @"avant-hier", -2, @"avant-avant-hier", -3], + @"en" : [@"tomorrow", 1, @"yesterday", -1], + @"de" : [], + @"es" : [] + }; + + patternStringTokens = [@"QQQ", @"qqq", @"QQQQ", @"qqqq", @"MMM", @"MMMM", @"LLL", @"LLLL", @"E", @"EE", @"EEE", @"eee", @"eeee", @"eeeee", @"a", @"z", @"zz", @"zzz", @"zzzz", @"Z", @"ZZ", @"ZZZ", @"ZZZZ", @"ZZZZZ", @"v", @"vv", @"vvv", @"vvvv", @"V", @"VV", @"VVV", @"VVVV"]; +} + +/*! Return a string representation of the given date, dateStyle and timeStyle + @param date the given date + @param dateStyle the dateStyle + @param timeStyle the timeStyle + @return a CPString reprensenting the given date +*/ ++ (CPString)localizedStringFromDate:(CPDate)date dateStyle:(CPDateFormatterStyle)dateStyle timeStyle:(CPDateFormatterStyle)timeStyle +{ + var formatter = [[CPDateFormatter alloc] init]; + + [formatter setFormatterBehavior:CPDateFormatterBehavior10_4]; + [formatter setDateStyle:dateStyle]; + [formatter setTimeStyle:timeStyle]; + + return [formatter stringForObjectValue:date]; +} + +/*! Not yet implemented + Return a string representation of the given template, opts and locale + @param template the template + @param opts, pass 0 + @param locale the locale + @return a CPString representing the givent template +*/ ++ (CPString)dateFormatFromTemplate:(CPString)template options:(CPUInteger)opts locale:(CPLocale)locale +{ + // TODO : check every template from cocoa and return a good format (have fun ^^) +} + +/*! Return the defaultFormatterBehavior + @return a CPDateFormatterBehavior +*/ ++ (CPDateFormatterBehavior)defaultFormatterBehavior +{ + return defaultDateFormatterBehavior; +} + +/*! Set the defaultFormatterBehavior + @param behavior +*/ ++ (void)setDefaultFormatterBehavior:(CPDateFormatterBehavior)behavior +{ + defaultDateFormatterBehavior = behavior; +} + +/*! Init a dateFormatter + @return a new CPDateFormatter +*/ - (id)init { if (self = [super init]) { - _dateStyle = CPDateFormatterShortStyle; + _dateStyle = nil; + _timeStyle = nil; + + [self _init]; } return self; } +/*! Init a dateFormatter with a format and the naturalLanguage + @param format the format + @param flag flag representation of allowNaturalLanguage + @return a new CPDateFormatter +*/ +- (id)initWithDateFormat:(CPString)format allowNaturalLanguage:(BOOL)flag +{ + if (self = [self init]) + { + _dateFormat = format; + _allowNaturalLanguage = flag; + } + + return self +} + +/*! Private init +*/ +- (void)_init +{ + var AMSymbol = [CPString stringWithFormat:@"%s", @"AM"], + PMSymbol = [CPString stringWithFormat:@"%s", @"PM"], + weekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"], + shortWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"], + veryShortWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"], + standaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"], + shortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"], + veryShortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"], + monthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"], + shortMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"], + veryShortMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"], + standaloneMonthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"], + shortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"], + veryShortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"], + quarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"], + shortQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"], + standaloneQuarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"], + shortStandaloneQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"]; + + _symbols = @{ + @"en" : @{ + @"AMSymbol" : AMSymbol, + @"PMSymbol" : PMSymbol, + @"weekdaySymbols" : weekdaySymbols, + @"shortWeekdaySymbols" : shortWeekdaySymbols, + @"veryShortWeekdaySymbols" : veryShortWeekdaySymbols, + @"standaloneWeekdaySymbols" : standaloneWeekdaySymbols, + @"shortStandaloneWeekdaySymbols" : shortStandaloneWeekdaySymbols, + @"veryShortStandaloneWeekdaySymbols" : veryShortStandaloneWeekdaySymbols, + @"monthSymbols" : monthSymbols, + @"shortMonthSymbols" : shortMonthSymbols, + @"veryShortMonthSymbols" : veryShortMonthSymbols, + @"standaloneMonthSymbols" : standaloneMonthSymbols, + @"shortStandaloneMonthSymbols" : shortStandaloneMonthSymbols, + @"veryShortStandaloneMonthSymbols" : veryShortStandaloneMonthSymbols, + @"quarterSymbols" : quarterSymbols, + @"shortQuarterSymbols" : shortQuarterSymbols, + @"standaloneQuarterSymbols" : standaloneQuarterSymbols, + @"shortStandaloneQuarterSymbols" : shortStandaloneQuarterSymbols + }, + @"fr" : @{}, + @"es" : @{}, + @"de" : @{} + }; + + _timeZone = [CPTimeZone systemTimeZone]; + _twoDigitStartDate = [[CPDate alloc] initWithString:@"1950-01-01 00:00:00 +0000"]; + _locale = [CPLocale currentLocale]; +} + + +#pragma mark - +#pragma mark Setter Getter + +/*! Return AMSymbol +*/ +- (CPString)AMSymbol +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"AMSymbol"]; +} + +/*! Set the AMSymbol +*/ +- (void)setAMSymbol:(CPString)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"AMSymbol"]; +} + +/*! Return a PMSymbol +*/ +- (CPString)PMSymbol +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"PMSymbol"]; +} + +/*! Set the PMSymbol +*/ +- (void)setPMSymbol:(CPString)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"PMSymbol"]; +} + +/*! Return the weekdaySymbols +*/ +- (CPArray)weekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"weekdaySymbols"]; +} + +/*! Set the weekdaySymbols +*/ +- (void)setWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"weekdaySymbols"]; +} + +/*! Return a shortWeekdaySymbols +*/ +- (CPArray)shortWeekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortWeekdaySymbols"]; +} + +/*! Set the shortWeekdaySymbols +*/ +- (void)setShortWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortWeekdaySymbols"]; +} + +/*! Return veryShortWeekdaySymbols +*/ +- (CPArray)veryShortWeekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"veryShortWeekdaySymbols"]; +} + +/*! Set the veryShortWeekdaySymbols +*/ +- (void)setVeryShortWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"veryShortWeekdaySymbols"]; +} + +/*! Return the standaloneWeekdaySymbols +*/ +- (CPArray)standaloneWeekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"standaloneWeekdaySymbols"]; +} + +/*! Set the standaloneWeekdaySymbols +*/ +- (void)setStandaloneWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"standaloneWeekdaySymbols"]; +} + +/*! Return the shortStandaloneWeekdaySymbols +*/ +- (CPArray)shortStandaloneWeekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortStandaloneWeekdaySymbols"]; +} + +/*! Set the shortStandaloneWeekdaySymbols +*/ +- (void)setShortStandaloneWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortStandaloneWeekdaySymbols"]; +} + +/*! Return the veryShortStandaloneWeekdaySymbols +*/ +- (CPArray)veryShortStandaloneWeekdaySymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"veryShortStandaloneWeekdaySymbols"]; +} + +/*! Set the veryShortStandaloneWeekdaySymbols +*/ +- (void)setVeryShortStandaloneWeekdaySymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"veryShortStandaloneWeekdaySymbols"]; +} + +/*! Return the monthSymbols +*/ +- (CPArray)monthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"monthSymbols"]; +} + +/*! Set the monthSymbols +*/ +- (void)setMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"monthSymbols"]; +} + +/*! Return a shortMonthSymbols +*/ +- (CPArray)shortMonthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortMonthSymbols"]; +} + +/*! Set the shortMonthSymbols +*/ +- (void)setShortMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortMonthSymbols"]; +} + +/*! Return veryShortMonthSymbols +*/ +- (CPArray)veryShortMonthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"veryShortMonthSymbols"]; +} + +/*! Set the veryShortMonthSymbols +*/ +- (void)setVeryShortMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"veryShortMonthSymbols"]; +} + +/*! Return standaloneMonthSymbols +*/ +- (CPArray)standaloneMonthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"standaloneMonthSymbols"]; +} + +/*! Set the standaloneMonthSymbols +*/ +- (void)setStandaloneMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"standaloneMonthSymbols"]; +} + +/*! Return the shortStandaloneMonthSymbols +*/ +- (CPArray)shortStandaloneMonthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortStandaloneMonthSymbols"]; +} + +/*! Set the shortStandaloneMonthSymbols +*/ +- (void)setShortStandaloneMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortStandaloneMonthSymbols"]; +} + +/*! Return the veryShortStandaloneMonthSymbols +*/ +- (CPArray)veryShortStandaloneMonthSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"veryShortStandaloneMonthSymbols"]; +} + +/*! Set the veryShortStandaloneMonthSymbols +*/ +- (void)setVeryShortStandaloneMonthSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"veryShortStandaloneMonthSymbols"]; +} + +/*! Return the quarterSymbols +*/ +- (CPArray)quarterSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"quarterSymbols"]; +} + +/*! Set the quarterSymbols +*/ +- (void)setQuarterSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"quarterSymbols"]; +} + +/*! Return the shortQuarterSymbols +*/ +- (CPArray)shortQuarterSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortQuarterSymbols"]; +} + +/*! Set the shortQuarterSymbols +*/ +- (void)setShortQuarterSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortQuarterSymbols"]; +} + +/*! Return the standaloneQuarterSymbols +*/ +- (CPArray)standaloneQuarterSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"standaloneQuarterSymbols"]; +} + +/*! Set the standaloneQuarterSymbols +*/ +- (void)setStandaloneQuarterSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"standaloneQuarterSymbols"]; +} + +/*! Return the shortStandaloneQuarterSymbols +*/ +- (CPArray)shortStandaloneQuarterSymbols +{ + return [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] valueForKey:@"shortStandaloneQuarterSymbols"]; +} + +/*! Set the shortStandaloneQuarterSymbols +*/ +- (void)setShortStandaloneQuarterSymbols:(CPArray)aValue +{ + [[_symbols valueForKey:[_locale objectForKey:CPLocaleLanguageCode]] setValue:aValue forKey:@"shortStandaloneQuarterSymbols"]; +} + + +#pragma mark - +#pragma mark StringFromDate methods + +/*! Return a string representation of a given date. + This method returns (if possible) a representation of the given date with the dateFormat of the CPDateFormatter, otherwise it takes the dateStyle and timeStyle + @param aDate the given date + @return CPString the string representation +*/ - (CPString)stringFromDate:(CPDate)aDate { - // TODO Add locale support. - switch (_dateStyle) - { - case CPDateFormatterShortStyle: - var format = "d/m/Y"; - return aDate.dateFormat(format); + var format, + relativeWord, + result; - default: - return [aDate description]; - } -} + if (!aDate) + return; -- (CPDate)dateFromString:(CPString)aString -{ - if (!aString) - return nil; + aDate = [aDate copy]; + [aDate _dateWithTimeZone:_timeZone]; + + if (_dateFormat) + return [self _stringFromDate:aDate format:_dateFormat]; switch (_dateStyle) { + case CPDateFormatterNoStyle: + format = @""; + break; + case CPDateFormatterShortStyle: - var format = "d/m/Y"; - return Date.parseDate(aString, format); + if ([self _isAmericanFormat]) + format = @"M/d/yy"; + else + format = @"dd/MM/yy"; + + break; + + case CPDateFormatterMediumStyle: + if ([self _isAmericanFormat]) + format = @"MMM d, Y"; + else + format = @"d MMM Y"; + + break; + + case CPDateFormatterLongStyle: + if ([self _isAmericanFormat]) + format = @"MMMM d, Y"; + else + format = @"d MMMM Y"; + + break; + + case CPDateFormatterFullStyle: + if ([self _isAmericanFormat]) + format = @"EEEE, MMMM d, Y"; + else + format = @"EEEE d MMMM Y"; + + break; default: - return Date.parseDate(aString); + format = @""; } + + + if ([self doesRelativeDateFormatting]) + { + var language = [_locale objectForKey:CPLocaleLanguageCode], + relativeWords = [relativeDateFormating valueForKey:language]; + + for (var i = 1; i < [relativeWords count]; i = i + 2) + { + var date = [CPDate date]; + [date _dateWithTimeZone:_timeZone]; + + date.setHours(12); + date.setMinutes(0); + date.setSeconds(0); + + date.setDate([relativeWords objectAtIndex:i] + date.getDate()); + + if (date.getDate() == aDate.getDate() && date.getMonth() == aDate.getMonth() && date.getFullYear() == aDate.getFullYear()) + { + relativeWord = [relativeWords objectAtIndex:(i - 1)]; + format = @""; + break; + } + } + } + + if ((relativeWord || format.length) && _timeStyle != CPDateFormatterNoStyle) + format += @" "; + + switch (_timeStyle) + { + case CPDateFormatterNoStyle: + format += @""; + break; + + case CPDateFormatterShortStyle: + if ([self _isEnglishFormat]) + format += @"h:mm a"; + else + format += @"H:mm"; + + break; + + case CPDateFormatterMediumStyle: + if ([self _isEnglishFormat]) + format += @"h:mm:ss a"; + else + format += @"H:mm:ss" + + break; + + case CPDateFormatterLongStyle: + if ([self _isEnglishFormat]) + format += @"h:mm:ss a z"; + else + format += @"H:mm:ss z"; + + break; + + case CPDateFormatterFullStyle: + if ([self _isEnglishFormat]) + format += @"h:mm:ss a zzzz"; + else + format += @"h:mm:ss zzzz"; + + break; + + default: + format += @""; + } + + result = [self _stringFromDate:aDate format:format]; + + if (relativeWord) + result = relativeWord + result; + + return result; } +/*! Return a string representation of the given objectValue. + This method call the method stringFromDate if possible, otherwise it returns the description of the object + @param anObject + @return a string +*/ - (CPString)stringForObjectValue:(id)anObject { if ([anObject isKindOfClass:[CPDate class]]) return [self stringFromDate:anObject]; else - return [anObject description]; + return nil; } +/*! Return a string + This method call the method stringForObjectValue + @param anObject + @return a string +*/ - (CPString)editingStringForObjectValue:(id)anObject { return [self stringForObjectValue:anObject]; } -- (BOOL)getObjectValue:(id)anObject forString:(CPString)aString errorDescription:(CPString)anError +/*! Return a string representation of the given date and format + @patam aDate + @param aFormat + @return a string +*/ +- (CPString)_stringFromDate:(CPDate)aDate format:(CPString)aFormat +{ + var length = [aFormat length], + currentToken = [CPString new], + isTextToken = NO, + result = [CPString new]; + + for (var i = 0; i < length; i++) + { + var character = [aFormat characterAtIndex:i]; + + if (isTextToken) + { + if ([character isEqualToString:@"'"]) + { + isTextToken = NO; + result += currentToken; + currentToken = [CPString new]; + } + else + { + currentToken += character; + } + + continue; + } + + if ([character isEqualToString:@"'"]) + { + if (!isTextToken) + { + isTextToken = YES; + result += currentToken; + currentToken = [CPString new]; + } + + continue; + } + + if ([character isEqualToString:@","] || [character isEqualToString:@":"] || [character isEqualToString:@"/"] || [character isEqualToString:@"-"] || [character isEqualToString:@" "]) + { + result += [self _stringFromToken:currentToken date:aDate]; + result += character; + currentToken = [CPString new]; + } + else + { + if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character]) + { + result += [self _stringFromToken:currentToken date:aDate]; + currentToken = [CPString new]; + } + + currentToken += character; + + if (i == (length - 1)) + result += [self _stringFromToken:currentToken date:aDate]; + } + } + + return result; +} + +/*! Return a string representation of the given token and date + @param aToken + @param aDate + @return a string +*/ +- (CPString)_stringFromToken:(CPString)aToken date:(CPDate)aDate +{ + if (![aToken length]) + return aToken; + + var character = [aToken characterAtIndex:0], + length = [aToken length], + timeZone = _timeZone; + + switch (character) + { + case @"G": + // TODO + CPLog.warn(@"Token not yet implemented " + aToken); + return [CPString new]; + + case @"y": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getFullYear()] length]; + + return [self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength]; + + case @"Y": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getFullYear()] length]; + + return [self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength]; + + case @"u": + // TODO + CPLog.warn(@"Token not yet implemented " + aToken); + return [CPString new]; + + case @"U": + // TODO + CPLog.warn(@"Token not yet implemented " + aToken); + return [CPString new]; + + case @"Q": + var quarter = 1; + + if (aDate.getMonth() < 6 && aDate.getMonth() > 2) + quarter = 2; + + if (aDate.getMonth() > 5 && aDate.getMonth() < 9) + quarter = 3; + + if (aDate.getMonth() >= 9) + quarter = 4; + + if (length <= 2) + return [self _stringValueForValue:quarter length:MIN(2,length)]; + + if (length == 3) + return [[self shortQuarterSymbols] objectAtIndex:(quarter - 1)]; + + if (length >= 4) + return [[self quarterSymbols] objectAtIndex:(quarter - 1)]; + + case @"q": + var quarter = 1; + + if (aDate.getMonth() < 6 && aDate.getMonth() > 2) + quarter = 2; + + if (aDate.getMonth() > 5 && aDate.getMonth() < 9) + quarter = 3; + + if (aDate.getMonth() >= 9) + quarter = 4; + + if (length <= 2) + return [self _stringValueForValue:quarter length:MIN(2,length)]; + + if (length == 3) + return [[self shortStandaloneQuarterSymbols] objectAtIndex:(quarter - 1)]; + + if (length >= 4) + return [[self standaloneQuarterSymbols] objectAtIndex:(quarter - 1)]; + + case @"M": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getMonth() + 1] length]; + + if (length <= 2) + return [self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)]; + + if (length == 3) + return [[self shortMonthSymbols] objectAtIndex:aDate.getMonth()]; + + if (length == 4) + return [[self monthSymbols] objectAtIndex:aDate.getMonth()]; + + if (length >= 5) + return [[self veryShortMonthSymbols] objectAtIndex:aDate.getMonth()]; + + case @"L": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getMonth() + 1] length]; + + if (length <= 2) + return [self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)]; + + if (length == 3) + return [[self shortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()]; + + if (length == 4) + return [[self standaloneMonthSymbols] objectAtIndex:aDate.getMonth()]; + + if (length >= 5) + return [[self veryShortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()]; + + case @"I": + // Deprecated + CPLog.warn(@"Depreacted - Token not yet implemented " + aToken); + return [CPString new]; + + case @"w": + var d = [aDate copy]; + + d.setHours(0, 0, 0); + d.setDate(d.getDate() + 4 - (d.getDay() || 7)); + + var yearStart = new Date(d.getFullYear(), 0, 1), + weekOfYear = Math.ceil((((d - yearStart) / 86400000) + 1) / 7); + + return [self _stringValueForValue:(weekOfYear + 1) length:MAX(2, length)]; + + case @"W": + var firstDay = new Date(aDate.getFullYear(), aDate.getMonth(), 1).getDay(), + weekOfMonth = Math.ceil((aDate.getDate() + firstDay) / 7); + + return [self _stringValueForValue:weekOfMonth length:1]; + + case @"d": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getDate()] length]; + + return [self _stringValueForValue:aDate.getDate() length:MAX(length, currentLength)]; + + case @"D": + var oneJan = new Date(aDate.getFullYear(), 0, 1), + dayOfYear = Math.ceil((aDate - oneJan) / 86400000), + currentLength = [[CPString stringWithFormat:@"%i", dayOfYear] length]; + + return [self _stringValueForValue:dayOfYear length:MAX(currentLength, MIN(3, length))]; + + case @"F": + var dayOfWeek = 1, + day = aDate.getDate(); + + if (day > 7 && day < 15) + dayOfWeek = 2; + + if (day > 14 && day < 22) + dayOfWeek = 3; + + if (day > 21 && day < 29) + dayOfWeek = 4; + + if (day > 28) + dayOfWeek = 5; + + return [self _stringValueForValue:dayOfWeek length:1]; + + case @"g": + CPLog.warn(@"Token not yet implemented " + aToken); + return [CPString new]; + + case @"E": + var day = aDate.getDay(); + + if (length <= 3) + return [[self shortWeekdaySymbols] objectAtIndex:day]; + + if (length == 4) + return [[self weekdaySymbols] objectAtIndex:day]; + + if (length >= 5) + return [[self veryShortWeekdaySymbols] objectAtIndex:day]; + + case @"e": + var day = aDate.getDay(); + + if (length <= 2) + return [self _stringValueForValue:(day + 1) length:MIN(2, length)]; + + if (length == 3) + return [[self shortWeekdaySymbols] objectAtIndex:day]; + + if (length == 4) + return [[self weekdaySymbols] objectAtIndex:day]; + + if (length >= 5) + return [[self veryShortWeekdaySymbols] objectAtIndex:day]; + + case @"c": + var day = aDate.getDay(); + + if (length <= 2) + return [self _stringValueForValue:(day + 1) length:aDate.getDay().toString().length]; + + if (length == 3) + return [[self shortStandaloneWeekdaySymbols] objectAtIndex:day]; + + if (length == 4) + return [[self standaloneWeekdaySymbols] objectAtIndex:day]; + + if (length >= 5) + return [[self veryShortStandaloneWeekdaySymbols] objectAtIndex:day]; + + case @"a": + + if (aDate.getHours() > 11) + return [self PMSymbol]; + else + return [self AMSymbol]; + + case @"h": + var hours = aDate.getHours(); + + if ([self _isAmericanFormat] || [self _isEnglishFormat]) + { + if (hours == 0) + hours = 12; + else if (hours > 12) + hours = hours - 12; + } + + var currentLength = [[CPString stringWithFormat:@"%i", hours] length]; + + return [self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))]; + + case @"H": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getHours()] length]; + + return [self _stringValueForValue:aDate.getHours() length:MAX(currentLength, MIN(2, length))]; + + case @"K": + var hours = aDate.getHours(); + + if (hours > 12) + hours -= 12; + + var currentLength = [[CPString stringWithFormat:@"%i", hours] length]; + + return [self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))]; + + case @"k": + var hours = aDate.getHours(); + + if (aDate.getHours() == 0) + hours = 24; + + var currentLength = [[CPString stringWithFormat:@"%i", hours] length]; + + return [self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))]; + + case @"j": + CPLog.warn(@"Token not yet implemented " + aToken); + return [CPString new]; + + case @"m": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getMinutes()] length]; + + return [self _stringValueForValue:aDate.getMinutes() length:MAX(currentLength, MIN(2, length))]; + + case @"s": + var currentLength = [[CPString stringWithFormat:@"%i", aDate.getMinutes()] length]; + + return [self _stringValueForValue:aDate.getSeconds() length:MIN(2, length)]; + + case @"S": + return [self _stringValueForValue:aDate.getMilliseconds() length:length]; + + case @"A": + var value = aDate.getHours() * 60 * 60 * 1000 + aDate.getMinutes() * 60 * 1000 + aDate.getSeconds() * 1000 + aDate.getMilliseconds(); + + return [self _stringValueForValue:value length:value.toString().length]; + + case @"z": + if (length <= 3) + return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale]; + else + return [timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale]; + + case @"Z": + var seconds = [timeZone secondsFromGMT], + minutes = seconds / 60, + hours = minutes / 60, + result, + diffMinutes = (hours - parseInt(hours)) * 100 * 60 / 100; + + if (length <= 3) + { + result = diffMinutes.toString(); + + while ([result length] < 2) + result = @"0" + result; + + result = ABS(parseInt(hours)) + result; + + while ([result length] < 4) + result = @"0" + result; + + if (seconds > 0) + result = @"+" + result; + else + result = @"-" + result; + + return result; + } + else if (length == 4) + { + result = diffMinutes.toString(); + + while ([result length] < 2) + result = @"0" + result; + + result = @":" + result; + result = ABS(parseInt(hours)) + result; + + while ([result length] < 5) + result = @"0" + result; + + if (seconds > 0) + result = @"+" + result; + else + result = @"-" + result; + + return @"GMT" + result; + } + else + { + result = diffMinutes.toString(); + + while ([result length] < 2) + result = @"0" + result; + + result = @":" + result; + result = ABS(parseInt(hours)) + result; + + while ([result length] < 5) + result = @"0" + result; + + if (seconds > 0) + result = @"+" + result; + else + result = @"-" + result; + + return result; + } + + case @"v": + if (length == 1) + return [timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale]; + else if (length == 4) + return [timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale]; + + return @" "; + + case @"V": + if (length == 1) + { + return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale]; + } + else if (length == 4) + { + CPLog.warn(@"No pattern found for " + aToken); + return @""; + } + + return @" "; + + default: + CPLog.warn(@"No pattern found for " + aToken); + return aToken; + } + + return [CPString new]; +} + + +#pragma mark - +#pragma mark datefromString + +/*! Return a date of the given string + This method returns (if possible) a representation of the given string with the dateFormat of the CPDateFormatter, otherwise it takes the dateStyle and timeStyle + @param aString + @return CPDate the date +*/ +- (CPDate)dateFromString:(CPString)aString +{ + var format; + + if (_dateFormat != nil) + return [self _dateFromString:aString format:_dateFormat]; + + switch (_dateStyle) + { + case CPDateFormatterNoStyle: + format = @""; + break; + + case CPDateFormatterShortStyle: + if ([self _isAmericanFormat]) + format = @"M/d/yy"; + else + format = @"dd/MM/yy"; + + break; + + case CPDateFormatterMediumStyle: + if ([self _isAmericanFormat]) + format = @"MMM d, Y"; + else + format = @"d MMM Y"; + + break; + + case CPDateFormatterLongStyle: + if ([self _isAmericanFormat]) + format = @"MMMM d, Y"; + else + format = @"d MMMM Y"; + + break; + + case CPDateFormatterFullStyle: + if ([self _isAmericanFormat]) + format = @"EEEE, MMMM d, Y"; + else + format = @"EEEE d MMMM Y"; + + break; + + default: + format = @""; + } + + switch (_timeStyle) + { + case CPDateFormatterNoStyle: + format += @""; + break; + + case CPDateFormatterShortStyle: + if ([self _isEnglishFormat]) + format += @" h:mm a"; + else + format += @" H:mm"; + break; + + case CPDateFormatterMediumStyle: + if ([self _isEnglishFormat]) + format += @" h:mm:ss a"; + else + format += @" H:mm:ss" + break; + + case CPDateFormatterLongStyle: + if ([self _isEnglishFormat]) + format += @" h:mm:ss a z"; + else + format += @" H:mm:ss z"; + break; + + case CPDateFormatterFullStyle: + if ([self _isEnglishFormat]) + format += @" h:mm:ss a zzzz"; + else + format += @" h:mm:ss zzzz"; + break; + + default: + format += @""; + } + + return [self _dateFromString:aString format:format]; +} + +/*! Returns a boolean if the given object has been changed or not depending of the given string (use of ref) + @param anObject the given object + @param aString + @param anError, if it returns NO the describe error will be in anError (use of ref) + @return aBoolean for the success or fail of the method +*/ +- (BOOL)getObjectValue:(idRef)anObject forString:(CPString)aString errorDescription:(CPStringRef)anError { - // TODO Error handling. var value = [self dateFromString:aString]; @deref(anObject) = value; + if (!value) + { + if (anError) + @deref(anError) = @"The value \"" + aString + "\" is invalid."; + + return NO; + } + return YES; } +/*! Return a date representation of the given string and format + @patam aDate + @param aFormat + @return a string +*/ +- (CPDate)_dateFromString:(CPString)aString format:(CPString)aFormat +{ + // Interpret @"" as the date 2000-01-01 00:00:00 +0000, like in Cocoa. No idea why they picked this particular date. + if (!aString) + return [[CPDate alloc] initWithTimeIntervalSinceReferenceDate:-31622400]; + + if (aFormat == nil) + return nil; + + var currentToken = [CPString new], + isTextToken = NO, + tokens = [CPArray array], + dateComponents = [CPArray array], + patternTokens = [CPArray array]; + + for (var i = 0; i < [aFormat length]; i++) + { + var character = [aFormat characterAtIndex:i]; + + if (isTextToken) + { + if ([character isEqualToString:@"'"]) + currentToken = [CPString new]; + + continue; + } + + if ([character isEqualToString:@"'"]) + { + if (!isTextToken) + isTextToken = YES; + + continue; + } + + if ([character isEqualToString:@","] || [character isEqualToString:@":"] || [character isEqualToString:@"/"] || [character isEqualToString:@"-"] || [character isEqualToString:@" "]) + { + [tokens addObject:currentToken]; + + if ([patternStringTokens containsObject:currentToken]) + [patternTokens addObject:[tokens count] - 1]; + + currentToken = [CPString new]; + } + else + { + if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character]) + { + [tokens addObject:currentToken]; + + if ([patternStringTokens containsObject:currentToken]) + [patternTokens addObject:[tokens count] - 1]; + + currentToken = [CPString new]; + } + + currentToken += character; + + if (i == ([aFormat length] - 1)) + { + [tokens addObject:currentToken]; + + if ([patternStringTokens containsObject:currentToken]) + [patternTokens addObject:[tokens count] - 1]; + } + } + } + + isTextToken = NO; + currentToken = [CPString new]; + + var currentIndexSpecialPattern = 0; + + if ([patternTokens count] == 0) + [patternTokens addObject:CPNotFound]; + + for (var i = 0; i < [aString length]; i++) + { + var character = [aString characterAtIndex:i]; + + if (isTextToken) + { + if ([character isEqualToString:@"'"]) + currentToken = [CPString new]; + + continue; + } + + if ([character isEqualToString:@"'"]) + { + if (!isTextToken) + isTextToken = YES; + + continue; + } + + // Need to do this to check if the word match with the token. We can get some words with space... + if ([dateComponents count] == [patternTokens objectAtIndex:currentIndexSpecialPattern]) + { + var j = [self _lastIndexMatchedString:aString token:[tokens objectAtIndex:[dateComponents count]] index:i]; + + if (j == CPNotFound) + return nil; + + currentIndexSpecialPattern++; + [dateComponents addObject:[aString substringWithRange:CPMakeRange(i, (j - i))]]; + i = j; + + continue; + } + + if ([character isEqualToString:@","] || [character isEqualToString:@":"] || [character isEqualToString:@"/"] || [character isEqualToString:@"-"] || [character isEqualToString:@" "]) + { + [dateComponents addObject:currentToken]; + currentToken = [CPString new]; + } + else + { + currentToken += character; + + if (i == ([aString length] - 1)) + [dateComponents addObject:currentToken]; + } + } + + if ([dateComponents count] != [tokens count]) + return nil; + + return [self _dateFromTokens:tokens dateComponents:dateComponents]; +} + +- (CPDate)_dateFromTokens:(CPArray)tokens dateComponents:(CPArray)dateComponents +{ + var timeZoneseconds = [_timeZone secondsFromGMT], + dateArray = [2000, 01, 01, 00, 00, 00, @"+0000"], + isPM = NO, + dayOfYear, + dayIndexInWeek, + weekOfYear, + weekOfMonth; + + for (var i = 0; i < [tokens count]; i++) + { + var token = [tokens objectAtIndex:i], + dateComponent = [dateComponents objectAtIndex:i], + character = [token characterAtIndex:0], + length = [token length]; + + switch (character) + { + case @"G": + // TODO + CPLog.warn(@"Token not yet implemented " + token); + break; + + case @"y": + var u = _twoDigitStartDate.getFullYear() % 10, + d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10, + c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10, + m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10; + + if (length == 2 && dateComponent.length == 2) + { + if ((u + d * 10) >= parseInt(dateComponent)) + dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent); + else + dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent); + } + else + { + dateArray[0] = parseInt(dateComponent); + } + + break; + + case @"Y": + var u = _twoDigitStartDate.getFullYear() % 10, + d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10, + c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10, + m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10; + + if (length == 2 && dateComponent.length == 2) + { + if ((u + d * 10) >= parseInt(dateComponent)) + dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent); + else + dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent); + } + else + { + dateArray[0] = parseInt(dateComponent); + } + + break; + + case @"u": + // TODO + CPLog.warn(@"Token not yet implemented " + token); + break; + + case @"U": + // TODO + CPLog.warn(@"Token not yet implemented " + token); + break; + + case @"Q": + var month; + + if (length <= 2) + month = (parseInt(dateComponent) - 1) * 3; + + if (length == 3) + { + if (![[self shortQuarterSymbols] containsObject:dateComponent]) + return nil; + + month = [[self shortQuarterSymbols] indexOfObject:dateComponent] * 3; + } + + if (length >= 4) + { + if (![[self quarterSymbols] containsObject:dateComponent]) + return nil; + + month = [[self quarterSymbols] indexOfObject:dateComponent] * 3; + } + + if (month > 11) + return nil; + + dateArray[1] = month + 1; + break; + + case @"q": + var month; + + if (length <= 2) + month = (parseInt(dateComponent) - 1) * 3; + + if (length == 3) + { + if (![[self shortQuarterSymbols] containsObject:dateComponent]) + return nil; + + month = [[self shortQuarterSymbols] indexOfObject:dateComponent] * 3; + } + + if (length >= 4) + { + if (![[self quarterSymbols] containsObject:dateComponent]) + return nil; + + month = [[self quarterSymbols] indexOfObject:dateComponent] * 3; + } + + if (month > 11) + return nil; + + dateArray[1] = month + 1; + break; + + case @"M": + var month; + + if (length <= 2) + month = parseInt(dateComponent) + + if (length == 3) + { + if (![[self shortMonthSymbols] containsObject:dateComponent]) + return nil; + + month = [[self shortMonthSymbols] indexOfObject:dateComponent] + 1; + } + + if (length == 4) + { + if (![[self monthSymbols] containsObject:dateComponent]) + return nil; + + month = [[self monthSymbols] indexOfObject:dateComponent] + 1; + } + + if (month > 11 || length >= 5) + return nil; + + dateArray[1] = month; + break; + + case @"L": + var month; + + if (length <= 2) + month = parseInt(dateComponent); + + if (length == 3) + { + if (![[self shortStandaloneMonthSymbols] containsObject:dateComponent]) + return nil; + + month = [[self shortStandaloneMonthSymbols] indexOfObject:dateComponent] + 1; + } + + if (length == 4) + { + if (![[self standaloneMonthSymbols] containsObject:dateComponent]) + return nil; + + month = [[self standaloneMonthSymbols] indexOfObject:dateComponent] + 1; + } + + if (month > 11 || length >= 5) + return nil; + + dateArray[1] = month; + break; + + case @"I": + // Deprecated + CPLog.warn(@"Depreacted - Token not yet implemented " + token); + break; + + case @"w": + if (dateComponent > 52) + return nil; + + weekOfYear = dateComponent; + break; + + case @"W": + if (dateComponent > 52) + return nil; + + weekOfMonth = dateComponent; + break; + + case @"d": + dateArray[2] = parseInt(dateComponent); + break; + + case @"D": + if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 345) + return nil; + + dayOfYear = parseInt(dateComponent); + break; + + case @"F": + if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 5 || parseInt(dateComponent) == 0) + return nil; + + if (parseInt(dateComponent) == 1) + dateArray[2] = 1; + + if (parseInt(dateComponent) == 2) + dateArray[2] = 8; + + if (parseInt(dateComponent) == 3) + dateArray[2] = 15; + + if (parseInt(dateComponent) == 4) + dateArray[2] = 22; + + if (parseInt(dateComponent) == 5) + dateArray[2] = 29; + + break; + + case @"g": + CPLog.warn(@"Token not yet implemented " + token); + break; + + case @"E": + if (length <= 3) + dayIndexInWeek = [[self shortWeekdaySymbols] indexOfObject:dateComponent]; + + if (length == 4) + dayIndexInWeek = [[self weekdaySymbols] indexOfObject:dateComponent]; + + if (dayIndexInWeek == CPNotFound || length >= 5) + return nil; + + break; + + case @"e": + if (length <= 2 && isNaN(parseInt(dateComponent))) + return nil; + + if (length <= 2) + dayIndexInWeek = parseInt(dateComponent); + + if (length == 3) + dayIndexInWeek = [[self shortWeekdaySymbols] indexOfObject:dateComponent]; + + if (length == 4) + dayIndexInWeek = [[self weekdaySymbols] indexOfObject:dateComponent]; + + if (dayIndexInWeek == CPNotFound || length >= 5) + return nil; + + break; + + case @"c": + if (length <= 2 && isNaN(parseInt(dateComponent))) + return nil; + + if (length <= 2) + dayIndexInWeek = dateComponent; + + if (length == 3) + dayIndexInWeek = [[self shortStandaloneWeekdaySymbols] indexOfObject:dateComponent]; + + if (length == 4) + dayIndexInWeek = [[self standaloneWeekdaySymbols] indexOfObject:dateComponent]; + + if (length == 5) + dayIndexInWeek = [[self veryShortStandaloneWeekdaySymbols] indexOfObject:dateComponent]; + + if (dayIndexInWeek == CPNotFound || length >= 5) + return nil; + + break; + + case @"a": + if (![dateComponent isEqualToString:[self PMSymbol]] && ![dateComponent isEqualToString:[self AMSymbol]]) + return nil; + + if ([dateComponent isEqualToString:[self PMSymbol]]) + isPM = YES; + + break; + + case @"h": + if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12) + return nil; + + dateArray[3] = parseInt(dateComponent); + break; + + case @"H": + if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 23) + return nil; + + dateArray[3] = parseInt(dateComponent); + break; + + case @"K": + if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 11) + return nil; + + dateArray[3] = parseInt(dateComponent); + break; + + case @"k": + if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12) + return nil; + + dateArray[3] = parseInt(dateComponent); + break; + + case @"j": + CPLog.warn(@"Token not yet implemented " + token); + break; + + case @"m": + var minutes = parseInt(dateComponent); + + if (minutes > 59) + return nil; + + dateArray[4] = minutes; + break; + + case @"s": + var seconds = parseInt(dateComponent); + + if (seconds > 59) + return nil; + + dateArray[5] = seconds; + break; + + case @"S": + if (isNaN(parseInt(dateComponent))) + return nil; + + break; + + case @"A": + if (isNaN(parseInt(dateComponent))) + return nil; + + var millisecondsInDay = parseInt(dateComponent), + tmpDate = new Date(); + + tmpDate.setHours(0); + tmpDate.setMinutes(0); + tmpDate.setSeconds(0); + tmpDate.setMilliseconds(0); + + tmpDate.setMilliseconds(millisecondsInDay); + + dateArray[3] = tmpDate.getHours(); + dateArray[4] = tmpDate.getMinutes(); + dateArray[5] = tmpDate.getSeconds(); + break; + + case @"z": + if (length < 4) + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortDaylightSaving]; + else + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleDaylightSaving]; + + if (!timeZoneseconds) + timeZoneseconds = [self _secondsFromTimeZoneDefaultFormatString:dateComponent]; + + if (!timeZoneseconds) + return nil; + + timeZoneseconds = timeZoneseconds + 60 * 60; + + break; + + case @"Z": + timeZoneseconds = [self _secondsFromTimeZoneDefaultFormatString:dateComponent]; + + if (!timeZoneseconds) + return nil; + + timeZoneseconds = timeZoneseconds + 60 * 60; + + break; + + case @"v": + if (length <= 3) + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortGeneric]; + else + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleGeneric]; + + if (!timeZoneseconds && length == 4) + timeZoneseconds = [self _secondsFromTimeZoneDefaultFormatString:dateComponent]; + + if (!timeZoneseconds) + return nil; + + timeZoneseconds = timeZoneseconds + 60 * 60; + + break; + + case @"V": + if (length <= 3) + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortStandard]; + else + timeZoneseconds = [self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleStandard]; + + if (!timeZoneseconds) + timeZoneseconds = [self _secondsFromTimeZoneDefaultFormatString:dateComponent]; + + if (!timeZoneseconds) + return nil; + + timeZoneseconds = timeZoneseconds + 60 * 60; + + break; + + default: + CPLog.warn(@"No pattern found for " + token); + return nil; + } + } + + // Make the calcul day of the year + if (dayOfYear) + { + var tmpDate = new Date(); + tmpDate.setFullYear(dateArray[0]); + tmpDate.setMonth(0); + + tmpDate.setDate(dayOfYear) + + dateArray[1] = tmpDate.getMonth() + 1; + dateArray[2] = tmpDate.getDate(); + } + + if (weekOfMonth) + dateArray[2] = (weekOfMonth - 1) * 7 + 1; + + if (weekOfYear) + { + var tmpDate = new Date(); + tmpDate.setFullYear(dateArray[0]); + tmpDate.setMonth(0); + tmpDate.setDate(1); + + while (tmpDate.getDay() != 0) + tmpDate.setDate(tmpDate.getDate() + 1); + + tmpDate.setDate(tmpDate.getDate() + (weekOfYear - 1) * 7); + + dateArray[1] = tmpDate.getMonth() + 1; + dateArray[2] = tmpDate.getDate() - 1; + } + + // Check if the day is possible in the current month + var tmpDate = new Date(); + tmpDate.setMonth(dateArray[1] - 1); + tmpDate.setFullYear(dateArray[0]); + + if (dateArray[2] <= 0 || dateArray[2] > [tmpDate _daysInMonth]) + return nil; + + // PM hours + if (isPM) + dateArray[3] += 12; + + if (isNaN(parseInt(dateArray[0])) || isNaN(parseInt(dateArray[1])) || isNaN(parseInt(dateArray[2])) || isNaN(parseInt(dateArray[3])) || isNaN(parseInt(dateArray[4])) || isNaN(parseInt(dateArray[5])) || isNaN(parseInt(dateArray[6]))) + return nil; + + var dateResult = [[CPDate alloc] initWithString:[CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d %s", dateArray[0], dateArray[1], dateArray[2], dateArray[3], dateArray[4], dateArray[5], dateArray[6]]]; + dateResult.setSeconds(dateResult.getSeconds() - timeZoneseconds + 60 * 60); + + return dateResult; +} + + +#pragma mark - +#pragma mark Utils + +- (CPString)_stringValueForValue:(id)aValue length:(int)length +{ + var string = [CPString stringWithFormat:@"%i", aValue]; + + if ([string length] == length) + return string; + + if ([string length] > length) + return [string substringFromIndex:([string length] - length)]; + + while ([string length] < length) + string = [CPString stringWithFormat:@"0%s", string]; + + return string; +} + +/*! 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"]; +} + +/*! Returns the number of second from a time zone (-8000 or HGP-8:35 or GMT-08:00) +*/ +- (int)_secondsFromTimeZoneDefaultFormatString:(CPString)aTimeZoneFormatString +{ + var format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/, + result = aTimeZoneFormatString.match(new RegExp(format)), + seconds = 0; + + if (!result) + return nil; + + seconds = result[3] * 60 * 60 + result[5] * 60; + + if ([result[2] isEqualToString:@"-"]) + seconds = -seconds; + + return seconds; +} + +/*! Return the number of seconds from a timeZoneString +*/ +- (int)_secondsFromTimeZoneString:(CPString)aTimeZoneString style:(NSTimeZoneNameStyle)aStyle +{ + var timeZone = [CPTimeZone _timeZoneFromString:aTimeZoneString style:aStyle locale:_locale]; + + if (!timeZone) + return nil; + + return [timeZone secondsFromGMT]; +} + +/*! This method is used to know if the given string match with the token. + @param aString + @param aToken + @param anIndex the current index in the string + @return an index who describes the position of the end of the word for the token +*/ +- (int)_lastIndexMatchedString:(CPString)aString token:(CPString)aToken index:anIndex +{ + var character = [aToken characterAtIndex:0], + length = [aToken length], + targetedArray, + format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/, + result = aString.match(new RegExp(format)); + + switch (character) + { + case @"Q": + if (length == 3) + targetedArray = [self shortQuarterSymbols]; + + if (length >= 4) + targetedArray = [self quarterSymbols]; + + break; + + case @"q": + if (length == 3) + targetedArray = [self shortStandaloneQuarterSymbols]; + + if (length >= 4) + targetedArray = [self standaloneQuarterSymbols]; + + break; + + case @"M": + if (length == 3) + targetedArray = [self shortMonthSymbols]; + + if (length == 4) + targetedArray = [self monthSymbols]; + + if (length >= 5) + targetedArray = [self veryShortMonthSymbols]; + + break; + + case @"L": + if (length == 3) + targetedArray = [self shortStandaloneMonthSymbols]; + + if (length == 4) + targetedArray = [self standaloneMonthSymbols]; + + if (length >= 5) + targetedArray = [self veryShortStandaloneMonthSymbols]; + + break; + + case @"E": + if (length <= 3) + targetedArray = [self shortWeekdaySymbols]; + + if (length == 4) + targetedArray = [self weekdaySymbols]; + + if (length >= 5) + targetedArray = [self veryShortWeekdaySymbols]; + + break; + + case @"e": + if (length == 3) + targetedArray = [self shortWeekdaySymbols]; + + if (length == 4) + targetedArray = [self weekdaySymbols]; + + if (length >= 5) + targetedArray = [self veryShortWeekdaySymbols]; + + break; + + case @"c": + if (length == 3) + targetedArray = [self shortStandaloneWeekdaySymbols]; + + if (length == 4) + targetedArray = [self standaloneWeekdaySymbols]; + + if (length >= 5) + targetedArray = [self veryShortStandaloneWeekdaySymbols]; + + break; + + case @"a": + targetedArray = [[self PMSymbol], [self AMSymbol]]; + break; + + case @"z": + if (length <= 3) + targetedArray = [CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortDaylightSaving locale:_locale]; + else + targetedArray = [CPTimeZone _namesForStyle:CPTimeZoneNameStyleDaylightSaving locale:_locale]; + + if (result) + return anIndex + [result objectAtIndex:0].length; + + break; + + case @"Z": + if (result) + return anIndex + [result objectAtIndex:0].length; + + return CPNotFound; + + case @"v": + if (length == 1) + targetedArray = [CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortGeneric locale:_locale]; + else if (length == 4) + targetedArray = [CPTimeZone _namesForStyle:CPTimeZoneNameStyleGeneric locale:_locale]; + + if (result) + return anIndex + [result objectAtIndex:0].length; + + break; + + case @"V": + if (length == 1) + targetedArray = [CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortStandard locale:_locale]; + + if (result) + return anIndex + [result objectAtIndex:0].length; + + break; + + default: + CPLog.warn(@"No pattern found for " + aToken); + return CPNotFound; + } + + for (var i = 0; i < [targetedArray count]; i++) + { + var currentObject = [targetedArray objectAtIndex:i], + range = [aString rangeOfString:currentObject]; + + if (range.length == 0) + continue; + + character = [aString characterAtIndex:(anIndex + range.length)]; + + if ([character isEqualToString:@"'"] || [character isEqualToString:@","] || [character isEqualToString:@":"] || [character isEqualToString:@"/"] || [character isEqualToString:@"-"] || [character isEqualToString:@" "] || [character isEqualToString:@""]) + return anIndex + range.length; + } + + return CPNotFound; +} + @end -var CPDateFormatterStyleKey = @"CPDateFormatterStyle", +var CPDateFormatterDateStyleKey = @"CPDateFormatterDateStyle", + CPDateFormatterTimeStyleKey = @"CPDateFormatterTimeStyleKey", + CPDateFormatterFormatterBehaviorKey = @"CPDateFormatterFormatterBehaviorKey", + CPDateFormatterDoseRelativeDateFormattingKey = @"CPDateFormatterDoseRelativeDateFormattingKey", + CPDateFormatterDateFormatKey = @"CPDateFormatterDateFormatKey", + CPDateFormatterAllowNaturalLanguageKey = @"CPDateFormatterAllowNaturalLanguageKey", CPDateFormatterLocaleKey = @"CPDateFormatterLocaleKey"; @implementation CPDateFormatter (CPCoding) @@ -122,10 +2083,17 @@ var CPDateFormatterStyleKey = @"CPDateFormatterStyle", if (self) { - _dateStyle = [aCoder decodeIntForKey:CPDateFormatterStyleKey]; + _allowNaturalLanguage = [aCoder decodeBoolForKey:CPDateFormatterAllowNaturalLanguageKey]; + _dateFormat = [aCoder decodeObjectForKey:CPDateFormatterDateFormatKey]; + _dateStyle = [aCoder decodeIntForKey:CPDateFormatterDateStyleKey]; + _doesRelativeDateFormatting = [aCoder decodeBoolForKey:CPDateFormatterDoseRelativeDateFormattingKey]; + _formatterBehavior = [aCoder decodeIntForKey:CPDateFormatterFormatterBehaviorKey]; _locale = [aCoder decodeObjectForKey:CPDateFormatterLocaleKey]; + _timeStyle = [aCoder decodeIntForKey:CPDateFormatterTimeStyleKey]; } + [self _init]; + return self; } @@ -133,8 +2101,29 @@ var CPDateFormatterStyleKey = @"CPDateFormatterStyle", { [super encodeWithCoder:aCoder]; - [aCoder encodeInt:_dateStyle forKey:CPDateFormatterStyleKey]; + [aCoder encodeBool:_allowNaturalLanguage forKey:CPDateFormatterAllowNaturalLanguageKey]; + [aCoder encodeInt:_dateStyle forKey:CPDateFormatterDateStyleKey]; + [aCoder encodeObject:_dateFormat forKey:CPDateFormatterDateFormatKey]; + [aCoder encodeBool:_doesRelativeDateFormatting forKey:CPDateFormatterDoseRelativeDateFormattingKey]; + [aCoder encodeInt:_formatterBehavior forKey:CPDateFormatterFormatterBehaviorKey]; [aCoder encodeInt:_locale forKey:CPDateFormatterLocaleKey]; + [aCoder encodeInt:_timeStyle forKey:CPDateFormatterTimeStyleKey]; +} + +@end + + +@implementation CPDate (CPTimeZone) + +/*! Convert a date from a timeZone +*/ +- (void)_dateWithTimeZone:(CPTimeZone)aTimeZone +{ + if (!aTimeZone) + return; + + self.setSeconds(self.getSeconds() - [aTimeZone secondsFromGMTForDate:self]); + self.setSeconds(self.getSeconds() + [aTimeZone secondsFromGMT]); } @end diff --git a/Foundation/CPDecimalNumber.j b/Foundation/CPDecimalNumber.j index c7b78d218..7221cd2e5 100644 --- a/Foundation/CPDecimalNumber.j +++ b/Foundation/CPDecimalNumber.j @@ -130,7 +130,20 @@ var CPDefaultDcmHandler = nil; @end // CPDecimalNumberBehaviors protocol -@implementation CPDecimalNumberHandler (CPDecimalNumberBehaviors) + +@protocol CPDecimalNumberBehaviors + +- (CPRoundingMode)roundingMode; + +- (short)scale; + // The scale could return NO_SCALE for no defined scale. + +- (CPDecimalNumber)exceptionDuringOperation:(SEL)operation error:(CPCalculationError)error leftOperand:(CPDecimalNumber)leftOperand rightOperand:(CPDecimalNumber)rightOperand; + // Receiver can raise, return a new value, or return nil to ignore the exception. + +@end + +@implementation CPDecimalNumberHandler (CPDecimalNumberBehaviors) /*! Returns the current rounding mode. One of \e CPRoundingMode enum: diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index 3ee48a7bd..b95792f78 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -27,7 +27,9 @@ @import "CPObject.j" //FIXME: After release of 0.9.7 remove below variable -var CPDictionaryShowNilDeprecationMessage = YES; +var CPDictionaryShowNilDeprecationMessage = YES, + + CPDictionaryMaxDescriptionRecursion = 10; /* @ignore */ @implementation _CPDictionaryValueEnumerator : CPEnumerator @@ -721,10 +723,12 @@ var CPDictionaryShowNilDeprecationMessage = YES; - (CPString)description { var string = "@{", - keys = self._keys, + keys = [self allKeys], index = 0, count = self._count; + keys.sort(); + for (; index < count; ++index) { if (index === 0) @@ -733,7 +737,7 @@ var CPDictionaryShowNilDeprecationMessage = YES; var key = keys[index], value = self.valueForKey(key); - string += " @\"" + key + "\": " + CPDescriptionOfObject(value).split("\n").join("\n ") + (index + 1 < count ? "," : "") + "\n"; + string += " @\"" + key + "\": " + CPDescriptionOfObject(value, CPDictionaryMaxDescriptionRecursion).split("\n").join("\n ") + (index + 1 < count ? "," : "") + "\n"; } return string + "}"; diff --git a/Foundation/CPError.j b/Foundation/CPError.j index 34a53bee5..4acafe2ce 100644 --- a/Foundation/CPError.j +++ b/Foundation/CPError.j @@ -91,7 +91,7 @@ CPFilePathErrorKey = @"CPFilePathErrorKey"; return [_userInfo objectForKey:CPRecoveryAttempterErrorKey]; } -- (id)description +- (CPString)description { return [CPString stringWithFormat:@"Error Domain=%@ Code=%d UserInfo=%p %@", _domain, _code, _userInfo, [self localizedDescription]]; } diff --git a/Foundation/CPException.j b/Foundation/CPException.j index be23f3d62..290d3a877 100755 --- a/Foundation/CPException.j +++ b/Foundation/CPException.j @@ -71,6 +71,22 @@ if (input == nil) [[self exceptionWithName:aName reason:aReason userInfo:nil] raise]; } +/*! + Raises an exception with a name and a formatted reason. + @param aName the name of the exception to raise + @param aFormat the reason for the exception in sprintf style + @param ... the arguments for the sprintf format +*/ ++ (void)raise:(CPString)aName format:(CPString)aFormat, ... +{ + if (!aFormat) + [CPException raise:CPInvalidArgumentException + reason:"raise:format: the format can't be 'nil'"]; + + var aReason = ObjectiveJ.sprintf.apply(this, Array.prototype.slice.call(arguments, 3)); + [[self exceptionWithName:aName reason:aReason userInfo:nil] raise]; +} + /*! Creates an exception with a name, reason and user info. @param aName the name of the exception diff --git a/Foundation/CPIndexSet.j b/Foundation/CPIndexSet.j index b2a362300..c9f94fddb 100644 --- a/Foundation/CPIndexSet.j +++ b/Foundation/CPIndexSet.j @@ -1187,5 +1187,5 @@ X - (void)addIndex:(unsigned int)value; X - (void)removeIndex:(unsigned int)value; X - (void)addIndexesInRange:(NSRange)range; X - (void)removeIndexesInRange:(NSRange)range; - - (void)shiftIndexesStartingAtIndex:(unsigned int)index by:(int)delta; + - (void)shiftIndexesStartingAtIndex:(CPUInteger)index by:(int)delta; */ diff --git a/Foundation/CPInvocation.j b/Foundation/CPInvocation.j index 7cc5fbe32..a07b48952 100644 --- a/Foundation/CPInvocation.j +++ b/Foundation/CPInvocation.j @@ -105,7 +105,7 @@ @param anArgument the argument to add @param anIndex the index of the argument in the method */ -- (void)setArgument:(id)anArgument atIndex:(unsigned)anIndex +- (void)setArgument:(id)anArgument atIndex:(CPUInteger)anIndex { _arguments[anIndex] = anArgument; } @@ -116,7 +116,7 @@ @param anIndex the index of the argument to return @throws CPInvalidArgumentException if anIndex is greater than or equal to the invocation's number of arguments. */ -- (id)argumentAtIndex:(unsigned)anIndex +- (id)argumentAtIndex:(CPUInteger)anIndex { return _arguments[anIndex]; } diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index 9e7d319ba..fa86c5f9c 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -187,6 +187,12 @@ var CPObjectAccessorsForClassKey = @"$CPObjectAccessorsForClassKey", - (void)setValue:(id)aValue forKey:(CPString)aKey { + // setValue:forKey: should unwrap CPValue by default. In Objective-C we would need to care about which type + // the setter takes (or target ivar) and send [aValue rectValue], [aValue pointValue] etc, but in + // Objective-C we can use them interchangably. + if (aValue && aValue.isa && [aValue isKindOfClass:CPValue]) + aValue = [aValue JSObject]; + var theClass = [self class], modifier = nil, modifiers = theClass[CPObjectModifiersForClassKey]; diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 1115d8cd9..5dc1257a0 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -135,7 +135,7 @@ } } -- (void)addObserver:(id)anObserver forKeyPath:(CPString)aPath options:(unsigned)options context:(id)aContext +- (void)addObserver:(id)anObserver forKeyPath:(CPString)aPath options:(CPKeyValueObservingOptions)options context:(id)aContext { if (!anObserver || !aPath) return; @@ -742,7 +742,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti } } -- (void)_addObserver:(id)anObserver forKeyPath:(CPString)aPath options:(unsigned)options context:(id)aContext +- (void)_addObserver:(id)anObserver forKeyPath:(CPString)aPath options:(CPKeyValueObservingOptions)options context:(id)aContext { if (!anObserver) return; @@ -1003,7 +1003,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti @end -@implementation _CPKVOModelSubclass +@implementation _CPKVOModelSubclass : CPObject { } @@ -1129,7 +1129,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew | CPKeyValueObservingOpti @end -@implementation _CPKVOModelDictionarySubclass +@implementation _CPKVOModelDictionarySubclass : CPObject { } diff --git a/Foundation/CPKeyedUnarchiver.j b/Foundation/CPKeyedUnarchiver.j index 1a01beb8e..8fe7480d7 100644 --- a/Foundation/CPKeyedUnarchiver.j +++ b/Foundation/CPKeyedUnarchiver.j @@ -469,11 +469,14 @@ var _CPKeyedUnarchiverDecodeObjectAtIndex = function(self, anIndex) if (!theClass) theClass = CPClassFromString(className); - if (!theClass && (self._delegateSelectors & CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_)) - theClass = [_delegate unarchiver:self cannotDecodeObjectOfClassName:className originalClasses:classes]; + if (!theClass && + (self._delegateSelectors & CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_)) + { + theClass = [self._delegate unarchiver:self cannotDecodeObjectOfClassName:className originalClasses:classes]; + } if (!theClass) - [CPException raise:CPInvalidUnarchiveOperationException reason:@"-[CPKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (" + className + @")"]; + [CPException raise:CPInvalidUnarchiveOperationException format:@"-[CPKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (%@)", className]; var savedPlistObject = self._plistObject; diff --git a/Foundation/CPLocale.j b/Foundation/CPLocale.j index 01945215c..219b5c690 100644 --- a/Foundation/CPLocale.j +++ b/Foundation/CPLocale.j @@ -23,47 +23,47 @@ @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"; +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"; +CPLocaleAlternateQuotationEndDelimiterKey = @"CPLocaleAlternateQuotationEndDelimiterKey"; -CPGregorianCalendar = @"CPGregorianCalendar"; -CPBuddhistCalendar = @"CPBuddhistCalendar"; -CPChineseCalendar = @"CPChineseCalendar"; -CPHebrewCalendar = @"CPHebrewCalendar"; -CPIslamicCalendar = @"CPIslamicCalendar"; -CPIslamicCivilCalendar = @"CPIslamicCivilCalendar"; -CPJapaneseCalendar = @"CPJapaneseCalendar"; -CPRepublicOfChinaCalendar = @"CPRepublicOfChinaCalendar"; -CPPersianCalendar = @"CPPersianCalendar"; -CPIndianCalendar = @"CPIndianCalendar"; -CPISO8601Calendar = @"CPISO8601Calendar"; +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"; +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"]; + availableLocaleIdentifiers = [@"de_DE", @"en_GB", @"en_US", @"es_ES", @"fr_FR"]; var sharedSystemLocale = nil, sharedCurrentLocale = nil; @@ -83,35 +83,36 @@ var sharedSystemLocale = nil, return sharedSystemLocale; } -/*! Return the current locale base on the navigator +/*! Return the current locale based on the navigator string. */ + (id)currentLocale { if (!sharedCurrentLocale) { - var localeIdentifier, + var localeIdentifier = @"en_US", language; - if (typeof navigator != "undefined") + if (typeof navigator !== "undefined") { - if (navigator.appVersion.indexOf("MSIE") >= 0) - language = navigator.browserLanguage.substring(0,2); - else - language = navigator.language.substring(0,2); + // userLanguage is an IE only property. + language = (typeof navigator.language !== "undefined") ? navigator.language : navigator.userLanguage; - language = [CPString stringWithFormat:@"%s_%s", [language lowercaseString], [language uppercaseString]]; + if (language) + { + // Browsers use locale strings such as "en-US", but CPLocale uses "en_US". + language = language.replace("-", "_").substring(0, 5); + // Some browsers have "en_us" at this point, while we want "en_US". + language = language.substring(0, 3).toLowerCase() + language.substring(3, 5).toUpperCase(); - if ([availableLocaleIdentifiers indexOfObject:language]) - localeIdentifier = language; + if ([availableLocaleIdentifiers indexOfObject:language] !== CPNotFound) + localeIdentifier = language; + } } - if (!localeIdentifier) - localeIdentifier = @"en_US"; - sharedCurrentLocale = [[CPLocale alloc] initWithLocaleIdentifier:localeIdentifier]; } - return sharedCurrentLocale + return sharedCurrentLocale; } /*! Return an array of the availableLocaleIdentifiers @@ -155,25 +156,25 @@ var sharedSystemLocale = nil, { if (self == [super init]) { - var parts = [anIdentifier componentsSeparatedByString:@"_"], - language = [parts objectAtIndex:0], - country = nil; + var parts = [anIdentifier componentsSeparatedByString:@"_"], + language = [parts objectAtIndex:0], + country = nil; if ([parts count] > 1) - country = [parts objectAtIndex:1]; + country = [parts objectAtIndex:1]; else - country = anIdentifier; + 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:)]) + 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]; + // 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 { diff --git a/Foundation/CPNumber.j b/Foundation/CPNumber.j index 2035efce0..33bcb73ac 100644 --- a/Foundation/CPNumber.j +++ b/Foundation/CPNumber.j @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@import "CPException.j" +@import "CPNull.j" @import "CPObject.j" @import "CPObjJRuntime.j" @@ -48,7 +50,7 @@ var CPNumberUIDs = new CFMutableDictionary(); + (id)numberWithBool:(BOOL)aBoolean { - return aBoolean; + return aBoolean ? 1 : 0; } + (id)numberWithChar:(char)aChar @@ -314,6 +316,9 @@ FIXME: Do we need this? - (CPComparisonResult)compare:(CPNumber)aNumber { + if (aNumber === nil || aNumber['isa'] === CPNull) + [CPException raise:CPInvalidArgumentException reason:"nil argument"]; + if (self > aNumber) return CPOrderedDescending; else if (self < aNumber) diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index 2299ea10e..f59dca490 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -160,6 +160,14 @@ var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?'); } } ++ (CPString)localizedStringFromNumber:(CPNumber)num numberStyle:(CPNumberFormatterStyle)localizationStyle +{ + var formatter = [[CPNumberFormatter alloc] init]; + [formatter setNumberStyle:localizationStyle]; + + return [formatter stringFromNumber:num]; +} + - (CPNumber)numberFromString:(CPString)aString { if (_generatesDecimalNumbers) @@ -181,7 +189,7 @@ var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?'); return [self stringForObjectValue:anObject]; } -- (BOOL)getObjectValue:(id)anObjectRef forString:(CPString)aString errorDescription:(CPString)anErrorRef +- (BOOL)getObjectValue:(idRef)anObjectRef forString:(CPString)aString errorDescription:(CPStringRef)anErrorRef { // Interpret an empty string as nil, like in Cocoa. if (aString === @"") @@ -301,13 +309,16 @@ var CPNumberFormatterStyleKey = @"CPNumberFormatterStyleKey", _numberStyle = [aCoder decodeIntForKey:CPNumberFormatterStyleKey]; _minimumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMinimumFractionDigitsKey]; _maximumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMaximumFractionDigitsKey]; - _minimum = [aCoder decodeIntForKey:CPNumberFormatterMinimumKey]; - _maximum = [aCoder decodeIntForKey:CPNumberFormatterMaximumKey]; _roundingMode = [aCoder decodeIntForKey:CPNumberFormatterRoundingModeKey]; _groupingSeparator = [aCoder decodeObjectForKey:CPNumberFormatterGroupingSeparatorKey]; _currencyCode = [aCoder decodeObjectForKey:CPNumberFormatterCurrencyCodeKey]; _currencySymbol = [aCoder decodeObjectForKey:CPNumberFormatterCurrencySymbolKey]; _generatesDecimalNumbers = [aCoder decodeBoolForKey:CPNumberFormatterGeneratesDecimalNumbers]; + + // We decode _minimum and _maximum as object here because otherwise, nil values are not preserved + // causing a min and max always set to 0 after an decoding. + _minimum = [aCoder decodeObjectForKey:CPNumberFormatterMinimumKey]; + _maximum = [aCoder decodeObjectForKey:CPNumberFormatterMaximumKey]; } return self; diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index 71b1bd6b5..ae5a39ac1 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -67,7 +67,42 @@ CPLog(@"Got some class: %@", inst); @global CPInvalidArgumentException -@implementation CPObject + +@protocol CPObject + +- (BOOL)isEqual:(id)object; +- (CPUInteger)hash; + +- (Class)superclass; +- (Class)class; +- (id)self; + +- (id)performSelector:(SEL)aSelector; +- (id)performSelector:(SEL)aSelector withObject:(id)object; +- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; + +- (BOOL)isProxy; + +- (BOOL)isKindOfClass:(Class)aClass; +- (BOOL)isMemberOfClass:(Class)aClass; +- (BOOL)conformsToProtocol:(Protocol)aProtocol; + +- (BOOL)respondsToSelector:(SEL)aSelector; + +- (CPString)description; +@optional +- (CPString)debugDescription; + +@end + +@protocol CPCoding + +- (void)encodeWithCoder:(CPCoder)aCoder; +- (id)initWithCoder:(CPCoder)aDecoder; + +@end + +@implementation CPObject { Class isa; } @@ -254,6 +289,26 @@ CPLog(@"Got some class: %@", inst); return NO; } +/*! + Test whether instances of this class conforms to the provided protocol. + @param aProtocol the protocol for which to test the class + @return \c YES if instances of the class conforms to the protocol +*/ ++ (BOOL)conformsToProtocol:(Protocol)aProtocol +{ + return class_conformsToProtocol(self, aProtocol); +} + +/*! + Tests whether the receiver conforms to the provided protocol. + @param protocol the protocol for which to test the class + @return \c YES if instances of the class conforms to the protocol +*/ +- (BOOL)conformsToProtocol:(Protocol)aProtocol +{ + return class_conformsToProtocol(isa, aProtocol); +} + // Obtaining method information /*! @@ -536,7 +591,7 @@ CPLog(@"Got some class: %@", inst); @end -function CPDescriptionOfObject(anObject) +function CPDescriptionOfObject(anObject, maximumRecursionDepth) { if (anObject === nil) return "nil"; @@ -544,11 +599,20 @@ function CPDescriptionOfObject(anObject) if (anObject === undefined) return "undefined"; + if (anObject === window) + return "window"; + + if (maximumRecursionDepth === 0) + return "..."; + if (anObject.isa) { if ([anObject isKindOfClass:CPString]) return '@"' + [anObject description] + '"'; + if ([anObject respondsToSelector:@selector(_descriptionWithMaximumDepth:)]) + return [anObject _descriptionWithMaximumDepth:maximumRecursionDepth !== undefined ? maximumRecursionDepth - 1 : maximumRecursionDepth]; + return [anObject description]; } @@ -581,7 +645,10 @@ function CPDescriptionOfObject(anObject) if (i === 0) desc += "\n"; - desc += " " + properties[i] + ": " + CPDescriptionOfObject(anObject[properties[i]]).split("\n").join("\n "); + var value = anObject[properties[i]], + valueDescription = CPDescriptionOfObject(value, maximumRecursionDepth !== undefined ? maximumRecursionDepth - 1 : maximumRecursionDepth).split("\n").join("\n "); + + desc += " " + properties[i] + ": " + valueDescription; if (i < properties.length - 1) desc += ",\n"; diff --git a/Foundation/CPPredicate/CPComparisonPredicate.j b/Foundation/CPPredicate/CPComparisonPredicate.j index ffe374e7a..f2cfb3172 100644 --- a/Foundation/CPPredicate/CPComparisonPredicate.j +++ b/Foundation/CPPredicate/CPComparisonPredicate.j @@ -275,7 +275,7 @@ var CPComparisonPredicateModifier, if (self === anObject) return YES; - if (anObject.isa !== self.isa || _modifier !== [anObject comparisonPredicateModifier] || _type !== [anObject predicateOperatorType] || _options !== [anObject options] || _customSelector !== [anObject customSelector] || ![_left isEqual:[anObject leftExpression]] || ![_right isEqual:[anObject rightExpression]]) + if (anObject === nil || anObject.isa !== self.isa || _modifier !== [anObject comparisonPredicateModifier] || _type !== [anObject predicateOperatorType] || _options !== [anObject options] || _customSelector !== [anObject customSelector] || ![_left isEqual:[anObject leftExpression]] || ![_right isEqual:[anObject rightExpression]]) return NO; return YES; @@ -374,6 +374,9 @@ var CPComparisonPredicateModifier, var leftValue = [_left expressionValueWithObject:object context:variables], rightValue = [_right expressionValueWithObject:object context:variables]; + leftValue = (typeof leftValue == "boolean") ? [CPNumber numberWithBool:leftValue] : leftValue; + rightValue = (typeof rightValue == "boolean") ? [CPNumber numberWithBool:rightValue] : rightValue; + if (_modifier == CPDirectPredicateModifier) return [self _evaluateValue:leftValue rightValue:rightValue]; else diff --git a/Foundation/CPPredicate/CPCompoundPredicate.j b/Foundation/CPPredicate/CPCompoundPredicate.j index 8eaeb709f..e36ceb0d0 100644 --- a/Foundation/CPPredicate/CPCompoundPredicate.j +++ b/Foundation/CPPredicate/CPCompoundPredicate.j @@ -215,7 +215,7 @@ var CPCompoundPredicateType; if (self === anObject) return YES; - if (anObject.isa !== self.isa || _type !== [anObject compoundPredicateType] || ![_predicates isEqualToArray:[anObject subpredicates]]) + if (anObject === nil || anObject.isa !== self.isa || _type !== [anObject compoundPredicateType] || ![_predicates isEqualToArray:[anObject subpredicates]]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPAggregateExpression.j b/Foundation/CPPredicate/_CPAggregateExpression.j index b010881a7..688166398 100644 --- a/Foundation/CPPredicate/_CPAggregateExpression.j +++ b/Foundation/CPPredicate/_CPAggregateExpression.j @@ -42,7 +42,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![[object collection] isEqual:_aggregate]) + if (object === nil || object.isa !== self.isa || ![[object collection] isEqual:_aggregate]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPConstantValueExpression.j b/Foundation/CPPredicate/_CPConstantValueExpression.j index 5ffa9e07a..617c9b10a 100644 --- a/Foundation/CPPredicate/_CPConstantValueExpression.j +++ b/Foundation/CPPredicate/_CPConstantValueExpression.j @@ -45,7 +45,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![[object constantValue] isEqual:_value]) + if (object === nil || object.isa !== self.isa || ![[object constantValue] isEqual:_value]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPFunctionExpression.j b/Foundation/CPPredicate/_CPFunctionExpression.j index 75b1619fc..394c93612 100644 --- a/Foundation/CPPredicate/_CPFunctionExpression.j +++ b/Foundation/CPPredicate/_CPFunctionExpression.j @@ -72,7 +72,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![[object _function] isEqual:_selector] || ![[object operand] isEqual:_operand] || ![[object arguments] isEqualToArray:_arguments]) + if (object === nil || object.isa !== self.isa || ![[object _function] isEqual:_selector] || ![[object operand] isEqual:_operand] || ![[object arguments] isEqualToArray:_arguments]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPKeyPathExpression.j b/Foundation/CPPredicate/_CPKeyPathExpression.j index c0694b395..0f9ece8b6 100644 --- a/Foundation/CPPredicate/_CPKeyPathExpression.j +++ b/Foundation/CPPredicate/_CPKeyPathExpression.j @@ -51,7 +51,7 @@ if (object === self) return YES; - if (object.isa !== self.isa || ![[object keyPath] isEqualToString:[self keyPath]]) + if (object === nil || object.isa !== self.isa || ![[object keyPath] isEqualToString:[self keyPath]]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPPredicate.j b/Foundation/CPPredicate/_CPPredicate.j index d2d8544db..201bcccd0 100644 --- a/Foundation/CPPredicate/_CPPredicate.j +++ b/Foundation/CPPredicate/_CPPredicate.j @@ -190,7 +190,7 @@ if (self === anObject) return YES; - if (self.isa !== anObject.isa || _value !== [anObject evaluateWithObject:nil]) + if (anObject === nil || self.isa !== anObject.isa || _value !== [anObject evaluateWithObject:nil]) return NO; return YES; @@ -970,7 +970,7 @@ @end -var CPRaiseParseError = function CPRaiseParseError(aScanner, target) +var CPRaiseParseError = function(aScanner, target) { [CPException raise:CPInvalidArgumentException reason:@"unable to parse " + target + " at index " + [aScanner scanLocation]]; }; diff --git a/Foundation/CPPredicate/_CPSetExpression.j b/Foundation/CPPredicate/_CPSetExpression.j index f7d4e673b..a0e9df3bb 100644 --- a/Foundation/CPPredicate/_CPSetExpression.j +++ b/Foundation/CPPredicate/_CPSetExpression.j @@ -47,7 +47,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![[object leftExpression] isEqual:_left] || ![[object rightExpression] isEqual:_right]) + if (object === nil || object.isa !== self.isa || ![[object leftExpression] isEqual:_left] || ![[object rightExpression] isEqual:_right]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPSubqueryExpression.j b/Foundation/CPPredicate/_CPSubqueryExpression.j index 78b50be94..a94d88d2c 100644 --- a/Foundation/CPPredicate/_CPSubqueryExpression.j +++ b/Foundation/CPPredicate/_CPSubqueryExpression.j @@ -73,7 +73,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![_collection isEqual:[object collection]] || ![_variableExpression isEqual:[object variableExpression]] || ![_subpredicate isEqual:[object predicate]]) + if (object === nil || object.isa !== self.isa || ![_collection isEqual:[object collection]] || ![_variableExpression isEqual:[object variableExpression]] || ![_subpredicate isEqual:[object predicate]]) return NO; return YES; diff --git a/Foundation/CPPredicate/_CPVariableExpression.j b/Foundation/CPPredicate/_CPVariableExpression.j index c426d6c60..910ef23d5 100644 --- a/Foundation/CPPredicate/_CPVariableExpression.j +++ b/Foundation/CPPredicate/_CPVariableExpression.j @@ -48,7 +48,7 @@ if (self === object) return YES; - if (object.isa !== self.isa || ![[object variable] isEqual:_variable]) + if (object === nil || object.isa !== self.isa || ![[object variable] isEqual:_variable]) return NO; return YES; diff --git a/Foundation/CPScanner.j b/Foundation/CPScanner.j index ea2ffb3dc..f4c01c9df 100644 --- a/Foundation/CPScanner.j +++ b/Foundation/CPScanner.j @@ -329,7 +329,7 @@ /* = Debug = */ /* ========= */ -- (void)description +- (CPString)description { return [super description] + " {" + CPStringFromClass([self class]) + ", state = '" + ([self string].substr(0, _scanLocation) + "{{ SCAN LOCATION ->}}" + [self string].substr(_scanLocation)) + "'; }"; } diff --git a/Foundation/CPSet+KVO.j b/Foundation/CPSet+KVO.j index 2bc3560d0..d4648fe10 100644 --- a/Foundation/CPSet+KVO.j +++ b/Foundation/CPSet+KVO.j @@ -168,7 +168,7 @@ [_proxyObject setValue:anObject forKey:_key]; } -- (unsigned)count +- (CPUInteger)count { if (_count) return _count(_proxyObject, _countSEL); diff --git a/Foundation/CPString.j b/Foundation/CPString.j index dc04d6aa2..d9992ed8f 100644 --- a/Foundation/CPString.j +++ b/Foundation/CPString.j @@ -27,6 +27,7 @@ @import "CPSortDescriptor.j" @import "CPURL.j" @import "CPValue.j" +@import "CPNull.j" @class CPException @class CPURL @@ -205,7 +206,7 @@ var CPStringUIDs = new CFMutableDictionary(), Returns the character at the specified index. @param anIndex the index of the desired character */ -- (CPString)characterAtIndex:(unsigned)anIndex +- (CPString)characterAtIndex:(CPUInteger)anIndex { return self.charAt(anIndex); } @@ -248,7 +249,7 @@ var CPStringUIDs = new CFMutableDictionary(), @param anIndex the index of the padding string to start from (if necessary to use) @return the new padded string */ -- (CPString)stringByPaddingToLength:(unsigned)aLength withString:(CPString)aString startingAtIndex:(unsigned)anIndex +- (CPString)stringByPaddingToLength:(unsigned)aLength withString:(CPString)aString startingAtIndex:(CPUInteger)anIndex { if (self.length == aLength) return self; @@ -496,6 +497,9 @@ var CPStringUIDs = new CFMutableDictionary(), return [self compare:aString options:CPCaseInsensitiveSearch]; } +// This is for speed +var CPStringNull = [CPNull null]; + /*! Compares the receiver to the specified string, using options. @param aString the string with which to compare @@ -504,6 +508,12 @@ var CPStringUIDs = new CFMutableDictionary(), */ - (CPComparisonResult)compare:(CPString)aString options:(int)aMask { + if (aString === nil) + return CPOrderedDescending; + + if (aString === CPStringNull) + [CPException raise:CPInvalidArgumentException reason:"compare: argument can't be 'CPNull'"]; + var lhs = self, rhs = aString; @@ -586,7 +596,7 @@ var CPStringUIDs = new CFMutableDictionary(), /*! Returns a hash of the string instance. */ -- (unsigned)UID +- (CPString)UID { var UID = CPStringUIDs.valueForKey(self); diff --git a/Foundation/CPTimeZone.j b/Foundation/CPTimeZone.j new file mode 100644 index 000000000..3d294c25f --- /dev/null +++ b/Foundation/CPTimeZone.j @@ -0,0 +1,630 @@ +/* CPTimeZone.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" +@import "CPString.j" +@import "CPDate.j" +@import "CPLocale.j" + +CPTimeZoneNameStyleStandard = 0; +CPTimeZoneNameStyleShortStandard = 1; +CPTimeZoneNameStyleDaylightSaving = 2; +CPTimeZoneNameStyleShortDaylightSaving = 3; +CPTimeZoneNameStyleGeneric = 4; +CPTimeZoneNameStyleShortGeneric = 5; + +CPSystemTimeZoneDidChangeNotification = @"CPSystemTimeZoneDidChangeNotification"; + +var abbreviationDictionary, + timeDifferenceFromUTC, + knownTimeZoneNames, + defaultTimeZone, + localTimeZone, + systemTimeZone, + timeZoneDataVersion, + localizedName; + +/*! + @class CPTimeZone + @ingroup foundation + @brief CPTimeZone is a class to define the behvior of time zone object (like CPDatePicker) +*/ +@implementation CPTimeZone : CPObject +{ + CPData _data @accessors(property=data, readonly); + CPInteger _secondsFromGMT @accessors(property=secondFromGMT, readonly); + CPString _abbreviation @accessors(property=abbreviation, readonly); + CPString _name @accessors(property=name, readonly); +} + +/*! Initialize the default value of the class +*/ ++ (void)initialize +{ + if (self !== [CPTimeZone class]) + return; + + knownTimeZoneNames = [ + @"America/Halifax", + @"America/Juneau", + @"America/Juneau", + @"America/Argentina/Buenos_Aires", + @"America/Halifax", + @"Asia/Dhaka", + @"America/Sao_Paulo", + @"America/Sao_Paulo", + @"Europe/London", + @"Africa/Harare", + @"America/Chicago", + @"Europe/Paris", + @"Europe/Paris", + @"America/Santiago", + @"America/Santiago", + @"America/Bogota", + @"America/Chicago", + @"Africa/Addis_Ababa", + @"America/New_York", + @"Europe/Istanbul", + @"Europe/Istanbul", + @"America/New_York", + @"GMT", + @"Asia/Dubai", + @"Asia/Hong_Kong", + @"Pacific/Honolulu", + @"Asia/Bangkok", + @"Asia/Tehran", + @"Asia/Calcutta", + @"Asia/Tokyo", + @"Asia/Seoul", + @"America/Denver", + @"Europe/Moscow", + @"Europe/Moscow", + @"America/Denver", + @"Pacific/Auckland", + @"Pacific/Auckland", + @"America/Los_Angeles", + @"America/Lima", + @"Asia/Manila", + @"Asia/Karachi", + @"America/Los_Angeles", + @"Asia/Singapore", + @"UTC", + @"Africa/Lagos", + @"Europe/Lisbon", + @"Europe/Lisbon", + @"Asia/Jakarta" + ]; + + abbreviationDictionary = @{ + @"ADT" : @"America/Halifax", + @"AKDT" : @"America/Juneau", + @"AKST" : @"America/Juneau", + @"ART" : @"America/Argentina/Buenos_Aires", + @"AST" : @"America/Halifax", + @"BDT" : @"Asia/Dhaka", + @"BRST" : @"America/Sao_Paulo", + @"BRT" : @"America/Sao_Paulo", + @"BST" : @"Europe/London", + @"CAT" : @"Africa/Harare", + @"CDT" : @"America/Chicago", + @"CEST" : @"Europe/Paris", + @"CET" : @"Europe/Paris", + @"CLST" : @"America/Santiago", + @"CLT" : @"America/Santiago", + @"COT" : @"America/Bogota", + @"CST" : @"America/Chicago", + @"EAT" : @"Africa/Addis_Ababa", + @"EDT" : @"America/New_York", + @"EEST" : @"Europe/Istanbul", + @"EET" : @"Europe/Istanbul", + @"EST" : @"America/New_York", + @"GMT" : @"GMT", + @"GST" : @"Asia/Dubai", + @"HKT" : @"Asia/Hong_Kong", + @"HST" : @"Pacific/Honolulu", + @"ICT" : @"Asia/Bangkok", + @"IRST" : @"Asia/Tehran", + @"IST" : @"Asia/Calcutta", + @"JST" : @"Asia/Tokyo", + @"KST" : @"Asia/Seoul", + @"MDT" : @"America/Denver", + @"MSD" : @"Europe/Moscow", + @"MSK" : @"Europe/Moscow", + @"MST" : @"America/Denver", + @"NZDT" : @"Pacific/Auckland", + @"NZST" : @"Pacific/Auckland", + @"PDT" : @"America/Los_Angeles", + @"PET" : @"America/Lima", + @"PHT" : @"Asia/Manila", + @"PKT" : @"Asia/Karachi", + @"PST" : @"America/Los_Angeles", + @"SGT" : @"Asia/Singapore", + @"UTC" : @"UTC", + @"WAT" : @"Africa/Lagos", + @"WEST" : @"Europe/Lisbon", + @"WET" : @"Europe/Lisbon", + @"WIT" : @"Asia/Jakarta" + }; + + timeDifferenceFromUTC = @{ + @"ADT" : -180, + @"AKDT" : -480, + @"AKST" : -540, + @"ART" : -180, + @"AST" : -240, + @"BDT" : 360, + @"BRST" : -120, + @"BRT" : -180, + @"BST" : 60, + @"CAT" : 120, + @"CDT" : -300, + @"CEST" : 120, + @"CET" : 60, + @"CLST" : -180, + @"CLT" : -240, + @"COT" : -300, + @"CST" : -360, + @"EAT" : 180, + @"EDT" : -240, + @"EEST" : 180, + @"EET" : 120, + @"EST" : -300, + @"GMT" : 0, + @"GST" : 240, + @"HKT" : 480, + @"HST" : -600, + @"ICT" : 420, + @"IRST" : 210, + @"IST" : 330, + @"JST" : 540, + @"KST" : 540, + @"MDT" : -300, + @"MSD" : 240, + @"MSK" : 240, + @"MST" : -420, + @"NZDT" : 900, + @"NZST" : 900, + @"PDT" : -420, + @"PET" : -300, + @"PHT" : 480, + @"PKT" : 300, + @"PST" : -480, + @"SGT" : 480, + @"UTC" : 0, + @"WAT" : -540, + @"WEST" : 60, + @"WET" : 0, + @"WIT" : 540 + }; + + var englishLocalizedName = @{ + @"EDT" : [@"Eastern Standard Time", @"EST", @"Eastern Daylight Time", @"EDT", @"Eastern Time", @"ET"], + @"GMT" : [@"GMT", @"GMT", @"GMT", @"GMT", @"GMT", @"GMT"], + @"AST" : [@"Atlantic Standard Time", @"AST", @"Atlantic Daylight Time", @"ADT", @"Atlantic Time", @"AT"], + @"IRST" : [@"Iran Standard Time", @"GMT+03:30", @"Iran Daylight Time", @"GMT+03:30", @"Iran Time", @"Iran Time"], + @"ICT" : [@"Indochina Time", @"GMT+07:00", @"GMT+07:00", @"GMT+07:00", @"Indochina Time", @"Thailand Time"], + @"PET" : [@"Peru Standard Time", @"GMT-05:00", @"Peru Summer Time", @"GMT-05:00", @"Peru Standard Time", @"Peru Time"], + @"KST" : [@"Korean Standard Time", @"GMT+09:00", @"Korean Daylight Time", @"GMT+09:00", @"Korean Standard Time", @"South Korea Time"], + @"PST" : [@"Pacific Standard Time", @"PST", @"Pacific Daylight Time", @"PDT", @"Pacific Time", @"PT"], + @"CDT" : [@"Central Standard Time", @"CST", @"Central Daylight Time", @"CDT", @"Central Time", @"CT"], + @"EEST" : [@"Eastern European Standard Time", @"GMT+02:00", @"Eastern European Summer Time", @"GMT+03:00", @"Eastern European Time", @"Turkey Time"], + @"NZDT" : [@"New Zealand Standard Time", @"GMT+12:00", @"New Zealand Daylight Time", @"GMT+13:00", @"New Zealand Time", @"New Zealand Time (Auckland)"], + @"WEST" : [@"Western European Standard Time", @"GMT", @"Western European Summer Time", @"GMT+01:00", @"Western European Time", @"Portugal Time (Lisbon)"], + @"EAT" : [@"East Africa Time", @"GMT+03:00", @"GMT+03:00", @"GMT+03:00", @"East Africa Time", @"Ethiopia Time"], + @"HKT" : [@"Hong Kong Standard Time", @"GMT+08:00", @"Hong Kong Summer Time", @"GMT+08:00", @"Hong Kong Standard Time", @"Hong Kong SAR China Time"], + @"IST" : [@"India Standard Time", @"GMT+05:30", @"GMT+05:30", @"GMT+05:30", @"India Standard Time", @"India Time"], + @"MDT" : [@"Mountain Standard Time", @"MST", @"Mountain Daylight Time", @"MDT", @"Mountain Time", @"MT"], + @"NZST" : [@"New Zealand Standard Time", @"GMT+12:00", @"New Zealand Daylight Time", @"GMT+13:00", @"New Zealand Time", @"New Zealand Time (Auckland)"], + @"WIT" : [@"Western Indonesia Time", @"GMT+07:00", @"GMT+07:00", @"GMT+07:00", @"Western Indonesia Time", @"Indonesia Time (Jakarta)"], + @"ADT" : [@"Atlantic Standard Time", @"AST", @"Atlantic Daylight Time", @"ADT", @"Atlantic Time", @"AT"], + @"BST" : [@"Greenwich Mean Time", @"GMT", @"British Summer Time", @"GMT+01:00", @"United Kingdom Time", @"United Kingdom Time"], + @"ART" : [@"Argentina Standard Time", @"GMT-03:00", @"Argentina Summer Time", @"GMT-03:00", @"Argentina Standard Time", @"Argentina Time (Buenos Aires)"], + @"CAT" : [@"Central Africa Time", @"GMT+02:00", @"GMT+02:00", @"GMT+02:00", @"Central Africa Time", @"Zimbabwe Time"], + @"GST" : [@"Gulf Standard Time", @"GMT+04:00", @"GMT+04:00", @"GMT+04:00", @"Gulf Standard Time", @"United Arab Emirates Time"], + @"PDT" : [@"Pacific Standard Time", @"PST", @"Pacific Daylight Time", @"PDT", @"Pacific Time", @"PT"], + @"SGT" : [@"Singapore Standard Time", @"GMT+08:00", @"GMT+08:00", @"GMT+08:00", @"Singapore Standard Time", @"Singapore Time"], + @"COT" : [@"Colombia Standard Time", @"GMT-05:00", @"Colombia Summer Time", @"GMT-05:00", @"Colombia Standard Time", @"Colombia Time"], + @"PKT" : [@"Pakistan Standard Time", @"GMT+05:00", @"Pakistan Summer Time", @"GMT+05:00", @"Pakistan Standard Time", @"Pakistan Time"], + @"EET" : [@"Eastern European Standard Time", @"GMT+02:00", @"Eastern European Summer Time", @"GMT+03:00", @"Eastern European Time", @"Turkey Time"], + @"UTC" : [@"GMT", @"GMT", @"GMT", @"GMT", @"GMT", @"GMT"], + @"WAT" : [@"West Africa Standard Time", @"GMT+01:00", @"West Africa Summer Time", @"GMT+01:00", @"West Africa Standard Time", @"Nigeria Time"], + @"EST" : [@"Eastern Standard Time", @"EST", @"Eastern Daylight Time", @"EDT", @"Eastern Time", @"ET"], + @"JST" : [@"Japan Standard Time", @"GMT+09:00", @"Japan Daylight Time", @"GMT+09:00", @"Japan Standard Time", @"Japan Time"], + @"CLST" : [@"Chile Standard Time", @"GMT-04:00", @"Chile Summer Time", @"GMT-04:00", @"Chile Time", @"Chile Time (Santiago)"], + @"CET" : [@"Central European Standard Time", @"GMT+01:00", @"Central European Summer Time", @"GMT+02:00", @"Central European Time", @"France Time"], + @"BDT" : [@"Bangladesh Standard Time", @"GMT+06:00", @"Bangladesh Summer Time", @"GMT+06:00", @"Bangladesh Standard Time", @"Bangladesh Time"], + @"MSK" : [@"Moscow Standard Time", @"GMT+04:00", @"Moscow Summer Time", @"GMT+04:00", @"Moscow Standard Time", @"Russia Time (Moscow)"], + @"AKDT" : [@"Alaska Standard Time", @"AKST", @"Alaska Daylight Time", @"AKDT", @"Alaska Time", @"AKT"], + @"CLT" : [@"Chile Standard Time", @"GMT-04:00", @"Chile Summer Time", @"GMT-04:00", @"Chile Time", @"Chile Time (Santiago)"], + @"AKST" : [@"Alaska Standard Time", @"AKST", @"Alaska Daylight Time", @"AKDT", @"Alaska Time", @"AKT"], + @"BRST" : [@"Brasilia Standard Time", @"GMT-03:00", @"Brasilia Summer Time", @"GMT-03:00", @"Brasilia Time", @"Brazil Time (Sao Paulo)"], + @"BRT" : [@"Brasilia Standard Time", @"GMT-03:00", @"Brasilia Summer Time", @"GMT-03:00", @"Brasilia Time", @"Brazil Time (Sao Paulo)"], + @"CEST" : [@"Central European Standard Time", @"GMT+01:00", @"Central European Summer Time", @"GMT+02:00", @"Central European Time", @"France Time"], + @"CST" : [@"Central Standard Time", @"CST", @"Central Daylight Time", @"CDT", @"Central Time", @"CT"], + @"HST" : [@"Hawaii-Aleutian Standard Time", @"HST", @"Hawaii-Aleutian Daylight Time", @"HDT", @"Hawaii-Aleutian Standard Time", @"HST"], + @"MSD" : [@"Moscow Standard Time", @"GMT+04:00", @"Moscow Summer Time", @"GMT+04:00", @"Moscow Standard Time", @"Russia Time (Moscow)"], + @"MST" : [@"Mountain Standard Time", @"MST", @"Mountain Daylight Time", @"MDT", @"Mountain Time", @"MT"], + @"PHT" : [@"Philippine Standard Time", @"GMT+08:00", @"Philippine Summer Time", @"GMT+08:00", @"Philippine Standard Time", @"Philippines Time"], + @"WET" : [@"Western European Standard Time", @"GMT", @"Western European Summer Time", @"GMT+01:00", @"Western European Time", @"Portugal Time (Lisbon)"] + }; + + var date = [CPDate date], + abbreviation = String(String(date).split("(")[1]).split(")")[0]; + + localTimeZone = [self timeZoneWithAbbreviation:abbreviation]; + systemTimeZone = [self timeZoneWithAbbreviation:abbreviation]; + defaultTimeZone = [self timeZoneWithAbbreviation:abbreviation]; + + localizedName = @{ + @"en" : englishLocalizedName, + @"fr" : @{}, + @"de" : @{}, + @"es" : @{} + }; + + timeZoneDataVersion = nil; +} + + +#pragma mark - +#pragma mark Class constructor + +/*! Returns a time zone from the given abbreviation. + Returns nil if the given abbreviation doesn't match with any abbreviations + @param abbreviation the given abreviation + @return a new instance of CPTimeZone +*/ ++ (id)timeZoneWithAbbreviation:(CPString)abbreviation +{ + if (![abbreviationDictionary containsKey:abbreviation]) + return nil; + + return [[CPTimeZone alloc] _initWithName:[abbreviationDictionary valueForKey:abbreviation] abbreviation:abbreviation]; +} + +/*! Return a time zone from the given timeZone name + Returns nil if the given timeZone name doesn't match with any abbreviations + Raises an exception if tzName is nil + @param tzName the timeZone name + @return a new instance of CPTimeZone +*/ ++ (id)timeZoneWithName:(CPString)tzName +{ + return [[CPTimeZone alloc] initWithName:tzName]; +} + +/*! Return a time zone from the given timeZone name and data + Returns nil if the given timeZone name doesn't match with any abbreviations + Raises an exception if tzName is nil + @param tzName the timeZone name + @param data the data + @return a new instance of CPTimeZone +*/ ++ (id)timeZoneWithName:(CPString)tzName data:(CPData)data +{ + return [[CPTimeZone alloc] initWithName:tzName data:data]; +} + +/*! Return a time zone from the given seconds + Returns nil if the number of seconds doesn't match with any offset + @param seconds the number of seconds + @return a new instance of CPTimeZone +*/ ++ (id)timeZoneForSecondsFromGMT:(CPInteger)seconds +{ + var minutes = seconds / 60, + keys = [timeDifferenceFromUTC keyEnumerator], + key, + abbreviation = nil; + + while (key = [keys nextObject]) + { + var value = [timeDifferenceFromUTC valueForKey:key]; + + if (value == minutes) + { + abbreviation = key; + break; + } + } + + if (!abbreviation) + return nil; + + return [self timeZoneWithAbbreviation:abbreviation]; +} + +/*! @ignore +*/ ++ (id)_timeZoneFromString:(CPString)aTimeZoneString style:(NSTimeZoneNameStyle)style locale:(CPLocale)_locale +{ + if ([abbreviationDictionary containsKey:aTimeZoneString]) + return [self timeZoneWithAbbreviation:aTimeZoneString]; + + var dict = [localizedName valueForKey:[_locale objectForKey:CPLocaleLanguageCode]], + keys = [dict keyEnumerator], + key; + + while (key = [keys nextObject]) + { + var value = [[dict valueForKey:key] objectAtIndex:style]; + + if ([value isEqualToString:aTimeZoneString]) + return [self timeZoneWithAbbreviation:key]; + } + + return nil; +} + +/*! @ignore +*/ ++ (CPArray)_namesForStyle:(NSTimeZoneNameStyle)style locale:(CPLocale)aLocale +{ + var array = [CPArray array], + dict = [localizedName valueForKey:[aLocale objectForKey:CPLocaleLanguageCode]], + keys = [dict keyEnumerator], + key; + + while (key = [keys nextObject]) + [array addObject:[[dict valueForKey:key] objectAtIndex:style]]; + + return array; +} + +#pragma mark - +#pragma mark Class accessors + +/*! Return the timeZoneDataVersion (not yet implemented) +*/ ++ (CPString)timeZoneDataVersion +{ + // TODO : don't know what to do ^^ + return timeZoneDataVersion; +} + +/*! Return the localTimeZone +*/ ++ (CPTimeZone)localTimeZone +{ + return localTimeZone; +} + +/*! Return the defaultTimeZone +*/ ++ (CPTimeZone)defaultTimeZone +{ + return defaultTimeZone; +} + +/*! Set the defaultTimeZone + @param aTimeZone the defaultTimeZone +*/ ++ (void)setDefaultTimeZone:(CPTimeZone)aTimeZone +{ + defaultTimeZone = aTimeZone; +} + +/*! Reset the systemTimeZone + This will send the notification CPSystemTimeZoneDidChangeNotification +*/ ++ (void)resetSystemTimeZone +{ + var date = [CPDate date], + abbreviation = String(String(date).split("(")[1]).split(")")[0]; + + systemTimeZone = [self timeZoneWithAbbreviation:abbreviation]; + + [[CPNotification defaultCenter] postNotificationName:CPSystemTimeZoneDidChangeNotification object:systemTimeZone]; +} + +/*! Return the systemTimeZone +*/ ++ (CPTimeZone)systemTimeZone +{ + return systemTimeZone; +} + +/*! Return the abbreviationDictionary +*/ ++ (CPDictionary)abbreviationDictionary +{ + return abbreviationDictionary; +} + +/*! Set the abbreviationDictionary + @param dict +*/ ++ (void)setAbbreviationDictionary:(CPDictionary)dict +{ + abbreviationDictionary = dict; +} + +/*! Return the knownTimeZoneNames +*/ ++ (CPArray)knownTimeZoneNames +{ + return knownTimeZoneNames; +} + + +#pragma mark - +#pragma mark Consructors + +/*! Init a new time zone with the given time zone name and abbreviation + Returns nil if tzName doesn't match with any timeZoneNames or if abbreviation is nil + Raises an exception if tzName is nil + @param tzName the timeZone name + @param abbreviation the abbreviation + @return a new timeZone +*/ +- (id)_initWithName:(CPString)tzName abbreviation:(CPString)abbreviation +{ + if (!tzName) + [CPException raise:CPInvalidArgumentException reason:"Invalid value provided for tzName"]; + + if (![knownTimeZoneNames containsObject:tzName] || !abbreviation) + return nil; + + if (self = [super init]) + { + _name = tzName; + _abbreviation = abbreviation; + } + + return self; +} + +/*! Init a new time zone from the given timeZone name + Returns nil if the given timeZone name doesn't match with any abbreviations + Raises an exception if tzName is nil + @param tzName the timeZone name + @return a new instance of CPTimeZone +*/ +- (id)initWithName:(CPString)tzName +{ + if (!tzName) + [CPException raise:CPInvalidArgumentException reason:"Invalid value provided for tzName"]; + + if (![knownTimeZoneNames containsObject:tzName]) + return nil; + + if (self = [super init]) + { + _name = tzName; + + var keys = [abbreviationDictionary keyEnumerator], + key; + + while (key = [keys nextObject]) + { + var value = [abbreviationDictionary valueForKey:key]; + + if ([value isEqualToString:_name]) + { + _abbreviation = key; + break; + } + } + } + + return self; +} + +/*! Return a time zone from the given timeZone name and data + Returns nil if the given timeZone name doesn't match with any abbreviations + Raises an exception if tzName is nil + @param tzName the timeZone name + @param data the data + @return a new instance of CPTimeZone +*/ +- (id)initWithName:(CPString)tzName data:(CPData)data +{ + if (self = [self initWithName:tzName]) + { + _data = data; + } + + return self; +} + + +#pragma mark - +#pragma mark Methods for CPDate + +/*! Returns the abbreviation from a date + Returns nil if the date is nil + @return the abbreviation +*/ +- (CPString)abbreviationForDate:(CPDate)date +{ + if (!date) + return nil; + + return String(String(date).split("(")[1]).split(")")[0]; +} + +/*! Returns the number of seconds from GMT for the given date + Returns nil if the date is nil + @param date + @return the number of seconds +*/ +- (CPInteger)secondsFromGMTForDate:(CPDate)date +{ + if (!date) + return nil; + + var abbreviation = String(String(date).split("(")[1]).split(")")[0]; + + return [timeDifferenceFromUTC valueForKey:abbreviation] * 60; +} + +/*! Returns the number of seconds from GMT + @return the number of seconds +*/ +- (CPInteger)secondsFromGMT +{ + return [timeDifferenceFromUTC valueForKey:_abbreviation] * 60; +} + + +#pragma mark - +#pragma mark Compars methods + +/*! Returns a bool to compare tow timeZones. + This is made by the compare of the name and the data of the timeZones + @return a bool +*/ +- (BOOL)isEqualToTimeZone:(CPTimeZone)aTimeZone +{ + return [[aTimeZone name] isEqualToString:_name] && [aTimeZone data] == _data +} + + +#pragma mark - +#pragma mark Description + +/*! Returns the description of the timeZone + The pattern of the description is : 'name of the timeZone' ('abbreviation of the timeZone') offset 'the timeDifferenceFromGMT' + @return the description +*/ +- (CPString)description +{ + return [CPString stringWithFormat:@"%s (%s) offset %i", _name, _abbreviation, [self secondsFromGMT]]; +} + + +#pragma mark - +#pragma mark Localized methods + +/*! Return a localized string from the given style and locale + @param style the style + @param locale the locale + @return a string +*/ +- (CPString)localizedName:(NSTimeZoneNameStyle)style locale:(CPLocale)locale +{ + if (style > 5) + return nil; + + return [[[localizedName valueForKey:[locale objectForKey:CPLocaleLanguageCode]] valueForKey:_abbreviation] objectAtIndex:style]; +} + +@end diff --git a/Foundation/CPTimer.j b/Foundation/CPTimer.j index 855fed96c..0dcc2a077 100644 --- a/Foundation/CPTimer.j +++ b/Foundation/CPTimer.j @@ -25,6 +25,8 @@ @import "CPObject.j" @import "CPRunLoop.j" +#define CPTimerDefaultTimeInterval 0.1 + /*! @class CPTimer @ingroup foundation @@ -112,7 +114,7 @@ if (self) { - _timeInterval = seconds; + _timeInterval = (seconds <= 0) ? CPTimerDefaultTimeInterval : seconds; _invocation = anInvocation; _repeats = shouldRepeat; _isValid = YES; @@ -150,7 +152,7 @@ if (self) { - _timeInterval = seconds; + _timeInterval = (seconds <= 0) ? CPTimerDefaultTimeInterval : seconds; _callback = aFunction; _repeats = shouldRepeat; _isValid = YES; diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index db9acb8f6..b520cf9fd 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -156,9 +156,9 @@ var CPURLConnectionDelegate = nil; // Browsers use "file:", Titanium uses "app:" _isLocalFileConnection = scheme === "file" || - ((scheme === "http" || scheme === "https:") && - window.location && - (window.location.protocol === "file:" || window.location.protocol === "app:")); + ((scheme === "http" || scheme === "https") && + window.location && + (window.location.protocol === "file:" || window.location.protocol === "app:")); _HTTPRequest = new CFHTTPRequest(); @@ -257,6 +257,7 @@ var CPURLConnectionDelegate = nil; [_delegate connection:self didReceiveResponse:response]; } } + if (!_isCanceled) { if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index a7dc3fdab..ab9d5fdb2 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -69,6 +69,7 @@ @import "CPSortDescriptor.j" @import "CPString.j" @import "CPTimer.j" +@import "CPTimeZone.j" @import "CPUndoManager.j" @import "CPURL.j" @import "CPURLConnection.j" diff --git a/Foundation/_CGGeometry.j b/Foundation/_CGGeometry.j index 480e814ab..4861ce8fd 100644 --- a/Foundation/_CGGeometry.j +++ b/Foundation/_CGGeometry.j @@ -112,7 +112,6 @@ function CGStringFromRect(aRect) return "{" + CGStringFromPoint(aRect.origin) + ", " + CGStringFromSize(aRect.size) + "}"; } - function CGRectOffset(aRect, dX, dY) { return { origin:{ x:aRect.origin.x + dX, y:aRect.origin.y + dY }, size:{ width:aRect.size.width, height:aRect.size.height } }; @@ -424,7 +423,7 @@ function CGRectFromString(aString) { var comma = aString.indexOf(',', aString.indexOf(',') + 1); - return { origin:CGPointFromString(aString.substr(1, comma - 1)), size:CGSizeFromString(aString.substring(comma + 2, aString.length)) }; + return { origin:CGPointFromString(aString.substr(1, comma - 1)), size:CGSizeFromString(aString.substring(comma + 2, aString.length - 1)) }; } function CGPointFromEvent(anEvent) diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index 54fd3b99c..db3f77190 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -352,8 +352,8 @@ function loadExecutableAndResources(/*Bundle*/ aBundle, /*BOOL*/ shouldExecute) if (!aBundle.mostEligibleEnvironment()) return failure(); - loadExecutableForBundle(aBundle, success, failure); - loadSpritedImagesForBundle(aBundle, success, failure); + loadExecutableForBundle(aBundle, success, failure, progress); + loadSpritedImagesForBundle(aBundle, success, failure, progress); if (aBundle._loadStatus === CFBundleLoading) return success(); @@ -373,14 +373,21 @@ function loadExecutableAndResources(/*Bundle*/ aBundle, /*BOOL*/ shouldExecute) finishBundleLoadingWithError(aBundle, anError || new Error("Could not recognize executable code format in Bundle " + aBundle)); } - function success() + function progress(bytesLoaded) { if ((typeof CPApp === "undefined" || !CPApp || !CPApp._finishedLaunching) && - typeof OBJJ_PROGRESS_CALLBACK === "function" && CPApplicationSizeInBytes) + typeof OBJJ_PROGRESS_CALLBACK === "function") { - OBJJ_PROGRESS_CALLBACK(MAX(MIN(1.0, CFTotalBytesLoaded / CPApplicationSizeInBytes), 0.0), CPApplicationSizeInBytes, aBundle.bundlePath()); - } + CFTotalBytesLoaded += bytesLoaded; + var percent = CPApplicationSizeInBytes ? MAX(MIN(1.0, CFTotalBytesLoaded / CPApplicationSizeInBytes), 0.0) : 0; + + OBJJ_PROGRESS_CALLBACK(percent, CPApplicationSizeInBytes, aBundle.bundlePath()); + } + } + + function success() + { if (aBundle._loadStatus === CFBundleLoading) aBundle._loadStatus = CFBundleLoaded; else @@ -392,13 +399,13 @@ function loadExecutableAndResources(/*Bundle*/ aBundle, /*BOOL*/ shouldExecute) function complete() { - aBundle._eventDispatcher.dispatchEvent( { type:"load", bundle:aBundle }); } + if (shouldExecute) executeBundle(aBundle, complete); else @@ -406,7 +413,7 @@ function loadExecutableAndResources(/*Bundle*/ aBundle, /*BOOL*/ shouldExecute) } } -function loadExecutableForBundle(/*Bundle*/ aBundle, success, failure) +function loadExecutableForBundle(/*Bundle*/ aBundle, success, failure, progress) { var executableURL = aBundle.executableURL(); @@ -419,7 +426,6 @@ function loadExecutableForBundle(/*Bundle*/ aBundle, success, failure) { try { - CFTotalBytesLoaded += anEvent.request.responseText().length; decompileStaticFile(aBundle, anEvent.request.responseText(), executableURL); aBundle._loadStatus &= ~CFBundleLoadingExecutable; success(); @@ -428,7 +434,7 @@ function loadExecutableForBundle(/*Bundle*/ aBundle, success, failure) { failure(anException); } - }, failure); + }, failure, progress); } function spritedImagesTestURLStringForBundle(/*Bundle*/ aBundle) @@ -448,7 +454,7 @@ function spritedImagesURLForBundle(/*Bundle*/ aBundle) return NULL; } -function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure) +function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progress) { if (!aBundle.hasSpritedImages()) return; @@ -458,7 +464,7 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure) if (!CFBundleHasTestedSpriteSupport()) return CFBundleTestSpriteSupport(spritedImagesTestURLStringForBundle(aBundle), function() { - loadSpritedImagesForBundle(aBundle, success, failure); + loadSpritedImagesForBundle(aBundle, success, failure, progress); }); var spritedImagesURL = spritedImagesURLForBundle(aBundle); @@ -473,17 +479,15 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure) { try { - CFTotalBytesLoaded += anEvent.request.responseText().length; decompileStaticFile(aBundle, anEvent.request.responseText(), spritedImagesURL); aBundle._loadStatus &= ~CFBundleLoadingSpritedImages; + success(); } catch(anException) { failure(anException); } - - success(); - }, failure); + }, failure, progress); } var CFBundleSpriteSupportListeners = [], diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index 8be9e8b2f..2b2d29c73 100644 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -63,7 +63,11 @@ var NativeRequest = null; // We check ActiveXObject first, because we require local file access and // overrideMimeType feature (which the native XMLHttpRequest does not have in IE). -if (window.ActiveXObject !== undefined) +if (window.XMLHttpRequest) +{ + NativeRequest = window.XMLHttpRequest; +} +else if (window.ActiveXObject !== undefined) { // DON'T try 4.0 and 5.0: http://bit.ly/microsoft-msxml-explanation var MSXML_XMLHTTP_OBJECTS = ["Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0"], @@ -90,9 +94,6 @@ if (window.ActiveXObject !== undefined) } } -if (!NativeRequest) - NativeRequest = window.XMLHttpRequest; - GLOBAL(CFHTTPRequest) = function() { this._isOpen = false; @@ -293,7 +294,7 @@ function determineAndDispatchHTTPRequestEvents(/*CFHTTPRequest*/ aRequest) eventDispatcher.dispatchEvent({ type:readyStates[aRequest.readyState()], request:aRequest}); } -function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure) +function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress) { var request = new CFHTTPRequest(); @@ -326,17 +327,62 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure) } #endif + var loaded = 0, + progressHandler = null; + + function progress(progressEvent) + { + onprogress(progressEvent.loaded - loaded); + loaded = progressEvent.loaded; + } + + function success(anEvent) + { + // If the browser can't handle progress events, + // we need to send a progress message with the total + // size of the file when the file finishes loading. + if (onprogress && progressHandler === null) + onprogress(anEvent.request.responseText().length); + + onsuccess(anEvent); + } + if (exports.asyncLoader) { - request.onsuccess = Asynchronous(onsuccess); + request.onsuccess = Asynchronous(success); request.onfailure = Asynchronous(onfailure); } else { - request.onsuccess = onsuccess; + request.onsuccess = success; request.onfailure = onfailure; } +#if BROWSER + if (onprogress) + { + var supportsProgress = true; + + // document.all means IE, window.atob is only supported by IE 10+ + if (document.all) + supportsProgress = !!window.atob; + + if (supportsProgress) + { + try + { + progressHandler = exports.asyncLoader ? Asynchronous(progress) : progress; + request._nativeRequest.onprogress = progressHandler; + } + catch (anException) + { + // Must be <= IE 9 + progressHandler = null; + } + } + } +#endif + request.open("GET", aURL.absoluteString(), exports.asyncLoader); request.send(""); } diff --git a/Objective-J/CFURL.js b/Objective-J/CFURL.js index 757af5617..4f266a6d6 100644 --- a/Objective-J/CFURL.js +++ b/Objective-J/CFURL.js @@ -277,9 +277,17 @@ function resolveURL(aURL) absoluteBaseURL = baseURL.absoluteURL(), baseParts = PARTS(absoluteBaseURL); - if (parts.scheme || parts.authority) + if (!parts.scheme && parts.authorityRoot) + { + // Handle "//domain.com/" style links which need to take their scheme from the base URL, + // but nothing else. + resolvedParts = CFURLPartsCreateCopy(parts); + resolvedParts.scheme = baseURL.scheme(); + } + else if (parts.scheme || parts.authority) + { resolvedParts = parts; - + } else { resolvedParts = { }; @@ -302,7 +310,6 @@ function resolveURL(aURL) resolvedParts.path = parts.path; resolvedParts.pathComponents = pathComponents; } - else { var basePathComponents = baseParts.pathComponents, diff --git a/Objective-J/CommonJS/lib/objective-j.js b/Objective-J/CommonJS/lib/objective-j.js index 254a96c16..cf5504a3f 100644 --- a/Objective-J/CommonJS/lib/objective-j.js +++ b/Objective-J/CommonJS/lib/objective-j.js @@ -185,7 +185,7 @@ exports.fullVersionString = function() { global.ObjectiveJ = {}; -for (key in exports) +for (var key in exports) if (Object.prototype.hasOwnProperty.call(exports, key)) global.ObjectiveJ[key] = exports[key]; diff --git a/Objective-J/CommonJS/lib/objective-j/compiler.js b/Objective-J/CommonJS/lib/objective-j/compiler.js index 34e22c80d..65079fd48 100644 --- a/Objective-J/CommonJS/lib/objective-j/compiler.js +++ b/Objective-J/CommonJS/lib/objective-j/compiler.js @@ -174,6 +174,9 @@ function resolveFlags(args) else if (argument.indexOf("-O") === 0) objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Compress; + else if (argument.indexOf("-G") === 0) + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Generate; + else filePaths.push(argument); } diff --git a/Objective-J/CommonJS/lib/objective-j/jake/applicationtask.js b/Objective-J/CommonJS/lib/objective-j/jake/applicationtask.js index c3a2045e9..cc227c6ea 100644 --- a/Objective-J/CommonJS/lib/objective-j/jake/applicationtask.js +++ b/Objective-J/CommonJS/lib/objective-j/jake/applicationtask.js @@ -12,7 +12,7 @@ function ApplicationTask(aName) this._indexFilePath = "index.html"; else this._indexFilePath = null; - + if (FILE.exists("Frameworks")) this._frameworksPath = "Frameworks"; else @@ -53,7 +53,7 @@ ApplicationTask.prototype.setFrameworksPath = function(aFrameworksPath) // The default will use local app frameworks // Pass in ENV["CAPP_BUILD"] to use your built frameworks // Pass in "capp" to use installed frameworks - + this._frameworksPath = aFrameworksPath; } @@ -77,11 +77,11 @@ ApplicationTask.prototype.defineFrameworksTask = function() // FIXME: platform requires... if (!this._frameworksPath && this.environments().indexOf(require("objective-j/jake/environment").Browser) === -1) return; - + var buildPath = this.buildProductPath(), newFrameworks = FILE.join(buildPath, "Frameworks"), thisTask = this; - + Jake.fileCreate(newFrameworks, function() { if (thisTask._frameworksPath === "capp") @@ -90,11 +90,23 @@ ApplicationTask.prototype.defineFrameworksTask = function() { if (FILE.exists(newFrameworks)) FILE.rmtree(newFrameworks); - + + // If there is a Frameworks/Source directory, move it temporarily + // so it doesn't get copied. + var sourcePath = FILE.join(thisTask._frameworksPath, "Source"), + hasSource = FILE.exists(sourcePath), + tempPath = FILE.join(FILE.cwd(), ".__capp_Frameworks_Source__"); + + if (hasSource) + FILE.move(sourcePath, tempPath); + FILE.copyTree(thisTask._frameworksPath, newFrameworks); + + if (hasSource) + FILE.move(tempPath, sourcePath); } }); - + this.enhance([newFrameworks]); } diff --git a/Objective-J/FileExecutable.js b/Objective-J/FileExecutable.js index 6176ac6b1..8e9bcac7a 100644 --- a/Objective-J/FileExecutable.js +++ b/Objective-J/FileExecutable.js @@ -118,7 +118,8 @@ function decompile(/*String*/ aString, /*CFURL*/ aURL) dependencies.push(new FileDependency(new CFURL(text), YES)); } - var fn = FileExecutable._lookupCachedFunction(aURL) + var fn = FileExecutable._lookupCachedFunction(aURL); + if (fn) return new Executable(code, dependencies, aURL, fn); diff --git a/Objective-J/Includes.js b/Objective-J/Includes.js index 4bfcacad4..a4373e3a0 100644 --- a/Objective-J/Includes.js +++ b/Objective-J/Includes.js @@ -28,6 +28,7 @@ #define GLOBAL(name) name +#include "OldBrowserCompatibility.js" #include "DebugOptions.js" #include "json2.js" #include "sprintf.js" diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 6c8fc4a1b..3f684bb77 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -45,7 +45,12 @@ Scope.prototype.isRootScope = function() Scope.prototype.currentClassName = function() { - return this.classDef ? this.classDef.className : this.prev ? this.prev.currentClassName() : null; + return this.classDef ? this.classDef.name : this.prev ? this.prev.currentClassName() : null; +} + +Scope.prototype.currentProtocolName = function() +{ + return this.protocolDef ? this.protocolDef.name : this.prev ? this.prev.currentProtocolName() : null; } Scope.prototype.getIvarForCurrentClass = function(/* String */ ivarName) @@ -78,7 +83,7 @@ Scope.prototype.getLvar = function(/* String */ lvarName, /* BOOL */ stopAtMetho var prev = this.prev; // Stop at the method declaration - if (prev && (!stopAtMethod || !this.methodtype)) + if (prev && (!stopAtMethod || !this.methodType)) return prev.getLvar(lvarName, stopAtMethod); return null; @@ -112,16 +117,264 @@ Scope.prototype.maybeWarnings = function() return this.rootScope()._maybeWarnings; } +var GlobalVariableMaybeWarning = function(/* String */ aMessage, /* SpiderMonkey AST node */ node, /* String */ code) +{ + this.message = createMessage(aMessage, node, code); + this.node = node; +} + +GlobalVariableMaybeWarning.prototype.checkIfWarning = function(/* Scope */ st) +{ + var identifier = this.node.name; + return !st.getLvar(identifier) && typeof global[identifier] === "undefined" && typeof window[identifier] === "undefined" && !st.compiler.getClassDef(identifier); +} + +function StringBuffer() +{ + this.atoms = []; +} + +StringBuffer.prototype.toString = function() +{ + return this.atoms.join(""); +} + +StringBuffer.prototype.concat = function(aString) +{ + this.atoms.push(aString); +} + +StringBuffer.prototype.isEmpty = function() +{ + return this.atoms.length !== 0; +} + +// Both the ClassDef and ProtocolDef conforms to a 'protocol' (That we can't declare in Javascript). +// Both Objects have the attribute 'protocols': Array of ProtocolDef that they conform to +// Both also have the functions: addInstanceMethod, addClassMethod, getInstanceMethod and getClassMethod +// classDef = {"className": aClassName, "superClass": superClass , "ivars": myIvars, "instanceMethods": instanceMethodDefs, "classMethods": classMethodDefs, "protocols": myProtocols}; +var ClassDef = function(isImplementationDeclaration, name, superClass, ivars, instanceMethods, classMethods, protocols) +{ + this.name = name; + if (superClass) + this.superClass = superClass; + if (ivars) + this.ivars = ivars; + if (isImplementationDeclaration) { + this.instanceMethods = instanceMethods || Object.create(null); + this.classMethods = classMethods || Object.create(null); + } + if (protocols) + this.protocols = protocols; +} + +ClassDef.prototype.addInstanceMethod = function(methodDef) { + this.instanceMethods[methodDef.name] = methodDef; +} + +ClassDef.prototype.addClassMethod = function(methodDef) { + this.classMethods[methodDef.name] = methodDef; +} + +ClassDef.prototype.listOfNotImplementedMethodsForProtocols = function(protocolDefs) { + var resultList = [], + instanceMethods = this.getInstanceMethods(), + classMethods = this.getClassMethods(); + + for (var i = 0, size = protocolDefs.length; i < size; i++) + { + var protocolDef = protocolDefs[i], + protocolInstanceMethods = protocolDef.requiredInstanceMethods, + protocolClassMethods = protocolDef.requiredClassMethods, + inheritFromProtocols = protocolDef.protocols; + + if (protocolInstanceMethods) + for (var methodName in protocolInstanceMethods) { + var methodDef = protocolInstanceMethods[methodName]; + + if (!instanceMethods[methodName]) + resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); + } + + if (protocolClassMethods) + for (var methodName in protocolClassMethods) { + var methodDef = protocolClassMethods[methodName]; + + if (!classMethods[methodName]) + resultList.push({"methodDef": methodDef, "protocolDef": protocolDef}); + } + + if (inheritFromProtocols) + resultList = resultList.concat(this.listOfNotImplementedMethodsForProtocols(inheritFromProtocols)); + } + + return resultList; +} + +ClassDef.prototype.getInstanceMethod = function(name) { + var instanceMethods = this.instanceMethods; + + if (instanceMethods) { + var method = instanceMethods[name]; + + if (method) + return method; + } + + var superClass = this.superClass; + + if (superClass) + return superClass.getInstanceMethod(name); + + return null; +} + +ClassDef.prototype.getClassMethod = function(name) { + var classMethods = this.classMethods; + if (classMethods) { + var method = classMethods[name]; + + if (method) + return method; + } + + var superClass = this.superClass; + + if (superClass) + return superClass.getClassMethod(name); + + return null; +} + +// Return a new Array with all instance methods +ClassDef.prototype.getInstanceMethods = function() { + var instanceMethods = this.instanceMethods; + if (instanceMethods) { + var superClass = this.superClass, + returnObject = Object.create(null); + if (superClass) { + var superClassMethods = superClass.getInstanceMethods(); + for (var methodName in superClassMethods) + returnObject[methodName] = superClassMethods[methodName]; + } + + for (var methodName in instanceMethods) + returnObject[methodName] = instanceMethods[methodName]; + + return returnObject; + } + + return []; +} + +// Return a new Array with all class methods +ClassDef.prototype.getClassMethods = function() { + var classMethods = this.classMethods; + if (classMethods) { + var superClass = this.superClass, + returnObject = Object.create(null); + if (superClass) { + var superClassMethods = superClass.getClassMethods(); + for (var methodName in superClassMethods) + returnObject[methodName] = superClassMethods[methodName]; + } + + for (var methodName in classMethods) + returnObject[methodName] = classMethods[methodName]; + + return returnObject; + } + + return []; +} + +// protocolDef = {"name": aProtocolName, "protocols": inheritFromProtocols, "requiredInstanceMethods": requiredInstanceMethodDefs, "requiredClassMethods": requiredClassMethodDefs}; +var ProtocolDef = function(name, protocols, requiredInstanceMethodDefs, requiredClassMethodDefs) +{ + this.name = name; + this.protocols = protocols; + if (requiredInstanceMethodDefs) + this.requiredInstanceMethods = requiredInstanceMethodDefs; + if (requiredClassMethodDefs) + this.requiredClassMethods = requiredClassMethodDefs; +} + +ProtocolDef.prototype.addInstanceMethod = function(methodDef) { + (this.requiredInstanceMethods || (this.requiredInstanceMethods = Object.create(null)))[methodDef.name] = methodDef; +} + +ProtocolDef.prototype.addClassMethod = function(methodDef) { + (this.requiredClassMethods || (this.requiredClassMethods = Object.create(null)))[methodDef.name] = methodDef; +} + +ProtocolDef.prototype.getInstanceMethod = function(name) { + var instanceMethods = this.requiredInstanceMethods; + + if (instanceMethods) { + var method = instanceMethods[name]; + + if (method) + return method; + } + + var protocols = this.protocols; + + for (var i = 0, size = protocols.length; i < size; i++) { + var protocol = protocols[i], + method = protocol.getInstanceMethod(name); + + if (method) + return method; + } + + return null; +} + +ProtocolDef.prototype.getClassMethod = function(name) { + var classMethods = this.requiredClassMethods; + + if (classMethods) { + var method = classMethods[name]; + + if (method) + return method; + } + + var protocols = this.protocols; + + for (var i = 0, size = protocols.length; i < size; i++) { + var protocol = protocols[i], + method = protocol.getInstanceMethod(name); + + if (method) + return method; + } + + return null; +} + +// methodDef = {"types": types, "name": selector} +var MethodDef = function(name, types) +{ + this.name = name; + this.types = types; +} + var currentCompilerFlags = ""; var reservedIdentifiers = exports.acorn.makePredicate("self _cmd undefined localStorage arguments"); -var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, /*unsigned*/ pass, /* Dictionary */ classDefs) +var wordPrefixOperators = exports.acorn.makePredicate("delete in instanceof new typeof void"); + +var isLogicalBinary = exports.acorn.makePredicate("LogicalExpression BinaryExpression"); +var isInInstanceof = exports.acorn.makePredicate("in instanceof"); + +var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, /*unsigned*/ pass, /* Dictionary */ classDefs, /* Dictionary */ protocolDefs) { this.source = aString; this.URL = new CFURL(aURL); - this.pass = pass; - this.jsBuffer = new StringBuffer(); + this.pass = pass; + this.jsBuffer = new StringBuffer(); this.imBuffer = null; this.cmBuffer = null; this.warnings = []; @@ -145,7 +398,12 @@ var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned* this.dependencies = []; this.flags = flags | ObjJAcornCompiler.Flags.IncludeDebugSymbols; this.classDefs = classDefs ? classDefs : Object.create(null); + this.protocolDefs = protocolDefs ? protocolDefs : Object.create(null); this.lastPos = 0; + if (currentCompilerFlags & ObjJAcornCompiler.Flags.Generate) + this.generate = true; + this.generate = true; + compile(this.tokens, new Scope(null ,{ compiler: this }), pass === 2 ? pass2 : pass1); } @@ -157,9 +415,9 @@ exports.ObjJAcornCompiler.compileToExecutable = function(/*String*/ aString, /*C return new ObjJAcornCompiler(aString, aURL, flags, 2).executable(); } -exports.ObjJAcornCompiler.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, classDefs) +exports.ObjJAcornCompiler.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, classDefs, protocolDefs) { - return new ObjJAcornCompiler(aString, aURL, flags, 2, classDefs).IMBuffer(); + return new ObjJAcornCompiler(aString, aURL, flags, 2, classDefs, protocolDefs).IMBuffer(); } exports.ObjJAcornCompiler.compileFileDependencies = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags) @@ -171,11 +429,11 @@ exports.ObjJAcornCompiler.compileFileDependencies = function(/*String*/ aString, ObjJAcornCompiler.prototype.compilePass2 = function() { ObjJAcornCompiler.currentCompileFile = this.URL; - this.pass = 2; - this.jsBuffer = new StringBuffer(); + this.pass = 2; + this.jsBuffer = new StringBuffer(); this.warnings = []; + //print(this.URL + ": Compiling"); compile(this.tokens, new Scope(null ,{ compiler: this }), pass2); - for (var i = 0; i < this.warnings.length; i++) { var message = this.prettifyMessage(this.warnings[i], "WARNING"); @@ -186,7 +444,8 @@ ObjJAcornCompiler.prototype.compilePass2 = function() #endif } - return this.jsBuffer.toString(); + //print(this.URL + ": " + this.jsBuffer.toString()); + return this.jsBuffer.toString(); } var currentCompilerFlags = ""; @@ -203,8 +462,9 @@ exports.currentCompilerFlags = function(/*String*/ compilerFlags) ObjJAcornCompiler.Flags = { }; -ObjJAcornCompiler.Flags.IncludeDebugSymbols = 1 << 0; +ObjJAcornCompiler.Flags.IncludeDebugSymbols = 1 << 0; ObjJAcornCompiler.Flags.IncludeTypeSignatures = 1 << 1; +ObjJAcornCompiler.Flags.Generate = 1 << 2; ObjJAcornCompiler.prototype.addWarning = function(/* Warning */ aWarning) { @@ -229,45 +489,112 @@ ObjJAcornCompiler.prototype.getIvarForClass = function(/* String */ ivarName, /* if (ivarDef) return ivarDef; } - c = this.getClassDef(c.superClassName); + c = c.superClass; } } ObjJAcornCompiler.prototype.getClassDef = function(/* String */ aClassName) { - if (!aClassName) return null; + if (!aClassName) + return null; - var c = this.classDefs[aClassName]; + var c = this.classDefs[aClassName]; - if (c) return c; + if (c) + return c; - if (objj_getClass) - { - var aClass = objj_getClass(aClassName); - if (aClass) - { - var ivars = class_copyIvarList(aClass), - ivarSize = ivars.length, - myIvars = Object.create(null), - superClass = aClass.super_class; + if (typeof objj_getClass === 'function') + { + var aClass = objj_getClass(aClassName); + if (aClass) + { + var ivars = class_copyIvarList(aClass), + ivarSize = ivars.length, + myIvars = Object.create(null), + protocols = class_copyProtocolList(aClass), + protocolSize = protocols.length, + myProtocols = Object.create(null), + instanceMethodDefs = ObjJAcornCompiler.methodDefsFromMethodList(class_copyMethodList(aClass)), + classMethodDefs = ObjJAcornCompiler.methodDefsFromMethodList(class_copyMethodList(aClass.isa)), + superClass = class_getSuperclass(aClass); - for (var i = 0; i < ivarSize; i++) - { - var ivar = ivars[i]; + for (var i = 0; i < ivarSize; i++) + { + var ivar = ivars[i]; - myIvars[ivar.name] = {"type": ivar.type, "name": ivar.name}; - } - c = {"className": aClassName, "ivars": myIvars}; + myIvars[ivar.name] = {"type": ivar.type, "name": ivar.name}; + } - if (superClass) - c.superClassName = superClass.name; - this.classDefs[aClassName] = c; - return c; - } - } + for (var i = 0; i < protocolSize; i++) + { + var protocol = protocols[i], + protocolName = protocol_getName(protocol), + protocolDef = this.getProtocolDef(protocolName); - return null; -// classDef = {"className": className, "superClassName": superClassName, "ivars": Object.create(null), "methods": Object.create(null)}; + myProtocols[protocolName] = protocolDef; + } + + c = new ClassDef(true, aClassName, superClass ? this.getClassDef(superClass.name) : null, myIvars, instanceMethodDefs, classMethodDefs, myProtocols); + this.classDefs[aClassName] = c; + return c; + } + } + + return null; +} + +ObjJAcornCompiler.prototype.getProtocolDef = function(/* String */ aProtocolName) +{ + if (!aProtocolName) + return null; + + var p = this.protocolDefs[aProtocolName]; + + if (p) + return p; + + if (typeof objj_getProtocol === 'function') + { + var aProtocol = objj_getProtocol(aProtocolName); + if (aProtocol) + { + var protocolName = protocol_getName(aProtocol), + requiredInstanceMethods = protocol_copyMethodDescriptionList(aProtocol, true, true), + requiredInstanceMethodDefs = ObjJAcornCompiler.methodDefsFromMethodList(requiredInstanceMethods), + requiredClassMethods = protocol_copyMethodDescriptionList(aProtocol, true, false), + requiredClassMethodDefs = ObjJAcornCompiler.methodDefsFromMethodList(requiredClassMethods), + protocols = aProtocol.protocols, + inheritFromProtocols = []; + + if (protocols) + for (var i = 0, size = protocols.length; i < size; i++) + inheritFromProtocols.push(compiler.getProtocolDef(protocols[i].name)); + + p = new ProtocolDef(protocolName, inheritFromProtocols, requiredInstanceMethodDefs, requiredClassMethodDefs); + + this.protocolDefs[aProtocolName] = p; + return p; + } + } + + return null; +// protocolDef = {"name": protocolName, "protocols": Object.create(null), "required": Object.create(null), "optional": Object.create(null)}; +} + +ObjJAcornCompiler.methodDefsFromMethodList = function(/* Array */ methodList) +{ + var methodSize = methodList.length, + myMethods = Object.create(null); + + for (var i = 0; i < methodSize; i++) + { + var method = methodList[i], + methodName = method_getName(method); + + myMethods[methodName] = new MethodDef(methodName, method.types); + } + + return myMethods; } ObjJAcornCompiler.prototype.executable = function() @@ -330,7 +657,9 @@ function createMessage(/* String */ aMessage, /* SpiderMonkey AST node */ node, function compile(node, state, visitor) { function c(node, st, override) { + //print("c: " + (override ? override + ", " : "") + node.type + ", " + exports.acorn.getLineInfo(st.compiler.source, node.start).line); visitor[override || node.type](node, st, c); + //print("cc: " + (override ? override + ", " : "") + node.type + ", " + exports.acorn.getLineInfo(st.compiler.source, node.end).line); } c(node, state); }; @@ -409,6 +738,63 @@ function checkCanDereference(st, node) { throw st.compiler.error_message("Dereference of expression with side effects", node); } +// Surround expression with parentheses +function surroundExpression(c) { + return function(node, st, override) { + st.compiler.jsBuffer.concat("("); + c(node, st, override); + st.compiler.jsBuffer.concat(")"); + } +} + +var operatorPrecedence = { + // MemberExpression + // These two are never used as they are a MemberExpression with the attribute 'computed' which tells what operator it uses. + //".": 0, "[]": 0, + // NewExpression + // This is never used. + //"new": 1, + // All these are UnaryExpression or UpdateExpression and never used. + //"!": 2, "~": 2, "-": 2, "+": 2, "++": 2, "--": 2, "typeof": 2, "void": 2, "delete": 2, + // BinaryExpression + "*": 3, "/": 3, "%": 3, + "+": 4, "-": 4, + "<<": 5, ">>": 5, ">>>": 5, + "<": 6, "<=": 6, ">": 6, ">=": 6, "in": 6, "instanceof": 6, + "==": 7, "!=": 7, "===": 7, "!==": 7, + "&": 8, + "^": 9, + "|": 10, + // LogicalExpression + "&&": 11, + "||": 12 + // ConditionalExpression + // AssignmentExpression +} + +var expressionTypePrecedence = { + MemberExpression: 0, + CallExpression: 1, + NewExpression: 2, + FunctionExpression: 3, + UnaryExpression: 4, UpdateExpression: 4, + BinaryExpression: 5, + LogicalExpression: 6, + ConditionalExpression: 7, + AssignmentExpression: 8 +} + +// Returns true if subNode has higher precedence the the root node. +// If the subNode is the right (as in left/right) subNode +function nodePrecedence(node, subNode, right) { + var nodeType = node.type, + nodePrecedence = expressionTypePrecedence[nodeType] || -1, + subNodePrecedence = expressionTypePrecedence[subNode.type] || -1, + nodeOperatorPrecedence, + subNodeOperatorPrecedence; + return nodePrecedence < subNodePrecedence || (nodePrecedence === subNodePrecedence && isLogicalBinary(nodeType) && ((nodeOperatorPrecedence = operatorPrecedence[node.operator]) < (subNodeOperatorPrecedence = operatorPrecedence[subNode.operator]) || (right && nodeOperatorPrecedence === subNodeOperatorPrecedence))); +} + var pass1 = exports.acorn.walk.make({ ImportStatement: function(node, st, c) { var urlString = node.filename.value; @@ -417,249 +803,937 @@ ImportStatement: function(node, st, c) { } }); +var indentationSpaces = 4; +var indentStep = Array(indentationSpaces + 1).join(" "); +var indentation = ""; + var pass2 = exports.acorn.walk.make({ Program: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + indentation = ""; for (var i = 0; i < node.body.length; ++i) { c(node.body[i], st, "Statement"); } - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.end)); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.end)); + // Check maybe warnings var maybeWarnings = st.maybeWarnings(); if (maybeWarnings) for (var i = 0; i < maybeWarnings.length; i++) { var maybeWarning = maybeWarnings[i]; - if (!st.getLvar(maybeWarning.identifier) && typeof global[maybeWarning.identifier] === "undefined" && typeof window[maybeWarning.identifier] === "undefined" && !st.compiler.getClassDef(maybeWarning.identifier)) { - st.compiler.addWarning(maybeWarning.message); + if (maybeWarning.checkIfWarning(st)) { + compiler.addWarning(maybeWarning.message); } } }, -Function: function(node, scope, c) { - var inner = new Scope(scope); +BlockStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + st.indentBlockLevel = typeof st.indentBlockLevel === "undefined" ? 0 : st.indentBlockLevel + 1; + buffer = compiler.jsBuffer; + buffer.concat(indentation.substring(indentationSpaces)); + buffer.concat("{\n"); + } + for (var i = 0; i < node.body.length; ++i) { + c(node.body[i], st, "Statement"); + } + if (generate) { + buffer.concat(indentation.substring(indentationSpaces)); + buffer.concat("}"); + if (st.isDecl || st.indentBlockLevel > 0) + buffer.concat("\n"); + st.indentBlockLevel--; + } +}, +ExpressionStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) compiler.jsBuffer.concat(indentation); + c(node.expression, st, "Expression"); + if (generate) compiler.jsBuffer.concat(";\n"); +}, +IfStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + if (!st.superNodeIsElse) + buffer.concat(indentation); + else + delete st.superNodeIsElse; + buffer.concat("if ("); + } + c(node.test, st, "Expression"); + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + if (generate) buffer.concat(node.consequent.type === "EmptyStatement" ? ");\n" : ")\n"); + indentation += indentStep; + c(node.consequent, st, "Statement"); + indentation = indentation.substring(indentationSpaces); + var alternate = node.alternate; + if (alternate) { + var alternateNotIf = alternate.type !== "IfStatement"; + if (generate) { + var emptyStatement = alternate.type === "EmptyStatement"; + buffer.concat(indentation); + // We don't want EmptyStatements to generate an extra parenthesis except when it is in a while, for, ... + buffer.concat(alternateNotIf ? emptyStatement ? "else;\n" : "else\n" : "else "); + } + if (alternateNotIf) + indentation += indentStep; + else + st.superNodeIsElse = true; + + c(alternate, st, "Statement"); + if (alternateNotIf) indentation = indentation.substring(indentationSpaces); + } +}, +LabeledStatement: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) { + var buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat(node.label.name); + buffer.concat(": "); + } + c(node.body, st, "Statement"); +}, +BreakStatement: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) { + compiler.jsBuffer.concat(indentation); + if (node.label) { + compiler.jsBuffer.concat("break "); + compiler.jsBuffer.concat(node.label.name); + compiler.jsBuffer.concat(";\n"); + } else + compiler.jsBuffer.concat("break;\n"); + } +}, +ContinueStatement: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) { + var buffer = compiler.jsBuffer; + buffer.concat(indentation); + if (node.label) { + buffer.concat("continue "); + buffer.concat(node.label.name); + buffer.concat(";\n"); + } else + buffer.concat("continue;\n"); + } +}, +WithStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("with("); + } + c(node.object, st, "Expression"); + if (generate) buffer.concat(")\n"); + indentation += indentStep; + c(node.body, st, "Statement"); + indentation = indentation.substring(indentationSpaces); +}, +SwitchStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("switch("); + } + c(node.discriminant, st, "Expression"); + if (generate) buffer.concat(") {\n"); + for (var i = 0; i < node.cases.length; ++i) { + var cs = node.cases[i]; + if (cs.test) { + if (generate) { + buffer.concat(indentation); + buffer.concat("case "); + } + c(cs.test, st, "Expression"); + if (generate) buffer.concat(":\n"); + } else + if (generate) buffer.concat("default:\n"); + indentation += indentStep; + for (var j = 0; j < cs.consequent.length; ++j) + c(cs.consequent[j], st, "Statement"); + indentation = indentation.substring(indentationSpaces); + } + if (generate) { + buffer.concat(indentation); + buffer.concat("}\n"); + } +}, +ReturnStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("return"); + } + if (node.argument) { + if (generate) buffer.concat(" "); + c(node.argument, st, "Expression"); + } + if (generate) buffer.concat(";\n"); +}, +ThrowStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("throw "); + } + c(node.argument, st, "Expression"); + if (generate) buffer.concat(";\n"); +}, +TryStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("try"); + } + indentation += indentStep; + c(node.block, st, "Statement"); + indentation = indentation.substring(indentationSpaces); + for (var i = 0; i < node.handlers.length; ++i) { + var handler = node.handlers[i], inner = new Scope(st), + param = handler.param, + name = param.name; + inner.vars[name] = {type: "catch clause", node: param}; + if (generate) { + buffer.concat(indentation); + buffer.concat("catch("); + buffer.concat(name); + buffer.concat(") "); + } + indentation += indentStep; + c(handler.body, inner, "ScopeBody"); + indentation = indentation.substring(indentationSpaces); + inner.copyAddedSelfToIvarsToParent(); + } + if (node.finalizer) { + if (generate) { + buffer.concat(indentation); + buffer.concat("finally "); + } + indentation += indentStep; + c(node.finalizer, st, "Statement"); + indentation = indentation.substring(indentationSpaces); + } +}, +WhileStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + body = node.body, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("while ("); + } + c(node.test, st, "Expression"); + if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + indentation += indentStep; + c(body, st, "Statement"); + indentation = indentation.substring(indentationSpaces); +}, +DoWhileStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("do\n"); + } + indentation += indentStep; + c(node.body, st, "Statement"); + indentation = indentation.substring(indentationSpaces); + if (generate) { + buffer.concat(indentation); + buffer.concat("while ("); + } + c(node.test, st, "Expression"); + if (generate) buffer.concat(");\n"); +}, +ForStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + body = node.body, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("for ("); + } + if (node.init) c(node.init, st, "ForInit"); + if (generate) buffer.concat("; "); + if (node.test) c(node.test, st, "Expression"); + if (generate) buffer.concat("; "); + if (node.update) c(node.update, st, "Expression"); + if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + indentation += indentStep; + c(body, st, "Statement"); + indentation = indentation.substring(indentationSpaces); +}, +ForInStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + body = node.body, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("for ("); + } + c(node.left, st, "ForInit"); + if (generate) buffer.concat(" in "); + c(node.right, st, "Expression"); + if (generate) buffer.concat(body.type === "EmptyStatement" ? ");\n" : ")\n"); + indentation += indentStep; + c(body, st, "Statement"); + indentation = indentation.substring(indentationSpaces); +}, +ForInit: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (node.type === "VariableDeclaration") { + st.isFor = true; + c(node, st); + delete st.isFor; + } else + c(node, st, "Expression"); +}, +DebuggerStatement: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) { + var buffer = compiler.jsBuffer; + buffer.concat(indentation); + buffer.concat("debugger;\n"); + } +}, +Function: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer = compiler.jsBuffer; + inner = new Scope(st), + decl = node.type == "FunctionDeclaration"; + + inner.isDecl = decl; for (var i = 0; i < node.params.length; ++i) inner.vars[node.params[i].name] = {type: "argument", node: node.params[i]}; if (node.id) { - var decl = node.type == "FunctionDeclaration"; - (decl ? scope : inner).vars[node.id.name] = + (decl ? st : inner).vars[node.id.name] = {type: decl ? "function" : "function name", node: node.id}; - CONCAT(scope.compiler.jsBuffer,scope.compiler.source.substring(scope.compiler.lastPos, node.start)); - CONCAT(scope.compiler.jsBuffer, node.id.name); - CONCAT(scope.compiler.jsBuffer, " = function"); - scope.compiler.lastPos = node.id.end; + if (generate) { + buffer.concat(node.id.name); + buffer.concat(" = "); + } else { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(node.id.name); + buffer.concat(" = function"); + compiler.lastPos = node.id.end; + } } + if (generate) { + buffer.concat("function("); + for (var i = 0; i < node.params.length; ++i) { + if (i) + buffer.concat(", "); + buffer.concat(node.params[i].name); + } + buffer.concat(")\n"); + } + indentation += indentStep; c(node.body, inner, "ScopeBody"); + indentation = indentation.substring(indentationSpaces); inner.copyAddedSelfToIvarsToParent(); }, -TryStatement: function(node, scope, c) { - c(node.block, scope, "Statement"); - for (var i = 0; i < node.handlers.length; ++i) { - var handler = node.handlers[i], inner = new Scope(scope); - inner.vars[handler.param.name] = {type: "catch clause", node: handler.param}; - c(handler.body, inner, "ScopeBody"); - inner.copyAddedSelfToIvarsToParent(); +VariableDeclaration: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer; + if (generate) { + buffer = compiler.jsBuffer; + if (!st.isFor) buffer.concat(indentation); + buffer.concat("var "); } - if (node.finalizer) c(node.finalizer, scope, "Statement"); -}, -VariableDeclaration: function(node, scope, c) { for (var i = 0; i < node.declarations.length; ++i) { var decl = node.declarations[i], identifier = decl.id.name; - scope.vars[identifier] = {type: "var", node: decl.id}; - if (decl.init) c(decl.init, scope, "Expression"); - if (scope.addedSelfToIvars) { - var addedSelfToIvar = scope.addedSelfToIvars[identifier]; + if (i) + if (generate) { + if (st.isFor) + buffer.concat(", "); + else { + buffer.concat(",\n"); + buffer.concat(indentation); + buffer.concat(" "); + } + } + st.vars[identifier] = {type: "var", node: decl.id}; + if (generate) buffer.concat(identifier); + if (decl.init) { + if (generate) buffer.concat(" = "); + c(decl.init, st, "Expression"); + } + // FIXME: Extract to function + if (st.addedSelfToIvars) { + var addedSelfToIvar = st.addedSelfToIvars[identifier]; if (addedSelfToIvar) { - var buffer = scope.compiler.jsBuffer.atoms; + var buffer = st.compiler.jsBuffer.atoms; for (var i = 0; i < addedSelfToIvar.length; i++) { var dict = addedSelfToIvar[i]; buffer[dict.index] = ""; - scope.compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides instance variable", dict.node, scope.compiler.source)); + compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides instance variable", dict.node, compiler.source)); } - scope.addedSelfToIvars[identifier] = []; + st.addedSelfToIvars[identifier] = []; } } } + if (generate && !st.isFor) compiler.jsBuffer.concat(";\n"); // Don't add ';' if this is a for statement but do it if this is a statement +}, +ThisExpression: function(node, st, c) { + var compiler = st.compiler; + if (compiler.generate) compiler.jsBuffer.concat("this"); +}, +ArrayExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) compiler.jsBuffer.concat("["); + for (var i = 0; i < node.elements.length; ++i) { + var elt = node.elements[i]; + if (i !== 0) + if (generate) compiler.jsBuffer.concat(", "); + + if (elt) c(elt, st, "Expression"); + } + if (generate) compiler.jsBuffer.concat("]"); +}, +ObjectExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) compiler.jsBuffer.concat("{"); + for (var i = 0; i < node.properties.length; ++i) + { + var prop = node.properties[i]; + if (generate) { + if (i) + compiler.jsBuffer.concat(", "); + st.isPropertyKey = true; + c(prop.key, st, "Expression"); + delete st.isPropertyKey; + compiler.jsBuffer.concat(": "); + } else if (prop.key.raw && prop.key.raw.charAt(0) === "@") { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, prop.key.start)); + compiler.lastPos = prop.key.start + 1; + } + + c(prop.value, st, "Expression"); + } + if (generate) compiler.jsBuffer.concat("}"); +}, +SequenceExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) compiler.jsBuffer.concat("("); + for (var i = 0; i < node.expressions.length; ++i) { + if (generate && i !== 0) + compiler.jsBuffer.concat(", "); + c(node.expressions[i], st, "Expression"); + } + if (generate) compiler.jsBuffer.concat(")"); +}, +UnaryExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + argument = node.argument; + if (generate) { + if (node.prefix) { + compiler.jsBuffer.concat(node.operator); + if (wordPrefixOperators(node.operator)) + compiler.jsBuffer.concat(" "); + (nodePrecedence(node, argument) ? surroundExpression(c) : c)(argument, st, "Expression"); + } else { + (nodePrecedence(node, argument) ? surroundExpression(c) : c)(argument, st, "Expression"); + compiler.jsBuffer.concat(node.operator); + } + } else { + c(argument, st, "Expression"); + } +}, +UpdateExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (node.argument.type === "Dereference") { + checkCanDereference(st, node.argument); + + // @deref(x)++ and ++@deref(x) require special handling. + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + + // Output the dereference function, "(...)(z)" + compiler.jsBuffer.concat((node.prefix ? "" : "(") + "("); + + // The thing being dereferenced. + if (!generate) compiler.lastPos = node.argument.expr.start; + c(node.argument.expr, st, "Expression"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.argument.expr.end)); + compiler.jsBuffer.concat(")("); + + if (!generate) compiler.lastPos = node.argument.start; + c(node.argument, st, "Expression"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.argument.end)); + compiler.jsBuffer.concat(" " + node.operator.substring(0, 1) + " 1)" + (node.prefix ? "" : node.operator == '++' ? " - 1)" : " + 1)")); + + if (!generate) compiler.lastPos = node.end; + return; + } + + if (node.prefix) { + if (generate) { + compiler.jsBuffer.concat(node.operator); + if (wordPrefixOperators(node.operator)) + compiler.jsBuffer.concat(" "); + } + (generate && nodePrecedence(node, node.argument) ? surroundExpression(c) : c)(node.argument, st, "Expression"); + } else { + (generate && nodePrecedence(node, node.argument) ? surroundExpression(c) : c)(node.argument, st, "Expression"); + if (generate) compiler.jsBuffer.concat(node.operator); + } +}, +BinaryExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + operatorType = isInInstanceof(node.operator); + (generate && nodePrecedence(node, node.left) ? surroundExpression(c) : c)(node.left, st, "Expression"); + if (generate) { + var buffer = compiler.jsBuffer; + buffer.concat(" "); + buffer.concat(node.operator); + buffer.concat(" "); + } + (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); +}, +LogicalExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + (generate && nodePrecedence(node, node.left) ? surroundExpression(c) : c)(node.left, st, "Expression"); + if (generate) { + var buffer = compiler.jsBuffer; + buffer.concat(" "); + buffer.concat(node.operator); + buffer.concat(" "); + } + (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); }, AssignmentExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + saveAssignment = st.assignment, + buffer = compiler.jsBuffer; + if (node.left.type === "Dereference") { checkCanDereference(st, node.left); // @deref(x) = z -> x(z) etc - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); // Output the dereference function, "(...)(z)" - CONCAT(st.compiler.jsBuffer, "("); + buffer.concat("("); // What's being dereferenced could itself be an expression, such as when dereferencing a deref. - st.compiler.lastPos = node.left.expr.start; + if (!generate) compiler.lastPos = node.left.expr.start; c(node.left.expr, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.left.expr.end)); - CONCAT(st.compiler.jsBuffer, ")("); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.left.expr.end)); + buffer.concat(")("); // Now "(x)(...)". We have to manually expand +=, -=, *= etc. if (node.operator !== "=") { // Output the whole .left, not just .left.expr. - st.compiler.lastPos = node.left.start; + if (!generate) compiler.lastPos = node.left.start; c(node.left, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.left.end)); - CONCAT(st.compiler.jsBuffer, " " + node.operator.substring(0, 1) + " "); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.left.end)); + buffer.concat(" " + node.operator.substring(0, 1) + " "); } - st.compiler.lastPos = node.right.start; + if (!generate) compiler.lastPos = node.right.start; c(node.right, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.right.end)); - CONCAT(st.compiler.jsBuffer, ")"); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.right.end)); + buffer.concat(")"); - st.compiler.lastPos = node.end; + if (!generate) compiler.lastPos = node.end; return; } var saveAssignment = st.assignment; st.assignment = true; - c(node.left, st, "Expression"); + (generate && nodePrecedence(node, node.left) ? surroundExpression(c) : c)(node.left, st, "Expression"); + if (generate) { + buffer.concat(" "); + buffer.concat(node.operator); + buffer.concat(" "); + } st.assignment = saveAssignment; - c(node.right, st, "Expression"); + (generate && nodePrecedence(node, node.right, true) ? surroundExpression(c) : c)(node.right, st, "Expression"); if (st.isRootScope() && node.left.type === "Identifier" && !st.getLvar(node.left.name)) st.vars[node.left.name] = {type: "global", node: node.left}; }, -UpdateExpression: function(node, st, c) { - if (node.argument.type === "Dereference") { - checkCanDereference(st, node.argument); - - // @deref(x)++ and ++@deref(x) require special handling. - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - - // Output the dereference function, "(...)(z)" - CONCAT(st.compiler.jsBuffer, (node.prefix ? "" : "(") + "("); - - // The thing being dereferenced. - st.compiler.lastPos = node.argument.expr.start; - c(node.argument.expr, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.argument.expr.end)); - CONCAT(st.compiler.jsBuffer, ")("); - - st.compiler.lastPos = node.argument.start; - c(node.argument, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.argument.end)); - CONCAT(st.compiler.jsBuffer, " " + node.operator.substring(0, 1) + " 1)" + (node.prefix ? "" : node.operator == '++' ? " - 1)" : " + 1)")); - - st.compiler.lastPos = node.end; - return; +ConditionalExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + (generate && nodePrecedence(node, node.test) ? surroundExpression(c) : c)(node.test, st, "Expression"); + if (generate) + compiler.jsBuffer.concat(" ? "); + c(node.consequent, st, "Expression"); + if (generate) compiler.jsBuffer.concat(" : "); + c(node.alternate, st, "Expression"); +}, +NewExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) compiler.jsBuffer.concat("new "); + (generate && nodePrecedence(node, node.callee) ? surroundExpression(c) : c)(node.callee, st, "Expression"); + if (generate) compiler.jsBuffer.concat("("); + if (node.arguments) { + for (var i = 0; i < node.arguments.length; ++i) { + if (generate && i) + compiler.jsBuffer.concat(", "); + c(node.arguments[i], st, "Expression"); + } } - - c(node.argument, st, "Expression"); + if (generate) compiler.jsBuffer.concat(")"); +}, +CallExpression: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + (generate && nodePrecedence(node, node.callee) ? surroundExpression(c) : c)(node.callee, st, "Expression"); + if (generate) compiler.jsBuffer.concat("("); + if (node.arguments) { + for (var i = 0; i < node.arguments.length; ++i) { + if (generate && i) + compiler.jsBuffer.concat(", "); + c(node.arguments[i], st, "Expression"); + } + } + if (generate) compiler.jsBuffer.concat(")"); }, MemberExpression: function(node, st, c) { - c(node.object, st, "Expression"); - st.secondMemberExpression = !node.computed; - c(node.property, st, "Expression"); + var compiler = st.compiler, + generate = compiler.generate, + computed = node.computed; + (generate && nodePrecedence(node, node.object) ? surroundExpression(c) : c)(node.object, st, "Expression"); + if (generate) { + if (computed) + compiler.jsBuffer.concat("["); + else + compiler.jsBuffer.concat("."); + } + st.secondMemberExpression = !computed; + // No parentheses when it is computed, '[' amd ']' are the same thing. + (generate && !computed && nodePrecedence(node, node.property) ? surroundExpression(c) : c)(node.property, st, "Expression"); st.secondMemberExpression = false; + if (generate && computed) + compiler.jsBuffer.concat("]"); +}, +Identifier: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + identifier = node.name; + if (st.currentMethodType() === "-" && !st.secondMemberExpression && !st.isPropertyKey) + { + var lvar = st.getLvar(identifier, true), // Only look inside method + ivar = compiler.getIvarForClass(identifier, st); + + if (ivar) + { + if (lvar) + compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides instance variable", node, compiler.source)); + else + { + var nodeStart = node.start; + + if (!generate) do { // The Spider Monkey AST tree includes any parentheses in start and end properties so we have to make sure we skip those + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, nodeStart)); + compiler.lastPos = nodeStart; + } while (compiler.source.substr(nodeStart++, 1) === "(") + // Save the index in where the "self." string is stored and the node. + // These will be used if we find a variable declaration that is hoisting this identifier. + ((st.addedSelfToIvars || (st.addedSelfToIvars = Object.create(null)))[identifier] || (st.addedSelfToIvars[identifier] = [])).push({node: node, index: compiler.jsBuffer.atoms.length}); + compiler.jsBuffer.concat("self."); + } + } else if (!reservedIdentifiers(identifier)) { // Don't check for warnings if it is a reserved word like self, localStorage, _cmd, etc... + var message, + classOrGlobal = typeof global[identifier] !== "undefined" || typeof window[identifier] !== "undefined" || compiler.getClassDef(identifier), + globalVar = st.getLvar(identifier); + if (classOrGlobal && (!globalVar || globalVar.type !== "class")) { // It can't be declared with a @class statement. + /* Turned off this warning as there are many many warnings when compiling the Cappuccino frameworks - Martin + if (lvar) { + message = compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides global variable", node, compiler.source)); + }*/ + } else if (!globalVar) { + if (st.assignment) { + message = new GlobalVariableMaybeWarning("Creating global variable inside function or method '" + identifier + "'", node, compiler.source); + // Turn off these warnings for this identifier, we only want one. + st.vars[identifier] = {type: "remove global warning", node: node}; + } else { + message = new GlobalVariableMaybeWarning("Using unknown class or uninitialized global variable '" + identifier + "'", node, compiler.source); + } + } + if (message) + st.addMaybeWarning(message); + } + } + if (generate) compiler.jsBuffer.concat(identifier); +}, +Literal: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (generate) { + if (node.raw && node.raw.charAt(0) === "@") + compiler.jsBuffer.concat(node.raw.substring(1)); + else + compiler.jsBuffer.concat(node.raw); + } else if (node.raw.charAt(0) === "@") { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start + 1; + } +}, +ArrayLiteral: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (!generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start; + } + + if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + if (!node.elements.length) { + compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"init\")"); + } else { + compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"initWithObjects:count:\", ["); + for (var i = 0; i < node.elements.length; i++) { + var elt = node.elements[i]; + + if (i) + compiler.jsBuffer.concat(", "); + + if (!generate) compiler.lastPos = elt.start; + c(elt, st, "Expression"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, elt.end)); + } + compiler.jsBuffer.concat("], " + node.elements.length + ")"); + } + + if (!generate) compiler.lastPos = node.end; +}, +DictionaryLiteral: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + if (!generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start; + } + + if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + if (!node.keys.length) { + compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"init\")"); + } else { + compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"initWithObjectsAndKeys:\""); + for (var i = 0; i < node.keys.length; i++) { + var key = node.keys[i], + value = node.values[i]; + + compiler.jsBuffer.concat(", "); + + if (!generate) compiler.lastPos = value.start; + c(value, st, "Expression"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, value.end)); + + compiler.jsBuffer.concat(", "); + + if (!generate) compiler.lastPos = key.start; + c(key, st, "Expression"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, key.end)); + } + compiler.jsBuffer.concat(")"); + } + + if (!generate) compiler.lastPos = node.end; }, ImportStatement: function(node, st, c) { - var buffer = st.compiler.jsBuffer; + var compiler = st.compiler, + generate = compiler.generate, + buffer = compiler.jsBuffer; - if (!buffer) return; - CONCAT(buffer,st.compiler.source.substring(st.compiler.lastPos, node.start)); - CONCAT(buffer, "objj_executeFile(\""); - CONCAT(buffer, node.filename.value); - CONCAT(buffer, node.localfilepath ? "\", YES);" : "\", NO);"); - st.compiler.lastPos = node.end; + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat("objj_executeFile(\""); + buffer.concat(node.filename.value); + buffer.concat(node.localfilepath ? "\", YES);" : "\", NO);"); + if (!generate) compiler.lastPos = node.end; }, ClassDeclarationStatement: function(node, st, c) { - var classDef, - saveJSBuffer = st.compiler.jsBuffer, + var compiler = st.compiler, + generate = compiler.generate, + saveJSBuffer = compiler.jsBuffer, className = node.classname.name, - classScope = new Scope(st); + classDef = compiler.getClassDef(className), + classScope = new Scope(st), + isInterfaceDeclaration = node.type === "InterfaceDeclarationStatement", + protocols = node.protocols; - st.compiler.imBuffer = new StringBuffer(); - st.compiler.cmBuffer = new StringBuffer(); - st.compiler.classBodyBuffer = new StringBuffer(); // TODO: Check if this is needed + compiler.imBuffer = new StringBuffer(); + compiler.cmBuffer = new StringBuffer(); + compiler.classBodyBuffer = new StringBuffer(); // TODO: Check if this is needed - CONCAT(saveJSBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); // First we declare the class if (node.superclassname) { - classDef = st.compiler.getClassDef(className); - if (classDef && classDef.ivars) // Must have ivars dictionary to be a real declaration. Without it is a "@class" declaration - throw st.compiler.error_message("Duplicate class " + className, node.classname); - if (!st.compiler.getClassDef(node.superclassname.name)) + // Must have methods dictionaries and ivars dictionary to be a real implementaion declaration. + // Without it is a "@class" declaration (without both ivars dictionary and method dictionaries) or + // "interface" declaration (without ivars dictionary) + // TODO: Create a ClassDef object and add this logic to it + if (classDef && classDef.ivars) + // It has a real implementation declaration already + throw compiler.error_message("Duplicate class " + className, node.classname); + + if (isInterfaceDeclaration && classDef && classDef.instanceMethods && classDef.classMethods) + // It has a interface declaration already + throw compiler.error_message("Duplicate interface definition for class " + className, node.classname); + var superClassDef = compiler.getClassDef(node.superclassname.name); + if (!superClassDef) { var errorMessage = "Can't find superclass " + node.superclassname.name; for (var i = ObjJAcornCompiler.importStack.length; --i >= 0;) errorMessage += "\n" + Array((ObjJAcornCompiler.importStack.length - i) * 2 + 1).join(" ") + "Imported by: " + ObjJAcornCompiler.importStack[i]; - throw st.compiler.error_message(errorMessage, node.superclassname); + throw compiler.error_message(errorMessage, node.superclassname); } - classDef = {"className": className, "superClassName": node.superclassname.name, "ivars": Object.create(null), "methods": Object.create(null)}; + classDef = new ClassDef(!isInterfaceDeclaration, className, superClassDef, Object.create(null)); - CONCAT(saveJSBuffer, "{var the_class = objj_allocateClassPair(" + node.superclassname.name + ", \"" + className + "\"),\nmeta_class = the_class.isa;"); + saveJSBuffer.concat("{var the_class = objj_allocateClassPair(" + node.superclassname.name + ", \"" + className + "\"),\nmeta_class = the_class.isa;"); } else if (node.categoryname) { - classDef = st.compiler.getClassDef(className); + classDef = compiler.getClassDef(className); if (!classDef) - throw st.compiler.error_message("Class " + className + " not found ", node.classname); + throw compiler.error_message("Class " + className + " not found ", node.classname); - CONCAT(saveJSBuffer, "{\nvar the_class = objj_getClass(\"" + className + "\")\n"); - CONCAT(saveJSBuffer, "if(!the_class) throw new SyntaxError(\"*** Could not find definition for class \\\"" + className + "\\\"\");\n"); - CONCAT(saveJSBuffer, "var meta_class = the_class.isa;"); + saveJSBuffer.concat("{\nvar the_class = objj_getClass(\"" + className + "\")\n"); + saveJSBuffer.concat("if(!the_class) throw new SyntaxError(\"*** Could not find definition for class \\\"" + className + "\\\"\");\n"); + saveJSBuffer.concat("var meta_class = the_class.isa;"); } else { - classDef = {"className": className, "superClassName": null, "ivars": Object.create(null), "methods": Object.create(null)}; + classDef = new ClassDef(!isInterfaceDeclaration, className, null, Object.create(null)); - CONCAT(saveJSBuffer, "{var the_class = objj_allocateClassPair(Nil, \"" + className + "\"),\nmeta_class = the_class.isa;"); + saveJSBuffer.concat("{var the_class = objj_allocateClassPair(Nil, \"" + className + "\"),\nmeta_class = the_class.isa;"); } + if (protocols) + for (var i = 0, size = protocols.length; i < size; i++) + { + saveJSBuffer.concat("\nvar aProtocol = objj_getProtocol(\"" + protocols[i].name + "\");"); + saveJSBuffer.concat("\nif (!aProtocol) throw new SyntaxError(\"*** Could not find definition for protocol \\\"" + protocols[i].name + "\\\"\");"); + saveJSBuffer.concat("\nclass_addProtocol(the_class, aProtocol);"); + } + /* + if (isInterfaceDeclaration) + classDef.interfaceDeclaration = true; +*/ classScope.classDef = classDef; - st.compiler.currentSuperClass = "objj_getClass(\"" + className + "\").super_class"; - st.compiler.currentSuperMetaClass = "objj_getMetaClass(\"" + className + "\").super_class"; + compiler.currentSuperClass = "objj_getClass(\"" + className + "\").super_class"; + compiler.currentSuperMetaClass = "objj_getMetaClass(\"" + className + "\").super_class"; var firstIvarDeclaration = true, hasAccessors = false; // Then we add all ivars - if (node.ivardeclarations) for (var i = 0; i < node.ivardeclarations.length; ++i) - { - var ivarDecl = node.ivardeclarations[i], - ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null, - ivarName = ivarDecl.id.name, - ivar = {"type": ivarType, "name": ivarName}; - - if (firstIvarDeclaration) + if (node.ivardeclarations) + for (var i = 0; i < node.ivardeclarations.length; ++i) { - firstIvarDeclaration = false; - CONCAT(saveJSBuffer, "class_addIvars(the_class, ["); + var ivarDecl = node.ivardeclarations[i], + ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null, + ivarName = ivarDecl.id.name, + ivars = classDef.ivars, + ivar = {"type": ivarType, "name": ivarName}, + accessors = ivarDecl.accessors; + + if (ivars[ivarName]) + throw compiler.error_message("Instance variable '" + ivarName + "'is already declared for class " + className, ivarDecl.id); + + if (firstIvarDeclaration) + { + firstIvarDeclaration = false; + saveJSBuffer.concat("class_addIvars(the_class, ["); + } + else + saveJSBuffer.concat(", "); + + if (compiler.flags & ObjJAcornCompiler.Flags.IncludeTypeSignatures) + saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\", \"" + ivarType + "\")"); + else + saveJSBuffer.concat("new objj_ivar(\"" + ivarName + "\")"); + + if (ivarDecl.outlet) + ivar.outlet = true; + ivars[ivarName] = ivar; + if (!classScope.ivars) + classScope.ivars = Object.create(null); + classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarDecl.id, ivar: ivar}; + + if (accessors) + { + // TODO: This next couple of lines for getting getterName and setterName are duplicated from below. Create functions for this. + var property = (accessors.property && accessors.property.name) || ivarName, + getterName = (accessors.getter && accessors.getter.name) || property; + + classDef.addInstanceMethod(new MethodDef(getterName, [ivarType])); + + if (!accessors.readonly) + { + var setterName = accessors.setter ? accessors.setter.name : null; + + if (!setterName) + { + var start = property.charAt(0) == '_' ? 1 : 0; + + setterName = (start ? "_" : "") + "set" + property.substr(start, 1).toUpperCase() + property.substring(start + 1) + ":"; + } + classDef.addInstanceMethod(new MethodDef(setterName, ["void", ivarType])); + } + hasAccessors = true; + } } - else - CONCAT(saveJSBuffer, ", "); - - if (st.compiler.flags & ObjJAcornCompiler.Flags.IncludeTypeSignatures) - CONCAT(saveJSBuffer, "new objj_ivar(\"" + ivarName + "\", \"" + ivarType + "\")"); - else - CONCAT(saveJSBuffer, "new objj_ivar(\"" + ivarName + "\")"); - - if (ivarDecl.outlet) - ivar.outlet = true; - classDef.ivars[ivarName] = ivar; - if (!classScope.ivars) - classScope.ivars = Object.create(null); - classScope.ivars[ivarName] = {type: "ivar", name: ivarName, node: ivarDecl.id, ivar: ivar}; - - if (!hasAccessors && ivarDecl.accessors) - hasAccessors = true; - } if (!firstIvarDeclaration) - CONCAT(saveJSBuffer, "]);"); + saveJSBuffer.concat("]);"); // If we have accessors add get and set methods for them - if (hasAccessors) + if (!isInterfaceDeclaration && hasAccessors) { var getterSetterBuffer = new StringBuffer(); // Add the class declaration to compile accessors correctly - CONCAT(getterSetterBuffer, st.compiler.source.substring(node.start, node.endOfIvars)); - CONCAT(getterSetterBuffer, "\n"); + getterSetterBuffer.concat(compiler.source.substring(node.start, node.endOfIvars)); + getterSetterBuffer.concat("\n"); for (var i = 0; i < node.ivardeclarations.length; ++i) { @@ -675,7 +1749,7 @@ ClassDeclarationStatement: function(node, st, c) { getterName = (accessors.getter && accessors.getter.name) || property, getterCode = "- (" + (ivarType ? ivarType : "id") + ")" + getterName + "\n{\nreturn " + ivarName + ";\n}\n"; - CONCAT(getterSetterBuffer, getterCode); + getterSetterBuffer.concat(getterCode); if (accessors.readonly) continue; @@ -696,141 +1770,364 @@ ClassDeclarationStatement: function(node, st, c) { else setterCode += ivarName + " = newValue;\n}\n"; - CONCAT(getterSetterBuffer, setterCode); + getterSetterBuffer.concat(setterCode); } - CONCAT(getterSetterBuffer, "\n@end"); + getterSetterBuffer.concat("\n@end"); // Remove all @accessors or we will get a recursive loop in infinity var b = getterSetterBuffer.toString().replace(/@accessors(\(.*\))?/g, ""); - var imBuffer = ObjJAcornCompiler.compileToIMBuffer(b, "Accessors", st.compiler.flags, st.compiler.classDefs); + var imBuffer = ObjJAcornCompiler.compileToIMBuffer(b, "Accessors", compiler.flags, compiler.classDefs, compiler.protocolDefs); // Add the accessors methods first to instance method buffer. // This will allow manually added set and get methods to override the compiler generated - CONCAT(st.compiler.imBuffer, imBuffer); + compiler.imBuffer.concat(imBuffer); } // We will store the classDef first after accessors are done so we don't get a duplicate class error - st.compiler.classDefs[className] = classDef; + compiler.classDefs[className] = classDef; - if (node.body.length > 0) + var bodies = node.body, + bodyLength = bodies.length; + + if (bodyLength > 0) { - st.compiler.lastPos = node.body[0].start; + if (!generate) + compiler.lastPos = bodies[0].start; // And last add methods and other statements - for (var i = 0; i < node.body.length; ++i) { - var body = node.body[i]; + for (var i = 0; i < bodyLength; ++i) { + var body = bodies[i]; c(body, classScope, "Statement"); } - CONCAT(saveJSBuffer, st.compiler.source.substring(st.compiler.lastPos, body.end)); + if (!generate) + saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, body.end)); } - // We must make a new class object for our class definition if it's not a category - if (!node.categoryname) { - CONCAT(saveJSBuffer, "objj_registerClassPair(the_class);\n"); + if (!isInterfaceDeclaration && !node.categoryname) { + saveJSBuffer.concat("objj_registerClassPair(the_class);\n"); } // Add instance methods - if (IS_NOT_EMPTY(st.compiler.imBuffer)) + if (compiler.imBuffer.isEmpty()) { - CONCAT(saveJSBuffer, "class_addMethods(the_class, ["); - saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, st.compiler.imBuffer.atoms); // FIXME: Move this append to StringBuffer - CONCAT(saveJSBuffer, "]);\n"); + saveJSBuffer.concat("class_addMethods(the_class, ["); + saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, compiler.imBuffer.atoms); // FIXME: Move this append to StringBuffer + saveJSBuffer.concat("]);\n"); } // Add class methods - if (IS_NOT_EMPTY(st.compiler.cmBuffer)) + if (compiler.cmBuffer.isEmpty()) { - CONCAT(saveJSBuffer, "class_addMethods(meta_class, ["); - saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, st.compiler.cmBuffer.atoms); // FIXME: Move this append to StringBuffer - CONCAT(saveJSBuffer, "]);\n"); + saveJSBuffer.concat("class_addMethods(meta_class, ["); + saveJSBuffer.atoms.push.apply(saveJSBuffer.atoms, compiler.cmBuffer.atoms); // FIXME: Move this append to StringBuffer + saveJSBuffer.concat("]);\n"); } - CONCAT(saveJSBuffer, "}"); + saveJSBuffer.concat("}"); - st.compiler.jsBuffer = saveJSBuffer; + compiler.jsBuffer = saveJSBuffer; // Skip the "@end" - st.compiler.lastPos = node.end; + if (!generate) + compiler.lastPos = node.end; + + // If the class conforms to protocols check that all required methods are implemented + if (protocols) + { + // Lookup the protocolDefs for the protocols + var protocolDefs = []; + + for (var i = 0, size = protocols.length; i < size; i++) + protocolDefs.push(compiler.getProtocolDef(protocols[i].name)); + + var unimplementedMethods = classDef.listOfNotImplementedMethodsForProtocols(protocolDefs); + + if (unimplementedMethods && unimplementedMethods.length > 0) + for (var i = 0, size = unimplementedMethods.length; i < size; i++) { + var unimplementedMethod = unimplementedMethods[i], + methodDef = unimplementedMethod.methodDef, + protocolDef = unimplementedMethod.protocolDef; + + compiler.addWarning(createMessage("Method '" + methodDef.name + "' in protocol '" + protocolDef.name + "' is not implemented", node.classname, compiler.source)); + } + } +}, +ProtocolDeclarationStatement: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate, + buffer = compiler.jsBuffer, + protocolName = node.protocolname.name, + protocolDef = compiler.getProtocolDef(protocolName), + protocols = node.protocols, + protocolScope = new Scope(st), + inheritFromProtocols = []; + + if (protocolDef) + throw compiler.error_message("Duplicate protocol " + protocolName, node.protocolname); + + compiler.imBuffer = new StringBuffer(); + compiler.cmBuffer = new StringBuffer(); + + if (!generate) + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + + buffer.concat("{var the_protocol = objj_allocateProtocol(\"" + protocolName + "\");"); + + if (protocols) + for (var i = 0, size = protocols.length; i < size; i++) + { + var protocol = protocols[i], + inheritFromProtocolName = protocol.name; + inheritProtocolDef = compiler.getProtocolDef(inheritFromProtocolName); + + if (!inheritProtocolDef) + throw compiler.error_message("Can't find protocol " + inheritFromProtocolName, protocol); + + buffer.concat("\nvar aProtocol = objj_getProtocol(\"" + inheritFromProtocolName + "\");"); + buffer.concat("\nif (!aProtocol) throw new SyntaxError(\"*** Could not find definition for protocol \\\"" + protocolName + "\\\"\");"); + buffer.concat("\nprotocol_addProtocol(the_protocol, aProtocol);"); + inheritFromProtocols.push(inheritProtocolDef); + } + + protocolDef = new ProtocolDef(protocolName, inheritFromProtocols); + compiler.protocolDefs[protocolName] = protocolDef; + protocolScope.protocolDef = protocolDef; + + var someRequired = node.required; + + if (someRequired) { + var requiredLength = someRequired.length; + + if (requiredLength > 0) + { + // We only add the required methods + for (var i = 0; i < requiredLength; ++i) + { + var required = someRequired[i]; + if (!generate) + compiler.lastPos = required.start; + c(required, protocolScope, "Statement"); + } + if (!generate) + buffer.concat(compiler.source.substring(compiler.lastPos, required.end)); + } + } + + buffer.concat("\nobjj_registerProtocol(the_protocol);\n"); + + // Add instance methods + if (compiler.imBuffer.isEmpty()) + { + buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); + buffer.atoms.push.apply(buffer.atoms, compiler.imBuffer.atoms); // FIXME: Move this append to StringBuffer + buffer.concat("], true, true);\n"); + } + + // Add class methods + if (compiler.cmBuffer.isEmpty()) + { + buffer.concat("protocol_addMethodDescriptions(the_protocol, ["); + buffer.atoms.push.apply(buffer.atoms, compiler.cmBuffer.atoms); // FIXME: Move this append to StringBuffer + buffer.concat("], true, false);\n"); + } + + buffer.concat("}"); + + compiler.jsBuffer = buffer; + + // Skip the "@end" + if (!generate) + compiler.lastPos = node.end; }, MethodDeclarationStatement: function(node, st, c) { - var saveJSBuffer = st.compiler.jsBuffer, + var compiler = st.compiler, + generate = compiler.generate, + saveJSBuffer = compiler.jsBuffer, methodScope = new Scope(st), + isInstanceMethodType = node.methodtype === '-'; selectors = node.selectors, - arguments = node.arguments, - types = [node.returntype ? node.returntype.name : "id"], + nodeArguments = node.arguments, + returnType = node.returntype, + types = [returnType ? returnType.name : (node.action ? "void" : "id")], + returnTypeProtocols = returnType ? returnType.protocols : null; selector = selectors[0].name; // There is always at least one selector - CONCAT(saveJSBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + if (returnTypeProtocols) + for (var i = 0, size = returnTypeProtocols.length; i < size; i++) { + var returnTypeProtocol = returnTypeProtocols[i]; + if (!compiler.getProtocolDef(returnTypeProtocol.name)) { + compiler.addWarning(createMessage("Cannot find protocol declaration for '" + returnTypeProtocol.name + "'", returnTypeProtocol, compiler.source)); + } + } - st.compiler.jsBuffer = node.methodtype === '-' ? st.compiler.imBuffer : st.compiler.cmBuffer; + if (!generate) + saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + + compiler.jsBuffer = isInstanceMethodType ? compiler.imBuffer : compiler.cmBuffer; // Put together the selector. Maybe this should be done in the parser... - for (var i = 0; i < arguments.length; i++) { + for (var i = 0; i < nodeArguments.length; i++) { + var argument = nodeArguments[i], + argumentType = argument.type, + argumentTypeName = argumentType ? argumentType.name : "id", + argumentProtocols = argumentType ? argumentType.protocols : null; + + types.push(argumentType ? argumentType.name : "id"); + + if (argumentProtocols) for (var j = 0, size = argumentProtocols.length; j < size; j++) + { + var argumentProtocol = argumentProtocols[j]; + if (!compiler.getProtocolDef(argumentProtocol.name)) + compiler.addWarning(createMessage("Cannot find protocol declaration for '" + argumentProtocol.name + "'", argumentProtocol, compiler.source)); + } + if (i === 0) selector += ":"; else selector += (selectors[i] ? selectors[i].name : "") + ":"; } - if (IS_NOT_EMPTY(st.compiler.jsBuffer)) // Add comma separator if this is not first method in this buffer - CONCAT(st.compiler.jsBuffer, ", "); - CONCAT(st.compiler.jsBuffer, "new objj_method(sel_getUid(\""); - CONCAT(st.compiler.jsBuffer, selector); - CONCAT(st.compiler.jsBuffer, "\"), function"); + if (compiler.jsBuffer.isEmpty()) // Add comma separator if this is not first method in this buffer + compiler.jsBuffer.concat(", "); -// this.currentSelector = selector; + compiler.jsBuffer.concat("new objj_method(sel_getUid(\""); + compiler.jsBuffer.concat(selector); + compiler.jsBuffer.concat("\"), "); - if (st.compiler.flags & ObjJAcornCompiler.Flags.IncludeDebugSymbols) + if (node.body) { - CONCAT(st.compiler.jsBuffer, " $" + st.currentClassName() + "__" + selector.replace(/:/g, "_")); + compiler.jsBuffer.concat("function"); + + if (compiler.flags & ObjJAcornCompiler.Flags.IncludeDebugSymbols) + { + compiler.jsBuffer.concat(" $" + st.currentClassName() + "__" + selector.replace(/:/g, "_")); + } + + compiler.jsBuffer.concat("(self, _cmd"); + + methodScope.methodType = node.methodtype; + if (nodeArguments) for (var i = 0; i < nodeArguments.length; i++) + { + var argument = nodeArguments[i], + argumentName = argument.identifier.name; + + compiler.jsBuffer.concat(", "); + compiler.jsBuffer.concat(argumentName); + methodScope.vars[argumentName] = {type: "method argument", node: argument}; + } + + compiler.jsBuffer.concat(")\n"); + + if (!generate) + compiler.lastPos = node.startOfBody; + indentation += indentStep; + c(node.body, methodScope, "Statement"); + indentation = indentation.substring(indentationSpaces); + if (!generate) + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.body.end)); + + compiler.jsBuffer.concat("\n"); + } else { // It is a interface or protocol declatartion and we don't have a method implementation + compiler.jsBuffer.concat("Nil\n"); } - CONCAT(st.compiler.jsBuffer, "(self, _cmd"); + if (compiler.flags & ObjJAcornCompiler.Flags.IncludeDebugSymbols) + compiler.jsBuffer.concat(","+JSON.stringify(types)); - methodScope.methodType = node.methodtype; - if (arguments) for (var i = 0; i < arguments.length; i++) - { - var argument = arguments[i], - argumentName = argument.identifier.name; + compiler.jsBuffer.concat(")"); + compiler.jsBuffer = saveJSBuffer; - CONCAT(st.compiler.jsBuffer, ", "); - CONCAT(st.compiler.jsBuffer, argumentName); - types.push(argument.type ? argument.type.name : null); - methodScope.vars[argumentName] = {type: "method argument", node: argument}; + if (!generate) + compiler.lastPos = node.end; + + // Add the method to the class or protocol definition + var def = st.classDef, + alreadyDeclared; + + // But first, if it is a class definition check if it is declared in superclass or interface declaration + if (def) + alreadyDeclared = isInstanceMethodType ? def.getInstanceMethod(selector) : def.getClassMethod(selector); + else + def = st.protocolDef; + + if (!def) + throw "InternalError: MethodDeclaration without ClassDeclaration or ProtocolDeclaration at line: " + exports.acorn.getLineInfo(compiler.source, node.start).line; + + // Create warnings if types does not corresponds to method declaration in superclass or interface declarations + // If we don't find the method in superclass or interface declarations above or if it is a protocol + // declaration, try to find it in any of the conforming protocols + if (!alreadyDeclared) { + var protocols = def.protocols; + + if (protocols) + for (var i = 0, size = protocols.length; i < size; i++) { + var protocol = protocols[i], + alreadyDeclared = isInstanceMethodType ? protocol.getInstanceMethod(selector) : protocol.getClassMethod(selector); + + if (alreadyDeclared) + break; + } } - CONCAT(st.compiler.jsBuffer, ")"); + if (alreadyDeclared) { + var declaredTypes = alreadyDeclared.types; - st.compiler.lastPos = node.startOfBody; - c(node.body, methodScope, "Statement"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.body.end)); + if (declaredTypes) { + var typeSize = declaredTypes.length; + if (typeSize > 0) { + // First type is return type + var declaredReturnType = declaredTypes[0]; - CONCAT(st.compiler.jsBuffer, "\n"); - if (st.compiler.flags & ObjJAcornCompiler.Flags.IncludeDebugSymbols) - CONCAT(st.compiler.jsBuffer, ","+JSON.stringify(types)); - CONCAT(st.compiler.jsBuffer, ")"); - st.compiler.jsBuffer = saveJSBuffer; - st.compiler.lastPos = node.end; + // Create warning if return types is not the same. It is ok if superclass has 'id' and subclass has a class type + if (declaredReturnType !== types[0] && !(declaredReturnType === 'id' && returnType && returnType.typeisclass)) + compiler.addWarning(createMessage("Conflicting return type in implementation of '" + selector + "': '" + declaredReturnType + "' vs '" + types[0] + "'", returnType || node.action || selectors[0], compiler.source)); + + // Check the parameter types. The size of the two type arrays should be the same as they have the same selector. + for (var i = 1; i < typeSize; i++) { + var parameterType = declaredTypes[i]; + + if (parameterType !== types[i] && !(parameterType === 'id' && nodeArguments[i - 1].type.typeisclass)) + compiler.addWarning(createMessage("Conflicting parameter types in implementation of '" + selector + "': '" + parameterType + "' vs '" + types[i] + "'", nodeArguments[i - 1].type || nodeArguments[i - 1].identifier, compiler.source)); + } + } + } + } + + // Now we add it + var methodDef = new MethodDef(selector, types); + + if (isInstanceMethodType) + def.addInstanceMethod(methodDef); + else + def.addClassMethod(methodDef); }, MessageSendExpression: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.object ? node.object.start : node.arguments.length ? node.arguments[0].start : node.end; + var compiler = st.compiler, + generate = compiler.generate, + buffer = compiler.jsBuffer; + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.object ? node.object.start : node.arguments.length ? node.arguments[0].start : node.end; + } if (node.superObject) { - CONCAT(st.compiler.jsBuffer, "objj_msgSendSuper("); - CONCAT(st.compiler.jsBuffer, "{ receiver:self, super_class:" + (st.currentMethodType() === "+" ? st.compiler.currentSuperMetaClass : st.compiler.currentSuperClass ) + " }"); + if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + buffer.concat("objj_msgSendSuper("); + buffer.concat("{ receiver:self, super_class:" + (st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass ) + " }"); } else { - CONCAT(st.compiler.jsBuffer, "objj_msgSend("); + if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + buffer.concat("objj_msgSend("); c(node.object, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.object.end)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, node.object.end)); } var selectors = node.selectors, arguments = node.arguments, - selector = selectors[0].name; // There is always at least one selector + firstSelector = selectors[0], + selector = firstSelector ? firstSelector.name : ""; // There is always at least one selector // Put together the selector. Maybe this should be done in the parser... for (var i = 0; i < arguments.length; i++) @@ -839,19 +2136,22 @@ MessageSendExpression: function(node, st, c) { else selector += (selectors[i] ? selectors[i].name : "") + ":"; - CONCAT(st.compiler.jsBuffer, ", \""); - CONCAT(st.compiler.jsBuffer, selector); // FIXME: sel_getUid(selector + "") ? This FIXME is from the old preprocessor compiler - CONCAT(st.compiler.jsBuffer, "\""); + buffer.concat(", \""); + buffer.concat(selector); // FIXME: sel_getUid(selector + "") ? This FIXME is from the old preprocessor compiler + buffer.concat("\""); if (node.arguments) for (var i = 0; i < node.arguments.length; i++) { var argument = node.arguments[i]; - CONCAT(st.compiler.jsBuffer, ", "); - st.compiler.lastPos = argument.start; + buffer.concat(", "); + if (!generate) + compiler.lastPos = argument.start; c(argument, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, argument.end)); - st.compiler.lastPos = argument.end; + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, argument.end)); + compiler.lastPos = argument.end; + } } // TODO: Move this 'if' with body up inside the node.argument 'if' @@ -859,175 +2159,106 @@ MessageSendExpression: function(node, st, c) { { var parameter = node.parameters[i]; - CONCAT(st.compiler.jsBuffer, ", "); - st.compiler.lastPos = parameter.start; + buffer.concat(", "); + if (!generate) + compiler.lastPos = parameter.start; c(parameter, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, parameter.end)); - st.compiler.lastPos = parameter.end; - } - - CONCAT(st.compiler.jsBuffer, ")"); - st.compiler.lastPos = node.end; -}, -Identifier: function(node, st, c) { - if (st.currentMethodType() === "-" && !st.secondMemberExpression) - { - var identifier = node.name, - lvar = st.getLvar(identifier, true), // Stop looking at method - ivar = st.compiler.getIvarForClass(identifier, st); - - if (ivar) - { - if (lvar) - st.compiler.addWarning(createMessage("Local declaration of '" + identifier + "' hides instance variable", node, st.compiler.source)); - else - { - var nodeStart = node.start, - compiler = st.compiler; - - do { // The Spider Monkey AST tree includes any parentheses in start and end properties so we have to make sure we skip those - CONCAT(compiler.jsBuffer, compiler.source.substring(compiler.lastPos, nodeStart)); - compiler.lastPos = nodeStart; - } while (compiler.source.substr(nodeStart++, 1) === "(") - // Save the index in where the "self." string is stored and the node. - // These will be used if we find a variable declaration that is hoisting this identifier. - ((st.addedSelfToIvars || (st.addedSelfToIvars = Object.create(null)))[identifier] || (st.addedSelfToIvars[identifier] = [])).push({node: node, index: compiler.jsBuffer.atoms.length}); - CONCAT(compiler.jsBuffer, "self."); - } - } else { - if (!reservedIdentifiers(identifier) && !st.getLvar(identifier) && typeof global[identifier] === "undefined" && typeof window[identifier] === "undefined" && !st.compiler.getClassDef(identifier)) { - var message; - if (st.assignment) { - message = createMessage("Creating global variable inside function or method '" + identifier + "'", node, st.compiler.source); - st.vars[identifier] = {type: "global", node: node}; - } else - message = createMessage("Using unknown class or uninitialized global variable '" + identifier + "'", node, st.compiler.source); - - st.addMaybeWarning({identifier: identifier, message: message}); - } + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, parameter.end)); + compiler.lastPos = parameter.end; } } -}, -ArrayLiteral: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start; - if (!node.elements.length) { - CONCAT(st.compiler.jsBuffer, "objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"init\")"); - } else { - CONCAT(st.compiler.jsBuffer, "objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"initWithObjects:count:\", ["); - for (var i = 0; i < node.elements.length; i++) { - var elt = node.elements[i]; - - if (i) - CONCAT(st.compiler.jsBuffer, ", "); - - st.compiler.lastPos = elt.start; - c(elt, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, elt.end)); - } - CONCAT(st.compiler.jsBuffer, "], " + node.elements.length + ")"); - } - - st.compiler.lastPos = node.end; -}, -DictionaryLiteral: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start; - - if (!node.keys.length) { - CONCAT(st.compiler.jsBuffer, "objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"init\")"); - } else { - CONCAT(st.compiler.jsBuffer, "objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"initWithObjectsAndKeys:\""); - for (var i = 0; i < node.keys.length; i++) { - var key = node.keys[i], - value = node.values[i]; - - CONCAT(st.compiler.jsBuffer, ", "); - - st.compiler.lastPos = value.start; - c(value, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, value.end)); - - CONCAT(st.compiler.jsBuffer, ", "); - - st.compiler.lastPos = key.start; - c(key, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, key.end)); - } - CONCAT(st.compiler.jsBuffer, ")"); - } - - st.compiler.lastPos = node.end; + buffer.concat(")"); + if (!generate) compiler.lastPos = node.end; }, SelectorLiteralExpression: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - CONCAT(st.compiler.jsBuffer, "sel_getUid(\""); - CONCAT(st.compiler.jsBuffer, node.selector); - CONCAT(st.compiler.jsBuffer, "\")"); - st.compiler.lastPos = node.end; + var compiler = st.compiler, + buffer = compiler.jsBuffer, + generate = compiler.generate; + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(" "); // Add an extra space if it looks something like this: "return(@selector(a:))". No space between return and expression. + } + buffer.concat("sel_getUid(\""); + buffer.concat(node.selector); + buffer.concat("\")"); + if (!generate) compiler.lastPos = node.end; +}, +ProtocolLiteralExpression: function(node, st, c) { + var compiler = st.compiler, + buffer = compiler.jsBuffer, + generate = compiler.generate; + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(" "); // Add an extra space if it looks something like this: "return(@protocol(a))". No space between return and expression. + } + buffer.concat("objj_getProtocol(\""); + buffer.concat(node.id.name); + buffer.concat("\")"); + if (!generate) compiler.lastPos = node.end; }, Reference: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - CONCAT(st.compiler.jsBuffer, "function(__input) { if (arguments.length) return "); - CONCAT(st.compiler.jsBuffer, node.element.name); - CONCAT(st.compiler.jsBuffer, " = __input; return "); - CONCAT(st.compiler.jsBuffer, node.element.name); - CONCAT(st.compiler.jsBuffer, "; }"); - st.compiler.lastPos = node.end; + var compiler = st.compiler, + buffer = compiler.jsBuffer, + generate = compiler.generate; + if (!generate) { + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + } + buffer.concat("function(__input) { if (arguments.length) return "); + buffer.concat(node.element.name); + buffer.concat(" = __input; return "); + buffer.concat(node.element.name); + buffer.concat("; }"); + if (!generate) compiler.lastPos = node.end; }, Dereference: function(node, st, c) { + var compiler = st.compiler, + generate = compiler.generate; + checkCanDereference(st, node.expr); // @deref(y) -> y() // @deref(@deref(y)) -> y()() - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.expr.start; + if (!generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.expr.start; + } c(node.expr, st, "Expression"); - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.expr.end)); - CONCAT(st.compiler.jsBuffer, "()"); - st.compiler.lastPos = node.end; - -}, -Literal: function(node, st, c) { - if (node.raw && node.raw.charAt(0) === "@") - { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start + 1; - } -}, -ObjectExpression: function(node, st, c) { - for (var i = 0; i < node.properties.length; ++i) - { - var prop = node.properties[i]; - if (prop.key.raw && prop.key.raw.charAt(0) === "@") - { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, prop.key.start)); - st.compiler.lastPos = prop.key.start + 1; - } - c(prop.value, st, "Expression"); - } -}, -PreprocessStatement: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start; - CONCAT(st.compiler.jsBuffer, "//"); + if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.expr.end)); + compiler.jsBuffer.concat("()"); + if (!generate) compiler.lastPos = node.end; }, ClassStatement: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start; - CONCAT(st.compiler.jsBuffer, "//"); + var compiler = st.compiler; + if (!compiler.generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start; + compiler.jsBuffer.concat("//"); + } var className = node.id.name; - if (!st.compiler.getClassDef(className)) { - classDef = {"className": className}; - st.compiler.classDefs[className] = classDef; + if (!compiler.getClassDef(className)) { + classDef = new ClassDef(false, className); + compiler.classDefs[className] = classDef; } st.vars[node.id.name] = {type: "class", node: node.id}; }, GlobalStatement: function(node, st, c) { - CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); - st.compiler.lastPos = node.start; - CONCAT(st.compiler.jsBuffer, "//"); + var compiler = st.compiler; + if (!compiler.generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start; + compiler.jsBuffer.concat("//"); + } st.rootScope().vars[node.id.name] = {type: "global", node: node.id}; +}, +PreprocessStatement: function(node, st, c) { + var compiler = st.compiler; + if (!compiler.generate) { + compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + compiler.lastPos = node.start; + compiler.jsBuffer.concat("//"); + } } }); diff --git a/Objective-J/OldBrowserCompatibility.js b/Objective-J/OldBrowserCompatibility.js new file mode 100644 index 000000000..0086388ff --- /dev/null +++ b/Objective-J/OldBrowserCompatibility.js @@ -0,0 +1,117 @@ +/* + * OldBrowserCompatibility.js + * Objective-J + * + * Created by Martin Carlberg. + * Copyright 2013, Martin Carlberg. + * + * 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 + */ + +// This is for IE8 support. It doesn't have the Object.create function. +if (!Object.create) +{ + Object.create = function(o) + { + if (arguments.length > 1) + throw new Error('Object.create implementation only accepts the first parameter.'); + + function F() {} + F.prototype = o; + return new F(); + }; +} + +// This is for IE8 support. It doesn't have the Object.keys function. +if (!Object.keys) +{ + Object.keys = (function () + { + var hasOwnProperty = Object.prototype.hasOwnProperty, + hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), + dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + dontEnumsLength = dontEnums.length; + + return function (obj) + { + if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) + throw new TypeError('Object.keys called on non-object'); + + var result = []; + + for (var prop in obj) + { + if (hasOwnProperty.call(obj, prop)) + result.push(prop); + } + + if (hasDontEnumBug) + { + for (var i = 0; i < dontEnumsLength; i++) + { + if (hasOwnProperty.call(obj, dontEnums[i])) + result.push(dontEnums[i]); + } + } + return result; + }; + })(); +} + +// This is for IE8 support. It doesn't have the Array.prototype.indexOf function. +if (!Array.prototype.indexOf) +{ + Array.prototype.indexOf = function(searchElement /*, fromIndex */ ) + { + "use strict"; + if (this === null) + throw new TypeError(); + + var t = new Object(this), + len = t.length >>> 0; + + if (len === 0) + return -1; + + var n = 0; + if (arguments.length > 1) + { + n = Number(arguments[1]); + if (n != n) // shortcut for verifying if it's NaN + n = 0; + else if (n !== 0 && n != Infinity && n != -Infinity) + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + + if (n >= len) + return -1; + + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) + { + if (k in t && t[k] === searchElement) + return k; + } + return -1; + }; +} diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 7b1929384..3d50604fa 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -47,7 +47,7 @@ GLOBAL(objj_ivar) = function(/*String*/ aName, /*String*/ aType) this.type = aType; } -GLOBAL(objj_method) = function(/*String*/ aName, /*IMP*/ anImplementation, /*String*/ types) +GLOBAL(objj_method) = function(/*String*/ aName, /*IMP*/ anImplementation, /*Array*/ types) { this.name = aName; this.method_imp = anImplementation; @@ -74,6 +74,8 @@ GLOBAL(objj_class) = function(displayName) this.method_store = function() { }; this.method_dtable = this.method_store.prototype; + this.protocol_list = []; + #if DEBUG // Naming the allocator allows the WebKit heap snapshot tool to display object class names correctly // HACK: displayName property is not respected so we must eval a function to name it @@ -85,6 +87,13 @@ GLOBAL(objj_class) = function(displayName) this._UID = -1; } +GLOBAL(objj_protocol) = function(/*String*/ aName) +{ + this.name = aName; + this.instance_methods = { }; + this.class_methods = { }; +} + GLOBAL(objj_object) = function() { this.isa = NULL; @@ -288,6 +297,149 @@ GLOBAL(class_replaceMethod) = function(/*Class*/ aClass, /*SEL*/ aSelector, /*IM return method_imp; } +GLOBAL(class_addProtocol) = function(/*Class*/ aClass, /*Protocol*/ aProtocol) +{ + if (!aProtocol || class_conformsToProtocol(aClass, aProtocol)) + { + return; + } + + (aClass.protocol_list || (aClass.protocol_list == [])).push(aProtocol); + + return true; +} + +GLOBAL(class_conformsToProtocol) = function(/*Class*/ aClass, /*Protocol*/ aProtocol) +{ + if (!aProtocol) + return false; + + while (aClass) + { + var protocols = aClass.protocol_list, + size = protocols ? protocols.length : 0; + + for (var i = 0; i < size; i++) + { + var p = protocols[i]; + + if (p.name === aProtocol.name) + { + return true; + } + if (protocol_conformsToProtocol(p, aProtocol)) + { + return true; + } + } + + aClass = class_getSuperclass(aClass); + } + + return false; +} + +GLOBAL(class_copyProtocolList) = function(/*Class*/ aClass) +{ + var protocols = aClass.protocol_list; + + return protocols ? protocols.slice(0) : []; +} + +GLOBAL(protocol_conformsToProtocol) = function(/*Protocol*/ p1, /*Protocol*/ p2) +{ + if (!p1 || !p2) + return false; + + if (p1.name === p2.name) + return true; + + var protocols = p1.protocol_list, + size = protocols ? protocols.length : 0; + + for (var i = 0; i < size; i++) + { + var p = protocols[i]; + + if (p.name === p2.name) + { + return true; + } + if (protocol_conformsToProtocol(p, p2)) + { + return true; + } + } + + return false; +} + +var REGISTERED_PROTOCOLS = { }; + +GLOBAL(objj_allocateProtocol) = function(/*String*/ aName) +{ + var protocol = new objj_protocol(aName); + + return protocol; +} + +GLOBAL(objj_registerProtocol) = function(/*Protocol*/ proto) +{ + REGISTERED_PROTOCOLS[proto.name] = proto; +} + +GLOBAL(protocol_getName) = function(/*Protocol*/ proto) +{ + return proto.name; +} + +// Right now we only register required methods. THis might need to change in the future +GLOBAL(protocol_addMethodDescription) = function(/*Protocol*/ proto, /*SEL*/ selector, /*Array*/ types, /*BOOL*/ isRequiredMethod, /*BOOL*/ isInstanceMethod) +{ + if (!proto || !selector) return; + + if (isRequiredMethod) + (isInstanceMethod ? proto.instance_methods : proto.class_methods)[selector] = new objj_method(selector, null, types); +} + +GLOBAL(protocol_addMethodDescriptions) = function(/*Protocol*/ proto, /*Array*/ methods, /*BOOL*/ isRequiredMethod, /*BOOL*/ isInstanceMethod) +{ + if (!isRequiredMethod) return; + + var index = 0, + count = methods.length, + method_dtable = isInstanceMethod ? proto.instance_methods : proto.class_methods; + + for (; index < count; ++index) + { + var method = methods[index]; + + method_dtable[method.name] = method; + } +} + +GLOBAL(protocol_copyMethodDescriptionList) = function(/*Protocol*/ proto, /*BOOL*/ isRequiredMethod, /*BOOL*/ isInstanceMethod) +{ + if (!isRequiredMethod) + return []; + + var method_dtable = isInstanceMethod ? proto.instance_methods : proto.class_methods, + methodList = []; + + for (var selector in method_dtable) + if (method_dtable.hasOwnProperty(selector)) + methodList.push(method_dtable[selector]); + + return methodList; +} + +GLOBAL(protocol_addProtocol) = function(/*Protocol*/ proto, /*Protocol*/ addition) +{ + if (!proto || !addition) return; + + (proto.protocol_list || (proto.protocol_list = [])).push(addition); +} + var _class_initialize = function(/*Class*/ aClass) { var meta = GETMETA(aClass); @@ -442,6 +594,7 @@ GLOBAL(objj_resetRegisterClasses) = function() delete global[key]; REGISTERED_CLASSES = {}; + REGISTERED_PROTOCOLS = {}; resetBundle(); } @@ -547,6 +700,18 @@ GLOBAL(objj_getClass) = function(/*String*/ aName) return theClass ? theClass : Nil; } +GLOBAL(objj_getClassList) = function(/*CPArray*/ buffer, /*int*/ bufferLen) +{ + for (var aName in REGISTERED_CLASSES) + { + buffer.push(REGISTERED_CLASSES[aName]); + if (bufferLen && --bufferLen === 0) + break; + } + + return buffer.length; +} + //objc_getRequiredClass GLOBAL(objj_getMetaClass) = function(/*String*/ aName) { @@ -555,6 +720,13 @@ GLOBAL(objj_getMetaClass) = function(/*String*/ aName) return GETMETA(theClass); } +// Working with Protocol + +GLOBAL(objj_getProtocol) = function(/*String*/ aName) +{ + return REGISTERED_PROTOCOLS[aName]; +} + // Working with Instance Variables GLOBAL(ivar_getName) = function(anIvar) diff --git a/Objective-J/acorn.js b/Objective-J/acorn.js index 8af2eaf55..f12994057 100644 --- a/Objective-J/acorn.js +++ b/Objective-J/acorn.js @@ -13,13 +13,20 @@ // // [ghbt]: https://github.com/marijnh/acorn/issues // +// This file defines the main parser interface. The library also comes +// with a [error-tolerant parser][dammit] and an +// [abstract syntax tree walker][walk], defined in other files. +// +// [dammit]: acorn_loose.js +// [walk]: util/walk.js +// // Objective-J extensions made by Martin Carlberg // // Git repositories for Acorn with Objective-J extension is available at // // https://github.com/mrcarlberg/acorn.git -if (!exports.acorn) { +if (typeof exports != "undefined" && !exports.acorn) { exports.acorn = {}; exports.acorn.walk = {}; } @@ -27,7 +34,7 @@ if (!exports.acorn) { (function(exports) { "use strict"; - exports.version = "0.0.1"; + exports.version = "0.1.01"; // The main exported interface (under `self.acorn` when in the // browser) is a `parse` function that takes a code string and @@ -41,10 +48,8 @@ if (!exports.acorn) { exports.parse = function(inpt, opts) { input = String(inpt); inputLen = input.length; - options = opts || {}; - for (var opt in defaultOptions) if (!options.hasOwnProperty(opt)) - options[opt] = defaultOptions[opt]; - sourceFile = options.sourceFile || null; + setOptions(opts); + initTokenState(); return parseTopLevel(options.program); }; @@ -104,9 +109,54 @@ if (!exports.acorn) { // file in every node's `loc` object. sourceFile: null, // Turn on objj to allow Objective-J syntax - objj: true + objj: true, + // Turn on preprocess to allow C preprocess derectives. + // #define macro1 + // #define macro2 console.log("Hello") + // #define macro3(x,y,z) if (x > y && y > z) console.log("Touchdown!!!") + // #if macro1 + // #else + // #endif + preprocess: true, + // Preprocess add macro function + preprocessAddMacro: defaultAddMacro, + // Preprocess get macro function + preprocessGetMacro: defaultGetMacro, + // Preprocess undefine macro function. To delete a macro + preprocessUndefineMacro: defaultUndefineMacro, + // Preprocess is macro function + preprocessIsMacro: defaultIsMacro }; + function setOptions(opts) { + options = opts || {}; + for (var opt in defaultOptions) if (!options.hasOwnProperty(opt)) + options[opt] = defaultOptions[opt]; + sourceFile = options.sourceFile || null; + } + + var macros; + var macrosIsPredicate; + + function defaultAddMacro(macro) { + macros[macro.identifier] = macro; + macrosIsPredicate = null; + } + + function defaultGetMacro(macroIdentifier) { + return macros[macroIdentifier]; + } + + function defaultUndefineMacro(macroIdentifier) { + delete macros[macroIdentifier]; + macrosIsPredicate = null; + } + + function defaultIsMacro(macroIdentifier) { + var x = Object.keys(macros).join(" "); + return (macrosIsPredicate || (macrosIsPredicate = makePredicate(x)))(macroIdentifier); + } + // The `getLineInfo` function is mostly useful when the // `locations` option is off (for performance reasons) and you // want to find the line/column position for a given character @@ -126,9 +176,44 @@ if (!exports.acorn) { }; // Acorn is organized as a tokenizer and a recursive-descent parser. - // Both use (closure-)global variables to keep their state and - // communicate. We already saw the `options`, `input`, and - // `inputLen` variables above (set in `parse`). + // The `tokenize` export provides an interface to the tokenizer. + // Because the tokenizer is optimized for being efficiently used by + // the Acorn parser itself, this interface is somewhat crude and not + // very modular. Performing another parse or call to `tokenize` will + // reset the internal state, and invalidate existing tokenizers. + + exports.tokenize = function(inpt, opts) { + input = String(inpt); inputLen = input.length; + setOptions(opts); + initTokenState(); + + var t = {}; + function getToken(forceRegexp) { + readToken(forceRegexp); + t.start = tokStart; t.end = tokEnd; + t.startLoc = tokStartLoc; t.endLoc = tokEndLoc; + t.type = tokType; t.value = tokVal; + return t; + } + getToken.jumpTo = function(pos, reAllowed) { + tokPos = pos; + if (options.locations) { + tokCurLine = tokLineStart = lineBreak.lastIndex = 0; + var match; + while ((match = lineBreak.exec(input)) && match.index < pos) { + ++tokCurLine; + tokLineStart = match.index + match[0].length; + } + } + var ch = input.charAt(pos - 1); + tokRegexpAllowed = reAllowed; + skipSpace(); + }; + return getToken; + }; + + // State is kept in (closure-)global variables. We already saw the + // `options`, `input`, and `inputLen` variables above. // The current position of the tokenizer in the input. @@ -174,10 +259,15 @@ if (!exports.acorn) { // When `options.locations` is true, these are used to keep // track of the current line, and know when a new line has been - // entered. See the `curLineLoc` function. + // entered. var tokCurLine, tokLineStart, tokLineStartNext; + // Same as input but for the current token. If options.preprocess is used + // this can differ due to macros. + + var tokInput, preTokInput; + // These store the position of the previous token, which is useful // when finishing a node and assigning its `end` position. @@ -202,6 +292,13 @@ if (!exports.acorn) { var inFunction, labels, strict; + // These are used by the preprocess tokenizer. + + var preTokPos, preTokType, preTokVal, preTokStart, preTokEnd; + var preLastStart, preLastEnd; + var preprocessStack = []; + var preprocessMacroParamterListMode = false; + // This function is used to raise exceptions on parse errors. It // takes either a `{line, column}` object or an offset integer (into // the current `input`) as `pos` argument. It attaches the position @@ -215,6 +312,7 @@ if (!exports.acorn) { syntaxError.column = pos.column; syntaxError.lineStart = pos.lineStart; syntaxError.lineEnd = pos.lineEnd; + syntaxError.fileName = sourceFile; throw syntaxError; } @@ -232,7 +330,7 @@ if (!exports.acorn) { // make them recognizeable when debugging. var _num = {type: "num"}, _regexp = {type: "regexp"}, _string = {type: "string"}; - var _name = {type: "name"}, _eof = {type: "eof"}; + var _name = {type: "name"}, _eof = {type: "eof"}, _eol = {type: "eol"}; // Keyword tokens. The `keyword` property (also used in keyword-like // operators) indicates that the token originated from an @@ -255,7 +353,7 @@ if (!exports.acorn) { var _throw = {keyword: "throw", beforeExpr: true}, _try = {keyword: "try"}, _var = {keyword: "var"}; var _while = {keyword: "while", isLoop: true}, _with = {keyword: "with"}, _new = {keyword: "new", beforeExpr: true}; var _this = {keyword: "this"}; - var _void = {keyword: "void", prefix: true}; + var _void = {keyword: "void", prefix: true, beforeExpr: true}; // The keywords that denote values. @@ -275,12 +373,31 @@ if (!exports.acorn) { var _action = {keyword: "action"}, _selector = {keyword: "selector"}, _class = {keyword: "class"}, _global = {keyword: "global"}; var _dictionaryLiteral = {keyword: "{"}, _arrayLiteral = {keyword: "["}; var _ref = {keyword: "ref"}, _deref = {keyword: "deref"}; + var _protocol = {keyword: "protocol"}, _optional = {keyword: "optional"}, _required = {keyword: "required"}; + var _interface = {keyword: "interface"}; // Objective-J keywords var _filename = {keyword: "filename"}, _unsigned = {keyword: "unsigned", okAsIdent: true}, _signed = {keyword: "signed", okAsIdent: true}; var _byte = {keyword: "byte", okAsIdent: true}, _char = {keyword: "char", okAsIdent: true}, _short = {keyword: "short", okAsIdent: true}; - var _int = {keyword: "int", okAsIdent: true}, _long = {keyword: "long", okAsIdent: true}, _preprocess = {keyword: "#"}; + var _int = {keyword: "int", okAsIdent: true}, _long = {keyword: "long", okAsIdent: true}, _id = {keyword: "id", okAsIdent: true}; + var _preprocess = {keyword: "#"}; + + // Preprocessor keywords + + var _preDefine = {keyword: "define"}; + var _preUndef = {keyword: "undef"}; + var _preIfdef = {keyword: "ifdef"}; + var _preIfndef = {keyword: "ifndef"}; + var _preIf = {keyword: "if"}; + var _preElse = {keyword: "else"}; + var _preEndif = {keyword: "endif"}; + var _preElseIf = {keyword: "elif"}; + var _prePragma = {keyword: "pragma"}; + var _preDefined = {keyword: "defined"}; + var _preBackslash = {keyword: "\\"} + + var _preprocessParamItem = {type: "preprocessParamItem"} // Map keyword names to token types. @@ -290,21 +407,28 @@ if (!exports.acorn) { "function": _function, "if": _if, "return": _return, "switch": _switch, "throw": _throw, "try": _try, "var": _var, "while": _while, "with": _with, "null": _null, "true": _true, "false": _false, "new": _new, "in": _in, - "instanceof": {keyword: "instanceof", binop: 7}, "this": _this, - "typeof": {keyword: "typeof", prefix: true}, + "instanceof": {keyword: "instanceof", binop: 7, beforeExpr: true}, "this": _this, + "typeof": {keyword: "typeof", prefix: true, beforeExpr: true}, "void": _void, - "delete": {keyword: "delete", prefix: true} }; + "delete": {keyword: "delete", prefix: true, beforeExpr: true} }; // Map Objective-J keyword names to token types. var keywordTypesObjJ = {"IBAction": _action, "IBOutlet": _outlet, "unsigned": _unsigned, "signed": _signed, "byte": _byte, "char": _char, - "short": _short, "int": _int, "long": _long }; + "short": _short, "int": _int, "long": _long, "id": _id }; // Map Objective-J "@" keyword names to token types. var objJAtKeywordTypes = {"implementation": _implementation, "outlet": _outlet, "accessors": _accessors, "end": _end, "import": _import, "action": _action, "selector": _selector, "class": _class, "global": _global, - "ref": _ref, "deref": _deref}; + "ref": _ref, "deref": _deref, "protocol": _protocol, "optional": _optional, "required": _required, + "interface": _interface}; + + // Map Preprocessor keyword names to token types. + + var keywordTypesPreprocess = {"define": _preDefine, "pragma": _prePragma, "ifdef": _preIfdef, "ifndef": _preIfndef, + "undef": _preUndef, "if": _preIf, "endif": _preEndif, "else": _preElse, "elif": _preElseIf, + "defined": _preDefined}; // Punctuation token types. Again, the `type` property is purely for debugging. @@ -333,14 +457,23 @@ if (!exports.acorn) { // binary operators with a very low precedence, that should result // in AssignmentExpression nodes. - var _slash = {binop: 10, beforeExpr: true}, _eq = {isAssign: true, beforeExpr: true}; - var _assign = {isAssign: true, beforeExpr: true}, _plusmin = {binop: 9, prefix: true, beforeExpr: true}; + var _slash = {binop: 10, beforeExpr: true, preprocess: true}, _eq = {isAssign: true, beforeExpr: true, preprocess: true}; + var _assign = {isAssign: true, beforeExpr: true}, _plusmin = {binop: 9, prefix: true, beforeExpr: true, preprocess: true}; var _incdec = {postfix: true, prefix: true, isUpdate: true}, _prefix = {prefix: true, beforeExpr: true}; - var _bin1 = {binop: 1, beforeExpr: true}, _bin2 = {binop: 2, beforeExpr: true}; - var _bin3 = {binop: 3, beforeExpr: true}, _bin4 = {binop: 4, beforeExpr: true}; - var _bin5 = {binop: 5, beforeExpr: true}, _bin6 = {binop: 6, beforeExpr: true}; - var _bin7 = {binop: 7, beforeExpr: true}, _bin8 = {binop: 8, beforeExpr: true}; - var _bin10 = {binop: 10, beforeExpr: true}; + var _bin1 = {binop: 1, beforeExpr: true, preprocess: true}, _bin2 = {binop: 2, beforeExpr: true, preprocess: true}; + var _bin3 = {binop: 3, beforeExpr: true, preprocess: true}, _bin4 = {binop: 4, beforeExpr: true, preprocess: true}; + var _bin5 = {binop: 5, beforeExpr: true, preprocess: true}, _bin6 = {binop: 6, beforeExpr: true, preprocess: true}; + var _bin7 = {binop: 7, beforeExpr: true, preprocess: true}, _bin8 = {binop: 8, beforeExpr: true, preprocess: true}; + var _bin10 = {binop: 10, beforeExpr: true, preprocess: true}; + + // Provide access to the token types for external users of the + // tokenizer. + + exports.tokTypes = {bracketL: _bracketL, bracketR: _bracketR, braceL: _braceL, braceR: _braceR, + parenL: _parenL, parenR: _parenR, comma: _comma, semi: _semi, colon: _colon, + dot: _dot, question: _question, slash: _slash, eq: _eq, name: _name, eof: _eof, + num: _num, regexp: _regexp, string: _string}; + for (var kw in keywordTypes) exports.tokTypes[kw] = keywordTypes[kw]; // This is a trick taken from Esprima. It turns out that, on // non-Chrome browsers, to check whether a string is in a set, a @@ -414,7 +547,11 @@ if (!exports.acorn) { // The Objective-J keywords. - var isKeywordObjJ = makePredicate("IBAction IBOutlet byte char short int long unsigned signed"); + var isKeywordObjJ = makePredicate("IBAction IBOutlet byte char short int long unsigned signed id"); + + // The preprocessor keywords. + + var isKeywordPreprocess = makePredicate("define pragma if ifdef ifndef else elif endif defined"); // ## Character categories @@ -424,6 +561,7 @@ if (!exports.acorn) { // code point above 128. var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/; + var nonASCIIwhitespaceNoNewLine = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; var nonASCIIidentifierChars = "\u0371-\u0374\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); @@ -462,36 +600,20 @@ if (!exports.acorn) { // ## Tokenizer - // These are used when `options.locations` is on, in order to track - // the current line number and start of line offset, in order to set - // `tokStartLoc` and `tokEndLoc`. + // These are used when `options.locations` is on, for the + // `tokStartLoc` and `tokEndLoc` properties. - function nextLineStart() { - lineBreak.lastIndex = tokLineStart; - var match = lineBreak.exec(input); - return match ? match.index + match[0].length : input.length + 1; - } - - var line_loc_t = function() { + function line_loc_t() { this.line = tokCurLine; this.column = tokPos - tokLineStart; } - function curLineLoc() { - while (tokLineStartNext <= tokPos) { - ++tokCurLine; - tokLineStart = tokLineStartNext; - tokLineStartNext = nextLineStart(); - } - return new line_loc_t(); - } - // Reset the token state. Used at the start of a parse. function initTokenState() { + macros = Object.create(null); tokCurLine = 1; tokPos = tokLineStart = 0; - tokLineStartNext = nextLineStart(); tokRegexpAllowed = true; tokComments = null; tokSpaces = null; @@ -503,11 +625,43 @@ if (!exports.acorn) { // after the token, so that the next one's `tokStart` will point at // the right position. +var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _preEndif]; + function finishToken(type, val) { + // If we get any of these preprocess tokens skip it and read next + if (type in preprocessTokens) return readToken(); tokEnd = tokPos; - if (options.locations) tokEndLoc = curLineLoc(); + if (options.locations) tokEndLoc = new line_loc_t; tokType = type; skipSpace(); + if (options.preprocess && input.charCodeAt(tokPos) === 35 && input.charCodeAt(tokPos + 1) === 35) { // '##' + var val1 = type === _name ? val : type.keyword; + tokPos += 2; + if (val1) { + skipSpace(); + readToken(); + var val2 = tokType === _name ? tokVal : tokType.keyword; + if (val2) { + var concat = "" + val1 + val2, + code = concat.charCodeAt(0), + tok; + if (isIdentifierStart(code)) + tok = readWord(concat) !== false; + + // We might got a word token from the concatenation + if (tok) return tok; + // FIXME: Is not using the concatenated token + tok = getTokenFromCode(code, finishToken); + if (tok === false) { + unexpected(); + } + // We have now got another type of token from the concatenation + return tok; + } else { + // FIXME: Second token was not of right type. Save second token and return the first. When readToken is called again return the second. + } + } + } tokVal = val; lastTokCommentsAfter = tokCommentsAfter; lastTokSpacesAfter = tokSpacesAfter; @@ -518,32 +672,51 @@ if (!exports.acorn) { } function skipBlockComment() { - var end = input.indexOf("*/", tokPos += 2); + var startLoc = options.onComment && options.locations && new line_loc_t; + var start = tokPos, end = input.indexOf("*/", tokPos += 2); if (end === -1) raise(tokPos - 2, "Unterminated comment"); - if (options.trackComments) - (tokComments || (tokComments = [])).push(input.slice(tokPos, end)); tokPos = end + 2; + if (options.locations) { + lineBreak.lastIndex = start; + var match; + while ((match = lineBreak.exec(input)) && match.index < tokPos) { + ++tokCurLine; + tokLineStart = match.index + match[0].length; + } + } + if (options.onComment) + options.onComment(true, input.slice(start + 2, end), start, tokPos, + startLoc, options.locations && new line_loc_t); + if (options.trackComments) + (tokComments || (tokComments = [])).push(input.slice(start, end)); } - function skipLineComment(skipCharacters) { + function skipLineComment() { var start = tokPos; - var ch = input.charCodeAt(tokPos+=skipCharacters); + var startLoc = options.onComment && options.locations && new line_loc_t; + var ch = input.charCodeAt(tokPos+=2); while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8329) { ++tokPos; ch = input.charCodeAt(tokPos); } + if (options.onComment) + options.onComment(false, input.slice(start + 2, tokPos), start, tokPos, + startLoc, options.locations && new line_loc_t); if (options.trackComments) (tokComments || (tokComments = [])).push(input.slice(start, tokPos)); } - function skipWhiteSpaces() { - var start = tokPos; - var ch = input.charCodeAt(++tokPos); - while ((ch < 14 && ch > 8) || ch === 32 || ch === 160 || (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch)))) // 9 - 13, ' ', '\xa0' .... + function preprocesSkipRestOfLine() { + var ch = input.charCodeAt(tokPos); + var last; + // If the last none whitespace character is a '\' the line will continue on the the next line. + // Here we break the way gcc works as it joins the lines first and then tokenize it. Because of + // this we can't have a newline in the middle of a word. + while (tokPos < inputLen && ((ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8329) || last === 92)) { // White space and '\' + if (ch != 32 && ch != 9 && ch != 160 && (ch < 5760 || !nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch)))) + last = ch; ch = input.charCodeAt(++tokPos); - if (options.trackSpaces) - //tokSpaces = input.slice(start, tokPos); - (tokSpaces || (tokSpaces = [])).push(input.slice(start, tokPos)); + } } // Called at the start of the parse and after every token. Skips @@ -555,17 +728,56 @@ if (!exports.acorn) { function skipSpace() { tokComments = null; tokSpaces = null; - while (tokPos < inputLen) { + var spaceStart = tokPos; + for(;;) { var ch = input.charCodeAt(tokPos); - if (ch === 47) { // '/' + if (ch === 32) { // ' ' + ++tokPos; + } else if(ch === 13) { + ++tokPos; + var next = input.charCodeAt(tokPos); + if(next === 10) { + ++tokPos; + } + if(options.locations) { + ++tokCurLine; + tokLineStart = tokPos; + } + } else if (ch === 10) { + ++tokPos; + ++tokCurLine; + tokLineStart = tokPos; + } else if(ch < 14 && ch > 8) { + ++tokPos; + } else if (ch === 47) { // '/' var next = input.charCodeAt(tokPos+1); if (next === 42) { // '*' + if (options.trackSpaces) + (tokSpaces || (tokSpaces = [])).push(input.slice(spaceStart, tokPos)); skipBlockComment(); + spaceStart = tokPos; } else if (next === 47) { // '/' - skipLineComment(2); + if (options.trackSpaces) + (tokSpaces || (tokSpaces = [])).push(input.slice(spaceStart, tokPos)); + skipLineComment(); + spaceStart = tokPos; } else break; - } else if ((ch < 14 && ch > 8) || ch === 32 || ch === 160 || (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch)))) { // 9 - 13, ' ', '\xa0' .... - skipWhiteSpaces(); + } else if (ch === 160) { // '\xa0' + ++tokPos; + } else if (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++tokPos; + } else if (tokPos >= inputLen) { + if (options.preprocess && preprocessStack.length) { + // If we are at the end of the input inside a macro continue at last position + var lastItem = preprocessStack.pop(); + tokPos = lastItem.end; + input = lastItem.input; + inputLen = lastItem.inputLen; + lastEnd = lastItem.lastEnd; + lastStart = lastItem.lastStart; + } else { + break; + } } else { break; } @@ -584,9 +796,9 @@ if (!exports.acorn) { // The `forceRegexp` parameter is used in the one case where the // `tokRegexpAllowed` trick does not work. See `parseStatement`. - function readToken_dot(code) { + function readToken_dot(code, finishToken) { var next = input.charCodeAt(tokPos+1); - if (next >= 48 && next <= 57) return readNumber(String.fromCharCode(code)); + if (next >= 48 && next <= 57) return readNumber(String.fromCharCode(code), finishToken); if (next === 46 && options.objj && input.charCodeAt(tokPos+2) === 46) { //'.' tokPos += 3; return finishToken(_dotdotdot); @@ -595,40 +807,40 @@ if (!exports.acorn) { return finishToken(_dot); } - function readToken_slash() { // '/' + function readToken_slash(finishToken) { // '/' var next = input.charCodeAt(tokPos+1); if (tokRegexpAllowed) {++tokPos; return readRegexp();} - if (next === 61) return finishOp(_assign, 2); - return finishOp(_slash, 1); + if (next === 61) return finishOp(_assign, 2, finishToken); + return finishOp(_slash, 1, finishToken); } - function readToken_mult_modulo() { // '%*' + function readToken_mult_modulo(finishToken) { // '%*' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_assign, 2); - return finishOp(_bin10, 1); + if (next === 61) return finishOp(_assign, 2, finishToken); + return finishOp(_bin10, 1, finishToken); } - function readToken_pipe_amp(code) { // '|&' + function readToken_pipe_amp(code, finishToken) { // '|&' var next = input.charCodeAt(tokPos+1); - if (next === code) return finishOp(code === 124 ? _bin1 : _bin2, 2); - if (next === 61) return finishOp(_assign, 2); - return finishOp(code === 124 ? _bin3 : _bin5, 1); + if (next === code) return finishOp(code === 124 ? _bin1 : _bin2, 2, finishToken); + if (next === 61) return finishOp(_assign, 2, finishToken); + return finishOp(code === 124 ? _bin3 : _bin5, 1, finishToken); } - function readToken_caret() { // '^' + function readToken_caret(finishToken) { // '^' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_assign, 2); - return finishOp(_bin4, 1); + if (next === 61) return finishOp(_assign, 2, finishToken); + return finishOp(_bin4, 1, finishToken); } - function readToken_plus_min(code) { // '+-' + function readToken_plus_min(code, finishToken) { // '+-' var next = input.charCodeAt(tokPos+1); - if (next === code) return finishOp(_incdec, 2); - if (next === 61) return finishOp(_assign, 2); - return finishOp(_plusmin, 1); + if (next === code) return finishOp(_incdec, 2, finishToken); + if (next === 61) return finishOp(_assign, 2, finishToken); + return finishOp(_plusmin, 1, finishToken); } - function readToken_lt_gt(code) { // '<>' + function readToken_lt_gt(code, finishToken) { // '<>' if (tokAfterImport && options.objj && code === 60) { // '<' var str = []; for (;;) { @@ -645,24 +857,24 @@ if (!exports.acorn) { var size = 1; if (next === code) { size = code === 62 && input.charCodeAt(tokPos+2) === 62 ? 3 : 2; - if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1); - return finishOp(_bin8, size); + if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1, finishToken); + return finishOp(_bin8, size, finishToken); } if (next === 61) size = input.charCodeAt(tokPos+2) === 61 ? 3 : 2; - return finishOp(_bin7, size); + return finishOp(_bin7, size, finishToken); } - function readToken_eq_excl(code) { // '=!' + function readToken_eq_excl(code, finishToken) { // '=!' var next = input.charCodeAt(tokPos+1); - if (next === 61) return finishOp(_bin6, input.charCodeAt(tokPos+2) === 61 ? 3 : 2); - return finishOp(code === 61 ? _eq : _prefix, 1); + if (next === 61) return finishOp(_bin6, input.charCodeAt(tokPos+2) === 61 ? 3 : 2, finishToken); + return finishOp(code === 61 ? _eq : _prefix, 1, finishToken); } - function readToken_at(code) { // '@' + function readToken_at(code, finishToken) { // '@' var next = input.charCodeAt(++tokPos); if (next === 34 || next === 39) // Read string if "'" or '"' - return readString(next); + return readString(next, finishToken); if (next === 123) // Read dictionary literal if "{" return finishToken(_dictionaryLiteral); if (next === 91) // Ready array literal if "[" @@ -670,16 +882,191 @@ if (!exports.acorn) { var word = readWord1(), token = objJAtKeywordTypes[word]; - if (!token) raise(tokStart, "Unrecognized Objective-J keyword '@" + word + "'"); + if (!token) raise(tokPos, "Unrecognized Objective-J keyword '@" + word + "'"); return finishToken(token); } - function getTokenFromCode(code) { +// True if we are skipping token when finding #else or #endif after and #if + +var preNotSkipping = true; +var preIfLevel = 0; + + function readToken_preprocess(finishTokenFunction) { // '#' + ++tokPos; + preprocessReadToken(); + switch (preTokType) { + case _preDefine: + preprocessReadToken(); + var macroIdentifierEnd = preTokEnd; + var macroIdentifier = preprocessGetIdent(); + // '(' Must follow directly after identifier to be a valid macro with parameters + if (input.charCodeAt(macroIdentifierEnd) === 40) { // '(' + preprocessExpect(_parenL); + var parameters = []; + var first = true; + while (!preprocessEat(_parenR)) { + if (!first) preprocessExpect(_comma, "Expected ',' between macro parameters"); else first = false; + parameters.push(preprocessGetIdent()); + } + } + var start = tokPos = preTokStart; + preprocesSkipRestOfLine(); + var macroString = input.slice(start, tokPos); + macroString = macroString.replace(/\\/g, " "); + options.preprocessAddMacro(new Macro(macroIdentifier, macroString, parameters)); + break; + + case _preUndef: + preprocessReadToken(); + options.preprocessUndefineMacro(preprocessGetIdent()); + preprocesSkipRestOfLine(); + break; + + case _preIf: + if (preNotSkipping) { + preIfLevel++; + preprocessReadToken(); + var expr = preprocessParseExpression(); + var test = preprocessEvalExpression(expr); + if (!test) + preNotSkipping = false + preprocessSkipToElseOrEndif(!test); + } else { + return finishTokenFunction(_preIf); + } + break; + + case _preIfdef: + if (preNotSkipping) { + preIfLevel++; + preprocessReadToken(); + var ident = preprocessGetIdent(); + var test = options.preprocessGetMacro(ident); + if (!test) + preNotSkipping = false + //preprocessExpect(_eol); + preprocessSkipToElseOrEndif(!test); + } else { + //preprocesSkipRestOfLine(); + return finishTokenFunction(_preIfdef); + } + break; + + case _preIfndef: + if (preNotSkipping) { + preIfLevel++; + preprocessReadToken(); + var ident = preprocessGetIdent(); + var test = options.preprocessGetMacro(ident); + if (test) + preNotSkipping = false + //preprocessExpect(_eol); + preprocessSkipToElseOrEndif(test); + } else { + //preprocesSkipRestOfLine(); + return finishTokenFunction(_preIfndef); + } + break; + + case _preElse: + if (preIfLevel) { + if (preNotSkipping) { + preNotSkipping = false; + finishTokenFunction(_preElse); + preprocessReadToken(); + preprocessSkipToElseOrEndif(true, true); // no else + } else { + return finishTokenFunction(_preElse); + } + } else + raise(preTokStart, "#else without #if"); + break; + + case _preEndif: + if (preIfLevel) { + if (preNotSkipping) { + preIfLevel--; + break; + } + } else { + raise(preTokStart, "#endif without #if"); + } + return finishTokenFunction(_preEndif); + break; + + case _prePragma: + preprocesSkipRestOfLine(); + break; + + case _prefix: + preprocesSkipRestOfLine(); + break; + + default: + raise(preTokStart, "Invalid preprocessing directive"); + preprocesSkipRestOfLine(); + // Return the complete line as a token to make it possible to create a PreProcessStatement if we are between two statements + return finishTokenFunction(_preprocess); + //raise(tokPos, "Invalid preprocessing directive '" + (preTokType.keyword || preTokVal) + "' " + input.slice(tokStart, tokPos)); + } + // Drop this token and read next non preprocess token + finishToken(_preprocess); + return readToken(); + } + + function preprocessEvalExpression(expr) { + return exports.walk.recursive(expr, {}, { + BinaryExpression: function(node, st, c) { + var left = node.left, right = node.right; + switch(node.operator) { + case "+": + return c(left, st) + c(right, st); + case "-": + return c(left, st) - c(right, st); + case "*": + return c(left, st) * c(right, st); + case "/": + return c(left, st) / c(right, st); + case "%": + return c(left, st) % c(right, st); + case "<": + return c(left, st) < c(right, st); + case ">": + return c(left, st) > c(right, st); + case "=": + case "==": + case "===": + return c(left, st) === c(right, st); + case "<=": + return c(left, st) <= c(right, st); + case ">=": + return c(left, st) >= c(right, st); + case "&&": + return c(left, st) && c(right, st); + case "||": + return c(left, st) || c(right, st); + } + }, + Literal: function(node, st, c) { + return node.value; + }, + Identifier: function(node, st, c) { + var name = node.name, + macro = options.preprocessGetMacro(name); + return (macro && parseInt(macro.macro)) || 0; + }, + DefinedExpression: function(node, st, c) { + return !!options.preprocessGetMacro(node.id.name); + } + }, {}); + } + + function getTokenFromCode(code, finishToken, allowEndOfLineToken) { switch(code) { // The interpretation of a dot depends on whether it is followed // by a digit. case 46: // '.' - return readToken_dot(code); + return readToken_dot(code, finishToken); // Punctuation tokens. case 40: ++tokPos; return finishToken(_parenL); @@ -696,15 +1083,15 @@ if (!exports.acorn) { // '0x' is a hexadecimal number. case 48: // '0' var next = input.charCodeAt(tokPos+1); - if (next === 120 || next === 88) return readHexNumber(); + if (next === 120 || next === 88) return readHexNumber(finishToken); // Anything else beginning with a digit is an integer, octal // number, or float. case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9 - return readNumber(String.fromCharCode(code)); + return readNumber(false, finishToken); // Quotes produce strings. case 34: case 39: // '"', "'" - return readString(code); + return readString(code, finishToken); // Operators are parsed inline in tiny state machines. '=' (61) is // often referred to. `finishOp` simply skips the amount of @@ -712,64 +1099,303 @@ if (!exports.acorn) { // of the type given by its first argument. case 47: // '/' - return readToken_slash(code); + return readToken_slash(finishToken); case 37: case 42: // '%*' - return readToken_mult_modulo(); + return readToken_mult_modulo(finishToken); case 124: case 38: // '|&' - return readToken_pipe_amp(code); + return readToken_pipe_amp(code, finishToken); case 94: // '^' - return readToken_caret(); + return readToken_caret(finishToken); case 43: case 45: // '+-' - return readToken_plus_min(code); + return readToken_plus_min(code, finishToken); case 60: case 62: // '<>' - return readToken_lt_gt(code); + return readToken_lt_gt(code, finishToken, finishToken); case 61: case 33: // '=!' - return readToken_eq_excl(code); + return readToken_eq_excl(code, finishToken); + + case 126: // '~' + return finishOp(_prefix, 1, finishToken); case 64: // '@' if (options.objj) - return readToken_at(code); + return readToken_at(code, finishToken); return false; case 35: // '#' - if (options.objj) { - var start = tokPos; - var ch = input.charCodeAt(++tokPos); - while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8329) // End of line - ch = input.charCodeAt(++tokPos); - return finishToken(_preprocess, input.slice(start, tokPos)); + if (options.preprocess) { + return readToken_preprocess(finishToken); } return false; - case 126: // '~' - return finishOp(_prefix, 1); + case 92: // '\' + if (options.preprocess) { + return finishOp(_preBackslash, 1, finishToken); + } + return false; + } + + if (allowEndOfLineToken && newline.test(String.fromCharCode(code))) { + return finishOp(_eol, 1, finishToken); } return false; +} + +// Returns true if it stops at a line break + + function preprocessSkipSpace() { + while (tokPos < inputLen) { + var ch = input.charCodeAt(tokPos); + if (ch === 32 || ch === 9 || ch === 160 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch)))) { + ++tokPos; + } else if (ch === 92) { // '\' + // Check if we have an escaped newline. We are using a relaxed treatment of escaped newlines like gcc. + // We allow spaces, horizontal and vertical tabs, and form feeds between the backslash and the subsequent newline + var pos = tokPos + 1; + ch = input.charCodeAt(pos); + while (pos < inputLen && (ch === 32 || ch === 9 || ch === 11 || ch === 12 || (ch >= 5760 && nonASCIIwhitespaceNoNewLine.test(String.fromCharCode(ch))))) + ch = input.charCodeAt(++pos); + lineBreak.lastIndex = 0; + var match = lineBreak.exec(input.slice(pos, pos + 2)); + if (match && match.index === 0) { + tokPos = pos + match[0].length; + } else { + return false; + } + } else { + lineBreak.lastIndex = 0; + var match = lineBreak.exec(input.slice(tokPos, tokPos + 2)); + return match && match.index === 0; + } + } + } + + function preprocessSkipToElseOrEndif(test, skipElse) { + if (test) { + var ifLevel = 0; + while (ifLevel > 0 || (preTokType != _preEndif && (preTokType != _preElse || skipElse))) { + switch (preTokType) { + case _preIf: + case _preIfdef: + case _preIfndef: + ifLevel++; + break; + + case _preEndif: + ifLevel--; + break; + + case _eof: + preNotSkipping = true; + raise(preTokStart, "Missing #endif"); + } + preprocessReadToken(); + } + preNotSkipping = true; + if (preTokType === _preEndif) + preIfLevel--; + } + } + + function preprocessReadToken() { + preTokStart = tokPos; + preTokInput = input; + if (tokPos >= inputLen) return _eof; + var code = input.charCodeAt(tokPos); + if (preprocessMacroParamterListMode && code !== 41 && code !== 44) { // ')', ',' + var parenLevel = 0; + // If we are parsing a macro parameter list parentheses within each argument must balance + while(tokPos < inputLen && (parenLevel || (code !== 41 && code !== 44))) { // ')', ',' + if (code === 40) // '(' + parenLevel++; + if (code === 41) // ')' + parenLevel--; + code = input.charCodeAt(++tokPos); + } + return preprocessFinishToken(_preprocessParamItem, input.slice(preTokStart, tokPos)); + } + if (isIdentifierStart(code) || (code === 92 /* '\' */ && input.charCodeAt(tokPos +1) === 117 /* 'u' */)) return preprocessReadWord(); + if (getTokenFromCode(code, preprocessFinishToken, true) === false) { + // If we are here, we either found a non-ASCII identifier + // character, or something that's entirely disallowed. + var ch = String.fromCharCode(code); + if (ch === "\\" || nonASCIIidentifierStart.test(ch)) return preprocessReadWord(); + raise(tokPos, "Unexpected character '" + ch + "'"); + } + } + + function preprocessReadWord() { + var word = readWord1(); + preprocessFinishToken(isKeywordPreprocess(word) ? keywordTypesPreprocess[word] : _name, word); + } + + function preprocessFinishToken(type, val) { + preTokType = type; + preTokVal = val; + preTokEnd = tokPos; + preprocessSkipSpace(); + } + + // Continue to the next token. + + function preprocessNext() { + preLastStart = tokStart; + preLastEnd = tokEnd; + //lastEndLoc = tokEndLoc; + return preprocessReadToken(); + } + + // Predicate that tests whether the next token is of the given + // type, and if yes, consumes it as a side effect. + + function preprocessEat(type) { + if (preTokType === type) { + preprocessNext(); + return true; + } + } + + // Expect a token of a given type. If found, consume it, otherwise, + // raise with errorMessage or an unexpected token error. + + function preprocessExpect(type, errorMessage) { + if (preTokType === type) preprocessReadToken(); + else raise(preTokStart, errorMessage || "Unexpected token"); + } + + function preprocessGetIdent() { + var ident = preTokType === _name ? preTokVal : ((!options.forbidReserved || preTokType.okAsIdent) && preTokType.keyword) || raise(preTokStart, "Expected Macro identifier"); + preprocessNext(); + return ident; + } + + function preprocessParseIdent() { + var node = startNode(); + node.name = preprocessGetIdent(); + return preprocessFinishNode(node, "Identifier"); + } + + // Parse an expression — either a single token that is an + // expression, an expression started by a keyword like `defined`, + // or an expression wrapped in punctuation like `()`. + + function preprocessParseExpression() { + return preprocessParseExprOps(); + } + + // Start the precedence parser. + + function preprocessParseExprOps() { + return preprocessParseExprOp(preprocessParseMaybeUnary(), -1); + } + + // Parse binary operators with the operator precedence parsing + // algorithm. `left` is the left-hand side of the operator. + // `minPrec` provides context that allows the function to stop and + // defer further parser to one of its callers when it encounters an + // operator that has a lower precedence than the set it is parsing. + + function preprocessParseExprOp(left, minPrec) { + var prec = preTokType.binop; + if (prec) { + if (!preTokType.preprocess) raise(preTokStart, "Unsupported macro operator"); + if (prec > minPrec) { + var node = startNodeFrom(left); + node.left = left; + node.operator = preTokVal; + preprocessNext(); + node.right = preprocessParseExprOp(preprocessParseMaybeUnary(), prec); + var node = preprocessFinishNode(node, /*/&&|\|\|/.test(node.operator) ? "LogicalExpression" : */"BinaryExpression"); + return preprocessParseExprOp(node, minPrec); + } + } + return left; + } + + // Parse an unary expression if possible + + function preprocessParseMaybeUnary() { + if (preTokType.preprocess && preTokType.prefix) { + var node = startNode(); + node.operator = tokVal; + node.prefix = true; + preprocessNext(); + node.argument = preprocessParseMaybeUnary(); + return preprocessFinishNode(node, "UnaryExpression"); + } + return preprocessParseExprAtom(); + } + + // Parse an atomic macro expression — either a single token that is an + // expression, an expression started by a keyword like `defined`, + // or an expression wrapped in punctuation like `()`. + + function preprocessParseExprAtom() { + switch (preTokType) { + case _name: + return preprocessParseIdent(); + + case _num: case _string: + return preprocessParseStringNumLiteral(); + + case _parenL: + var tokStart1 = preTokStart; + preprocessNext(); + var val = preprocessParseExpression(); + val.start = tokStart1; + val.end = preTokEnd; + preprocessExpect(_parenR, "Expected closing ')' in macro expression"); + return val; + + case _preDefined: + var node = startNode(); + preprocessNext(); + node.id = preprocessParseIdent(); + return preprocessFinishNode(node, "DefinedExpression"); + + default: + unexpected(); + } + } + + function preprocessParseStringNumLiteral() { + var node = startNode(); + node.value = preTokVal; + node.raw = preTokInput.slice(preTokStart, preTokEnd); + preprocessNext(); + return preprocessFinishNode(node, "Literal"); + } + + function preprocessFinishNode(node, type) { + node.type = type; + node.end = preLastEnd; + return node; } function readToken(forceRegexp) { tokStart = tokPos; - if (options.locations) tokStartLoc = curLineLoc(); + tokInput = input; + if (options.locations) tokStartLoc = new line_loc_t; tokCommentsBefore = tokComments; tokSpacesBefore = tokSpaces; if (forceRegexp) return readRegexp(); - if (tokPos >= inputLen) return finishToken(_eof); + if (tokPos >= inputLen) + return finishToken(_eof); var code = input.charCodeAt(tokPos); // Identifier or keyword. '\uXXXX' sequences are allowed in // identifiers, so '\' also dispatches to that. if (isIdentifierStart(code) || code === 92 /* '\' */) return readWord(); - var tok = getTokenFromCode(code); + var tok = getTokenFromCode(code, finishToken); - if(tok === false) { + if (tok === false) { // If we are here, we either found a non-ASCII identifier // character, or something that's entirely disallowed. var ch = String.fromCharCode(code); @@ -779,7 +1405,7 @@ if (!exports.acorn) { return tok; } - function finishOp(type, size) { + function finishOp(type, size, finishToken) { var str = input.slice(tokPos, tokPos + size); tokPos += size; finishToken(type, str); @@ -832,7 +1458,7 @@ if (!exports.acorn) { return total; } - function readHexNumber() { + function readHexNumber(finishToken) { tokPos += 2; // 0x var val = readInt(16); if (val == null) raise(tokStart + 2, "Expected hexadecimal number"); @@ -842,18 +1468,18 @@ if (!exports.acorn) { // Read an integer, octal integer, or floating-point number. - function readNumber(ch) { - var start = tokPos, isFloat = ch === "."; - if (!isFloat && readInt(10) == null) raise(start, "Invalid number"); - if (isFloat || input.charAt(tokPos) === ".") { - var next = input.charAt(++tokPos); - if (next === "-" || next === "+") ++tokPos; - if (readInt(10) === null && ch === ".") raise(start, "Invalid number"); + function readNumber(startsWithDot, finishToken) { + var start = tokPos, isFloat = false, octal = input.charCodeAt(tokPos) === 48; + if (!startsWithDot && readInt(10) === null) raise(start, "Invalid number"); + if (input.charCodeAt(tokPos) === 46) { + ++tokPos; + readInt(10); isFloat = true; } - if (/e/i.test(input.charAt(tokPos))) { - var next = input.charAt(++tokPos); - if (next === "-" || next === "+") ++tokPos; + var next = input.charCodeAt(tokPos); + if (next === 69 || next === 101) { // 'eE' + next = input.charCodeAt(++tokPos); + if (next === 43 || next === 45) ++tokPos; // '+-' if (readInt(10) === null) raise(start, "Invalid number") isFloat = true; } @@ -861,7 +1487,7 @@ if (!exports.acorn) { var str = input.slice(start, tokPos), val; if (isFloat) val = parseFloat(str); - else if (ch !== "0" || str.length === 1) val = parseInt(str, 10); + else if (!octal || str.length === 1) val = parseInt(str, 10); else if (/[89]/.test(str) || strict) raise(start, "Invalid number"); else val = parseInt(str, 8); return finishToken(_num, val); @@ -871,7 +1497,7 @@ if (!exports.acorn) { var rs_str = []; - function readString(quote) { + function readString(quote, finishToken) { tokPos++; rs_str.length = 0; for (;;) { @@ -905,13 +1531,15 @@ if (!exports.acorn) { case 102: rs_str.push(12); break; // 'f' -> '\f' case 48: rs_str.push(0); break; // 0 -> '\0' case 13: if (input.charCodeAt(tokPos) === 10) ++tokPos; // '\r\n' - case 10: break; // ' \n' + case 10: // ' \n' + if (options.locations) { tokLineStart = tokPos; ++tokCurLine; } + break; default: rs_str.push(ch); break; } } } else { if (ch === 13 || ch === 10 || ch === 8232 || ch === 8329) raise(tokStart, "Unterminated string constant"); - if (ch !== 92) rs_str.push(ch); // '\' // This 'if' seems useless as the same thing is checked above..... - Martin + rs_str.push(ch); // '\' ++tokPos; } } @@ -966,11 +1594,68 @@ if (!exports.acorn) { } // Read an identifier or keyword token. Will check for reserved - // words when necessary. + // words when necessary. Argument preReadWord is used to concatenate + // The word is then passed in from caller. - function readWord() { - var word = readWord1(); + function readWord(preReadWord) { + var word = preReadWord || readWord1(); var type = _name; + var reservedError; + if (options.preprocess) { + var macro; + var i = preprocessStack.length; + if (i > 0) { + var lastItem = preprocessStack[i - 1]; + // If the current macro has parameters check if this word is one of them and should be translated + if (lastItem.parameterDict && lastItem.macro.isParameterFunction()(word)) { + macro = lastItem.parameterDict[word]; + } + } + // Does the word match agains any of the know macro names + if (!macro && options.preprocessIsMacro(word)) + macro = options.preprocessGetMacro(word); + if (macro) { + var macroStart = tokStart; + var parameters; + var hasParameters = macro.parameters; + var nextIsParenL; + if (hasParameters) + nextIsParenL = tokPos < inputLen && input.charCodeAt(tokPos) === 40; // '(' + if (!hasParameters || nextIsParenL) { + // Now we know that we have a matching macro. Get parameters if needed + var macroString = macro.macro; + var lastTokPos = tokPos; + if (nextIsParenL) { + var first = true; + var noParams = 0; + parameters = Object.create(null); + preprocessReadToken(); + preprocessMacroParamterListMode = true; + preprocessExpect(_parenL); + lastTokPos = tokPos; + while (!preprocessEat(_parenR)) { + if (!first) preprocessExpect(_comma, "Expected ',' between macro parameters"); else first = false; + var ident = hasParameters[noParams++]; + var val = preTokVal; + preprocessExpect(_preprocessParamItem); + parameters[ident] = new Macro(ident, val); + lastTokPos = tokPos; + } + preprocessMacroParamterListMode = false; + } + // If the macro defines anything add it to the preprocess input stack + if (macroString) { + preprocessStack.push({macro: macro, parameterDict: parameters, start: macroStart, end:lastTokPos, input: input, inputLen: inputLen, lastStart: tokStart, lastEnd: lastTokPos}); + input = macroString; + inputLen = macroString.length; + tokPos = 0; + } + // Now read the next token + return next(); + } + } + } + if (!containsEsc) { if (isKeyword(word)) type = keywordTypes[word]; else if (options.objj && isKeywordObjJ(word)) type = keywordTypesObjJ[word]; @@ -982,6 +1667,17 @@ if (!exports.acorn) { return finishToken(type, word); } + function Macro(ident, macro, parameters) { + this.identifier = ident; + if (macro) this.macro = macro; + if (parameters) this.parameters = parameters; + } + + Macro.prototype.isParameterFunction = function() { + var y = (this.parameters || []).join(" "); + return this.isParameterFunctionVar || (this.isParameterFunctionVar = makePredicate(y)); + } + // ## Parser // A recursive descent parser operates by defining functions for all @@ -1011,7 +1707,7 @@ if (!exports.acorn) { lastEnd = tokEnd; lastEndLoc = tokEndLoc; nodeMessageSendObjectExpression = null; - readToken(); + return readToken(); } // Enter strict mode. Re-reads the next token to please pedantic @@ -1027,17 +1723,17 @@ if (!exports.acorn) { // Start an AST node, attaching a start offset and optionally a // `commentsBefore` property to it. - var node_t = function(s) { + function node_t() { this.type = null; this.start = tokStart; this.end = null; - }; + } - var node_loc_t = function(s) { + function node_loc_t() { this.start = tokStartLoc; this.end = null; if (sourceFile !== null) this.source = sourceFile; - }; + } function startNode() { var node = new node_t(); @@ -1147,7 +1843,7 @@ if (!exports.acorn) { function canInsertSemicolon() { return !options.strictSemicolons && - (tokType === _eof || tokType === _braceR || newline.test(input.slice(lastEnd, tokStart)) || + (tokType === _eof || tokType === _braceR || newline.test(tokInput.slice(lastEnd, tokStart)) || (nodeMessageSendObjectExpression && options.objj)); } @@ -1155,7 +1851,7 @@ if (!exports.acorn) { // pretend that there is a semicolon at this position. function semicolon() { - if (!eat(_semi) && !canInsertSemicolon()) raise(lastEnd, "Expected a semicolon"); + if (!eat(_semi) && !canInsertSemicolon()) raise(tokStart, "Expected a semicolon"); } // Expect a token of a given type. If found, consume it, otherwise, @@ -1190,9 +1886,8 @@ if (!exports.acorn) { // to its body instead of creating a new node. function parseTopLevel(program) { - initTokenState(); lastStart = lastEnd = tokPos; - if (options.locations) lastEndLoc = curLineLoc(); + if (options.locations) lastEndLoc = new line_loc_t; inFunction = strict = null; labels = []; readToken(); @@ -1206,7 +1901,7 @@ if (!exports.acorn) { first = false; } return finishNode(node, "Program"); - }; + } var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; @@ -1218,14 +1913,18 @@ if (!exports.acorn) { // does not help. function parseStatement() { - if (nodeMessageSendObjectExpression) - return parseMessageSendExpression(nodeMessageSendObjectExpression, nodeMessageSendObjectExpression.object); - if (tokType === _slash) readToken(true); var starttype = tokType, node = startNode(); + // This is a special case when trying figure out if this is a subscript to the former line or a new send message statement on this line... + if (nodeMessageSendObjectExpression) { + node.expression = parseMessageSendExpression(nodeMessageSendObjectExpression, nodeMessageSendObjectExpression.object); + semicolon(); + return finishNode(node, "ExpressionStatement"); + } + // Most types of statements are recognized by the keyword they // start with. Many are trivial to parse, some require a bit of // complexity. @@ -1352,7 +2051,7 @@ if (!exports.acorn) { case _throw: next(); - if (newline.test(input.slice(lastEnd, tokStart))) + if (newline.test(tokInput.slice(lastEnd, tokStart))) raise(lastEnd, "Illegal newline after throw"); node.argument = parseExpression(); semicolon(); @@ -1407,6 +2106,47 @@ if (!exports.acorn) { next(); return finishNode(node, "EmptyStatement"); + // This is a Objective-J statement + case _interface: + if (options.objj) { + next(); + node.classname = parseIdent(true); + if (eat(_colon)) + node.superclassname = parseIdent(true); + else if (eat(_parenL)) { + node.categoryname = parseIdent(true); + expect(_parenR, "Expected closing ')' after category name"); + } + if (tokVal === '<') { + next(); + var protocols = [], + first = true; + node.protocols = protocols; + while (tokVal !== '>') { + if (!first) + expect(_comma, "Expected ',' between protocol names"); + else first = false; + protocols.push(parseIdent(true)); + } + next(); + } + if (eat(_braceL)) { + node.ivardeclarations = []; + for (;;) { + if (eat(_braceR)) break; + parseIvarDeclaration(node); + } + node.endOfIvars = tokStart; + } + node.body = []; + while(!eat(_end)) { + if (tokType === _eof) raise(tokPos, "Expected '@end' after '@interface'"); + node.body.push(parseClassElement()); + } + return finishNode(node, "InterfaceDeclarationStatement"); + } + break; + // This is a Objective-J statement case _implementation: if (options.objj) { @@ -1418,6 +2158,32 @@ if (!exports.acorn) { node.categoryname = parseIdent(true); expect(_parenR, "Expected closing ')' after category name"); } + if (tokVal === '<') { + next(); + var protocols = [], + first = true; + node.protocols = protocols; + while (tokVal !== '>') { + if (!first) + expect(_comma, "Expected ',' between protocol names"); + else first = false; + protocols.push(parseIdent(true)); + } + next(); + } + if (tokVal === '<') { + next(); + var protocols = [], + first = true; + node.protocols = protocols; + while (tokVal !== '>') { + if (!first) + expect(_comma, "Expected ',' between protocol names"); + else first = false; + protocols.push(parseIdent(true)); + } + next(); + } if (eat(_braceL)) { node.ivardeclarations = []; for (;;) { @@ -1431,38 +2197,90 @@ if (!exports.acorn) { if (tokType === _eof) raise(tokPos, "Expected '@end' after '@implementation'"); node.body.push(parseClassElement()); } + return finishNode(node, "ClassDeclarationStatement"); } - return finishNode(node, "ClassDeclarationStatement"); + break; + + // This is a Objective-J statement + case _protocol: + // If next token is a left parenthesis it is a ProtocolLiternal expression so bail out + if (options.objj && input.charCodeAt(tokPos) !== 40) { // '(' + next(); + node.protocolname = parseIdent(true); + if (tokVal === '<') { + next(); + var protocols = [], + first = true; + node.protocols = protocols; + while (tokVal !== '>') { + if (!first) + expect(_comma, "Expected ',' between protocol names"); + else first = false; + protocols.push(parseIdent(true)); + } + next(); + } + while(!eat(_end)) { + if (tokType === _eof) raise(tokPos, "Expected '@end' after '@protocol'"); + if (eat(_required)) continue; + if (eat(_optional)) { + while(!eat(_required) && tokType !== _end) { + (node.optional || (node.optional = [])).push(parseProtocolClassElement()); + } + } else { + (node.required || (node.required = [])).push(parseProtocolClassElement()); + } + } + return finishNode(node, "ProtocolDeclarationStatement"); + } + break; // This is a Objective-J statement case _import: - next(); - if (tokType === _string) - node.localfilepath = true; - else if (tokType ===_filename) - node.localfilepath = false; - else - unexpected(); + if (options.objj) { + next(); + if (tokType === _string) + node.localfilepath = true; + else if (tokType ===_filename) + node.localfilepath = false; + else + unexpected(); - node.filename = parseStringNumRegExpLiteral(); - return finishNode(node, "ImportStatement"); + node.filename = parseStringNumRegExpLiteral(); + return finishNode(node, "ImportStatement"); + } + break; // This is a Objective-J statement case _preprocess: - next(); - return finishNode(node, "PreprocessStatement"); + if (options.objj) { + next(); + return finishNode(node, "PreprocessStatement"); + } + break; // This is a Objective-J statement case _class: - next(); - node.id = parseIdent(false); - return finishNode(node, "ClassStatement"); + if (options.objj) { + next(); + node.id = parseIdent(false); + return finishNode(node, "ClassStatement"); + } + break; // This is a Objective-J statement case _global: - next(); - node.id = parseIdent(false); - return finishNode(node, "GlobalStatement"); + if (options.objj) { + next(); + node.id = parseIdent(false); + return finishNode(node, "GlobalStatement"); + } + break; + + } + + // The indentation is one step to the right here to make sure it + // is the same as in the original acorn parser. Easier merge // If the statement does not start with a statement keyword or a // brace, it's an ExpressionStatement or LabeledStatement. We @@ -1470,7 +2288,6 @@ if (!exports.acorn) { // next token is a colon and the expression was a simple // Identifier node, we switch to interpreting it as a label. - default: var maybeName = tokVal, expr = parseExpression(); if (starttype === _name && expr.type === "Identifier" && eat(_colon)) { for (var i = 0; i < labels.length; ++i) @@ -1486,18 +2303,8 @@ if (!exports.acorn) { semicolon(); return finishNode(node, "ExpressionStatement"); } - } } - // CompoundIvarDeclaration = - // IvarType _ IvarDeclaration (_ "," _ IvarDeclaration)* EOS - - // IvarDeclaration = - // Identifier _ Accessors? - - // Accessors = - // "@accessors" ("(" (AccessorsConfiguration (_ "," _ AccessorsConfiguration)*)? ")")? - function parseIvarDeclaration(node) { var outlet; if (eat(_outlet)) @@ -1557,49 +2364,56 @@ if (!exports.acorn) { semicolon(); } - function parseClassElement() { - var methodType = tokVal, - element = startNode(); - if (eat(_plusmin)) { - element.methodtype = methodType; - // If we find a '(' we have a return type to parse + function parseMethodDeclaration(node) { + node.methodtype = tokVal; + expect(_plusmin, "Method declaration must start with '+' or '-'"); + // If we find a '(' we have a return type to parse + if (eat(_parenL)) { + var typeNode = startNode(); + if (eat(_action)) { + node.action = finishNode(typeNode, "ObjectiveJActionType"); + typeNode = startNode(); + } + if (!eat(_parenR)) { + node.returntype = parseObjectiveJType(typeNode); + expect(_parenR, "Expected closing ')' after method return type"); + } + } + // Now we parse the selector + var first = true, + selectors = [], + args = []; + node.selectors = selectors; + node.arguments = args; + for (;;) { + if (tokType !== _colon) { + selectors.push(parseIdent(true)); + if (first && tokType !== _colon) break; + } else + selectors.push(null); + expect(_colon, "Expected ':' in selector"); + var argument = {}; + args.push(argument); if (eat(_parenL)) { - if (eat(_action)) - element.action = true; - if (!eat(_parenR)) { - element.returntype = parseObjectiveJType(); - expect(_parenR, "Expected closing ')' after method return type"); - } + argument.type = parseObjectiveJType(); + expect(_parenR, "Expected closing ')' after method argument type"); } - // Now we parse the selector - var first = true, - selectors = [], - args = []; - element.selectors = selectors; - element.arguments = args; - for (;;) { - if (tokType !== _colon) { - selectors.push(parseIdent(true)); - if (first && tokType !== _colon) break; - } else - selectors.push(null); - expect(_colon, "Expected ':' in selector"); - var argument = {}; - args.push(argument); - if (eat(_parenL)) { - argument.type = parseObjectiveJType(); - expect(_parenR, "Expected closing ')' after method argument type"); - } - argument.identifier = parseIdent(false); - if (tokType === _braceL || eat(_semi)) break; - if (eat(_comma)) { - expect(_dotdotdot, "Expected '...' after ',' in method declaration"); - element.parameters = true; - break; - } - first = false; + argument.identifier = parseIdent(false); + if (tokType === _braceL || tokType === _semi) break; + if (eat(_comma)) { + expect(_dotdotdot, "Expected '...' after ',' in method declaration"); + node.parameters = true; + break; } + first = false; + } + } + function parseClassElement() { + var element = startNode(); + if (tokVal === '+' || tokVal === '-') { + parseMethodDeclaration(element); + eat(_semi); element.startOfBody = lastEnd; // Start a new scope with regard to labels and the `inFunction` // flag (restore them to their old value afterwards). @@ -1612,6 +2426,14 @@ if (!exports.acorn) { return parseStatement(); } + function parseProtocolClassElement() { + var element = startNode(); + parseMethodDeclaration(element); + + semicolon(); + return finishNode(element, "MethodDeclarationStatement"); + } + // Used for constructs like `switch` and `if` that insist on // parentheses around their expression. @@ -1886,6 +2708,7 @@ if (!exports.acorn) { node.elements = parseExprList(_bracketR, firstExpr, true, true); return finishNode(node, "ArrayLiteral"); + case _bracketL: var node = startNode(), firstExpr = null; @@ -1926,6 +2749,14 @@ if (!exports.acorn) { expect(_parenR, "Expected closing ')' after selector"); return finishNode(node, "SelectorLiteralExpression"); + case _protocol: + var node = startNode(); + next(); + expect(_parenL, "Expected '(' after '@protocol'"); + node.id = parseIdent(true); + expect(_parenR, "Expected closing ')' after protocol name"); + return finishNode(node, "ProtocolLiteralExpression"); + case _ref: var node = startNode(); next(); @@ -1943,6 +2774,9 @@ if (!exports.acorn) { return finishNode(node, "Dereference"); default: + if(tokType.okAsIdent) + return parseIdent(); + unexpected(); } } @@ -2038,7 +2872,7 @@ if (!exports.acorn) { isGetSet = sawGetSet = true; kind = prop.kind = prop.key.name; prop.key = parsePropertyName(); - if (!tokType === _parenL) unexpected(); + if (tokType !== _parenL) unexpected(); prop.value = parseFunction(startNode(), false); } else unexpected(); @@ -2167,57 +3001,75 @@ if (!exports.acorn) { function parseStringNumRegExpLiteral() { var node = startNode(); node.value = tokVal; - node.raw = input.slice(tokStart, tokEnd); + node.raw = tokInput.slice(tokStart, tokEnd); next(); return finishNode(node, "Literal"); } // Parse the next token as an Objective-J typ. - // It can be an identifier followed by a optional protocol '' - // It can be 'void' + // It can be 'id' followed by a optional protocol '' + // It can be 'void' or 'id' // It can be 'signed' or 'unsigned' followed by an optional 'char', 'byte', 'short', 'int' or 'long' // It can be 'char', 'byte', 'short', 'int' or 'long' // 'int' can be followed by an optinal 'long'. 'long' can be followed by an optional extra 'long' - function parseObjectiveJType() { - var node = startNode(); + function parseObjectiveJType(startFrom) { + var node = startFrom ? startNodeFrom(startFrom) : startNode(); if (tokType === _name) { + // It should be a class name node.name = tokVal; + node.typeisclass = true; next(); - if (tokVal === '<') { - next(); - node.protocol = parseIdent(true); - if (tokVal !== '>') unexpected(); - next(); - } } else { node.name = tokType.keyword; + // Do nothing more if it is 'void' if (!eat(_void)) { - var nextKeyWord; - if (eat(_signed) || eat(_unsigned)) - nextKeyWord = tokType.keyword || true; - if (eat(_char) || eat(_byte) || eat(_short)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - } else { - if (eat(_int)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; + if (eat(_id)) { + // Is it 'id' followed by a '<' parse protocols. Do nothing more if it is only 'id' + if (tokVal === '<') { + var first = true, + protocols = []; + node.protocols = protocols; + do { + next(); + if (first) + first = false; + else + eat(_comma); + protocols.push(parseIdent(true)); + } while (tokVal !== '>'); + next(); } - if (eat(_long)) { + } else { + // Now check if it is some basic type or an approved combination of basic types + var nextKeyWord; + if (eat(_signed) || eat(_unsigned)) + nextKeyWord = tokType.keyword || true; + if (eat(_char) || eat(_byte) || eat(_short)) { if (nextKeyWord) node.name += " " + nextKeyWord; nextKeyWord = tokType.keyword || true; + } else { + if (eat(_int)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + } if (eat(_long)) { - node.name += " " + nextKeyWord; + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + if (eat(_long)) { + node.name += " " + nextKeyWord; + } } } - } - if (!nextKeyWord) { - node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); - next(); + if (!nextKeyWord) { + // It must be a class name if it was not a basic type. // FIXME: This is not true + node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); + node.typeisclass = true; + next(); + } } } } diff --git a/Objective-J/acornwalk.js b/Objective-J/acornwalk.js index 326d0dc72..87753e3f4 100644 --- a/Objective-J/acornwalk.js +++ b/Objective-J/acornwalk.js @@ -41,9 +41,9 @@ if (!exports.acorn) { exports.recursive = function(node, state, funcs, base) { var visitor = exports.make(funcs, base); function c(node, st, override) { - visitor[override || node.type](node, st, c); + return visitor[override || node.type](node, st, c); } - c(node, state); + return c(node, state); }; // Used to create a custom walker. Will fill in all missing node @@ -208,14 +208,23 @@ if (!exports.acorn) { exports.IvarDeclaration = ignore; - exports.MethodDeclarationStatement = ignore; - exports.PreprocessStatement = ignore; exports.ClassStatement = ignore; exports.GlobalStatement = ignore; + exports.ProtocolDeclarationStatement = function(node, st, c) { + if (node.required) for (var i = 0; i < node.required.length; ++i) { + c(node.required[i], st, "Statement"); + } + if (node.optional) for (var i = 0; i < node.optional.length; ++i) { + c(node.optional[i], st, "Statement"); + } + } + exports.MethodDeclarationStatement = function(node, st, c) { - c(node.body, st, "Statement"); + var body = node.body; + if (body) + c(body, st, "Statement"); } exports.MessageSendExpression = function(node, st, c) { @@ -227,6 +236,7 @@ if (!exports.acorn) { } exports.SelectorLiteralExpression = ignore; + exports.ProtocolLiteralExpression = ignore; exports.Reference = function(node, st, c) { c(node.element, st, "Identifier"); diff --git a/Objective-J/sprintf.js b/Objective-J/sprintf.js index b90b1b785..9a73e69ed 100644 --- a/Objective-J/sprintf.js +++ b/Objective-J/sprintf.js @@ -22,8 +22,8 @@ // sprintf: -var formatRegex = new RegExp("([^%]+|%(?:\\d+\\$)?[\\+\\-\\ \\#0]*[0-9\\*]*(.[0-9\\*]+)?[hlL]?[cbBdieEfgGosuxXpn%@])", "g"); -var tagRegex = new RegExp("(%)(?:(\\d+)\\$)?([\\+\\-\\ \\#0]*)([0-9\\*]*)((?:.[0-9\\*]+)?)([hlL]?)([cbBdieEfgGosuxXpn%@])"); +var formatRegex = /([^%]+|%(?:\d+\$)?[\+\-\ \#0]*[0-9\*]*(.[0-9\*]+)?[hlL]?[cbBdieEfgGosuxXpn%@])/g, + tagRegex = /(%)(?:(\d+)\$)?([\+\-\ \#0]*)([0-9\*]*)((?:.[0-9\*]+)?)([hlL]?)([cbBdieEfgGosuxXpn%@])/; exports.sprintf = function(format) { @@ -36,10 +36,10 @@ exports.sprintf = function(format) for (var i = 0; i < tokens.length; i++) { var t = tokens[i]; - if (format.substring(index, index + t.length) != t) - { + + if (format.substring(index, index + t.length) !== t) return result; - } + index += t.length; if (t.charAt(0) !== "%") @@ -51,10 +51,9 @@ exports.sprintf = function(format) else { var subtokens = t.match(tagRegex); - if (subtokens.length != 8 || subtokens[0] != t) - { + + if (subtokens.length !== 8 || subtokens[0] !== t) return result; - } var percentSign = subtokens[1], argIndex = subtokens[2], @@ -70,27 +69,28 @@ exports.sprintf = function(format) argIndex = Number(argIndex); var width = null; + if (widthString == "*") width = arguments[argIndex]; - else if (widthString != "") + else if (widthString !== "") width = Number(widthString); var precision = null; - if (precisionString == ".*") + + if (precisionString === ".*") precision = arguments[argIndex]; - else if (precisionString != "") + else if (precisionString !== "") precision = Number(precisionString.substring(1)); - var leftJustify = (flags.indexOf("-") >= 0); - var padZeros = (flags.indexOf("0") >= 0); + var leftJustify = (flags.indexOf("-") >= 0), + padZeros = (flags.indexOf("0") >= 0), + subresult = ""; - var subresult = ""; - - if (RegExp("[bBdiufeExXo]").test(specifier)) + if (/[bBdiufeExXo]/.test(specifier)) { - var num = Number(arguments[argIndex]); + var num = Number(arguments[argIndex]), + sign = ""; - var sign = ""; if (num < 0) { sign = "-"; @@ -103,7 +103,7 @@ exports.sprintf = function(format) sign = " "; } - if (specifier == "d" || specifier == "i" || specifier == "u") + if (specifier === "d" || specifier === "i" || specifier === "u") { var number = String(Math.abs(Math.floor(num))); @@ -112,16 +112,16 @@ exports.sprintf = function(format) if (specifier == "f") { - var number = String((precision != null) ? Math.abs(num).toFixed(precision) : Math.abs(num)); - var suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : ""; + var number = String((precision !== null) ? Math.abs(num).toFixed(precision) : Math.abs(num)), + suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : ""; subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros); } - if (specifier == "e" || specifier == "E") + if (specifier === "e" || specifier === "E") { - var number = String(Math.abs(num).toExponential(precision != null ? precision : 21)); - var suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : ""; + var number = String(Math.abs(num).toExponential(precision !== null ? precision : 21)), + suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : ""; subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros); } @@ -150,7 +150,7 @@ exports.sprintf = function(format) subresult = justify(sign, prefix, number, "", width, leftJustify, padZeros); } - if (RegExp("[A-Z]").test(specifier)) + if (/[A-Z]/.test(specifier)) subresult = subresult.toUpperCase(); else subresult = subresult.toLowerCase(); @@ -159,16 +159,14 @@ exports.sprintf = function(format) { var subresult = ""; - if (specifier == "%") + if (specifier === "%") subresult = "%"; - else if (specifier == "c") + else if (specifier === "c") subresult = String(arguments[argIndex]).charAt(0); - else if (specifier == "s" || specifier == "@") + else if (specifier === "s" || specifier === "@") subresult = String(arguments[argIndex]); - else if (specifier == "p" || specifier == "n") - { + else if (specifier === "p" || specifier === "n") subresult = ""; - } subresult = justify("", "", subresult, "", width, leftJustify, false); } @@ -176,12 +174,14 @@ exports.sprintf = function(format) result += subresult; } } + return result; } function justify(sign, prefix, string, suffix, width, leftJustify, padZeros) { var length = (sign.length + prefix.length + string.length + suffix.length); + if (leftJustify) { return sign + prefix + string + suffix + pad(width - length, " "); diff --git a/README.markdown b/README.markdown index 7da7ab119..b5a13beaa 100644 --- a/README.markdown +++ b/README.markdown @@ -33,7 +33,7 @@ Getting Started --------------- To get started, download and install the current release version of Cappuccino: - $ curl https://raw.github.com/cappuccino/cappuccino/v0.9.7-alpha1/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh + $ curl https://raw.github.com/cappuccino/cappuccino/v0.9.7/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh If you'd just like to get started using Cappuccino for your web apps, you are done. diff --git a/Tests/AppKit/CGGeometryTest.j b/Tests/AppKit/CGGeometryTest.j new file mode 100644 index 000000000..7261f2b3e --- /dev/null +++ b/Tests/AppKit/CGGeometryTest.j @@ -0,0 +1,34 @@ +@import + + +@implementation CGGeometryTest : OJTestCase + +- (void)testCGStringFromPoint +{ + [self assert:@"{0, 0}" equals:CGStringFromPoint(CGPointMakeZero())]; + [self assert:@"{123, 234}" equals:CGStringFromPoint(CGPointMake(123, 234))]; + [self assert:@"{-123.45, -234}" equals:CGStringFromPoint(CGPointMake(-123.45, -234.))]; +} + +- (void)testCGStringFromSize +{ + [self assert:@"{0, 0}" equals:CGStringFromSize(CGSizeMakeZero())]; + [self assert:@"{123, 234}" equals:CGStringFromSize(CGSizeMake(123, 234))]; + [self assert:@"{-123.45, -234}" equals:CGStringFromSize(CGSizeMake(-123.45, -234.))]; +} + +- (void)testCGStringFromRect +{ + [self assert:@"{{0, 0}, {0, 0}}" equals:CGStringFromRect(CGRectMakeZero())]; + [self assert:@"{{123, 234}, {345, 456}}" equals:CGStringFromRect(CGRectMake(123, 234, 345, 456))]; + [self assert:@"{{-123.45, -234}, {345.5, 456}}" equals:CGStringFromRect(CGRectMake(-123.45, -234, 345.5, 456.))]; +} + +- (void)testCGRectFromString +{ + [self assertTrue:CGRectEqualToRect(CGRectMakeZero(), CGRectFromString(@"{{0, 0}, {0, 0}}"))]; + [self assertTrue:CGRectEqualToRect(CGRectMake(123, 234, 345, 456), CGRectFromString(@"{{123, 234}, {345, 456}}"))]; + [self assertTrue:CGRectEqualToRect(CGRectMake(-123.45, -234, 345.5, 456), CGRectFromString(@"{{-123.45, -234}, {345.5, 456}}"))]; +} + +@end diff --git a/Tests/AppKit/CPAnimationTest.j b/Tests/AppKit/CPAnimationTest.j new file mode 100644 index 000000000..d151d82bc --- /dev/null +++ b/Tests/AppKit/CPAnimationTest.j @@ -0,0 +1,47 @@ +@import +@import + +[CPApplication sharedApplication]; + +@implementation CPAnimation (TestMethods) +{ +} + +- (CPTimer)timer +{ + return _timer; +} + +@end + +@implementation CPAnimationTest : OJTestCase +{ +} + +- (void)testScheduleTimerWithIntervalBasedOnDefaultFrameRate +{ + var animation = [[CPAnimation alloc] initWithDuration:0.1 animationCurve:CPAnimationLinear]; + [animation startAnimation]; + + [self assert:1.0/60.0 equals:[[animation timer] timeInterval]]; +} + +- (void)testScheduleTimerWithIntervalBasedOnCustomFrameRate +{ + var animation = [[CPAnimation alloc] initWithDuration:0.1 animationCurve:CPAnimationLinear]; + [animation setFrameRate:30]; + [animation startAnimation]; + + [self assert:1.0/30.0 equals:[[animation timer] timeInterval]]; +} + +- (void)testScheduleTimerWithIntervalBasedOnAsFastAsPossibleFrameRate +{ + var animation = [[CPAnimation alloc] initWithDuration:0.1 animationCurve:CPAnimationLinear]; + [animation setFrameRate:0]; + [animation startAnimation]; + + [self assert:0.0001 equals:[[animation timer] timeInterval]]; +} + +@end diff --git a/Tests/AppKit/CPArrayControllerTest.j b/Tests/AppKit/CPArrayControllerTest.j index 3590f9f61..5e7f8f982 100644 --- a/Tests/AppKit/CPArrayControllerTest.j +++ b/Tests/AppKit/CPArrayControllerTest.j @@ -1079,22 +1079,22 @@ return [_contentArray count]; } -- (id)objectInItemsArrayAtIndex:(unsigned int)index +- (id)objectInItemsArrayAtIndex:(CPUInteger)index { return [_contentArray objectAtIndex:index]; } -- (void)insertObject:(id)anObject inItemsArrayAtIndex:(unsigned int)index +- (void)insertObject:(id)anObject inItemsArrayAtIndex:(CPUInteger)index { [_contentArray insertObject:anObject atIndex:index]; } -- (void)removeObjectFromItemsArrayAtIndex:(unsigned int)index +- (void)removeObjectFromItemsArrayAtIndex:(CPUInteger)index { [_contentArray removeObjectAtIndex:index]; } -- (void)replaceObjectInItemsArrayAtIndex:(unsigned int)index withObject:(id)anObject +- (void)replaceObjectInItemsArrayAtIndex:(CPUInteger)index withObject:(id)anObject { [_contentArray replaceObjectAtIndex:index withObject:anObject]; } diff --git a/Tests/AppKit/CPColorTest.j b/Tests/AppKit/CPColorTest.j index a0ee065f1..b357a6805 100644 --- a/Tests/AppKit/CPColorTest.j +++ b/Tests/AppKit/CPColorTest.j @@ -8,7 +8,7 @@ { var colors = ['000000', '0099CC', '7E8EAB', 'FFFFFF']; for (var i = 0; i < colors.length; ++i) - [self assert: colors[i] equals: [[CPColor colorWithHexString: colors[i]] hexString]]; + [self assert:colors[i] equals:[[CPColor colorWithHexString:colors[i]] hexString]]; } - (void)testColorWithCSSString @@ -21,6 +21,33 @@ [self assert:128 equals:ROUND([rgbaColour alphaComponent] * 255) message:"alpha component"]; } +- (void)testColorWithHue_saturation_brightness_ +{ + var tests = [ + [[0, 0, 0], [0, 0, 0]], + [[0, 0, 1], [1, 1, 1]], + [[0, 1, 1], [1, 0, 0]], + [[0.75, 1, 1], [0.5, 0, 1]], + [[0.5, 0.5, 0.5], [0.25, 0.5, 0.5]], + [[0.9, 0.8, 0.7], [0.7, 0.14, 0.476]] + ]; + + for (var i = 0; i < tests.length; i++) + { + var test = tests[i], + input = test[0], + expected = test[1], + c = [CPColor colorWithCalibratedHue:input[0] saturation:input[1] brightness:input[2] alpha:0.5]; + [self assert:expected equals:[Math.round([c redComponent] * 1000) / 1000, Math.round([c greenComponent] * 1000) / 1000, Math.round([c blueComponent] * 1000) / 1000] message:@"hue: " + input[0] + " saturation: " + input[1] + " brightness: " + input[2]]; + } + + var hsb = [[CPColor colorWithHue:0.9 saturation:0.8 brightness:0.7] hsbComponents]; + [self assert:[0.9, 0.8, 0.7] equals:[Math.round(hsb[0] * 10) / 10, Math.round(hsb[1] * 10) / 10, Math.round(hsb[2] * 10) / 10]]; + + hsb = [[CPColor colorWithHue:0.999 saturation:0.8 brightness:0.7] hsbComponents]; + [self assert:[0.999, 0.8, 0.7] equals:[Math.round(hsb[0] * 1000) / 1000, Math.round(hsb[1] * 10) / 10, Math.round(hsb[2] * 10) / 10]]; +} + - (void)testIsEqual_ { // Based on https://gist.github.com/e06f749362cb1166439f by spakanati. diff --git a/Tests/AppKit/CPImageTest.j b/Tests/AppKit/CPImageTest.j new file mode 100644 index 000000000..2e808a78c --- /dev/null +++ b/Tests/AppKit/CPImageTest.j @@ -0,0 +1,14 @@ +@import + +@implementation CPImageTest : OJTestCase +{ +} + +- (void)testInitWithContentsOfFile_nil +{ + var image = [[CPImage alloc] initWithContentsOfFile:nil]; + + [self assert:nil equals:image message:@"- CPImage initWithContentsOfFile:nil should return nil"]; +} + +@end diff --git a/Tests/AppKit/CPKeyValueBindingTest.j b/Tests/AppKit/CPKeyValueBindingTest.j index 3d8e65ce2..2b03ff655 100644 --- a/Tests/AppKit/CPKeyValueBindingTest.j +++ b/Tests/AppKit/CPKeyValueBindingTest.j @@ -368,7 +368,7 @@ id lastKey; } -- (void)setValue:value forKey:aKey +- (void)setValue:(id)value forKey:(CPString)aKey { lastValue = value; lastKey = aKey; diff --git a/Tests/AppKit/CPMenuTest.j b/Tests/AppKit/CPMenuTest.j index 63a7e410a..44a16e0dd 100644 --- a/Tests/AppKit/CPMenuTest.j +++ b/Tests/AppKit/CPMenuTest.j @@ -15,6 +15,8 @@ BOOL saveDocumentWasCalled; BOOL saveDocumentAsWasCalled; BOOL undoWasCalled; + + CPMenuItem anInstantiatedMenuItem; } - (void)setUp @@ -67,6 +69,10 @@ [menu addItem:editMenuItem]; [menu addItem:[CPMenuItem separatorItem]]; + + // Test Issue 1899 + anInstantiatedMenuItem = [[CPMenuItem alloc] initWithTitle:@"Highlight" action:nil keyEquivalent:@""]; + [menu addItem:anInstantiatedMenuItem]; } - (void)_retarget:(CPMenuItem)aMenu @@ -82,6 +88,59 @@ } } +- (void)testRemoveAllItemsHighlighting +{ + // hack it so that this menu item is highlighted + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + // test both the public isHighlighted method, as well as the underlying view highlighting + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeAll"]; + + [menu removeAllItems]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeAll"]; +} + +- (void)testRemoveOneItemHighlighting +{ + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeItem"]; + + [menu removeItem:anInstantiatedMenuItem]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeItem"]; +} + +- (void)testRemoveOneItemByIndexHighlighting +{ + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeItemAtIndex"]; + + [menu removeItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeItemAtIndex"]; +} + +- (void)testSetEnabledHighlighting +{ + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + + [anInstantiatedMenuItem setEnabled:NO]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after setEnabled:NO"]; +} + - (void)testKeyEquivalent { [self _retarget:menu]; diff --git a/Tests/AppKit/CPOutlineViewTest.j b/Tests/AppKit/CPOutlineViewTest.j index 1c6dae2ae..37278a7fb 100644 --- a/Tests/AppKit/CPOutlineViewTest.j +++ b/Tests/AppKit/CPOutlineViewTest.j @@ -172,6 +172,43 @@ [outlineView expandItem:".1"]; } +- (void)testShouldExpandItemDelegate +{ + var delegate = [TestShouldExpandItemDelegate new]; + // reset state + [outlineView collapseItem:".1"]; + [self assertFalse:[outlineView isItemExpanded:".1"] message:".1 is collapsed by default"]; + [outlineView expandItem:".1"]; + [self assertTrue:[outlineView isItemExpanded:".1"] message:".1 is expanded, no restriction"]; + [outlineView collapseItem:".1"]; + [self assertFalse:[outlineView isItemExpanded:".1"] message:".1 is collapsed now"]; + + [outlineView setDelegate:delegate]; + + [outlineView expandItem:".1"]; + [self assertFalse:[outlineView isItemExpanded:".1"] message:".1 is still collapsed, cannot expand"]; +} + +- (void)testShouldCollapseItemDelegate +{ + var delegate = [TestShouldCollapseItemDelegate new]; + // reset state + [outlineView collapseItem:".1"]; + + [self assertFalse:[outlineView isItemExpanded:".1"] message:".1 is collapsed by default"]; + [outlineView expandItem:".1"]; + [self assertTrue:[outlineView isItemExpanded:".1"] message: ".1 is now expanded"]; + [outlineView collapseItem:".1"]; + [self assertFalse:[outlineView isItemExpanded:".1"] message: ".1 is now collapsed, no restriction"]; + + [outlineView setDelegate:delegate]; + + [outlineView expandItem:".1"]; + [self assertTrue:[outlineView isItemExpanded:".1"] message:".1 is now expanded"]; + [outlineView collapseItem:".1"]; + [self assertTrue:[outlineView isItemExpanded:".1"] message:".1 is still expanded, cannot collapse"]; +} + /*! Test that the outline view archives properly. */ @@ -326,5 +363,29 @@ [tester assert:0 equals:visibleRows.location]; [tester assert:8 equals:visibleRows.length]; } +@end + +@implementation TestShouldExpandItemDelegate : CPObject +{ +} + +- (BOOL)outlineView:(CPOutlineView)outlineView shouldExpandItem:(id)item +{ + if (item == @".1") + return NO; + return YES; +} +@end + +@implementation TestShouldCollapseItemDelegate : CPObject +{ +} + +- (BOOL)outlineView:(CPOutlineView)outlineView shouldCollapseItem:(id)item +{ + if (item == @".1") + return NO; + return YES; +} @end diff --git a/Tests/AppKit/CPPasteboardTest.j b/Tests/AppKit/CPPasteboardTest.j new file mode 100644 index 000000000..860576ca2 --- /dev/null +++ b/Tests/AppKit/CPPasteboardTest.j @@ -0,0 +1,33 @@ +@import + +@import + +@implementation CPPasteboardTest : OJTestCase +{ +} + +- (void)testSetString_forType_ +{ + var pboard = [CPPasteboard generalPasteboard]; + [pboard declareTypes:@[CPStringPboardType] owner:nil]; + [pboard setString:@"hello" forType:CPStringPboardType]; + [self assert:@"hello" equals:[pboard stringForType:CPStringPboardType]]; +} + +- (void)testSetStringTypeCheck +{ + var pboard = [CPPasteboard generalPasteboard]; + [pboard declareTypes:@[CPStringPboardType] owner:nil]; + + // These are okay. + [pboard setString:"a" forType:CPStringPboardType]; + [pboard setString:[CPString stringWithString:@"a"] forType:CPStringPboardType]; + + // This one should crash. + [self assertThrows:function() + { + [pboard setString:[1, 2, 3] forType:CPStringPboardType]; + }]; +} + +@end diff --git a/Tests/AppKit/CPTableViewTest.j b/Tests/AppKit/CPTableViewTest.j index a103507dd..c1c5d0180 100644 --- a/Tests/AppKit/CPTableViewTest.j +++ b/Tests/AppKit/CPTableViewTest.j @@ -317,7 +317,7 @@ @end -@implementation TestDataSource : CPObject +@implementation TestDataSource : CPObject { CPArray tableEntries @accessors; } @@ -327,12 +327,12 @@ return [tableEntries count]; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return tableEntries[aRow]; } -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(int)aRow +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow { tableEntries[aRow] = anObject; } @@ -343,7 +343,7 @@ { } -- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(int)anRow +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)anRow { return YES; } @@ -357,7 +357,7 @@ CPTableViewTest tester @accessors; } -- (void)tableView:(CPTableView)aTableView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)tableColumn row:(int)row +- (void)tableView:(CPTableView)aTableView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { // Make sure each view contains the full row in its objectValue [tester assert:tableEntries[row] equals:[aView objectValue]]; diff --git a/Tests/AppKit/CPTextFieldTest.j b/Tests/AppKit/CPTextFieldTest.j index 19dc3c539..bca749b45 100644 --- a/Tests/AppKit/CPTextFieldTest.j +++ b/Tests/AppKit/CPTextFieldTest.j @@ -54,7 +54,7 @@ } -- (id)initWithFrame:aFrame +- (id)initWithFrame:(CGRect)aFrame { if (self = [super initWithFrame:aFrame]) { diff --git a/Tests/AppKit/CPViewTest.j b/Tests/AppKit/CPViewTest.j index ac95d54a9..bc44eccb3 100644 --- a/Tests/AppKit/CPViewTest.j +++ b/Tests/AppKit/CPViewTest.j @@ -103,4 +103,83 @@ [self assertFalse:[view _isVisible] message:"a superview does not belong to a visible window"]; } +- (void)testNextValidKeyView +{ + var viewA = [CPView new], + viewB = [CPView new], + viewC = [CPCollectionView new], + viewD = [CPView new], + viewE = [CPView new]; + + [viewA setNextKeyView:viewB]; + [viewB setNextKeyView:viewC]; + + [self assert:viewC equals:[viewA nextValidKeyView]]; + + // Make a loop which is harder to detect. + [viewA setNextKeyView:viewB]; + [viewB setNextKeyView:viewD]; + [viewD setNextKeyView:viewE]; + [viewE setNextKeyView:viewD]; + + [self assert:nil equals:[viewA nextValidKeyView]]; +} + +- (void)testConvertPoint_fromView_shouldChangeNothingForSameView +{ + var tView0 = [CPView new], + aWindow = [CPWindow new]; + + [aWindow setContentView:tView0]; + + [tView0 setFrame:CGRectMake(3, 5, 13, 17)]; + + [self assertTrue:CGPointEqualToPoint(CGPointMake(7, 11), [tView0 convertPoint:CGPointMake(7, 11) fromView:tView0])] +} + +- (void)testConvertPoint_fromView_shouldAddSubviewCoordinatesWhenMovingUp +{ + var tView0 = [CPView new], + subView0 = [CPView new], + aWindow = [CPWindow new]; + + [aWindow setContentView:tView0]; + + [tView0 addSubview:subView0]; + [tView0 setFrame:CGRectMake(30, 50, 130, 170)]; + [subView0 setFrame:CGRectMake(3, 5, 13, 17)]; + + [self assertTrue:CGPointEqualToPoint(CGPointMake(10, 16), [tView0 convertPoint:CGPointMake(7, 11) fromView:subView0])] +} + +- (void)testConvertPoint_fromView_shouldWorkBetweenSiblingViews +{ + var tView0 = [CPView new], + subView0 = [CPView new], + aWindow = [CPWindow new]; + + [[aWindow contentView] addSubview:tView0]; + [[aWindow contentView] addSubview:subView0]; + + [tView0 setFrame:CGRectMake(30, 50, 130, 170)]; + [subView0 setFrame:CGRectMake(3, 5, 13, 17)]; + + [self assertTrue:CGPointEqualToPoint(CGPointMake(34, 56), [subView0 convertPoint:CGPointMake(7, 11) fromView:tView0])] +} + +- (void)testConvertPoint_fromView_shouldSubtractSubviewCoordinatesWhenMovingDown +{ + var tView0 = [CPView new], + subView0 = [CPView new], + aWindow = [CPWindow new]; + + [aWindow setContentView:tView0]; + + [tView0 addSubview:subView0]; + [tView0 setFrame:CGRectMake(30, 50, 130, 170)]; + [subView0 setFrame:CGRectMake(3, 5, 13, 17)]; + + [self assertTrue:CGPointEqualToPoint(CGPointMake(4, 6), [subView0 convertPoint:CGPointMake(7, 11) fromView:tView0])] +} + @end diff --git a/Tests/AppKit/WithAndWithoutBindingsIntegration/01_WithoutBindings/TableViewDataSource.j b/Tests/AppKit/WithAndWithoutBindingsIntegration/01_WithoutBindings/TableViewDataSource.j index 24a9f8387..ffe7727d5 100644 --- a/Tests/AppKit/WithAndWithoutBindingsIntegration/01_WithoutBindings/TableViewDataSource.j +++ b/Tests/AppKit/WithAndWithoutBindingsIntegration/01_WithoutBindings/TableViewDataSource.j @@ -32,7 +32,7 @@ return [collection count]; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex { var objectAtRow = [collection objectAtIndex:rowIndex], columnKey = [aTableColumn identifier]; @@ -40,7 +40,7 @@ return [objectAtRow valueForKey:columnKey]; } -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex { var objectAtRow = [collection objectAtIndex:rowIndex], columnKey = [aTableColumn identifier]; @@ -56,8 +56,8 @@ // TODO Drag and drop is not implemented since it's difficult to test in a unit test and not all that relevant in a bindings context anyhow. // - (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard -// - (CPDragOperation)tableView:(CPTableView)tv validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)op -// - (BOOL)tableView:(CPTableView)tv acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)op +// - (CPDragOperation)tableView:(CPTableView)tv validateDrop:(id)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)op +// - (BOOL)tableView:(CPTableView)tv acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)op // - (void)awakeFromNib @end diff --git a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/TableViewDataSource.j b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/TableViewDataSource.j index dbf4844da..ecd06daf6 100644 --- a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/TableViewDataSource.j +++ b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/TableViewDataSource.j @@ -36,8 +36,8 @@ // TODO Drag and drop is not implemented since it's difficult to test in a unit test and not all that relevant in a bindings context anyhow. // - (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard -// - (CPDragOperation)tableView:(CPTableView)tv validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)op -// - (BOOL)tableView:(CPTableView)tv acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)op +// - (CPDragOperation)tableView:(CPTableView)tv validateDrop:(id)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)op +// - (BOOL)tableView:(CPTableView)tv acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)op // - (void)awakeFromNib @end diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index d15aa52cb..d3d1bb3b8 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -641,6 +641,15 @@ [self assertTrue:d.indexOf("(5, 6)") !== -1 message:"Can't find '(5, 6)' in description of array " + d]; } +- (void)testRecursiveJSObjectDescription +{ + var a = []; + + a.push(a); + + [self assert:'@[\n @[\n @[\n @[\n @[\n @[\n @[\n @[\n @[\n @[\n @[\n ...\n ]\n ]\n ]\n ]\n ]\n ]\n ]\n ]\n ]\n ]\n]' equals:[a description]]; +} + - (void)testSortUsingDescriptorsWithDifferentSelectors { var a = [CPDictionary dictionaryWithJSObject:{"a": "AB", "b": "ba"}], diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 64bb4d4de..28ca7576e 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -5,6 +5,34 @@ var sharedObject = [CPObject new]; @implementation CPAttributedStringTest : OJTestCase +- (void)testAppendToEmptyString +{ + var string = [CPMutableAttributedString new]; + [string replaceCharactersInRange:CPMakeRange(0, 0) withString:@"hi there"]; + [self assert:[string string] equals:@"hi there"]; +} + +- (void)testAppendToEndOfString +{ + var string = [[CPMutableAttributedString alloc] initWithString:@"hi there"]; + [string replaceCharactersInRange:CPMakeRange(8, 0) withString:@" it is me"]; + [self assert:[string string] equals:@"hi there it is me"]; +} + +- (void)testWriteOverRangeBoundaries +{ + var string = [[CPMutableAttributedString alloc] initWithString:@"Fusce\n" attributes:@{"testkey": 1}]; + [string replaceCharactersInRange:CPMakeRange(6, 0) withAttributedString:[[CPAttributedString alloc] initWithString:@"this is boldface" + attributes:@{"testkey": 2}]]; + [string replaceCharactersInRange:CPMakeRange(5, 3) withString:@" "]; + + var aRange = CPMakeRange(0, 0), + attribs = [string attributesAtIndex:4 effectiveRange:aRange]; + + [self assertTrue:([attribs objectForKey:@"testkey"] === 1) + message:"testWriteOverRangeBoundaries: expected:" + @"1" + " actual:" + [attribs objectForKey:@"testkey"]]; +} + - (CPAttributedString)stringForTesting { var string = [[CPAttributedString alloc] initWithString:"The quick brown fox jumped over the lazy dog."]; @@ -53,7 +81,7 @@ var sharedObject = [CPObject new]; message:"testInitWithAttributedString: expected:" + [self stringForTesting] + " actual:" + string]; } -- (void)testIinitWithString_attributes +- (void)testInitWithString_attributes { var string = [[CPAttributedString alloc] initWithString:@"hi there" attributes:@{}]; @@ -116,7 +144,7 @@ var sharedObject = [CPObject new]; testAttributesAtIndexWithValues(string, 33, expectedValues, self); } -//- (CPDictionary)attributesAtIndex:(unsigned)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit +//- (CPDictionary)attributesAtIndex:(CPUInteger)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit - (void)testAttributesAtIndexLongestEffectiveRangeInRange { var string = [self stringForTesting]; @@ -135,7 +163,7 @@ var sharedObject = [CPObject new]; [self assertTrue:[attributes objectForKey:"f"] === 43 message:@"expecting 'f' to be 43, was: " + [attributes objectForKey:"f"]]; } -//- (id)attribute:(CPString)attribute atIndex:(unsigned)index effectiveRange:(CPRangePointer)aRange +//- (id)attribute:(CPString)attribute atIndex:(CPUInteger)index effectiveRange:(CPRangePointer)aRange - (void)testAttributeAtIndexEffectiveRange { var string = [self stringForTesting]; @@ -144,7 +172,7 @@ var sharedObject = [CPObject new]; testAttributeAtIndexWithValue(string, 20, "d", [CPNull null], self); } -//- (id)attribute:(CPString)attribute atIndex:(unsigned)index longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit +//- (id)attribute:(CPString)attribute atIndex:(CPUInteger)index longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit - (void)testAttributeAtIndexLongestEffectiveRangeInRange { var string = [self stringForTesting]; @@ -179,6 +207,38 @@ var sharedObject = [CPObject new]; [self assertFalse:[a isEqual:@"HELLO!"] message:"Expected a to not equal 'HELLO!', but it did"]; } +- (void)testIsEqualEmpty +{ + var a = [[CPMutableAttributedString alloc] initWithString:@""], + b = [[CPMutableAttributedString alloc] initWithString:@""]; + + [self assertTrue:[a isEqual:b]]; +} + +- (void)testIsEqualWithSimpleAttribute +{ + var a = [[CPMutableAttributedString alloc] initWithString:@"GREETINGS!"], + b = [[CPMutableAttributedString alloc] initWithString:@"GREETINGS!"]; + + [a addAttribute:"color" value:[CPColor redColor] range:CPMakeRange(0, 5)]; + [self assertFalse:[a isEqual:b] message:"red string should not equal string without color attribute"]; + [b addAttribute:"color" value:[CPColor redColor] range:CPMakeRange(0, 5)]; + [self assertTrue:[a isEqual:b]]; +} + +- (void)testIsEqualWithTwoAttributes +{ + var a = [[CPMutableAttributedString alloc] initWithString:@"GREETINGS!"], + b = [[CPMutableAttributedString alloc] initWithString:@"GREETINGS!"]; + + [a addAttribute:"color" value:[CPColor redColor] range:CPMakeRange(0, 9)]; + [b addAttribute:"color" value:[CPColor redColor] range:CPMakeRange(0, 9)]; + [a addAttribute:"font" value:"Helvetica" range:CPMakeRange(1, 4)]; + [self assertFalse:[a isEqual:b] message:"font difference from index 1 should be found"]; + [b addAttribute:"font" value:"Helvetica" range:CPMakeRange(1, 4)]; + [self assertTrue:[a isEqual:b]]; +} + //Extracting a Substring //- (CPAttributedString)attributedSubstringFromRange:(CPRange)aRange - (void)testAttributedSubstringFromRange @@ -458,7 +518,6 @@ var sharedObject = [CPObject new]; testAttributeAtIndexWithValue(string, 10, "duck", "goose", self); testAttributeAtIndexWithValue(string, 30, "duck", "goose", self); testAttributeAtIndexWithValue(string, 40, "duck", undefined, self); - } //- (void)removeAttribute:(CPString)anAttribute range:(CPRange)aRange @@ -554,6 +613,23 @@ var sharedObject = [CPObject new]; [self assertTrue:[[self stringForTesting] isEqual:string] message:"setAttributedString should have made strings equal, but they were not"]; } +- (void)testEncoding +{ + // We can't test using [self stringForTesting] because it contains attributes without coding support. + var original = [[CPMutableAttributedString alloc] initWithString:@"firstsecondthird"]; + [original addAttribute:"color" value:[CPColor redColor] range:CPMakeRange(0, 5)]; + [original addAttribute:"color" value:[CPColor greenColor] range:CPMakeRange(5, 6)]; + [original addAttribute:"color" value:[CPColor blueColor] range:CPMakeRange(11, 5)]; + + var encoded = [CPKeyedArchiver archivedDataWithRootObject:original], + decoded = [CPKeyedUnarchiver unarchiveObjectWithData:encoded]; + [self assert:original equals:decoded]; + + // Verify that the original and decoded are not incorrectly tied together. + [original addAttribute:"color" value:[CPColor blueColor] range:CPMakeRange(0, 5)]; + [self assertFalse:[original isEqual:decoded]]; +} + @end function isEqualAllowingUndefinedCast(a, b) @@ -585,7 +661,7 @@ function testAttributeAtIndexWithValue(aString, anIndex, aKey, aValue, aSelf) var range = CPMakeRange(0, 0), attribute = [aString attribute:aKey atIndex:anIndex effectiveRange:range]; - [aSelf assertTrue: isEqualAllowingUndefinedCast(attribute, aValue) message: "expecting '" + aKey + "' to be '" + aValue + "', was '" + attribute]; + [aSelf assertTrue:isEqualAllowingUndefinedCast(attribute, aValue) message: "expecting '" + aKey + "' to be '" + aValue + "', was '" + attribute]; var index = range.location; @@ -593,7 +669,7 @@ function testAttributeAtIndexWithValue(aString, anIndex, aKey, aValue, aSelf) { attribute = [aString attribute:aKey atIndex:index++ effectiveRange:nil]; - [aSelf assertTrue: isEqualAllowingUndefinedCast(attribute, aValue) message: "expecting '" + aKey + "' to be '" + aValue + "', was '" + attribute]; + [aSelf assertTrue:isEqualAllowingUndefinedCast(attribute, aValue) message: "expecting '" + aKey + "' to be '" + aValue + "', was '" + attribute]; } } diff --git a/Tests/Foundation/CPDateFormatterTest.j b/Tests/Foundation/CPDateFormatterTest.j new file mode 100644 index 000000000..a1a2432ce --- /dev/null +++ b/Tests/Foundation/CPDateFormatterTest.j @@ -0,0 +1,1222 @@ +/* CPDateFormatterTest.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 +@import +@import + +@import + +@global CPDateFormatterNoStyle +@global CPDateFormatterShortStyle +@global CPDateFormatterMediumStyle +@global CPDateFormatterLongStyle +@global CPDateFormatterFullStyle + +@implementation CPDateFormatterTest : OJTestCase +{ + CPDate _date; + CPDateFormatter _dateFormatter; +} + +- (void)setUp +{ + _date = [[CPDate alloc] initWithString:@"2011-10-05 16:34:38 -0900"]; + _dateFormatter = [[CPDateFormatter alloc] init]; + [_dateFormatter setDateStyle:CPDateFormatterMediumStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterShortStyle]; + [_dateFormatter setLocale:[[CPLocale alloc] initWithLocaleIdentifier:@"en_US"]]; + [_dateFormatter setTimeZone:[CPTimeZone timeZoneWithAbbreviation:@"PDT"]]; +} + + +#pragma mark - +#pragma mark Setter + +- (void)testSetterAMSymbol +{ + [_dateFormatter setAMSymbol:@"Hej hej"]; + [self assert:[_dateFormatter AMSymbol] equals:@"Hej hej"]; +} + +- (void)testSetterPMSymbol +{ + [_dateFormatter setPMSymbol:@"Hej hej"]; + [self assert:[_dateFormatter PMSymbol] equals:@"Hej hej"]; +} + +- (void)testSetterWeekdaySymbols +{ + [_dateFormatter setWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter weekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortWeekdaySymbols +{ + [_dateFormatter setShortWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortWeekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterVeryShortWeekdaySymbols +{ + [_dateFormatter setVeryShortWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter veryShortWeekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterStandaloneWeekdaySymbols +{ + [_dateFormatter setStandaloneWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter standaloneWeekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortStandaloneWeekdaySymbols +{ + [_dateFormatter setShortStandaloneWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortStandaloneWeekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterVeryShortStandaloneWeekdaySymbols +{ + [_dateFormatter setVeryShortStandaloneWeekdaySymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter veryShortStandaloneWeekdaySymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterMonthSymbols +{ + [_dateFormatter setMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter monthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortMonthSymbols +{ + [_dateFormatter setShortMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortMonthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterVeryShortMonthSymbols +{ + [_dateFormatter setVeryShortMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter veryShortMonthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterStandaloneMonthSymbols +{ + [_dateFormatter setStandaloneMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter standaloneMonthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortStandaloneMonthSymbols +{ + [_dateFormatter setShortStandaloneMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortStandaloneMonthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterVeryShortStandaloneMonthSymbols +{ + [_dateFormatter setVeryShortStandaloneMonthSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter veryShortStandaloneMonthSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterQuarterSymbols +{ + [_dateFormatter setQuarterSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter quarterSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortQuarterSymbols +{ + [_dateFormatter setShortQuarterSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortQuarterSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterStandaloneQuarterSymbols +{ + [_dateFormatter setStandaloneQuarterSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter standaloneQuarterSymbols] equals:[@"Hej hej"]]; +} + +- (void)testSetterShortStandaloneQuarterSymbols +{ + [_dateFormatter setShortStandaloneQuarterSymbols:[@"Hej hej"]]; + [self assert:[_dateFormatter shortStandaloneQuarterSymbols] equals:[@"Hej hej"]]; +} + +#pragma mark - +#pragma mark string from date + +- (void)testLocalizedStringFromDate +{ + var result = [CPDateFormatter localizedStringFromDate:[[CPDate alloc] initWithString:@"2011-10-05 23:59:59 +1200"] dateStyle:CPDateFormatterMediumStyle timeStyle:CPDateFormatterNoStyle]; + + if (![[[CPLocale currentLocale] objectForKey:CPLocaleCountryCode] isEqualToString:@"US"]) + [self assert:result equals:@"5 Oct 2011"]; + else + [self assert:result equals:@"Oct 5, 2011"]; +} + +- (void)testInit +{ + var dateFormatter = [[CPDateFormatter alloc] init], + result = [dateFormatter stringFromDate:_date]; + + [self assert:result.length equals:@"".length]; +} + +- (void)testInitWithDateFormat +{ + var dateFormatter = [[CPDateFormatter alloc] initWithDateFormat:@"d EEEE, MMM, Y 'at' H:mm:ss a z" allowNaturalLanguage:NO]; + [dateFormatter setLocale:[[CPLocale alloc] initWithLocaleIdentifier:@"en_US"]]; + [dateFormatter setTimeZone:[CPTimeZone timeZoneWithAbbreviation:@"PDT"]]; + + var result = [dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"5 Wednesday, Oct, 2011 at 18:34:38 PM PDT"] +} + +- (void)testStringFromDateDateNoStyleTimeNoStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterNoStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result.length equals:@"".length]; +} + +- (void)testStringFromDateDateShortStyleTimeNoStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterShortStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"10/5/11"]; +} + +- (void)testStringFromDateDateMediumStyleTimeNoStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterMediumStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"Oct 5, 2011"]; +} + +- (void)testStringFromDateDateLongStyleTimeNoStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterLongStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"October 5, 2011"]; +} + +- (void)testStringFromDateDateFullStyleTimeNoStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterFullStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"Wednesday, October 5, 2011"]; +} + +- (void)testStringFromDateDateNoStyleTimeShortStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterNoStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterShortStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"6:34 PM"]; +} + +- (void)testStringFromDateDateNoStyleTimeMediumStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterNoStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterMediumStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"6:34:38 PM"]; +} + +- (void)testStringFromDateDateNoStyleTimeLongStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterNoStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterLongStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"6:34:38 PM PDT"]; +} + +- (void)testStringFromDateDateNoStyleTimeFullStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterNoStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterFullStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"6:34:38 PM Pacific Daylight Time"]; +} + +- (void)testStringFromDateDateFullStyleTimeFullStyle +{ + [_dateFormatter setDateStyle:CPDateFormatterFullStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterFullStyle]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"Wednesday, October 5, 2011 6:34:38 PM Pacific Daylight Time"]; +} + +- (void)testStringForObjectValueWithDate +{ + [_dateFormatter setDateStyle:CPDateFormatterMediumStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterShortStyle]; + + var result = [_dateFormatter stringForObjectValue:_date]; + [self assert:result equals:@"Oct 5, 2011 6:34 PM"]; +} + +- (void)testStringForObjectValueWithString +{ + [_dateFormatter setDateStyle:CPDateFormatterMediumStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterShortStyle]; + + var result = [_dateFormatter stringForObjectValue:@"Test String"]; + [self assert:result equals:nil]; +} + +- (void)testEditingStringForObjectValueWithDate +{ + [_dateFormatter setDateStyle:CPDateFormatterMediumStyle]; + [_dateFormatter setTimeStyle:CPDateFormatterShortStyle]; + + var result = [_dateFormatter editingStringForObjectValue:_date]; + [self assert:result equals:@"Oct 5, 2011 6:34 PM"]; +} + +- (void)testDoesRelativeDateFormatting +{ + [_dateFormatter setTimeStyle:CPDateFormatterNoStyle]; + [_dateFormatter setDoesRelativeDateFormatting:YES]; + + var date = [CPDate date]; + date.setDate(date.getDate() + 1); + + var result = [_dateFormatter editingStringForObjectValue:date]; + [self assert:result equals:@"tomorrow"]; + + date.setDate(date.getDate() - 2); + + result = [_dateFormatter editingStringForObjectValue:date]; + [self assert:result equals:@"yesterday"]; +} + +- (void)testStringFromDateTokensYears +{ + [_dateFormatter setDateFormat:@"y yy yyy yyyy Y YY YYY YYYY"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"2011 11 2011 2011 2011 11 2011 2011"]; +} + +- (void)testStringFromDateTokensQuarters +{ + [_dateFormatter setDateFormat:@"Q QQ QQQ QQQQ q qq qqq qqqq"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"4 04 Q4 4th quarter 4 04 Q4 4th quarter"]; +} + +- (void)testStringFromDateTokensMonths +{ + [_dateFormatter setDateFormat:@"M MM MMM MMMM MMMMM L LL LLL LLLL LLLLL"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"10 10 Oct October O 10 10 Oct October O"]; +} + +- (void)testStringFromDateTokensWeeks +{ + [_dateFormatter setDateFormat:@"w ww W"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"41 41 2"]; +} + +- (void)testStringFromDateTokensDays +{ + [_dateFormatter setDateFormat:@"d dd D DD DDD F"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"5 05 278 278 278 1"]; +} + +- (void)testStringFromDateTokensWeekDays +{ + [_dateFormatter setDateFormat:@"E EE EEE EEEE EEEEE e ee eee eeee eeeee c cc ccc cccc ccccc"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"Wed Wed Wed Wednesday W 4 04 Wed Wednesday W 4 4 Wed Wednesday W"]; +} + +- (void)testStringFromDateTokensPeriods +{ + [_dateFormatter setDateFormat:@"a"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"PM"]; + + _date = [[CPDate alloc] initWithString:@"2011-10-05 05:34:38 -0900"]; + + var result = [_dateFormatter stringFromDate:_date]; + [self assert:result equals:@"AM"]; +} + +- (void)testStringFromDateTokensSeconds +{ + [_dateFormatter setDateFormat:@"s ss S SS SSS SSSS A AA AAA AAAA"]; + _date.setSeconds(8); + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"8 08 0 00 000 0000 66848000 66848000 66848000 66848000"]; +} + +- (void)testStringFromDateTokensMinutes +{ + [_dateFormatter setDateFormat:@"m mm"]; + _date.setMinutes(5); + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"5 05"]; +} + +- (void)testStringFromDateTokensHours +{ + var date = [[CPDate alloc] initWithString:@"2011-10-05 22:34:08 -0900"]; + + [_dateFormatter setDateFormat:@"h hh HH k kk K KK"]; + var result = [_dateFormatter stringFromDate:date]; + [self assert:result equals:@"12 12 00 24 24 0 00"]; + + date = [[CPDate alloc] initWithString:@"2011-10-05 06:34:08 -0900"]; + [_dateFormatter setDateFormat:@"h hh HH k kk K KK"]; + result = [_dateFormatter stringFromDate:date]; + [self assert:result equals:@"8 08 08 8 08 8 08"]; + + date = [[CPDate alloc] initWithString:@"2011-10-05 16:34:08 -0900"]; + [_dateFormatter setDateFormat:@"h hh HH k kk K KK"]; + var result = [_dateFormatter stringFromDate:date]; + [self assert:result equals:@"6 06 18 18 18 6 06"]; +} + +- (void)testStringFromDateTokensZones +{ + [_dateFormatter setDateFormat:@"z zz zzz zzzz Z ZZ ZZZ ZZZZ ZZZZ v vvvv V"]; + + var result = [_dateFormatter stringFromDate:_date]; + + [self assert:result equals:@"PDT PDT PDT Pacific Daylight Time -0700 -0700 -0700 GMT-07:00 GMT-07:00 PT Pacific Time PDT"]; +} + + +#pragma mark - +#pragma mark Date From string + +- (void)testDateFromStringToken +{ + [_dateFormatter setDateFormat:@""]; + var result = [_dateFormatter dateFromString:@""]; + + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"2000-01-01 00:00:00 +0000"]] equals:YES]; +} + +- (void)testDateFromStringTokeny +{ + [_dateFormatter setDateFormat:@"y"]; + var result = [_dateFormatter dateFromString:@"9"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"0009-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"yy"]; + result = [_dateFormatter dateFromString:@"49"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"2049-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"yy"]; + result = [_dateFormatter dateFromString:@"56"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"1956-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"yy"]; + result = [_dateFormatter dateFromString:@"563"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"0563-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"yyy"]; + result = [_dateFormatter dateFromString:@"563"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"0563-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"yyyy"]; + result = [_dateFormatter dateFromString:@"2012"]; + [self assert:[result isEqualToDate:[[CPDate alloc] initWithString:@"2012-01-01 08:00:00 +0000"]] equals:YES]; + + [_dateFormatter setDateFormat:@"y"]; + var result = [_dateFormatter dateFromString:@"eze"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"yy"]; + result = [_dateFormatter dateFromString:@"dezd"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"yyy"]; + result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"yyyy"]; + result = [_dateFormatter dateFromString:@"dezdezd"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenY +{ + [_dateFormatter setDateFormat:@"Y"]; + var result = [_dateFormatter dateFromString:@"9"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"0009-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"YY"]; + result = [_dateFormatter dateFromString:@"49"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2049-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"YY"]; + result = [_dateFormatter dateFromString:@"56"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"1956-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"YY"]; + result = [_dateFormatter dateFromString:@"563"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"0563-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"YYY"]; + result = [_dateFormatter dateFromString:@"563"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"0563-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"YYYY"]; + result = [_dateFormatter dateFromString:@"2012"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2012-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"Y"]; + var result = [_dateFormatter dateFromString:@"eze"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"YY"]; + result = [_dateFormatter dateFromString:@"dezd"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"YYY"]; + result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"YYYY"]; + result = [_dateFormatter dateFromString:@"dezdezd"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenq +{ + [_dateFormatter setDateFormat:@"q"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"qq"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"qqq"]; + var result = [_dateFormatter dateFromString:@"Q3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"qqqq"]; + var result = [_dateFormatter dateFromString:@"2nd quarter"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"q"]; + var result = [_dateFormatter dateFromString:@"12"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"q"]; + var result = [_dateFormatter dateFromString:@"eze"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"qq"]; + var result = [_dateFormatter dateFromString:@"12"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"qq"]; + var result = [_dateFormatter dateFromString:@"zaz"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"qqq"]; + var result = [_dateFormatter dateFromString:@"Q8"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"qqqq"]; + var result = [_dateFormatter dateFromString:@"2nd quarteer"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenQ +{ + [_dateFormatter setDateFormat:@"Q"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"QQ"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"QQQ"]; + var result = [_dateFormatter dateFromString:@"Q3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"QQQQ"]; + var result = [_dateFormatter dateFromString:@"2nd quarter"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-04-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"Q"]; + var result = [_dateFormatter dateFromString:@"12"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"Q"]; + var result = [_dateFormatter dateFromString:@"ezeze"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"QQ"]; + var result = [_dateFormatter dateFromString:@"12"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"QQ"]; + var result = [_dateFormatter dateFromString:@"zazasz"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"QQQ"]; + var result = [_dateFormatter dateFromString:@"Q6"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"QQQQ"]; + var result = [_dateFormatter dateFromString:@"2nd quarteereze"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenM +{ + [_dateFormatter setDateFormat:@"M"]; + var result = [_dateFormatter dateFromString:@"10"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-10-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"MM"]; + var result = [_dateFormatter dateFromString:@"7"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"MMM"]; + var result = [_dateFormatter dateFromString:@"Sep"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-09-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"MMMM"]; + var result = [_dateFormatter dateFromString:@"September"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-09-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"MMMMM"]; + var result = [_dateFormatter dateFromString:@"S"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"M"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"M"]; + var result = [_dateFormatter dateFromString:@"ezeze"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"MM"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"MM"]; + var result = [_dateFormatter dateFromString:@"zdazdza"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"MMM"]; + var result = [_dateFormatter dateFromString:@"Seepre"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"MMMM"]; + var result = [_dateFormatter dateFromString:@"Septembeer"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenL +{ + [_dateFormatter setDateFormat:@"L"]; + var result = [_dateFormatter dateFromString:@"10"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-10-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"LL"]; + var result = [_dateFormatter dateFromString:@"7"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"LLL"]; + var result = [_dateFormatter dateFromString:@"Sep"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-09-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"LLLL"]; + var result = [_dateFormatter dateFromString:@"September"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-09-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"LLLLL"]; + var result = [_dateFormatter dateFromString:@"S"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"L"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"L"]; + var result = [_dateFormatter dateFromString:@"dzadza"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"LL"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"LL"]; + var result = [_dateFormatter dateFromString:@"dzadza"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"LLL"]; + var result = [_dateFormatter dateFromString:@"Seepre"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"LLLL"]; + var result = [_dateFormatter dateFromString:@"Septemberezd"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenw +{ + [_dateFormatter setDateFormat:@"w"]; + var result = [_dateFormatter dateFromString:@"26"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-06-24 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"w"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"w"]; + var result = [_dateFormatter dateFromString:@"dzadza"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenW +{ + [_dateFormatter setDateFormat:@"W"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-08 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"W LL"]; + var result = [_dateFormatter dateFromString:@"2 7"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-08 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"W"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"W"]; + var result = [_dateFormatter dateFromString:@"dzadzad"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokend +{ + [_dateFormatter setDateFormat:@"d"]; + var result = [_dateFormatter dateFromString:@"6"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-06 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"dd"]; + var result = [_dateFormatter dateFromString:@"16"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-16 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"d LL"]; + var result = [_dateFormatter dateFromString:@"6 7"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-07-06 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"ddd"]; + var result = [_dateFormatter dateFromString:@"6"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-06 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"ddd"]; + var result = [_dateFormatter dateFromString:@"62"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"ddd"]; + var result = [_dateFormatter dateFromString:@"dzadza"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenD +{ + [_dateFormatter setDateFormat:@"D"]; + var result = [_dateFormatter dateFromString:@"76"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-03-16 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"D"]; + var result = [_dateFormatter dateFromString:@"1076"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"D"]; + var result = [_dateFormatter dateFromString:@"dzeezd"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenF +{ + [_dateFormatter setDateFormat:@"F"]; + var result = [_dateFormatter dateFromString:@"2"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-08 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"F"]; + var result = [_dateFormatter dateFromString:@"23"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"F"]; + var result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenE +{ + // No logic in cocoa (or I didn't get it :/) + [_dateFormatter setDateFormat:@"EEE"]; + var result = [_dateFormatter dateFromString:@"Tue"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"EEEE"]; + var result = [_dateFormatter dateFromString:@"Tuesday"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"EEEEE"]; + var result = [_dateFormatter dateFromString:@"T"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"EEE"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"EEEE"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokene +{ + // No logic in cocoa (or I didn't get it :/) + [_dateFormatter setDateFormat:@"ee"]; + var result = [_dateFormatter dateFromString:@"1"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"eee"]; + var result = [_dateFormatter dateFromString:@"Tue"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"eeee"]; + var result = [_dateFormatter dateFromString:@"Tuesday"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"eeeee"]; + var result = [_dateFormatter dateFromString:@"T"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"ee"]; + var result = [_dateFormatter dateFromString:@"frefre"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"eee"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"eeee"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenc +{ + // No logic in cocoa (or I didn't get it :/) + [_dateFormatter setDateFormat:@"cc"]; + var result = [_dateFormatter dateFromString:@"1"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"ccc"]; + var result = [_dateFormatter dateFromString:@"Tue"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"cccc"]; + var result = [_dateFormatter dateFromString:@"Tuesday"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"ccccc"]; + var result = [_dateFormatter dateFromString:@"T"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"cc"]; + var result = [_dateFormatter dateFromString:@"dezde"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"ccc"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"cccc"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokena +{ + [_dateFormatter setDateFormat:@"a"]; + var result = [_dateFormatter dateFromString:@"PM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 20:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"a"]; + var result = [_dateFormatter dateFromString:@"AM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"a"]; + var result = [_dateFormatter dateFromString:@"PdM"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenh +{ + [_dateFormatter setDateFormat:@"h"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 19:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh"]; + var result = [_dateFormatter dateFromString:@"3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh"]; + var result = [_dateFormatter dateFromString:@"0"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh a"]; + var result = [_dateFormatter dateFromString:@"3 PM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 23:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh a"]; + var result = [_dateFormatter dateFromString:@"3 AM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh"]; + var result = [_dateFormatter dateFromString:@"13"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"hh"]; + var result = [_dateFormatter dateFromString:@"edze"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenH +{ + [_dateFormatter setDateFormat:@"H"]; + var result = [_dateFormatter dateFromString:@"18"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-02 02:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"HH"]; + var result = [_dateFormatter dateFromString:@"3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"HH a"]; + var result = [_dateFormatter dateFromString:@"2 PM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 22:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"HH"]; + var result = [_dateFormatter dateFromString:@"24"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"HH"]; + var result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenK +{ + [_dateFormatter setDateFormat:@"K"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 19:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"KK"]; + var result = [_dateFormatter dateFromString:@"3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"KK"]; + var result = [_dateFormatter dateFromString:@"0"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"KK a"]; + var result = [_dateFormatter dateFromString:@"3 PM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 23:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"KK a"]; + var result = [_dateFormatter dateFromString:@"3 AM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"KK"]; + var result = [_dateFormatter dateFromString:@"13"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"KK"]; + var result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenk +{ + [_dateFormatter setDateFormat:@"k"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 19:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"kk"]; + var result = [_dateFormatter dateFromString:@"3"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 11:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"kk"]; + var result = [_dateFormatter dateFromString:@"0"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"kk a"]; + var result = [_dateFormatter dateFromString:@"3 PM"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 23:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"kk"]; + var result = [_dateFormatter dateFromString:@"13"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"kk"]; + var result = [_dateFormatter dateFromString:@"dezdezd"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenm +{ + [_dateFormatter setDateFormat:@"m"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:11:00 +0000"]]; + + [_dateFormatter setDateFormat:@"mm"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:11:00 +0000"]] + + [_dateFormatter setDateFormat:@"mm"]; + var result = [_dateFormatter dateFromString:@"61"]; + [self assert:result equals:nil] + + [_dateFormatter setDateFormat:@"mm"]; + var result = [_dateFormatter dateFromString:@"ezdezd"]; + [self assert:result equals:nil] +} + +- (void)testDateFromStringTokens +{ + [_dateFormatter setDateFormat:@"s"]; + var result = [_dateFormatter dateFromString:@"11"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:11 +0000"]]; + + [_dateFormatter setDateFormat:@"ss"]; + var result = [_dateFormatter dateFromString:@"4"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:04 +0000"]] + + [_dateFormatter setDateFormat:@"ss"]; + var result = [_dateFormatter dateFromString:@"64"]; + [self assert:result equals:nil] + + [_dateFormatter setDateFormat:@"ss"]; + var result = [_dateFormatter dateFromString:@"dezdez"]; + [self assert:result equals:nil] +} + +- (void)testDateFromStringTokenS +{ + // No logic in cocoa (or I didn't get it :/) + [_dateFormatter setDateFormat:@"SSS"]; + var result = [_dateFormatter dateFromString:@"21212"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 08:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"SSS"]; + var result = [_dateFormatter dateFromString:@"rer"]; + [self assert:result equals:nil]; +} + +- (void)testDateFromStringTokenA +{ + [_dateFormatter setDateFormat:@"AAAAAAAA"]; + var result = [_dateFormatter dateFromString:@"69540000"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-02 03:19:00 +0000"]]; + + [_dateFormatter setDateFormat:@"AAAAAAAA"]; + var result = [_dateFormatter dateFromString:@"ezde"]; + [self assert:result equals:nil]; +} + +- (void)testDataFromStringTokenz +{ + [_dateFormatter setDateFormat:@"hh zzz"]; + var result = [_dateFormatter dateFromString:@"10 PDT"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 17:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh zzzz"]; + var result = [_dateFormatter dateFromString:@"10 GMT+08:35"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 01:25:00 +0000"]]; + + [_dateFormatter setDateFormat:@"zzz"]; + var result = [_dateFormatter dateFromString:@"PezST"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"zzzz"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} + +- (void)testDataFromStringTokenZ +{ + [_dateFormatter setDateFormat:@"hh ZZZ"]; + var result = [_dateFormatter dateFromString:@"10 -0600"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 16:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh ZZZZ"]; + var result = [_dateFormatter dateFromString:@"10 GMT-05:00"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 15:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh ZZZZZ"]; + var result = [_dateFormatter dateFromString:@"10 +04:00"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 06:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"ZZZ"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"ZZZZ"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"ZZZZZ"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} +// +- (void)testDataFromStringTokenv +{ + [_dateFormatter setDateFormat:@"hh v"]; + var result = [_dateFormatter dateFromString:@"02 PT"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 10:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh vvvv"]; + var result = [_dateFormatter dateFromString:@"8 GMT-08:35"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 16:35:00 +0000"]]; + + [_dateFormatter setDateFormat:@"v"]; + var result = [_dateFormatter dateFromString:@"PezST"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"vvvv"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; + +} + +- (void)testDataFromStringTokenV +{ + [_dateFormatter setDateFormat:@"hh V"]; + var result = [_dateFormatter dateFromString:@"6 PST"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 14:00:00 +0000"]]; + + [_dateFormatter setDateFormat:@"hh VVVV"]; + var result = [_dateFormatter dateFromString:@"6 GMT+06:35"]; + [self assert:result equals:[[CPDate alloc] initWithString:@"1999-12-31 23:25:00 +0000"]]; + + [_dateFormatter setDateFormat:@"V"]; + var result = [_dateFormatter dateFromString:@"PezST"]; + [self assert:result equals:nil]; + + [_dateFormatter setDateFormat:@"VVVV"]; + var result = [_dateFormatter dateFromString:@"dehez"]; + [self assert:result equals:nil]; +} + +- (void)testGetObjectValueAcceptsNilErrorDescription +{ + var date = nil, + result = [_dateFormatter getObjectValue:@ref(date) forString:@"a" errorDescription:nil]; + + [self assertFalse:result]; + [self assertTrue:date === nil]; +} + +- (void)testGetObjectValueForEmptyStringReturnsReferenceDate +{ + [_dateFormatter setDateFormat:@"d mm"]; + + var date = nil, + error = @"", + result = [_dateFormatter getObjectValue:@ref(date) forString:@"" errorDescription:@ref(error)]; + + [self assertTrue:result]; + [self assert:[[CPDate alloc] initWithString:@"2000-01-01 00:00:00 +0000"] equals:date]; + [self assert:error equals:@""]; +} + +- (void)testGetObjectValueReturnYes +{ + [_dateFormatter setDateFormat:@"d mm"]; + + var date = nil, + error = @"", + result = [_dateFormatter getObjectValue:@ref(date) forString:@"10 12" errorDescription:@ref(error)]; + + [self assertTrue:result]; + [self assert:date equals:[[CPDate alloc] initWithString:@"2000-01-10 08:12:00 +0000"]]; + [self assert:error equals:@""]; +} + +- (void)testGetObjectValueReturnNo +{ + [_dateFormatter setDateFormat:@"d mm"]; + + var date = nil, + error = @"", + result = [_dateFormatter getObjectValue:@ref(date) forString:@"ezr 12" errorDescription:@ref(error)]; + + [self assert:result equals:NO]; + [self assert:date equals:nil]; + [self assert:error equals:@"The value \"ezr 12\" is invalid."]; +} + +@end diff --git a/Tests/Foundation/CPDictionaryTest.j b/Tests/Foundation/CPDictionaryTest.j index 78352a65a..f14dce9b0 100644 --- a/Tests/Foundation/CPDictionaryTest.j +++ b/Tests/Foundation/CPDictionaryTest.j @@ -389,7 +389,7 @@ - (void)testJSObjectDescription { - var dict = [[CPDictionary alloc] initWithObjects:[CGRectMake(1, 2, 3, 4), CGPointMake(5, 6)] forKeys:[@"key1", @"key2"]], + var dict = @{ "key1": CGRectMake(1, 2, 3, 4), "key2": CGPointMake(5, 6) }, d = [dict description]; [self assertTrue:d.indexOf("(1, 2)") !== -1 message:"Can't find '(1, 2)' in description of dictionary " + d]; @@ -399,6 +399,24 @@ [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]]; } +- (void)testWindowJSObjectDescription +{ + var dict = @{ "Key": window }; + + // 'window' is the global namespace so we should never try to fully describe it. If we do, we're likely + // to get into an infinite loop, and even if we don't it'll be huge. + [self assert:'@{\n @"Key": window\n}' equals:[dict description]]; +} + +- (void)testRecursiveJSObjectDescription +{ + var a = {}; + + a['a'] = a; + + [self assert:'@{\n @"a": {\n a: {\n a: {\n a: {\n a: {\n a: {\n a: {\n a: {\n a: {\n a: {\n a: ...\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}' equals:[@{ 'a': a } description]]; +} + - (void)testInitWithObjectsAndKeys { var dict = [[CPDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", nil, @"Key2", @"Value3", @"Key3"]; diff --git a/Tests/Foundation/CPExceptionTest.j b/Tests/Foundation/CPExceptionTest.j index 9c038223d..810dacc20 100644 --- a/Tests/Foundation/CPExceptionTest.j +++ b/Tests/Foundation/CPExceptionTest.j @@ -27,6 +27,22 @@ [self assertThrows:function(){[CPException raise:@"CPGenericException" reason:@"Margins must be positive"];}]; } +- (void)testRaise_format_ +{ + var success = NO; + try + { + [CPException raise:CPGenericException format:@"Expected %.2f for %s", 0.789, "hello"]; + } + catch (anException) + { + success = YES; + [self assert:CPGenericException equals:[anException name]]; + [self assert:@"Expected 0.79 for hello" equals:[anException reason]]; + } + [self assertTrue:success]; +} + - (void)testName { [self assert:[exception name] equals:@"CPGenericException"]; diff --git a/Tests/Foundation/CPKVOTest.j b/Tests/Foundation/CPKVOTest.j index 57ba2dd8c..0a4bccba5 100644 --- a/Tests/Foundation/CPKVOTest.j +++ b/Tests/Foundation/CPKVOTest.j @@ -833,17 +833,17 @@ return [managedObjects count]; } -- (id)objectInManagedObjectsAtIndex:(unsigned)anIndex +- (id)objectInManagedObjectsAtIndex:(CPUInteger)anIndex { return [managedObjects objectAtIndex:anIndex]; } -- (void)removeObjectFromManagedObjectsAtIndex:(unsigned)anIndex +- (void)removeObjectFromManagedObjectsAtIndex:(CPUInteger)anIndex { [managedObjects removeObjectAtIndex:anIndex]; } -- (void)insertObject:(id)anObject inManagedObjectsAtIndex:(unsigned)anIndex +- (void)insertObject:(id)anObject inManagedObjectsAtIndex:(CPUInteger)anIndex { [managedObjects insertObject:anObject atIndex:anIndex]; } diff --git a/Tests/Foundation/CPKeyValueCodingTest.j b/Tests/Foundation/CPKeyValueCodingTest.j index f750857a1..ac57d9f02 100644 --- a/Tests/Foundation/CPKeyValueCodingTest.j +++ b/Tests/Foundation/CPKeyValueCodingTest.j @@ -489,6 +489,51 @@ var accessIVARS = YES; @end +// CPValue unwrapping (AKA Wrapping and Unwrapping Structs) + +@implementation CPKeyValueCodingTest (CPValueUnwrapping) + +- (void)testIfCPValueIsUnwrapped +{ + [KVCTestClass setAccessInstanceVariablesDirectly: YES]; + + var values = @[ + [CPValue valueWithJSObject:CGPointMake(200, -100)], + [CPValue valueWithJSObject:CGSizeMake(100, 100)], + [CPValue valueWithJSObject:CGRectMake(100, 100, 50, 150)], + ]; + + for (var i = 0; i < values.length; i++) + { + var value = values[i]; + + [kvcTestObject setValue:value forKey:"privatePropertyWithoutAccessors"]; + [kvcTestObject setValue:value forKey:"publicPropertyWithoutAccessors"]; + [kvcTestObject setValue:value forKey:"privateBoolPropertyWithoutAccessors"]; + [kvcTestObject setValue:value forKey:"publicBoolPropertyWithoutAccessors"]; + [kvcTestObject setValue:value forKey:"propertyWithPublicAccessor"]; + [kvcTestObject setValue:value forKey:"propertyWithPrivateAccessor"]; + + var allKeys = ["privatePropertyWithoutAccessors","publicPropertyWithoutAccessors", + "privateBoolPropertyWithoutAccessors","publicBoolPropertyWithoutAccessors", + "propertyWithPublicAccessor", "propertyWithPrivateAccessor" + ], + dictForKeys = [kvcTestObject dictionaryWithValuesForKeys:allKeys], + key, + readBackValue, + keyEnumerator = [dictForKeys keyEnumerator]; + + while ((key = [keyEnumerator nextObject]) !== nil) + { + readBackValue = [dictForKeys objectForKey:key]; + [self assertFalse:readBackValue.isa message:"Expected to read back an unwrapped value, not " + readBackValue + "."]; + [self assert:JSON.stringify([value JSObject]) equals:JSON.stringify(readBackValue)]; + } + } +} + +@end + @implementation Employee2 : CPObject { CPString _name @accessors(property=name); diff --git a/Tests/Foundation/CPMutableArrayTest.j b/Tests/Foundation/CPMutableArrayTest.j index 30090b564..ddc2520ce 100644 --- a/Tests/Foundation/CPMutableArrayTest.j +++ b/Tests/Foundation/CPMutableArrayTest.j @@ -470,6 +470,26 @@ [self assert:[5, 4, 4, 3, 2, 2, 1, 1, 1, 1] equals:target]; } +- (void)testThatCPArrayDoesSortCorrectlyWithNilAndCPNull +{ + var descriptors = [[CPSortDescriptor sortDescriptorWithKey:@"number" ascending:NO]], + target = [ + [[CPPrettyObject alloc] initWithValue:@"a" number:nil], + [[CPPrettyObject alloc] initWithValue:@"a" number:[CPNull null]], + [[CPPrettyObject alloc] initWithValue:@"a" number:@"Objective-J"], + [[CPPrettyObject alloc] initWithValue:@"a" number:[CPNull null]], + [[CPPrettyObject alloc] initWithValue:@"a" number:nil], + ]; + + [target sortUsingDescriptors:descriptors]; + + [self assert:@"Objective-J" equals:[target[0] number]]; + [self assert:nil equals:[target[1] number]]; + [self assert:[CPNull null] equals:[target[2] number]]; + [self assert:[CPNull null] equals:[target[3] number]]; + [self assert:nil equals:[target[4] number]]; +} + - (void)testMutableCopy { var normalArray = [], diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 54338120d..81d994824 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -30,6 +30,8 @@ [self assert:@"123,456" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:123456]]]; [self assert:@"1,234,567" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:1234567]]]; + [self assert:@"1,234,567" equals:[CPNumberFormatter localizedStringFromNumber:[CPNumber numberWithInt:1234567] numberStyle:CPNumberFormatterDecimalStyle]]; + [self assert:@"-1" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-1]]]; [self assert:@"-12" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-12]]]; [self assert:@"-123" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-123]]]; @@ -38,6 +40,8 @@ [self assert:@"-123,456" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-123456]]]; [self assert:@"-1,234,567" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-1234567]]]; + [self assert:@"-1,234,567" equals:[CPNumberFormatter localizedStringFromNumber:[CPNumber numberWithInt:-1234567] numberStyle:CPNumberFormatterDecimalStyle]]; + [numberFormatter setGroupingSeparator:@" "]; [self assert:@"1" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:1]]]; [self assert:@"12" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:12]]]; @@ -247,4 +251,34 @@ [self assert:1.23456 equals:generated]; } +- (void)testEncodingDecodingWithZeroMinMaxValues +{ + var numberFormatter = [CPNumberFormatter new]; + + [numberFormatter setMaximum:0]; + [numberFormatter setMinimum:0]; + + var encoded = [CPKeyedArchiver archivedDataWithRootObject:numberFormatter], + decoded = [CPKeyedUnarchiver unarchiveObjectWithData:encoded]; + + [self assertNotNull:[decoded minimum]]; + [self assertNotNull:[decoded maximum]]; + [self assert:0 equals:[decoded minimum]]; + [self assert:0 equals:[decoded maximum]]; +} + +- (void)testEncodingDecodingWithNilMinMaxValues +{ + var numberFormatter = [CPNumberFormatter new]; + + [numberFormatter setMaximum:nil]; + [numberFormatter setMinimum:nil]; + + var encoded = [CPKeyedArchiver archivedDataWithRootObject:numberFormatter], + decoded = [CPKeyedUnarchiver unarchiveObjectWithData:encoded]; + + [self assertNull:[decoded minimum]]; + [self assertNull:[decoded maximum]]; +} + @end diff --git a/Tests/Foundation/CPNumberTest.j b/Tests/Foundation/CPNumberTest.j new file mode 100644 index 000000000..5939a2bc8 --- /dev/null +++ b/Tests/Foundation/CPNumberTest.j @@ -0,0 +1,15 @@ +@import + +@implementation CPNumberTest : OJTestCase + +- (void)testCompareWithNil +{ + [self assertThrows:function () { [34 compare:nil] }]; +} + +- (void)testCompareWithCPNull +{ + [self assertThrows:function () { [34 compare:[CPNull null]] }]; +} + +@end diff --git a/Tests/Foundation/CPObjectTest.j b/Tests/Foundation/CPObjectTest.j index 926a00238..c10293124 100644 --- a/Tests/Foundation/CPObjectTest.j +++ b/Tests/Foundation/CPObjectTest.j @@ -59,6 +59,13 @@ [self assertTrue:d.indexOf("access:") !== -1 message:"Can't find 'access:' in description of json " + d]; } +- (void)testCPObjectNotEqualToNil +{ + var anObject = [[CPObject alloc] init]; + + [self assert:anObject notEqual:nil]; +} + @end @implementation SuperReceiver : CPObject diff --git a/Tests/Foundation/CPOperationQueueTest.j b/Tests/Foundation/CPOperationQueueTest.j index c0f73d7b3..0cc5de666 100644 --- a/Tests/Foundation/CPOperationQueueTest.j +++ b/Tests/Foundation/CPOperationQueueTest.j @@ -33,7 +33,7 @@ globalResults = []; - (void)observeValueForKeyPath:(CPString)keyPath ofObject:(id)object change:(CPDictionary)change - context:(void)context + context:(id)context { [changedKeyPaths addObject:keyPath]; } diff --git a/Tests/Foundation/CPOperationTest.j b/Tests/Foundation/CPOperationTest.j index 701ef8397..1c1beef56 100644 --- a/Tests/Foundation/CPOperationTest.j +++ b/Tests/Foundation/CPOperationTest.j @@ -31,7 +31,7 @@ - (void)observeValueForKeyPath:(CPString)keyPath ofObject:(id)object change:(CPDictionary)change - context:(void)context + context:(id)context { [changedKeyPaths addObject:keyPath]; } diff --git a/Tests/Foundation/CPPredicateTest.j b/Tests/Foundation/CPPredicateTest.j index 58d6066ae..114f440e9 100644 --- a/Tests/Foundation/CPPredicateTest.j +++ b/Tests/Foundation/CPPredicateTest.j @@ -9,6 +9,7 @@ - (id)init { self = [super init]; + if (self != nil) { var d, @@ -117,18 +118,18 @@ - (void)testVariableExpressionEvaluation { -// Replace with constant + // Replace with constant var expression = [CPExpression expressionForVariable:@"variable"], bindings = [CPDictionary dictionaryWithObject:20 forKey:@"variable"], eval = [expression expressionValueWithObject:@"variable" context:bindings]; [self assertTrue:(eval == 20) message:"'" + eval + "' should be 20"]; -// Replace with constant expression + // Replace with constant expression bindings = [CPDictionary dictionaryWithObject:[CPExpression expressionForConstantValue:10] forKey:@"variable"]; eval = [expression expressionValueWithObject:nil context:bindings]; [self assertTrue:(eval == 10) message:"'" + eval + "' should be 10"]; -// Replace with keypath expression + // Replace with keypath expression bindings = [CPDictionary dictionaryWithObject:[CPExpression expressionForKeyPath:@"Record1.Age"] forKey:@"variable"]; eval = [expression expressionValueWithObject:dict context:bindings]; [self assertTrue:(eval == 34) message:"'" + eval + "' should be 34"]; @@ -213,7 +214,7 @@ - (void)testNilComparisons { -// Custom Selector Predicate + // Custom Selector Predicate var pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForKeyPath:@"Record1.Name"] rightExpression:[CPExpression expressionForConstantValue:nil] customSelector:@selector(yes:)]; [self assertTrue:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be true"]; @@ -226,7 +227,7 @@ [self assertFalse:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be false"]; -// Predicates with operators + // Predicates with operators pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForKeyPath:@"Record1.Age"] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPGreaterThanPredicateOperatorType options:0]; [self assertFalse:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be false"]; @@ -243,7 +244,7 @@ - (void)testPredicateParsing { var predicate; -// TEST String + // TEST String predicate = [CPPredicate predicateWithFormat: @"%K == %@", @"Record1.Name", @"John"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; @@ -256,14 +257,14 @@ predicate = [CPPredicate predicateWithFormat: @"(%K == %@) AND (%K == %@)", @"Record1.Name", @"John", @"Record2.Name", @"Mary"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// TEST integer + // TEST integer predicate = [CPPredicate predicateWithFormat: @"%K == %d", @"Record1.Age", 34]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; predicate = [CPPredicate predicateWithFormat: @"%K < %d", @"Record1.Age", 40]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; - predicate = [CPPredicate predicateWithFormat: @"%K BETWEEN %@", @"Record1.Age", [CPArray arrayWithObjects:[CPNumber numberWithInt:20], [CPNumber numberWithInt:40]]]; + predicate = [CPPredicate predicateWithFormat: @"%K BETWEEN %@", @"Record1.Age", @[20, 40]]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; predicate = [CPPredicate predicateWithFormat: @"Record1.Age BETWEEN {%f,%f}", 20, 40]; @@ -272,14 +273,14 @@ predicate = [CPPredicate predicateWithFormat: @"(%K == %d) OR (%K == %d)", @"Record1.Age", 34, @"Record2.Age", 34]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// TEST float + // TEST float predicate = [CPPredicate predicateWithFormat: @"%K < %f", @"Record1.Age", 40.5]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; predicate = [CPPredicate predicateWithFormat: @"%f > %K", 40.5, @"Record1.Age"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// TEST KeyPath + // TEST KeyPath predicate = [CPPredicate predicateWithFormat: @"%@ IN %K", @"Kid1", @"Record1.Children"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; @@ -289,11 +290,11 @@ predicate = [CPPredicate predicateWithFormat: @"ANY %K == %@", @"Record2.Children", @"Girl1"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// Test Aggregate + // Test Aggregate predicate = [CPPredicate predicateWithFormat:@"{Record1.Name, Record1.Age} = {'John',34}"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// Test Symbolic token + // Test Symbolic token predicate = [CPPredicate predicateWithFormat:@"Record1.Children[ FIRST ] = 'Kid1'"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; @@ -303,7 +304,7 @@ predicate = [CPPredicate predicateWithFormat:@"Record1.Children[count:(Record1.Children) - 1] = 'Kid2'"]; [self assertTrue:[predicate evaluateWithObject:dict] message:[predicate description] + " should be true"]; -// Test arithm + // Test arithm var n = 2; predicate = [CPPredicate predicateWithFormat:@"SELF +1 = 3"]; [self assertTrue:[predicate evaluateWithObject:n] message:[predicate description] + " should be true"]; @@ -323,22 +324,22 @@ predicate = [CPPredicate predicateWithFormat:@"SELF** 3 = 8"]; [self assertTrue:[predicate evaluateWithObject:n] message:[predicate description] + " should be true"]; -// TEST Operator type + // TEST Operator type predicate = [CPPredicate predicateWithFormat: @"a CONTAINS[c] \"b\""]; [self assertTrue:([predicate predicateOperatorType] == CPContainsPredicateOperatorType) message:[predicate description] + " operator should be a CPContainsPredicateOperatorType"]; predicate = [CPPredicate predicateWithFormat: @"a BETWEEN {%f,%f}", 20, 40]; [self assertTrue:([predicate predicateOperatorType] == CPBetweenPredicateOperatorType) message:[predicate description] + " operator should be a CPBetweenPredicateOperatorType"]; -// TEST Empty string + // TEST Empty string predicate = [CPPredicate predicateWithFormat: @"a CONTAINS \"\""]; [self assertNotNull:predicate message:[predicate description] + " should not be nil"]; -// TEST variable + // TEST variable predicate = [CPPredicate predicateWithFormat: @"$x CONTAINS \"\""]; [self assertTrue:[[predicate leftExpression] expressionType] == CPVariableExpressionType message:"Left Expression should be a CPVariableExpressionType"]; -// TEST variable inside keypath + // TEST variable inside keypath predicate = [CPPredicate predicateWithFormat: @"Record1.$age = 34"]; var bindings = [CPDictionary dictionaryWithObject:@"Age" forKey:@"age"]; [self assertTrue:[predicate evaluateWithObject:dict substitutionVariables:bindings] message:"Predicate " + predicate + " should evaluate to TRUE"]; @@ -350,14 +351,14 @@ predicate = [CPPredicate predicateWithFormat: @"$record.$age = 34"]; [self assertTrue:[predicate evaluateWithObject:dict substitutionVariables:bindings] message:"Predicate " + predicate + " should evaluate to TRUE"]; -// TEST built-in functions + // TEST built-in functions predicate = [CPPredicate predicateWithFormat: @"sum:(1,1) = 2"]; [self assertTrue:[predicate evaluateWithObject:nil] message:"Predicate " + predicate + " should evaluate to TRUE"]; predicate = [CPPredicate predicateWithFormat: @"multiply:by:(5,3) = 15"]; [self assertTrue:[predicate evaluateWithObject:nil] message:"Predicate " + predicate + " should evaluate to TRUE"]; -// TEST custom functions + // TEST custom functions predicate = [CPPredicate predicateWithFormat:@"FUNCTION('a/path', 'lastPathComponent') = 'path'"]; [self assertTrue:[predicate evaluateWithObject:nil] message:"Predicate " + predicate + " should evaluate to TRUE"]; @@ -367,13 +368,13 @@ predicate = [CPPredicate predicateWithFormat:@"FUNCTION('toto', 'stringByReplacingOccurrencesOfString:withString:', 'o', 'a') == 'tata'"]; [self assertTrue:[predicate evaluateWithObject:nil] message:"Predicate " + predicate + " should be TRUE"]; -// TEST Subquery -- This means: search people who have 2 boys. + // TEST Subquery -- This means: search people who have 2 boys. predicate = [CPPredicate predicateWithFormat: @"SUBQUERY(Record1.Children, $x, $x BEGINSWITH 'Kid')[SIZE] = 2"]; [self assertTrue:[predicate evaluateWithObject:dict] message:"Predicate " + predicate + " should evaluate to TRUE"]; -// Test Set expressions -// Parsing is ok but the evaluation of this predicate will return NO because: -// - lhs will evaluate to a CPSet and rhs to a CPArray (aggregate exp). Comparing sets against arrays will always fail in CPComparisonPredicate. This is also cocoa behavior but i guess it's for historical reasons (set expressions are 10.5+) and should be changed in capp in my opinion. + // Test Set expressions + // Parsing is ok but the evaluation of this predicate will return NO because: + // - lhs will evaluate to a CPSet and rhs to a CPArray (aggregate exp). Comparing sets against arrays will always fail in CPComparisonPredicate. This is also cocoa behavior but i guess it's for historical reasons (set expressions are 10.5+) and should be changed in capp in my opinion. var object = [CPDictionary dictionaryWithObject:[CPSet setWithObjects:@"a"] forKey:"a"], result = [CPSet setWithObjects:@"a",@"b"]; @@ -400,8 +401,8 @@ exp2 = [CPExpression expressionForVariable:"toto"]; [self assert:exp1 equals:exp2]; - var left = [CPExpression expressionForConstantValue:[CPSet setWithObjects:@"a",@"b",@"c"]], - right = [CPExpression expressionForConstantValue:[CPArray arrayWithObjects:@"a",@"b",@"d"]]; + var left = [CPExpression expressionForConstantValue:[CPSet setWithObjects:@"a", @"b", @"c"]], + right = [CPExpression expressionForConstantValue:[CPArray arrayWithObjects:@"a", @"b", @"d"]]; exp1 = [CPExpression expressionForIntersectSet:left with:right]; exp2 = [CPExpression expressionForIntersectSet:[left copy] with:[right copy]]; @@ -440,6 +441,64 @@ [self assert:pred1 equals:pred2]; } +- (void)testExpressionAndPredicateIsNotEqualToNil +{ + var cexp1 = [CPExpression expressionForConstantValue:2], + cexp2 = [CPExpression expressionForConstantValue:2]; + [self assert:cexp1 notEqual:nil]; + + var exp1 = [CPExpression expressionForKeyPath:"path"]; + + [self assert:exp1 notEqual:nil]; + + exp1 = [CPExpression expressionForEvaluatedObject]; + + [self assert:exp1 notEqual:nil]; + + exp1 = [CPExpression expressionForVariable:"toto"]; + + [self assert:exp1 notEqual:nil]; + + var left = [CPExpression expressionForConstantValue:[CPSet setWithObjects:@"a",@"b",@"c"]], + right = [CPExpression expressionForConstantValue:[CPArray arrayWithObjects:@"a",@"b",@"d"]]; + + exp1 = [CPExpression expressionForIntersectSet:left with:right]; + + [self assert:exp1 notEqual:nil]; + + exp1 = [CPExpression expressionForFunction:cexp1 selectorName:@"isEqual:" arguments:[CPArray arrayWithObjects:cexp2]]; + + [self assert:exp1 notEqual:nil]; + + var aexp1 = [CPExpression expressionForAggregate:[CPArray arrayWithObjects:cexp1,cexp2]]; + + [self assert:aexp1 notEqual:nil]; + + exp1 = [CPExpression expressionForSubquery:right usingIteratorVariable:@"self" predicate:[CPPredicate predicateWithValue:YES]]; + + [self assert:exp1 notEqual:nil]; + + var pred1 = [CPPredicate predicateWithFormat:@"FUNCTION('toto', 'stringByReplacingOccurrencesOfString:withString:', 'o', 'a') == 'tata'"]; + + [self assert:pred1 notEqual:nil]; + + pred1 = [CPPredicate predicateWithFormat:@"$record.$age = 34"]; + + [self assert:pred1 notEqual:nil]; + + pred1 = [CPPredicate predicateWithFormat:@"SUBQUERY(Record1.Children, $x, $x BEGINSWITH 'Kid')[SIZE] = 2"]; + + [self assert:pred1 notEqual:nil]; + + pred1 = [CPPredicate predicateWithFormat:@"$x CONTAINS 'a'"]; + + [self assert:pred1 notEqual:nil]; + + pred1 = [CPPredicate predicateWithFormat:@"a = 'a' AND b = 'b'"]; + + [self assert:pred1 notEqual:nil]; +} + - (void)testProxyArrayFiltering { var proxyArray = [self mutableArrayValueForKey:@"simpleArray"], @@ -455,8 +514,8 @@ var data = [1, 2, 3], result; - var tpred = [CPPredicate predicateWithFormat:@"TRUEPREDICATE"]; - var ctpred = [CPCompoundPredicate andPredicateWithSubpredicates:[tpred]]; + var tpred = [CPPredicate predicateWithFormat:@"TRUEPREDICATE"], + ctpred = [CPCompoundPredicate andPredicateWithSubpredicates:[tpred]]; // fails if evaluateWithObject: isn't implemented in CPPredicate_BOOL result = [tpred evaluateWithObject:"gazonk"]; diff --git a/Tests/Foundation/CPStringTest.j b/Tests/Foundation/CPStringTest.j index e3d7a44ce..3bc97c334 100644 --- a/Tests/Foundation/CPStringTest.j +++ b/Tests/Foundation/CPStringTest.j @@ -566,4 +566,10 @@ [self assert:"This is a test none" equals:[noneString stringByTrimmingCharactersInSet:set]]; } +- (void)testCompareWithNil +{ + [self assert:CPOrderedDescending equals:[@"Objective-J" compare:nil]]; + [self assertThrows:function () { [@"Objective-J" compare:[CPNull null]] }]; +} + @end diff --git a/Tests/Foundation/CPTimeZoneTest.j b/Tests/Foundation/CPTimeZoneTest.j new file mode 100644 index 000000000..9ba2b1e1c --- /dev/null +++ b/Tests/Foundation/CPTimeZoneTest.j @@ -0,0 +1,298 @@ +/* CPTimeZoneTest.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 +@import + +@implementation CPTimeZoneTest : OJTestCase +{ + CPLocale _locale; + CPData _data; + CPDate _date; +} + +- (void)setUp +{ + _locale = [[CPLocale alloc] initWithLocaleIdentifier:@"en_US"]; + _data = [CPData dataWithRawString:@"Data with string"]; + _date = [[CPDate alloc] initWithString:@"2011-10-05 16:34:38 +0900"]; +} + +- (void)tearDown +{ + +} + +- (void)testTimeZoneWithAbbreviation +{ + var timeZone = [CPTimeZone timeZoneWithAbbreviation:@"PDT"]; + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testTimeZoneWithWrongAbbreviation +{ + var timeZone = [CPTimeZone timeZoneWithAbbreviation:@"PDTezdez"]; + [self assert:timeZone equals:nil]; +} + +- (void)testTimeZoneWithName +{ + var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles"]; + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testTimeZoneWithWrongName +{ + var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angelesezdez"]; + [self assert:timeZone equals:nil]; +} + +- (void)testexceptionTimeZoneWithNilNameWithData +{ + try + { + var timeZone = [CPTimeZone timeZoneWithName:nil]; + [self fail:"Invalid value provided for tzName"]; + } + catch (e) + { + + } +} + +- (void)testTimeZoneWithNameWithData +{ + var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles" data:_data]; + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone data] equals:_data]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testTimeZoneWithWrongNameWithData +{ + var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angelesezdez" data:_data]; + [self assert:timeZone equals:nil]; +} + +- (void)testexceptionTimeZoneWithNilNameWithData +{ + try + { + var timeZone = [CPTimeZone timeZoneWithName:nil data:_data]; + [self fail:"Invalid value provided for tzName"]; + } + catch (e) + { + + } +} + +- (void)testTimeZoneWithSecondsFromGMT +{ + var timeZone = [CPTimeZone timeZoneForSecondsFromGMT:(-600 * 60)]; + [self assert:[timeZone name] equals:@"Pacific/Honolulu"]; + [self assert:[timeZone abbreviation] equals:@"HST"]; + [self assert:[timeZone secondsFromGMT] equals:(-600 * 60)]; + [self assert:[timeZone description] equals:@"Pacific/Honolulu (HST) offset -36000"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Hawaii-Aleutian Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"HST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Hawaii-Aleutian Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"HDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Hawaii-Aleutian Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"HST"]; +} + +- (void)testTimeZoneWithWrongSecondsFromGMT +{ + var timeZone = [CPTimeZone timeZoneForSecondsFromGMT:(-421 * 60)]; + [self assert:timeZone equals:nil]; +} + +- (void)testInitTimeZoneWithName +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testInitTimeZoneWithWrongName +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angelesezdez"]; + [self assert:timeZone equals:nil]; +} + +- (void)testexceptionInitTimeZoneWithNilName +{ + try + { + var timeZone = [[CPTimeZone alloc] initWithName:nil]; + [self fail:"Invalid value provided for tzName"]; + } + catch (e) + { + + } +} + +- (void)testInitTimeZoneWithNameWithData +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles" data:_data]; + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone data] equals:_data]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testInitTimeZoneWithWrongNameWithData +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angelesezdez" data:_data]; + [self assert:timeZone equals:nil]; +} + +- (void)testexceptionInitTimeZoneWithNilNameWithData +{ + try + { + var timeZone = [[CPTimeZone alloc] initWithName:nil data:_data]; + [self fail:"Invalid value provided for tzName"]; + } + catch (e) + { + + } +} + +- (void)testAbbreviationWithDate +{ + var timeZone = [CPTimeZone localTimeZone], + abbreviation = [timeZone abbreviationForDate:_date]; + + [self assert:abbreviation equals:String(String(_date).split("(")[1]).split(")")[0]]; +} + +- (void)testAbbreviationWithNilDate +{ + var timeZone = [CPTimeZone localTimeZone], + abbreviation = [timeZone abbreviationForDate:nil]; + + [self assert:abbreviation equals:nil]; +} + + +- (void)testSecondsFromGMTForDate +{ + var timeZone = [CPTimeZone localTimeZone], + seconds = [timeZone secondsFromGMTForDate:_date]; + + [self assert:seconds equals:(_date.getTimezoneOffset() * -60)]; +} + +- (void)testSecondsFromGMTForDateWithNilDate +{ + var timeZone = [CPTimeZone localTimeZone], + seconds = [timeZone secondsFromGMTForDate:nil]; + + [self assert:seconds equals:nil]; +} + +- (void)testSecondsFromGMT +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; +} + +- (void)testDescription +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; +} + +- (void)testLocalizedName +{ + var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale] equals:@"PDT"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale] equals:@"Pacific Time"]; + [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale] equals:@"PT"]; +} + +- (void)testEqualTrueToTimeZone +{ + var timeZone1 = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"], + timeZone2 = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; + + [self assert:[timeZone1 isEqualToTimeZone:timeZone2] equals:YES]; +} + +- (void)testEqualFalseToTimeZone +{ + var timeZone1 = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"], + timeZone2 = [[CPTimeZone alloc] initWithName:@"Pacific/Honolulu"]; + + [self assert:[timeZone1 isEqualToTimeZone:timeZone2] equals:NO]; +} + +@end diff --git a/Tests/Foundation/CPURLTest.j b/Tests/Foundation/CPURLTest.j index db606fab0..4a52efd2d 100644 --- a/Tests/Foundation/CPURLTest.j +++ b/Tests/Foundation/CPURLTest.j @@ -103,6 +103,16 @@ var exampleProtocol = "http", [self assert:[url lastPathComponent] equals:examplePathRelative]; } +- (void)testUrlWithDoubleSlashRelativeToHttpUrl +{ + [self assert:"http://example2.com/b/a.html" equals:[[CPURL URLWithString:@"//example2.com/b/a.html" relativeToURL:[CPURL URLWithString:@"http://www.example.com/test/"]] absoluteString]]; +} + +- (void)testUrlWithDoubleSlashRelativeToHttpsUrl +{ + [self assert:"https://example2.com/b/a.html" equals:[[CPURL URLWithString:@"//example2.com/b/a.html" relativeToURL:[CPURL URLWithString:@"https://www.example.com/test/"]] absoluteString]]; +} + - (void)testDeleteComponent { var url = [CPURL URLWithString:exampleFullPath]; diff --git a/Tests/Manual/ArrayController1/AppController.j b/Tests/Manual/ArrayController1/AppController.j index 056641151..78161119e 100644 --- a/Tests/Manual/ArrayController1/AppController.j +++ b/Tests/Manual/ArrayController1/AppController.j @@ -75,13 +75,13 @@ CPLogRegister(CPLogConsole); return [itemsArray count]; } -- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row +- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { return "foo"; } */ -- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex { return YES; } @@ -134,22 +134,22 @@ CPLogRegister(CPLogConsole); return [itemsArray count]; } -- (id)objectInItemsArrayAtIndex:(unsigned int)index +- (id)objectInItemsArrayAtIndex:(CPUInteger)index { return [itemsArray objectAtIndex:index]; } -- (void)insertObject:(id)anObject inItemsArrayAtIndex:(unsigned int)index +- (void)insertObject:(id)anObject inItemsArrayAtIndex:(CPUInteger)index { [itemsArray insertObject:anObject atIndex:index]; } -- (void)removeObjectFromItemsArrayAtIndex:(unsigned int)index +- (void)removeObjectFromItemsArrayAtIndex:(CPUInteger)index { [itemsArray removeObjectAtIndex:index]; } -- (void)replaceObjectInItemsArrayAtIndex:(unsigned int)index withObject:(id)anObject +- (void)replaceObjectInItemsArrayAtIndex:(CPUInteger)index withObject:(id)anObject { [itemsArray replaceObjectAtIndex:index withObject:anObject]; } diff --git a/Tests/Manual/AttachedSheet/AppController.j b/Tests/Manual/AttachedSheet/AppController.j index 4b48a33cb..b91f6c2b2 100644 --- a/Tests/Manual/AttachedSheet/AppController.j +++ b/Tests/Manual/AttachedSheet/AppController.j @@ -12,6 +12,7 @@ { CPWindow wind; CPWindow sheet; + CPWindow secondSheet; CPTextField textField; } @@ -21,10 +22,19 @@ [wind setMinSize:CGSizeMake(300, 200)]; [wind setTitle:@"Untitled"]; - sheet = [[CPWindow alloc] initWithContentRect:CGRectMake(0, 0, 300, 100) styleMask:CPDocModalWindowMask | CPResizableWindowMask]; + sheet = [[CPWindow alloc] initWithContentRect:CGRectMake(50, 50, 300, 100) styleMask:CPTitledWindowMask | CPResizableWindowMask]; [sheet setMinSize:CGSizeMake(300, 100)]; [sheet setMaxSize:CGSizeMake(600, 300)]; + secondSheet = [[CPWindow alloc] initWithContentRect:CGRectMake(50, 50, 300, 50) styleMask:CPTitledWindowMask | CPResizableWindowMask]; + [secondSheet setMinSize:CGSizeMake(300, 100)]; + [secondSheet setMaxSize:CGSizeMake(600, 300)]; + + toolbar = [CPToolbar new]; + [toolbar setDisplayMode:CPToolbarDisplayModeIconAndLabel] + [toolbar setDelegate:self]; + [secondSheet setToolbar:toolbar]; + var sheetContent = [sheet contentView]; textField = [[CPTextField alloc] initWithFrame:CGRectMake(10, 30, 280, 30)]; @@ -51,19 +61,50 @@ [sheetContent addSubview:okButton]; [sheetContent addSubview:cancelButton]; + var secondSheetContent = [secondSheet contentView]; + + var okButton2 = [[CPButton alloc] initWithFrame:CGRectMake(180, 25, 50, buttonHeight)]; + [okButton2 setTitle:"OK"]; + [okButton2 setTarget:self]; + [okButton2 setTag:1]; + [okButton2 setAction:@selector(closeSecondSheet:)]; + [okButton2 setAutoresizingMask:CPViewMinXMargin | CPViewMinYMargin]; + + var cancelButton2 = [[CPButton alloc] initWithFrame:CGRectMake(70, 25, 100, buttonHeight)]; + [cancelButton2 setTitle:"Cancel"]; + [cancelButton2 setTarget:self]; + [cancelButton2 setTag:0]; + [cancelButton2 setAction:@selector(closeSecondSheet:)]; + [cancelButton2 setAutoresizingMask:CPViewMinXMargin | CPViewMinYMargin]; + + [secondSheetContent addSubview:okButton2]; + [secondSheetContent addSubview:cancelButton2]; + var displayButton = [[CPButton alloc] initWithFrame:CGRectMake(200, 150, 100, buttonHeight)]; [displayButton setTitle:"Display Sheet"]; [displayButton setTarget:self]; [displayButton setAction:@selector(displaySheet:)]; [[wind contentView] addSubview:displayButton]; + var displayButton = [[CPButton alloc] initWithFrame:CGRectMake(160, 180, 180, buttonHeight)]; + [displayButton setTitle:"Display Sheet with toolbar"]; + [displayButton setTarget:self]; + [displayButton setAction:@selector(displaySheetWithToolBar:)]; + [[wind contentView] addSubview:displayButton]; + [wind orderFront:self] } +- (void)displaySheetWithToolBar:(id)sender +{ + [CPApp beginSheet:secondSheet modalForWindow:wind modalDelegate:self didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) contextInfo:nil]; +} + - (void)displaySheet:(id)sender { [textField setStringValue:""]; [sheet makeFirstResponder:textField]; + [sheet setToolbar:nil]; [CPApp beginSheet:sheet modalForWindow:wind modalDelegate:self didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) contextInfo:nil]; } @@ -73,14 +114,46 @@ [CPApp endSheet:sheet returnCode:[sender tag]]; } +- (void)closeSecondSheet:(id)sender +{ + [CPApp endSheet:secondSheet returnCode:0]; +} + - (void)didEndSheet:(CPWindow)aSheet returnCode:(int)returnCode contextInfo:(id)contextInfo { var str = [textField stringValue]; - [sheet orderOut:self]; + [aSheet orderOut:self]; if (returnCode == CPOKButton && [str length] > 0) [wind setTitle:str]; } +- (CPArray)toolbarDefaultItemIdentifiers:(CPToolbar)toolbar +{ + return ["item1", "item2"]; +} + +- (CPArray)toolbarAllowedItemIdentifiers:(CPToolbar)toolbar +{ + return ["item1", "item2"]; +} + +- (CPToolbarItem)toolbar:(CPToolbar)toolbar itemForItemIdentifier:(CPString)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag +{ + var toolbarItem = [[CPToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + if (itemIdentifier == "item1") + { + [toolbarItem setLabel:@"Color"]; + [toolbarItem setImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:@"CPImageNameColorPanel.png"] size:CGSizeMake(26, 29)]]; + return toolbarItem; + } + else if (itemIdentifier == "item2") + { + [toolbarItem setLabel:@"Small New"]; + [toolbarItem setImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:@"New.png"] size:CGSizeMake(16, 16)]]; + return toolbarItem; + } +} + @end diff --git a/Tests/Manual/AttachedSheet/Resources/CPImageNameColorPanel.png b/Tests/Manual/AttachedSheet/Resources/CPImageNameColorPanel.png new file mode 100644 index 000000000..a18918665 Binary files /dev/null and b/Tests/Manual/AttachedSheet/Resources/CPImageNameColorPanel.png differ diff --git a/Tests/Manual/AttachedSheet/Resources/New.png b/Tests/Manual/AttachedSheet/Resources/New.png new file mode 100644 index 000000000..2ca371152 Binary files /dev/null and b/Tests/Manual/AttachedSheet/Resources/New.png differ diff --git a/Tests/Manual/AttachedSheet2/SheetWindowController.j b/Tests/Manual/AttachedSheet2/SheetWindowController.j index ea4631af0..096beec68 100644 --- a/Tests/Manual/AttachedSheet2/SheetWindowController.j +++ b/Tests/Manual/AttachedSheet2/SheetWindowController.j @@ -259,6 +259,23 @@ [self disableUnlinkedButtons]; [self showWindow:self]; + + // This code exposes the bug described in issue #1911 by adding a CPPanel child window at a different window + // level than the parent window and then immediately closing it. To test, click the Window button. If a + // crash ensues the #1911 fix is not operating. On the other hand if the panel widnow is never seen and + // the window opens like normal everything is correct. + var windows = [CPApp windows]; + + if ([windows count] >= 2) + { + var w = [[CPPanel alloc] initWithContentRect:CGRectMake(100, 100, 100, 100) + styleMask:CPTitledWindowMask | CPClosableWindowMask | CPResizableWindowMask | CPHUDBackgroundWindowMask]; + [w setLevel:CPFloatingWindowLevel]; + [[windows objectAtIndex:0] addChildWindow:w ordered:CPWindowAbove]; + [[windows objectAtIndex:0] makeKeyAndOrderFront:nil]; + [w orderOut:nil]; + [[self window] makeKeyAndOrderFront:nil]; + } } // diff --git a/Tests/Manual/CGCanvasContext/AppController.j b/Tests/Manual/CGCanvasContext/AppController.j index 10ff70de2..c65005a7c 100644 --- a/Tests/Manual/CGCanvasContext/AppController.j +++ b/Tests/Manual/CGCanvasContext/AppController.j @@ -17,14 +17,15 @@ { [super drawRect:aRect]; - var points = [CPArray array]; - var minX = CGRectGetMinX(aRect); - var midX = CGRectGetMidX(aRect); - var maxX = CGRectGetMaxX(aRect); - var minY = CGRectGetMinY(aRect); - var midY = CGRectGetMidY(aRect); - var maxY = CGRectGetMaxY(aRect); - var quarterX = minX + (maxX - minX)/4; + var points = [CPArray array], + minX = CGRectGetMinX(aRect), + midX = CGRectGetMidX(aRect), + maxX = CGRectGetMaxX(aRect), + minY = CGRectGetMinY(aRect), + midY = CGRectGetMidY(aRect), + maxY = CGRectGetMaxY(aRect), + quarterX = minX + (maxX - minX)/4; + [points addObject:CGPointMake(midX, minY)]; [points addObject:CGPointMake(maxX, midY)]; [points addObject:CGPointMake(midX, maxY)]; diff --git a/Tests/Manual/CGPath/AppController.j b/Tests/Manual/CGPath/AppController.j new file mode 100644 index 000000000..dc160002d --- /dev/null +++ b/Tests/Manual/CGPath/AppController.j @@ -0,0 +1,127 @@ +/* + * AppController.j + * CGPath + * + * Created by Alexandre Wilhelm on May 23, 2013. + * Copyright 2013, Alexandre Wilhelm. All rights reserved. + */ + +@import +@import + +@implementation AppController : CPObject +{ +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView]; + + var pathView = [[PathView alloc] initWithFrame:CGRectMake(0.0, 0.0, 500.0, 500.0)]; + [contentView addSubview:pathView]; + + var pathMouseOverView = [[PathMouseOverView alloc] initWithFrame:CGRectMake(500.0, 0.0, 500.0, 500.0)]; + [contentView addSubview:pathMouseOverView]; + + [theWindow orderFront:self]; +} + +@end + +@implementation PathMouseOverView : CPView +{ + id path1; + id path2; + id path3; +} + +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + var context = [[CPGraphicsContext currentContext] graphicsPort]; + + CGContextBeginPath(context); + path1 = CGPathCreateMutable(); + CGPathMoveToPoint(path1, nil, 100, 100); + CGPathAddLineToPoint(path1, nil, 150, 50); + CGPathAddLineToPoint(path1, nil, 200, 100); + CGContextAddPath(context, path1); + CGContextClosePath(context); + CGContextStrokePath(context); + + CGContextBeginPath(context); + path2 = CGPathCreateMutable(); + CGPathAddRect(path2, nil, CGRectMake(250, 50, 100, 100)); + CGContextAddPath(context, path2); + CGContextClosePath(context); + CGContextStrokePath(context); + + CGContextBeginPath(context); + path3 = CGPathWithEllipseInRect(CGRectMake(100, 150, 100, 100)) + CGContextAddPath(context, path3); + CGContextClosePath(context); + CGContextStrokePath(context); +} + +- (void)mouseMoved:(CPEvent)anEvent +{ + var location = [self convertPointFromBase:[anEvent locationInWindow]], + context = CGBitmapGraphicsContextCreate(); + + if (CGPathContainsPoint(path1, nil, location, nil)) + console.log("Mouse is in the triangle"); + + if (CGPathContainsPoint(path2, nil, location, nil)) + console.log("Mouse is in rectangle"); + + if (CGPathContainsPoint(path3, nil, location, nil)) + console.log("Mouse is in the circle"); +} + +@end + + + +@implementation PathView : CPView + +- (void)drawRect:(CGRect)aRect +{ + [super drawRect:aRect]; + + var context = [[CPGraphicsContext currentContext] graphicsPort]; + + // Test to create a pie chart + CGContextBeginPath(context); + var path = CGPathCreateMutable(); + CGPathMoveToPoint(path, nil, 100, 100); + CGPathAddArc(path, nil, 100, 100, 70, 0, 2.615500255957057, YES); + CGPathAddLineToPoint(path, nil, 100, 100); + CGPathAddArc(path, nil, 100, 100, 70, 2.615500255957057, 6.148960361810042, YES); + CGPathAddLineToPoint(path, nil, 100, 100); + CGPathAddArc(path, nil, 100, 100, 70, 6.148960361810042, 0, YES); + CGPathAddLineToPoint(path, nil, 100, 100); + CGContextAddPath(context, path); + CGContextStrokePath(context); + CGContextClosePath(context); + + // Test to create an arc without a start point + CGContextBeginPath(context); + path = CGPathCreateMutable(); + CGPathAddArc(path, nil, 300, 100, 70, 0, 2.615500255957057, YES); + CGContextAddPath(context, path); + CGContextStrokePath(context); + CGContextClosePath(context); + + // Test to create an arc with a start point + CGContextBeginPath(context); + path = CGPathCreateMutable(); + CGPathMoveToPoint(path, nil, 100, 250); + CGPathAddArc(path, nil, 100, 300, 70, 0, 2.615500255957057, YES); + CGContextAddPath(context, path); + CGContextStrokePath(context); + CGContextClosePath(context); +} + +@end diff --git a/Tests/Manual/CGPath/Info.plist b/Tests/Manual/CGPath/Info.plist new file mode 100644 index 000000000..48b1a0402 --- /dev/null +++ b/Tests/Manual/CGPath/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + CGPath + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CGPath/Jakefile b/Tests/Manual/CGPath/Jakefile new file mode 100644 index 000000000..6d194c99d --- /dev/null +++ b/Tests/Manual/CGPath/Jakefile @@ -0,0 +1,98 @@ +/* + * Jakefile + * CGPath + * + * Created by You on May 23, 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 ("CGPath", function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CGPath.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CGPath"); + task.setIdentifier("com.yourcompany.CGPath"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CGPath"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CGPath"], 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", "CGPath", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CGPath", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CGPath")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CGPath"), FILE.join("Build", "Deployment", "CGPath")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CGPath")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CGPath"), FILE.join("Build", "Desktop", "CGPath", "CGPath.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CGPath", "CGPath.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CGPath")); + print("----------------------------"); +} diff --git a/Tools/capp/Resources/Templates/Application/Resources/spinner.gif b/Tests/Manual/CGPath/Resources/spinner.gif similarity index 100% rename from Tools/capp/Resources/Templates/Application/Resources/spinner.gif rename to Tests/Manual/CGPath/Resources/spinner.gif diff --git a/Tests/Manual/CGPath/index-debug.html b/Tests/Manual/CGPath/index-debug.html new file mode 100644 index 000000000..80c7219c9 --- /dev/null +++ b/Tests/Manual/CGPath/index-debug.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + CGPath + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CGPath/index.html b/Tests/Manual/CGPath/index.html new file mode 100644 index 000000000..1fa069702 --- /dev/null +++ b/Tests/Manual/CGPath/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + CGPath + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/CGPath/main.j b/Tests/Manual/CGPath/main.j new file mode 100644 index 000000000..a7bb6a144 --- /dev/null +++ b/Tests/Manual/CGPath/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CGPath + * + * Created by You on May 23, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CPAlertTest/AppController.j b/Tests/Manual/CPAlertTest/AppController.j index a0d1d97a0..bb91b42b3 100644 --- a/Tests/Manual/CPAlertTest/AppController.j +++ b/Tests/Manual/CPAlertTest/AppController.j @@ -16,9 +16,10 @@ CPArray variations; CPArray messages; int messageIndex; + BOOL useBlocks; } -- (void)applicationDidFinishLaunching:(CPNotification)aNotification +- (void)_init { messages = [ [@"Are you sure you want to theorise before you have data?", @@ -30,6 +31,7 @@ [@"Sometimes a message can be really long and just appear to go on and on. It could be a speech. It could be the television.", nil] ]; + messageIndex = 0; variations = [ @@ -43,6 +45,11 @@ [CPDocModalWindowMask, CPInformationalAlertStyle], [CPDocModalWindowMask, CPCriticalAlertStyle] ]; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + [self _init]; theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(100, 100, 500, 500) styleMask:CPTitledWindowMask]; [theWindow setTitle:@"CPAlert Test"]; @@ -54,6 +61,13 @@ [label setStringValue:"Respond to the alert dialog with the mouse or the keyboard."]; [contentView addSubview:label]; + var button = [CPButton buttonWithTitle:@"Start again using didEnd blocks"]; + + [button setTarget:self]; + [button setAction:@selector(testWithBlocks:)]; + [button setCenter:[contentView center]]; + [contentView addSubview:button]; + [theWindow orderFront:self]; [self showNextAlertVariation]; @@ -62,9 +76,17 @@ //[CPMenu setMenuBarVisible:YES]; } +- (@action)testWithBlocks:(id)sender +{ + useBlocks = YES; + [self _init]; + [self showNextAlertVariation]; +} + - (void)alertDidEnd:(CPAlert)anAlert returnCode:(CPInteger)returnCode { - CPLogConsole(_cmd); + CPLog.info("%s alert = %s, code = %d", _cmd, [anAlert description], returnCode); + if (returnCode === 0) [label setStringValue:"You chose the default action."]; else @@ -75,7 +97,7 @@ - (void)customDidEnd:(CPAlert)anAlert code:(id)code context:(id)context { - CPLogConsole(_cmd + anAlert + code + context); + CPLog.info("%s alert = %s, code = %d, context = %s", _cmd, [anAlert description], code, context); } - (void)showNextAlertVariation @@ -92,17 +114,37 @@ var windowStyle = variation[0]; [alert setDelegate:self]; - [alert setMessageText:message[0]]; - [alert setInformativeText:message[1]]; + [alert setMessageText:message[0] || @""]; + [alert setInformativeText:message[1] || @""]; + if (message.length > 2) [alert addButtonWithTitle:message[2]]; + if (message.length > 3) [alert addButtonWithTitle:message[3]]; + [alert setTheme:(windowStyle === CPHUDBackgroundWindowMask) ? [CPTheme defaultHudTheme] : [CPTheme defaultTheme]]; [alert setAlertStyle:variation[1]]; if (windowStyle & CPDocModalWindowMask) - [alert beginSheetModalForWindow:theWindow modalDelegate:self didEndSelector:@selector(customDidEnd:code:context:) contextInfo:@"here is some context"]; + { + if (useBlocks) + [alert beginSheetModalForWindow:theWindow didEndBlock:function(alert, returnCode) + { + CPLog.info("didEndBlock: alert = %s, code = %d", [alert description], returnCode); + + [self showNextAlertVariation]; + }]; + else + [alert beginSheetModalForWindow:theWindow modalDelegate:self didEndSelector:@selector(customDidEnd:code:context:) contextInfo:@"here is some context"]; + } + else if (useBlocks) + [alert runModalWithDidEndBlock:function(alert, returnCode) + { + CPLog.info("didEndBlock: alert = %s, code = %d", [alert description], returnCode); + + [self showNextAlertVariation]; + }]; else [alert runModal]; } diff --git a/Tests/Manual/CPBrowserTest/AppController.j b/Tests/Manual/CPBrowserTest/AppController.j index c30d847a9..7c8c04f50 100644 --- a/Tests/Manual/CPBrowserTest/AppController.j +++ b/Tests/Manual/CPBrowserTest/AppController.j @@ -77,7 +77,7 @@ //[browser setAllowsMultipleSelection:NO]; } -- (BOOL)browser:(CPBrowser)aBrowser writeRowsWithIndexes:(CPIndexSet)indexes inColumn:(int)column toPasteboard:(CPPasteboard)pboard +- (BOOL)browser:(CPBrowser)aBrowser writeRowsWithIndexes:(CPIndexSet)indexes inColumn:(CPInteger)column toPasteboard:(CPPasteboard)pboard { var encodedData = [CPKeyedArchiver archivedDataWithRootObject:"Foo"]; [pboard declareTypes:["Type"] owner:self]; @@ -85,11 +85,11 @@ return YES; } -- (BOOL)browser:(id)aBrowser validateDrop:(id)info proposedRow:(int)row column:(int)column dropOperation:(id)op +- (BOOL)browser:(id)aBrowser validateDrop:(id)info proposedRow:(CPInteger)row column:(CPInteger)column dropOperation:(id)op { return CPDragOperationMove; } -- (BOOL)browser:(id)aBrowser acceptDrop:(id)info atRow:(int)row column:(int)column dropOperation:(id)op +- (BOOL)browser:(id)aBrowser acceptDrop:(id)info atRow:(CPInteger)row column:(CPInteger)column dropOperation:(id)op { return YES; } diff --git a/Tests/Manual/CPDateFormatterTest/AppController.j b/Tests/Manual/CPDateFormatterTest/AppController.j new file mode 100644 index 000000000..40eff323e --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/AppController.j @@ -0,0 +1,42 @@ +/* + * AppController.j + * CPDateFormatterTest + * + * Created by You on April 9, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPDatePicker datePicker; + @outlet CPTextField labelDateFormatter; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; + [[datePicker formatter] setTimeZone:[CPTimeZone timeZoneForSecondsFromGMT:60 * 60 * 2]]; + [datePicker setDateValue:[CPDate date]]; +} + +- (@action)datePickerAction:(id)sender +{ + [labelDateFormatter setStringValue:[[sender formatter] stringFromDate:[sender dateValue]]]; +} + +@end diff --git a/Tests/Manual/CPDateFormatterTest/Info.plist b/Tests/Manual/CPDateFormatterTest/Info.plist new file mode 100644 index 000000000..ab43abcb2 --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/Info.plist @@ -0,0 +1,10 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPDateFormatterTest + + diff --git a/Tests/Manual/CPDateFormatterTest/Jakefile b/Tests/Manual/CPDateFormatterTest/Jakefile new file mode 100644 index 000000000..24c7daa20 --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/Jakefile @@ -0,0 +1,94 @@ +/* + * Jakefile + * CPDateFormatterTest + * + * Created by You on April 9, 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 ("CPDateFormatterTest", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPDateFormatterTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPDateFormatterTest"); + task.setIdentifier("com.yourcompany.CPDateFormatterTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPDateFormatterTest"); + 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", ["CPDateFormatterTest"], 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", "CPDateFormatterTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPDateFormatterTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPDateFormatterTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPDateFormatterTest"), FILE.join("Build", "Deployment", "CPDateFormatterTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPDateFormatterTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPDateFormatterTest"), FILE.join("Build", "Desktop", "CPDateFormatterTest", "CPDateFormatterTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPDateFormatterTest", "CPDateFormatterTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPDateFormatterTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPDateFormatterTest/Resources/MainMenu.cib b/Tests/Manual/CPDateFormatterTest/Resources/MainMenu.cib new file mode 100644 index 000000000..d09cb61ea --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/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;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;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;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;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;54E;D;K;6;CP$UIDd;2;56E;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;66E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;133E;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;56E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;3;102E;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;2;56E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;128E;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;134E;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;135E;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;131E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;128E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;124E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;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;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;116E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;54E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;96E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;62E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;128E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;131E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;134E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;174E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;175E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;176E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;59E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;177E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;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;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;186E;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;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;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;59E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;188E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;65E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;189E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;190E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;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;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;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;65E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;194E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;195E;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;65E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;196E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;197E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;197E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;198E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;199E;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;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;200E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;201E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;75E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;201E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;203E;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;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;206E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;207E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;208E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;209E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;210E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;215E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;86E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;217E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;219E;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;220E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;221E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;223E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;224E;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;225E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;226E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;227E;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;228E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;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;231E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;232E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;93E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;233E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;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;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;236E;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;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;237E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;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;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;239E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;241E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;99E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;241E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;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;99E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;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;99E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;245E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;245E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;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;231E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;232E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;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;228E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;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;220E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;221E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;252E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;253E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;257E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;259E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;114E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;260E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;261E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;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;114E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;265E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;182E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;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;184E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;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;108E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;267E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;120E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;267E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;268E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;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;120E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;270E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;272E;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;120E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;273E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;274E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;275E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;276E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;277E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;225E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;177E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;126E;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;125E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;279E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;279E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;280E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;281E;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;127E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;282E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;283E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;126E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;284E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;137E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;289E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;291E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;292E;K;21;CPControlFormatterKeyD;K;6;CP$UIDd;3;133E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;278E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;278E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;278E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;293E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;294E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;295E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;291E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;286E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;182E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;182E;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;129E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;296E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;297E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;126E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;284E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;298E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;281E;K;11;$aalignmentD;K;6;CP$UIDd;3;228E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;228E;K;6;$afontD;K;6;CP$UIDd;3;299E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;182E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;300E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;292E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;184E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;184E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;184E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;301E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;228E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;228E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;302E;E;D;K;10;$classnameS;15;CPDateFormatterK;8;$classesA;S;15;CPDateFormatterS;11;CPFormatterS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;38;CPDateFormatterAllowNaturalLanguageKeyD;K;6;CP$UIDd;3;184E;K;24;CPDateFormatterDateStyleD;K;6;CP$UIDd;3;220E;K;28;CPDateFormatterDateFormatKeyD;K;6;CP$UIDd;3;303E;K;44;CPDateFormatterDoseRelativeDateFormattingKeyD;K;6;CP$UIDd;3;184E;K;35;CPDateFormatterFormatterBehaviorKeyD;K;6;CP$UIDd;3;304E;K;24;CPDateFormatterLocaleKeyD;K;6;CP$UIDd;1;0E;K;27;CPDateFormatterTimeStyleKeyD;K;6;CP$UIDd;3;292E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;124E;E;E;S;8;delegateS;10;datePickerS;18;labelDateFormatterS;9;theWindowS;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;17;datePickerAction:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;71E;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;63E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;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;66E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;67E;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;73E;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;2;78E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;98E;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;2;91E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;88E;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;2;96E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;97E;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;101E;D;K;6;CP$UIDd;3;100E;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;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;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;112E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;118E;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;115E;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;121E;D;K;6;CP$UIDd;3;122E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 128}, {480, 360}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;130E;E;E;S;6;normalS;22;{{154, 36}, {242, 29}}S;19;{{0, 0}, {242, 29}}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;285E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;305E;E;S;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;288E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;306E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;307E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;182E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;184E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;182E;E;D;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;290E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;308E;E;d;1;4d;3;238D;K;6;$classD;K;6;CP$UIDd;3;290E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;3;290E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;310E;E;S;21;{{47, 93}, {387, 17}}S;19;{{0, 0}, {387, 17}}S;9;textfieldD;K;6;$classD;K;6;CP$UIDd;3;288E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;306E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;311E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;184E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;184E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;182E;E;S;5;LabelD;K;6;$classD;K;6;CP$UIDd;3;285E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;312E;E;S;13;AppControllerS;24;d MMM yyyy 'at' hh:mm:ssd;4;1040D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;231E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;13d;13;1234454400000d;15;-62135510400000d;14;64092297600000d;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;313E;D;K;6;CP$UIDd;3;313E;D;K;6;CP$UIDd;3;313E;D;K;6;CP$UIDd;3;231E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPDateFormatterTest/Resources/MainMenu.xib b/Tests/Manual/CPDateFormatterTest/Resources/MainMenu.xib new file mode 100644 index 000000000..1aa89c8b7 --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/Resources/MainMenu.xib @@ -0,0 +1,1967 @@ + + + + 1050 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + YES + NSCustomObject + NSDateFormatter + NSDatePicker + NSDatePickerCell + NSMenu + NSMenuItem + NSTextField + NSTextFieldCell + 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 + + + 7 + 2 + {{335, 390}, {480, 360}} + 1946157056 + Window + NSWindow + + + + + 256 + + YES + + + 268 + {{154, 298}, {245, 27}} + + + + _NS:9 + YES + + 71303168 + 0 + + 256147200 + + + LucidaGrande + 13 + 1044 + + + + YES + + YES + dateFormat + dateStyle + doesRelativeDateFormatting + formatterBehavior + timeStyle + + + YES + d MMM yyyy 'at' hh:mm:ss + + + + + + + d MMM yyyy 'at' hh:mm:ss + NO + + _NS:9 + + 0.0 + 238 + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{44, 250}, {393, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Label + + _NS:1535 + + + 6 + System + controlColor + + + + + NO + + + {480, 360} + + + + + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + YES + + + AppController + + + + + 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 + + + + datePicker + + + + 476 + + + + labelDateFormatter + + + + 477 + + + + datePickerAction: + + + + 478 + + + + + 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 + + + + + 460 + + + YES + + + + + + 461 + + + YES + + + + + + 462 + + + YES + + + + + + 463 + + + + + 465 + + + + + + + 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 + 460.IBPluginDependency + 461.IBPluginDependency + 462.IBPluginDependency + 463.IBPluginDependency + 465.IBDateFormatterBehaviorMetadataKey + 465.IBPluginDependency + 5.IBPluginDependency + 56.IBPluginDependency + 57.IBPluginDependency + 58.IBPluginDependency + 72.IBPluginDependency + 73.IBPluginDependency + 75.IBPluginDependency + 79.IBPluginDependency + 80.IBPluginDependency + 81.IBPluginDependency + 82.IBPluginDependency + 83.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 + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + 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 + + + + + 478 + + + + YES + + AppController + NSObject + + datePickerAction: + id + + + datePickerAction: + + datePickerAction: + id + + + + YES + + YES + datePicker + labelDateFormatter + theWindow + + + YES + NSDatePicker + NSTextField + NSWindow + + + + YES + + YES + datePicker + labelDateFormatter + theWindow + + + YES + + datePicker + NSDatePicker + + + labelDateFormatter + NSTextField + + + theWindow + NSWindow + + + + + IBProjectSource + ./Classes/AppController.h + + + + NSDocument + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + id + id + id + id + id + id + + + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + + IBProjectSource + ./Classes/NSDocument.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {11, 11} + {10, 3} + + + + diff --git a/Tools/capp/Resources/Templates/NibApplication/Resources/spinner.gif b/Tests/Manual/CPDateFormatterTest/Resources/spinner.gif similarity index 100% rename from Tools/capp/Resources/Templates/NibApplication/Resources/spinner.gif rename to Tests/Manual/CPDateFormatterTest/Resources/spinner.gif diff --git a/Tests/Manual/CPDateFormatterTest/index-debug.html b/Tests/Manual/CPDateFormatterTest/index-debug.html new file mode 100644 index 000000000..96c33bd02 --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/index-debug.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + CPDateFormatterTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPDateFormatterTest/index.html b/Tests/Manual/CPDateFormatterTest/index.html new file mode 100644 index 000000000..124529560 --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + CPDateFormatterTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPDateFormatterTest/main.j b/Tests/Manual/CPDateFormatterTest/main.j new file mode 100644 index 000000000..4295c7ebc --- /dev/null +++ b/Tests/Manual/CPDateFormatterTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPDateFormatterTest + * + * Created by You on April 9, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib index ba8729818..282d95e4f 100644 --- a/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.cib @@ -1 +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 +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;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;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;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;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;CPDatePicker 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 index fdfd528c9..9fa0c1cc7 100644 --- a/Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPDatePickerTest/Resources/MainMenu.xib @@ -672,6 +672,7 @@ {{456, 167}, {277, 148}} + _NS:9 YES @@ -730,7 +731,7 @@ 68157504 272630784 - CPDatePicket test + CPDatePicker test LucidaGrande-Bold 17 diff --git a/Tests/Manual/CPDictionaryControllerTest/AppController.j b/Tests/Manual/CPDictionaryControllerTest/AppController.j index 244a8e76b..c733154d6 100644 --- a/Tests/Manual/CPDictionaryControllerTest/AppController.j +++ b/Tests/Manual/CPDictionaryControllerTest/AppController.j @@ -54,7 +54,7 @@ [tableView setNeedsDisplay:YES]; } -- (BOOL)tableView:(CPTableView)tableView isGroupRow:(int)row +- (BOOL)tableView:(CPTableView)tableView isGroupRow:(CPInteger)row { return (row > 2 && row < 5); } diff --git a/Tests/Manual/CPGraphicsTest/AppController.j b/Tests/Manual/CPGraphicsTest/AppController.j index df56fbc48..96397bcce 100644 --- a/Tests/Manual/CPGraphicsTest/AppController.j +++ b/Tests/Manual/CPGraphicsTest/AppController.j @@ -11,6 +11,7 @@ { @outlet CPWindow window1; @outlet CPWindow window2; + @outlet CPWindow window3; @outlet CustomDrawView view1; @outlet CustomDrawView view2; @@ -24,6 +25,9 @@ @outlet CustomDrawView pathView0; @outlet CustomDrawView pathView1; + + @outlet CustomDrawView linearGradientView; + @outlet CustomDrawView radialGradientView; } - (void)awakeFromCib @@ -185,6 +189,34 @@ [starPath stroke]; [CPGraphicsContext restoreGraphicsState]; } + // else + else if (aView == linearGradientView) + { + var linearRect = dirtyRect, + gradientColors = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [1, 0, 0, 1 , 0, 0, 1, 1], [0,1], 2); + + CGContextSaveGState(context); + CGContextAddEllipseInRect(context, linearRect); + CGContextClip(context); + + var startPoint = CGPointMake(CGRectGetMidX(linearRect), CGRectGetMinY(linearRect)), + endPoint = CGPointMake(CGRectGetMidX(linearRect), CGRectGetMaxY(linearRect)); + + CGContextDrawLinearGradient(context, gradientColors, startPoint, endPoint, 0); + CGContextRestoreGState(context); + } + else if(aView == radialGradientView) + { + var gradientRect = dirtyRect, + gradientColors = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [1, 0, 0, 1 , 0, 0, 1, 1], [0,1], 2); + + CGContextSaveGState(context); + CGContextAddEllipseInRect(context, gradientRect); + CGContextClip(context); + + CGContextDrawRadialGradient(context, gradientColors, CGPointMake(CGRectGetMidX(gradientRect), CGRectGetMidY(gradientRect)), 0, CGPointMake(CGRectGetMidX(gradientRect), CGRectGetMidY(gradientRect)), 50,0); + CGContextRestoreGState(context); + } } @end diff --git a/Tests/Manual/CPGraphicsTest/Resources/LinearGradient.png b/Tests/Manual/CPGraphicsTest/Resources/LinearGradient.png new file mode 100644 index 000000000..d30896874 Binary files /dev/null and b/Tests/Manual/CPGraphicsTest/Resources/LinearGradient.png differ diff --git a/Tests/Manual/CPGraphicsTest/Resources/MainMenu.cib b/Tests/Manual/CPGraphicsTest/Resources/MainMenu.cib index c5773885e..0c04bd4b1 100644 --- a/Tests/Manual/CPGraphicsTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPGraphicsTest/Resources/MainMenu.cib @@ -1 +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;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;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;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;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;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;1;0E;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;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;45E;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;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;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;69E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;97E;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;2;98E;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;2;99E;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;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;100E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;83E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;101E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;84E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;87E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;103E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;88E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;93E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;48E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;107E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;49E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;108E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;47E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;109E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;110E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;111E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;112E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;49E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;47E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;50E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;87E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;83E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;98E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;114E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;115E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;116E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;117E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;118E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;119E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;120E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;42E;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;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;122E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;122E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;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;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;133E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;139E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;140E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;141E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;142E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;143E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;146E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;151E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;152E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;153E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;155E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;157E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;158E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;159E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;160E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;161E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;162E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;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;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;163E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;164E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;165E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;166E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;14;$aborder-widthD;K;6;CP$UIDd;3;121E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;121E;K;16;$acontent-marginD;K;6;CP$UIDd;3;168E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;131E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;169E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;170E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;121E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;173E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;174E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;152E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;177E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;178E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;179E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;180E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;159E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;181E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;182E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;162E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;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;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;183E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;186E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;187E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;188E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;189E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;190E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;191E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;192E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;114E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;115E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;116E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;194E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;118E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;119E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;120E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;195E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;195E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;196E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;197E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;198E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;199E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;200E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;201E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;203E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;205E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;206E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;207E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;208E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;209E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;210E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;211E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;212E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;213E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;214E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;215E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;177E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;216E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;217E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;218E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;219E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;220E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;174E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;221E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;222E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;165E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;166E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;14;$aborder-widthD;K;6;CP$UIDd;3;121E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;121E;K;16;$acontent-marginD;K;6;CP$UIDd;3;223E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;131E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;169E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;170E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;121E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;224E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;225E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;226E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;227E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;228E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;229E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;230E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;219E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;153E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;231E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;217E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;232E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;233E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;234E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;235E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;211E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;236E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;237E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;208E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;238E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;239E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;240E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;241E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;130E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;242E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;243E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;244E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;245E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;201E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;246E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;247E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;248E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;249E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;6;$afontD;K;6;CP$UIDd;3;250E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;248E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;136E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;136E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;138E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;131E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;131E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;62E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;69E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;121E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;251E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;125E;K;11;$aalignmentD;K;6;CP$UIDd;3;121E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;121E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;252E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;130E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;121E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;68E;E;E;S;8;delegateS;13;gradientView0S;13;gradientView1S;13;gradientView2S;13;gradientView3S;9;pathView0S;9;pathView1S;5;view1S;5;view2S;5;view3S;5;view4S;7;window1S;7;window2S;9;_delegateS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1948778496S;23;{{66, 151}, {840, 355}}S;22;{{0, 0}, {2560, 1418}}d;1;7S;15;CPGraphics Testd;1;0S;20;{{0, 0}, {840, 355}}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;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;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;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;63E;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;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;d;2;18S;6;normalS;21;{{20, 20}, {168, 22}}S;19;{{0, 0}, {168, 22}}d;2;36S;9;textfieldd;1;4d;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;T;S;16;CPDrawTiledRectsF;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;254E;E;S;22;{{20, 186}, {217, 22}}S;19;{{0, 0}, {217, 22}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;21;CPDrawColorTiledRectsS;22;{{20, 217}, {163, 96}}S;19;{{0, 0}, {163, 96}}S;14;CustomDrawViewS;21;{{20, 51}, {163, 96}}S;22;{{234, 51}, {163, 96}}S;23;{{234, 217}, {163, 96}}S;22;{{20, 155}, {163, 14}}S;19;{{0, 0}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;Bezel using full boundsS;23;{{232, 155}, {167, 14}}S;19;{{0, 0}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;32;Bezel clipping half horizontallyS;22;{{18, 321}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;13;Single borderS;23;{{230, 321}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;13;Triple borderS;21;{{418, 12}, {5, 331}}S;18;{{0, 0}, {5, 331}}d;2;20S;3;boxD;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;256E;E;d;1;3S;3;BoxS;22;{{441, 20}, {201, 22}}S;19;{{0, 0}, {201, 22}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;20;Reference RenderingsS;23;{{441, 155}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{653, 155}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{439, 321}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{651, 321}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{438, 47}, {169, 102}}S;20;{{0, 0}, {169, 102}}D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;258E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;260E;E;S;24;{{648, 213}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;261E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;262E;E;S;24;{{438, 213}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;263E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;264E;E;S;23;{{648, 47}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;266E;E;S;13;AppControllerS;24;{{182, 162}, {840, 490}}S;20;{{0, 0}, {840, 490}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;76E;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;75E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;E;E;S;24;{{441, 341}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;267E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;268E;E;S;23;{{441, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;15;General drawingS;24;{{648, 174}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;269E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;270E;E;S;24;{{438, 174}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;271E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;272E;E;S;23;{{653, 281}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;4;-20ºS;23;{{441, 281}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;4;225ºS;23;{{648, 48}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;273E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;274E;E;S;23;{{438, 48}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;275E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;276E;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;12;TransparencyD;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;5;SolidD;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;21;{{418, 12}, {5, 466}}S;18;{{0, 0}, {5, 466}}D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;256E;E;S;21;{{22, 20}, {102, 22}}S;19;{{0, 0}, {102, 22}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;10;CPGradientS;21;{{22, 51}, {163, 96}}S;22;{{236, 51}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;22;{{22, 177}, {163, 96}}S;23;{{236, 177}, {163, 96}}S;22;{{20, 281}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{232, 281}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;22;{{22, 313}, {120, 22}}S;19;{{0, 0}, {120, 22}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;134E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;12;CPBezierPathS;22;{{22, 344}, {163, 96}}S;23;{{236, 344}, {163, 96}}S;22;{{20, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;23;{{236, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;19;Strokes and ShadowsS;23;{{648, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;132E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;253E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;255E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;136E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;134E;E;S;24;{{648, 341}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;185E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;257E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;277E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;278E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;279E;D;K;6;CP$UIDd;3;279E;D;K;6;CP$UIDd;3;279E;D;K;6;CP$UIDd;3;280E;E;E;d;2;11S;22;{"width":0,"height":0}S;7;CPImageS;9;view1.pngD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;281E;E;E;S;9;view4.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;282E;E;E;S;9;view3.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;283E;E;E;S;9;view2.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;284E;E;E;S;13;pathView0.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;285E;E;E;S;9;grad3.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;286E;E;E;S;9;grad2.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;287E;E;E;S;9;grad1.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;288E;E;E;S;9;grad0.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;289E;E;E;S;13;pathView1.pngD;K;6;$classD;K;6;CP$UIDd;3;259E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;290E;E;E;f;18;0.6862745098039216d;1;1D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;291E;E;S;25;{"width":163,"height":96}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +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;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;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;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;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;1;0E;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;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;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;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;11E;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;104E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;116E;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;117E;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;118E;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;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;88E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;89E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;92E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;93E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;108E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;124E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;97E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;125E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;98E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;126E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;107E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;53E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;54E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;73E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;103E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;54E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;55E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;117E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;136E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;137E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;138E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;139E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;140E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;141E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;142E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;47E;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;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;145E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;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;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;149E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;155E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;157E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;163E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;164E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;165E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;168E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;169E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;170E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;173E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;174E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;177E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;178E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;179E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;180E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;181E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;182E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;183E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;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;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;185E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;186E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;187E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;188E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;14;$aborder-widthD;K;6;CP$UIDd;3;143E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;143E;K;16;$acontent-marginD;K;6;CP$UIDd;3;190E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;153E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;191E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;192E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;143E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;195E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;196E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;197E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;198E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;174E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;199E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;200E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;178E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;201E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;202E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;181E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;203E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;204E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;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;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;205E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;208E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;209E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;210E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;211E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;212E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;213E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;136E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;137E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;216E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;217E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;140E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;141E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;142E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;218E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;218E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;219E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;220E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;221E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;222E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;223E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;224E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;225E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;226E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;227E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;228E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;229E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;230E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;231E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;232E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;233E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;234E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;235E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;236E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;237E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;238E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;199E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;239E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;240E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;197E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;241E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;242E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;243E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;196E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;244E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;245E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;187E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;188E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;14;$aborder-widthD;K;6;CP$UIDd;3;143E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;143E;K;16;$acontent-marginD;K;6;CP$UIDd;3;246E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;153E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;191E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;192E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;143E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;247E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;248E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;249E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;250E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;251E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;252E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;253E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;242E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;254E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;240E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;256E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;257E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;258E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;234E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;259E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;260E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;231E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;261E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;262E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;263E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;264E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;265E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;266E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;267E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;268E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;224E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;270E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;271E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;272E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;273E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;271E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;274E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;275E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;136E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;137E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;276E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;277E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;140E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;141E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;278E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;279E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;279E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;280E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;281E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;283E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;284E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;285E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;152E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;286E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;152E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;288E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;289E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;290E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;289E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;291E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;289E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;143E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;292E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;293E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;289E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;143E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;143E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;143E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;294E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;295E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;296E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;187E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;188E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;14;$aborder-widthD;K;6;CP$UIDd;3;143E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;143E;K;16;$acontent-marginD;K;6;CP$UIDd;3;297E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;153E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;191E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;192E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;143E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;298E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;296E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;187E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;188E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;14;$aborder-widthD;K;6;CP$UIDd;3;143E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;143E;K;16;$acontent-marginD;K;6;CP$UIDd;3;299E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;153E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;191E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;192E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;143E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;300E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;301E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;302E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;304E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;302E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;305E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;306E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;307E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;104E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;143E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;308E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;104E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;153E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;153E;K;6;$afontD;K;6;CP$UIDd;3;309E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;307E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;152E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;158E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;158E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;153E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;153E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;3;103E;E;E;S;8;delegateS;13;gradientView0S;13;gradientView1S;13;gradientView2S;13;gradientView3S;18;linearGradientViewS;9;pathView0S;9;pathView1S;18;radialGradientViewS;5;view1S;5;view2S;5;view3S;5;view4S;7;window1S;7;window2S;7;window3S;9;_delegateS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1954021376S;26;{{300, 261.5}, {840, 355}}S;21;{{0, 0}, {1440, 878}}d;1;7S;15;CPGraphics Testd;1;0S;20;{{0, 0}, {840, 355}}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;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;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;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;68E;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;66E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;69E;E;E;d;2;18S;6;normalS;21;{{20, 20}, {168, 22}}S;19;{{0, 0}, {168, 22}}d;2;36S;9;textfieldd;1;4d;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;T;S;16;CPDrawTiledRectsF;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;159E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;311E;E;S;22;{{20, 186}, {217, 22}}S;19;{{0, 0}, {217, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;21;CPDrawColorTiledRectsS;22;{{20, 217}, {163, 96}}S;19;{{0, 0}, {163, 96}}S;14;CustomDrawViewS;21;{{20, 51}, {163, 96}}S;22;{{234, 51}, {163, 96}}S;23;{{234, 217}, {163, 96}}S;22;{{20, 155}, {163, 14}}S;19;{{0, 0}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;Bezel using full boundsS;23;{{232, 155}, {167, 14}}S;19;{{0, 0}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;32;Bezel clipping half horizontallyS;22;{{18, 321}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;13;Single borderS;23;{{230, 321}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;13;Triple borderS;21;{{418, 12}, {5, 331}}S;18;{{0, 0}, {5, 331}}d;2;20S;3;boxD;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;313E;E;d;1;3S;3;BoxS;22;{{441, 20}, {201, 22}}S;19;{{0, 0}, {201, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;20;Reference RenderingsS;23;{{441, 155}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{653, 155}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{439, 321}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{651, 321}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{438, 47}, {169, 102}}S;20;{{0, 0}, {169, 102}}D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;315E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;317E;E;S;24;{{648, 213}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;318E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;319E;E;S;24;{{438, 213}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;320E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;321E;E;S;23;{{648, 47}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;322E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;323E;E;S;13;AppControllerd;10;1948778496S;24;{{272, 117}, {840, 490}}S;20;{{0, 0}, {840, 490}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;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;84E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;81E;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;80E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;E;E;S;24;{{441, 341}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;324E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;325E;E;S;23;{{441, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;15;General drawingS;24;{{648, 174}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;326E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;327E;E;S;24;{{438, 174}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;328E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;329E;E;S;23;{{653, 281}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;4;-20ºS;23;{{441, 281}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;4;225ºS;23;{{648, 48}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;330E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;331E;E;S;23;{{438, 48}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;332E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;12;TransparencyD;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;5;SolidD;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;21;{{418, 12}, {5, 466}}S;18;{{0, 0}, {5, 466}}D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;313E;E;S;21;{{22, 20}, {102, 22}}S;19;{{0, 0}, {102, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;10;CPGradientS;21;{{22, 51}, {163, 96}}S;22;{{236, 51}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;22;{{22, 177}, {163, 96}}S;23;{{236, 177}, {163, 96}}S;22;{{20, 281}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{232, 281}, {167, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;22;{{22, 313}, {120, 22}}S;19;{{0, 0}, {120, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;12;CPBezierPathS;22;{{22, 344}, {163, 96}}S;23;{{236, 344}, {163, 96}}S;22;{{20, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;23;{{236, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;19;Strokes and ShadowsS;23;{{648, 448}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;24;{{648, 341}, {169, 102}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;334E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;335E;E;d;9;611845120S;24;{{393, 232}, {346, 356}}S;13;CPGraphicTestS;20;{{0, 0}, {346, 356}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;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;E;E;S;21;{{20, 12}, {282, 22}}S;19;{{0, 0}, {282, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;27;CGContextDrawRadialGradientS;22;{{20, 180}, {282, 22}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;146E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;156E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;27;CGContextDrawLinearGradientS;22;{{38, 47}, {100, 100}}S;20;{{0, 0}, {100, 100}}S;23;{{38, 219}, {100, 100}}S;24;{{192, 219}, {100, 100}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;336E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;337E;E;S;23;{{192, 47}, {100, 100}}D;K;6;$classD;K;6;CP$UIDd;3;207E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;314E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;338E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;339E;E;S;21;{{164, 47}, {5, 100}}S;18;{{0, 0}, {5, 100}}D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;313E;E;S;22;{{164, 219}, {5, 100}}D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;313E;E;S;23;{{161, 152}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;15;Cocoa referenceS;23;{{161, 322}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;21;{{7, 322}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;18;Made by cappuccinoS;21;{{7, 152}, {163, 14}}D;K;6;$classD;K;6;CP$UIDd;3;154E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;310E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;312E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;158E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;156E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;340E;D;K;6;CP$UIDd;3;340E;D;K;6;CP$UIDd;3;340E;D;K;6;CP$UIDd;3;341E;E;E;d;2;11S;22;{"width":0,"height":0}S;7;CPImageS;9;view1.pngD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;342E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;view4.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;344E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;view3.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;345E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;view2.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;346E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;13;pathView0.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;347E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;grad3.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;348E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;grad2.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;349E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;grad1.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;350E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;9;grad0.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;351E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;13;pathView1.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;352E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;18;LinearGradient.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;353E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;S;18;RadialGradient.pngD;K;6;$classD;K;6;CP$UIDd;3;316E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;354E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;343E;K;9;frameworkD;K;6;CP$UIDd;3;343E;E;E;f;18;0.6862745098039216d;1;1D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;356E;E;S;25;{"width":163,"height":96}S;30;{"width":100,"height":100.507}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPGraphicsTest/Resources/MainMenu.xib b/Tests/Manual/CPGraphicsTest/Resources/MainMenu.xib index e17ee360c..fe314d83d 100644 --- a/Tests/Manual/CPGraphicsTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPGraphicsTest/Resources/MainMenu.xib @@ -2,10 +2,10 @@ 1080 - 12C60 + 12D78 3084 - 1187.34 - 625.00 + 1187.37 + 626.00 com.apple.InterfaceBuilder.CocoaPlugin 3084 @@ -41,8 +41,8 @@ 7 2 - {{66, 912}, {840, 355}} - 1948778496 + {{100, 523}, {840, 355}} + 1954021376 CPGraphics Test NSWindow @@ -495,7 +495,7 @@ - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES @@ -505,7 +505,7 @@ 7 2 - {{182, 766}, {840, 490}} + {{272, 271}, {840, 490}} 1948778496 CPGraphics Test NSWindow @@ -1083,7 +1083,281 @@ - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + YES + + + 7 + 2 + {{393, 290}, {346, 356}} + 611845120 + CPGraphicTest + NSWindow + + + + + 256 + + + + 20 + {{164, 209}, {5, 100}} + + + + _NS:2168 + {0, 0} + + 67108864 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 20 + {{164, 37}, {5, 100}} + + + + _NS:2168 + {0, 0} + + 67108864 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 268 + {{38, 209}, {100, 100}} + + + + _NS:9 + CustomDrawView + + + + 268 + {{17, 322}, {288, 22}} + + + + YES + + 68157504 + 272630784 + CGContextDrawRadialGradient + + + + + + NO + + + + 268 + {{38, 37}, {100, 100}} + + + + _NS:9 + CustomDrawView + + + + 268 + {{17, 154}, {288, 22}} + + + + YES + + 68157504 + 272630784 + CGContextDrawLinearGradient + + + + + + NO + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{192, 37}, {100, 100}} + + + + _NS:9 + YES + + 134217728 + 33554432 + + NSImage + LinearGradient + + _NS:9 + 0 + 0 + 2 + NO + + NO + YES + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{192, 209}, {100, 100}} + + + + _NS:9 + YES + + 134217728 + 33554432 + + NSImage + RadialGradient + + _NS:9 + 0 + 0 + 2 + NO + + NO + YES + + + + 268 + {{158, 190}, {169, 14}} + + + + YES + + 68157504 + 138544128 + Cocoa reference + + + + + + NO + + + + 268 + {{158, 20}, {169, 14}} + + + + YES + + 68157504 + 138544128 + Cocoa reference + + + + + + NO + + + + 268 + {{4, 20}, {169, 14}} + + + + YES + + 68157504 + 138544128 + Made by cappuccino + + + + + + NO + + + + 268 + {{4, 190}, {169, 14}} + + + + YES + + 68157504 + 138544128 + Made by cappuccino + + + + + + NO + + + {346, 356} + + + + _NS:20 + + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES @@ -1130,22 +1404,6 @@ 1121 - - - window1 - - - - 1296 - - - - window2 - - - - 1297 - gradientView0 @@ -1194,6 +1452,46 @@ 1311 + + + window3 + + + + 1322 + + + + linearGradientView + + + + 1328 + + + + radialGradientView + + + + 1329 + + + + window2 + + + + 1369 + + + + window1 + + + + 1370 + _delegate @@ -1274,6 +1572,22 @@ 1304 + + + _delegate + + + + 1330 + + + + _delegate + + + + 1331 + @@ -1301,266 +1615,11 @@ Application - - 371 - - - - - - - - 372 - - - - - - - - - - - - - - - - - - - - - - - - - 450 - - 1069 - - - - - - - - 1070 - - - - - 1112 - - - - - 1113 - - - - - 1114 - - - - - - - - 1115 - - - - - 1116 - - - - - 1117 - - - - - 1122 - - - - - - - - 1123 - - - - - 1124 - - - - - - - - 1125 - - - - - 1126 - - - - - - - - 1127 - - - - - - - - 1128 - - - - - 1129 - - - - - 1130 - - - - - 1131 - - - - - - - - 1137 - - - - - - - - 1138 - - - - - - - - 1139 - - - - - - - - 1140 - - - - - - - - 1141 - - - - - 1142 - - - - - 1143 - - - - - 1144 - - - - - 1146 - - - - - 1147 - - - - - - - - 1148 - - - - - 1149 - - - - - - - - 1150 - - - - - 1151 - - - - - - - - 1152 - - - - - 1153 - - - - - - - - 1154 - - - 1211 @@ -1912,6 +1971,412 @@ + + 1312 + + + + + + + + 1313 + + + + + + + + + + + + + + + + + + + 1341 + + + + + + + + 1342 + + + + + 1339 + + + + + + + + 1340 + + + + + 1337 + + + + + + + + 1338 + + + + + 1335 + + + + + + + + 1336 + + + + + 1334 + + + + + 1333 + + + + + 1326 + + + + + + + + 1327 + + + + + 1324 + + + + + + + + 1325 + + + + + 1317 + + + + + 1314 + + + + + 1318 + + + + + + + + 1319 + + + + + 1315 + + + + + + + + 1316 + + + + + 371 + + + + + + + + 372 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1151 + + + + + + + + 1152 + + + + + 1149 + + + + + + + + 1150 + + + + + 1153 + + + + + + + + 1154 + + + + + 1147 + + + + + + + + 1148 + + + + + 1140 + + + + + + + + 1141 + + + + + 1139 + + + + + + + + 1142 + + + + + 1138 + + + + + + + + 1143 + + + + + 1137 + + + + + + + + 1144 + + + + + 1131 + + + + + + + + 1146 + + + + + 1130 + + + + + 1127 + + + + + + + + 1128 + + + + + 1126 + + + + + + + + 1129 + + + + + 1124 + + + + + + + + 1125 + + + + + 1122 + + + + + + + + 1123 + + + + + 1116 + + + + + 1113 + + + + + 1112 + + + + + 1115 + + + + + 1114 + + + + + + + + 1117 + + + + + 1069 + + + + + + + + 1070 + + + @@ -2008,11 +2473,34 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin {{469, 508}, {417, 368}} - + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2020,7 +2508,7 @@ - 1311 + 1411 @@ -2032,14 +2520,17 @@ CustomDrawView CustomDrawView CustomDrawView + CustomDrawView CustomDrawView CustomDrawView + CustomDrawView CustomDrawView CustomDrawView CustomDrawView CustomDrawView NSWindow NSWindow + NSWindow @@ -2058,6 +2549,10 @@ gradientView3 CustomDrawView + + linearGradientView + CustomDrawView + pathView0 CustomDrawView @@ -2066,6 +2561,10 @@ pathView1 CustomDrawView + + radialGradientView + CustomDrawView + view1 CustomDrawView @@ -2090,6 +2589,10 @@ window2 NSWindow + + window3 + NSWindow + IBProjectSource @@ -2122,6 +2625,8 @@ YES 3 + {100, 100.50697581706156} + {100, 100.50697581706156} {163, 96} {163, 96} {163, 96} diff --git a/Tests/Manual/CPGraphicsTest/Resources/RadialGradient.png b/Tests/Manual/CPGraphicsTest/Resources/RadialGradient.png new file mode 100644 index 000000000..beb0f08be Binary files /dev/null and b/Tests/Manual/CPGraphicsTest/Resources/RadialGradient.png differ diff --git a/Tests/Manual/CPPredicateEditorCibTest/AppController.j b/Tests/Manual/CPPredicateEditorCibTest/AppController.j index d648e7f74..4a46e8bc0 100644 --- a/Tests/Manual/CPPredicateEditorCibTest/AppController.j +++ b/Tests/Manual/CPPredicateEditorCibTest/AppController.j @@ -13,7 +13,7 @@ { CPWindow window; CPPredicateEditor predicateEditor; - + CPTableView leftTable; CPTableView rightTable; CPPopUpButton rightExpressionsType; @@ -28,7 +28,7 @@ + (void)initialize { var transformer = [[PredicateTransformer alloc] init]; - [CPValueTransformer setValueTransformer:transformer forName:@"PredicateTransformer"]; + [CPValueTransformer setValueTransformer:transformer forName:@"PredicateTransformer"]; } - (void)awakeFromCib @@ -109,7 +109,7 @@ template = [[CPPredicateEditorRowTemplate alloc] initWithLeftExpressions:leftExpressions rightExpressionAttributeType:CPStringAttributeType modifier:0 operators:operators options:0]; else if (type == 1) template = [[CPPredicateEditorRowTemplate alloc] initWithLeftExpressions:leftExpressions rightExpressionAttributeType:CPInteger16AttributeType modifier:0 operators:operators options:0]; - else if (type ==2) + else if (type == 2) { var rightExpressions = [CPMutableArray array], count = [rightConstants count]; @@ -121,6 +121,8 @@ template = [[CPPredicateEditorRowTemplate alloc] initWithLeftExpressions:leftExpressions rightExpressions:rightExpressions modifier:0 operators:operators options:0]; } + else if (type == 3) + template = [[CPPredicateEditorRowTemplate alloc] initWithLeftExpressions:leftExpressions rightExpressionAttributeType:CPDateAttributeType modifier:0 operators:operators options:0]; var templates = [[predicateEditor rowTemplates] arrayByAddingObject:template]; [predicateEditor setRowTemplates:templates]; diff --git a/Tests/Manual/CPPredicateEditorCibTest/Resources/MainMenu.cib b/Tests/Manual/CPPredicateEditorCibTest/Resources/MainMenu.cib index 9977f32bf..ae37f3145 100644 --- a/Tests/Manual/CPPredicateEditorCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPPredicateEditorCibTest/Resources/MainMenu.cib @@ -1 +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;66E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;104E;D;K;6;CP$UIDd;3;105E;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;3;106E;D;K;6;CP$UIDd;3;108E;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;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;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;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;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;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;199E;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;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;229E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;245E;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;247E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;3;251E;D;K;6;CP$UIDd;3;252E;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;254E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;258E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;260E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;267E;D;K;6;CP$UIDd;3;269E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;271E;D;K;6;CP$UIDd;3;272E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;274E;D;K;6;CP$UIDd;3;275E;D;K;6;CP$UIDd;3;276E;D;K;6;CP$UIDd;3;277E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;279E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;280E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;283E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;284E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;285E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;286E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;287E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;289E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;291E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;292E;D;K;6;CP$UIDd;3;293E;D;K;6;CP$UIDd;3;294E;D;K;6;CP$UIDd;3;295E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;296E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;299E;D;K;6;CP$UIDd;3;300E;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;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;108E;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;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;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;203E;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;188E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;209E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;231E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;243E;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;246E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;249E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;252E;D;K;6;CP$UIDd;3;252E;D;K;6;CP$UIDd;3;240E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;256E;D;K;6;CP$UIDd;3;255E;D;K;6;CP$UIDd;3;259E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;267E;D;K;6;CP$UIDd;3;269E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;272E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;273E;D;K;6;CP$UIDd;3;276E;D;K;6;CP$UIDd;3;277E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;279E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;280E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;283E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;284E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;285E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;286E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;287E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;289E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;291E;D;K;6;CP$UIDd;3;300E;D;K;6;CP$UIDd;3;300E;D;K;6;CP$UIDd;3;300E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;295E;D;K;6;CP$UIDd;3;233E;D;K;6;CP$UIDd;3;296E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;291E;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;301E;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;302E;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;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;295E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;267E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;305E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;240E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;291E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;307E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;276E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;264E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;297E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;231E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;240E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;267E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;267E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;276E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;276E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;303E;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;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;312E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;314E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;171E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;315E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;177E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;316E;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;176E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;170E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;169E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;320E;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;321E;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;322E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;179E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;323E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;175E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;324E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;325E;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;3;106E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;327E;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;328E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;159E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;160E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;330E;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;331E;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;332E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;139E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;154E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;334E;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;335E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;336E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;155E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;337E;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;338E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;150E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;339E;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;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;143E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;341E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;153E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;342E;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;343E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;183E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;184E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;345E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;156E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;347E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;164E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;348E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;165E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;349E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;222E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;350E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;223E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;351E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;224E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;352E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;225E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;353E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;227E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;228E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;229E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;192E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;357E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;216E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;358E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;218E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;359E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;219E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;360E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;210E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;361E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;211E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;362E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;212E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;213E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;364E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;214E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;365E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;205E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;366E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;206E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;367E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;207E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;368E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;199E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;369E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;200E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;370E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;201E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;371E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;202E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;372E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;262E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;240E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;373E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;272E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;374E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;285E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;283E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;282E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;284E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;287E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;288E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;286E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;291E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;376E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;280E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;377E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;289E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;375E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;295E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;297E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;378E;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;3;103E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;240E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;299E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;379E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;380E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;381E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;3;103E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;296E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;299E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;379E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;380E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;381E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;384E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;301E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;385E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;386E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;387E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;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;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;388E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;391E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;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;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;397E;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;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;398E;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;111E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;399E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;400E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;400E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;401E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;402E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;403E;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;117E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;404E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;405E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;406E;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;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;407E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;408E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;409E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;410E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;411E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;127E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;411E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;412E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;413E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;414E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;405E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;415E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;416E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;131E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;416E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;417E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;418E;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;131E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;419E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;420E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;134E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;420E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;421E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;422E;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;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;423E;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;424E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;425E;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;426E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;427E;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;428E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;429E;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;430E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;431E;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;432E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;433E;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;434E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;436E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;145E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;436E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;437E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;438E;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;439E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;145E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;440E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;441E;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;145E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;442E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;443E;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;444E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;145E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;445E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;446E;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;447E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;145E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;448E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;449E;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;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;145E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;451E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;452E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;152E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;452E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;453E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;454E;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;152E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;455E;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;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;456E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;457E;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;152E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;458E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;459E;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;152E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;460E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;158E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;460E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;461E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;462E;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;158E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;463E;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;158E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;464E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;162E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;134E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;464E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;465E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;466E;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;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;451E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;467E;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;447E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;448E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;468E;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;439E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;162E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;440E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;469E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;167E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;469E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;470E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;471E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;472E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;473E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;474E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;475E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;476E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;477E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;478E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;479E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;480E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;481E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;167E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;481E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;482E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;483E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;484E;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;174E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;485E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;486E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;435E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;487E;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;167E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;488E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;167E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;489E;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;167E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;167E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;490E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;182E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;490E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;491E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;492E;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;182E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;493E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;415E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;494E;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;182E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;495E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;186E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;495E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;496E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;497E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;188E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;497E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;498E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;499E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;500E;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;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;493E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;501E;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;447E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;502E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;503E;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;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;504E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;505E;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;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;506E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;507E;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;439E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;508E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;509E;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;510E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;511E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;512E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;198E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;512E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;513E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;514E;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;198E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;515E;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;198E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;516E;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;198E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;517E;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;198E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;518E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;204E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;518E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;519E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;514E;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;204E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;515E;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;204E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;520E;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;204E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;521E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;209E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;521E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;522E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;514E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;523E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;524E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;525E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;526E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;527E;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;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;528E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;529E;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;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;432E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;415E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;530E;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;188E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;430E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;415E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;531E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;389E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;531E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;532E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;533E;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;221E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;534E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;535E;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;221E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;536E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;537E;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;221E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;538E;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;221E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;539E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;393E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;394E;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;395E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;221E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;540E;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;221E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;541E;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;221E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;432E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;542E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;543E;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;221E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;430E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;542E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;230E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;544E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;545E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;546E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;547E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;548E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;549E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;388E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;233E;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;232E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;551E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;551E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;552E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;234E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;233E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;554E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;555E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;556E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;558E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;560E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;237E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;238E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;561E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;393E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;395E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;393E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;562E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;447E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;550E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;235E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;563E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;564E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;235E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;235E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;569E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;393E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;570E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;235E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;571E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;572E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;235E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;235E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;573E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;395E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;450E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPPredicateEditorK;8;$classesA;S;17;CPPredicateEditorS;12;CPRuleEditorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;239E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;560E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;574E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;574E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;575E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;560E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;576E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;577E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;20;CPRuleEditorEditableD;K;6;CP$UIDd;3;393E;K;35;CPRuleEditorAllowsEmptyCompoundRowsD;K;6;CP$UIDd;3;395E;K;25;CPRuleEditorDisallowEmptyD;K;6;CP$UIDd;3;393E;K;30;CPRuleEditorAlignmentGridWidthD;K;6;CP$UIDd;3;578E;K;23;CPRuleEditorSliceHeightD;K;6;CP$UIDd;3;579E;K;23;CPRuleEditorNestingModeD;K;6;CP$UIDd;3;439E;K;27;CPRuleEditorStringsFilenameD;K;6;CP$UIDd;3;580E;K;26;CPRuleEditorRowTypeKeyPathD;K;6;CP$UIDd;3;581E;K;24;CPRuleEditorItemsKeyPathD;K;6;CP$UIDd;3;582E;K;25;CPRuleEditorValuesKeyPathD;K;6;CP$UIDd;3;583E;K;29;CPRuleEditorBoundArrayKeyPathD;K;6;CP$UIDd;3;584E;K;31;CPRuleEditorSubrowsArrayKeyPathD;K;6;CP$UIDd;3;585E;K;24;CPRuleEditorSlicesHolderD;K;6;CP$UIDd;1;0E;K;18;CPRuleEditorSlicesD;K;6;CP$UIDd;3;586E;K;27;CPRuleEditorBoundArrayOwnerD;K;6;CP$UIDd;3;588E;K;20;CPPredicateTemplatesD;K;6;CP$UIDd;3;589E;E;D;K;10;$classnameS;28;CPPredicateEditorRowTemplateK;8;$classesA;S;28;CPPredicateEditorRowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;241E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;447E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;3;550E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;3;550E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;3;550E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;3;550E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;3;395E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;3;395E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;590E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;591E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;592E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;447E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;594E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;450E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;595E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;596E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;246E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;241E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;450E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;3;550E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;3;550E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;3;550E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;3;597E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;3;395E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;3;393E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;598E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;599E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;600E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;602E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;603E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;604E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;605E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;606E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;510E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;607E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;608E;E;D;K;6;$classD;K;6;CP$UIDd;3;241E;K;23;CPPredicateTemplateTypeD;K;6;CP$UIDd;3;450E;K;26;CPPredicateTemplateOptionsD;K;6;CP$UIDd;3;550E;K;27;CPPredicateTemplateModifierD;K;6;CP$UIDd;3;550E;K;36;CPPredicateTemplateLeftAttributeTypeD;K;6;CP$UIDd;3;550E;K;37;CPPredicateTemplateRightAttributeTypeD;K;6;CP$UIDd;3;609E;K;33;CPPredicateTemplateLeftIsWildcardD;K;6;CP$UIDd;3;395E;K;34;CPPredicateTemplateRightIsWildcardD;K;6;CP$UIDd;3;393E;K;24;CPPredicateTemplateViewsD;K;6;CP$UIDd;3;610E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;611E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;612E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;256E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;613E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;603E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;256E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;614E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;394E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;615E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;616E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;259E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;K;30;CPMenuItemRepresentedObjectKeyD;K;6;CP$UIDd;3;447E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;233E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;617E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;618E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;619E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;620E;K;16;$aimage-positionD;K;6;CP$UIDd;3;550E;K;6;$afontD;K;6;CP$UIDd;3;622E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;447E;K;7;$aimageD;K;6;CP$UIDd;3;624E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;450E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;508E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;625E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;550E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;550E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;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;263E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;233E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;626E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;627E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;628E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;629E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;550E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;630E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$acontent-marginD;K;6;CP$UIDd;3;632E;K;15;$acorner-radiusD;K;6;CP$UIDd;3;550E;K;14;$aborder-widthD;K;6;CP$UIDd;3;550E;K;18;$abackground-colorD;K;6;CP$UIDd;3;634E;K;12;CPBoxTypeKeyD;K;6;CP$UIDd;3;510E;K;18;CPBoxBorderTypeKeyD;K;6;CP$UIDd;3;450E;K;10;CPBoxTitleD;K;6;CP$UIDd;3;635E;K;18;CPBoxTitlePositionD;K;6;CP$UIDd;3;550E;K;14;CPBoxTitleViewD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;234E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;637E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;638E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;639E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;558E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;640E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;271E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;270E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;561E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;393E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;393E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;393E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;641E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;447E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;550E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;266E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;640E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;642E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;642E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;640E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;643E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;12;$agrid-colorD;K;6;CP$UIDd;3;645E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;646E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;647E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;550E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;510E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;395E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;393E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;393E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;393E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;393E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;648E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;645E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;550E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;393E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;1;0E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;268E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;649E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;650E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;651E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;653E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;654E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;439E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;395E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;393E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;265E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;655E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;656E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;265E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;265E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;573E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;395E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;657E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;265E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;658E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;659E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;265E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;265E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;569E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;393E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;660E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;661E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;662E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;619E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;620E;K;16;$aimage-positionD;K;6;CP$UIDd;3;550E;K;6;$afontD;K;6;CP$UIDd;3;622E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;447E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;450E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;508E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;625E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;550E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;550E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;234E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;663E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;638E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;664E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;558E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;665E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;274E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;275E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;561E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;561E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;393E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;393E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;393E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;666E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;447E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;550E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;273E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;658E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;659E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;273E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;273E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;569E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;393E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;660E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;273E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;655E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;656E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;273E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;566E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;567E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;568E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;273E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;573E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;550E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;395E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;657E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;266E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;665E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;642E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;642E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;665E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;643E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;644E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;12;$agrid-colorD;K;6;CP$UIDd;3;645E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;646E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;647E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;550E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;510E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;395E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;393E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;393E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;393E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;393E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;667E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;645E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;550E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;393E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;1;0E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;268E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;649E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;650E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;651E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;668E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;669E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;439E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;395E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;393E;K;28;CPSortDescriptorPrototypeKeyD;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;3;278E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;670E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;671E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;672E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;447E;K;11;$aalignmentD;K;6;CP$UIDd;3;510E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;393E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;674E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;675E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;395E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;395E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;395E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;676E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;447E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;510E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;677E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;662E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;619E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;620E;K;16;$aimage-positionD;K;6;CP$UIDd;3;550E;K;6;$afontD;K;6;CP$UIDd;3;622E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;447E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;450E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;508E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;625E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;550E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;550E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;678E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;679E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;680E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;682E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;565E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;683E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;684E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;685E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;686E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;687E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;688E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;689E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;447E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;690E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;688E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;691E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;692E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;693E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;694E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;695E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;510E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;696E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;688E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;697E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;608E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;698E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;684E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;699E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;281E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;700E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;688E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;681E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;16;$aimage-positionD;K;6;CP$UIDd;3;447E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;701E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;450E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;450E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;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;290E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;636E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;300E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;702E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;703E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;636E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;557E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;704E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;705E;K;6;$afontD;K;6;CP$UIDd;3;622E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;510E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;550E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;706E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;550E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;447E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;707E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;291E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;300E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;708E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;291E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;300E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;709E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;291E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;593E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;450E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;300E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;390E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;233E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;710E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;711E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;629E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;619E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;712E;K;16;$aimage-positionD;K;6;CP$UIDd;3;550E;K;6;$afontD;K;6;CP$UIDd;3;622E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;550E;K;11;$aalignmentD;K;6;CP$UIDd;3;447E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;450E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;510E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;713E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;394E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;395E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;625E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;550E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;393E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;550E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;550E;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;278E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;233E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;714E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;715E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;233E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;576E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;672E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;716E;K;6;$afontD;K;6;CP$UIDd;3;673E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;447E;K;11;$aalignmentD;K;6;CP$UIDd;3;510E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;394E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;675E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;393E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;393E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;393E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;643E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;447E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;510E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;717E;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;298E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;718E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;393E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;393E;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;719E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;720E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;231E;E;E;S;8;delegateS;11;addTemplateS;9;leftTableS;15;predicateEditorS;20;rightExpressionsTypeS;10;rightTableS;11;templateBoxS;6;windowS;10;dataSourceS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;14;runPageLayout:S;6;print:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;5;hide:S;10;terminate:S;22;hideOtherApplications:S;22;unhideAllApplications: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;10;alignLeft:S;12;alignCenter:S;15;alignJustified:S;11;alignRight:S;12;toggleRuler:S;10;copyRuler:S;11;pasteRuler:S;10;underline:S;21;orderFrontColorPanel:S;9;copyFont:S;10;pasteFont:S;9;unscript:S;12;superscript:S;10;subscript:S;14;raiseBaseline:S;14;lowerBaseline:S;21;useStandardLigatures:S;17;turnOffLigatures:S;16;useAllLigatures:S;19;useStandardKerning:S;15;turnOffKerning:S;15;tightenKerning:S;14;loosenKerning:S;7;addRow:S;15;addLeftKeyPath:S;16;updateOperators:S;25;selectRightAttributeType:S;17;addRightConstant:S;12;addTemplate:S;26;value: selection.predicateS;5;valueS;19;selection.predicateD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;382E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;382E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;721E;K;27;CPConditionallySetsEditableD;K;6;CP$UIDd;3;395E;K;38;CPAllowsEditingMultipleValuesSelectionD;K;6;CP$UIDd;3;395E;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;3;116E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;130E;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;3;115E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;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;3;118E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;121E;E;E;S;20;About NewApplicationS;19;Hide NewApplicationS;1;hS;8;Show AllS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;8;ServicesS;15;_CPServicesMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;11;Hide Othersd;7;1572864S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;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;137E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;157E;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;150E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;147E;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;155E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;156E;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;160E;D;K;6;CP$UIDd;3;159E;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;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;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;172E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;170E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;6;Print…S;1;pS;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;175E;E;E;S;10;Clear MenuS;13;Page Setup...S;1;PS;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;183E;D;K;6;CP$UIDd;3;184E;E;E;S;12;Show ToolbarS;1;tS;18;Customize Toolbar…S;6;FormatD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;220E;E;E;S;4;FontS;11;_CPFontMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;216E;D;K;6;CP$UIDd;3;217E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;219E;E;E;S;10;Show FontsS;4;BoldS;1;bS;6;ItalicS;1;iS;9;UnderlineS;1;uS;6;BiggerS;1;+S;7;Smallerd;1;4S;1;-S;4;KernD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;199E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;E;E;S;11;Use DefaultS;8;Use NoneS;7;TightenS;6;LoosenS;8;LigatureD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;E;E;S;7;Use AllS;8;BaselineD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;210E;D;K;6;CP$UIDd;3;211E;D;K;6;CP$UIDd;3;212E;D;K;6;CP$UIDd;3;213E;D;K;6;CP$UIDd;3;214E;E;E;S;11;SuperscriptS;9;SubscriptS;5;RaiseS;5;LowerS;11;Show ColorsS;1;CS;10;Copy StyleS;11;Paste StyleS;4;TextD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;222E;D;K;6;CP$UIDd;3;223E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;227E;D;K;6;CP$UIDd;3;228E;D;K;6;CP$UIDd;3;229E;E;E;S;10;Align LeftS;1;{S;6;CenterS;1;|S;7;JustifyS;11;Align RightS;1;}S;10;Show RulerS;10;Copy Rulerd;7;1310720S;11;Paste RulerS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;23;{{335, 77}, {960, 534}}S;22;{{0, 0}, {1680, 1028}}d;2;15d;1;0S;20;{{0, 0}, {960, 534}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;262E;D;K;6;CP$UIDd;3;296E;D;K;6;CP$UIDd;3;235E;D;K;6;CP$UIDd;3;264E;D;K;6;CP$UIDd;3;295E;E;E;S;6;normalS;22;{{20, 74}, {611, 164}}S;20;{{0, 0}, {611, 164}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;560E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;238E;D;K;6;CP$UIDd;3;562E;E;E;d;2;36S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;559E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;235E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;722E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;574E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;723E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;235E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;724E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;240E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;3;232E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;235E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;235E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;E;S;21;{{336, 79}, {15, 84}}S;18;{{0, 0}, {15, 84}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;27;_verticalScrollerDidScroll:f;17;0.977011501789093S;24;{{-100, 249}, {360, 15}}S;19;{{0, 0}, {360, 15}}S;29;_horizontalScrollerDidScroll:S;20;{{0, 0}, {609, 162}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;727E;E;E;d;2;38S;11;rule-editord;2;75d;2;26S;14;format.stringsS;7;rowTypeS;8;criteriaS;13;displayValuesS;10;boundArrayS;7;subrowsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;33;_CPRuleEditorViewUnboundRowHolderK;8;$classesA;S;33;_CPRuleEditorViewUnboundRowHolderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;587E;K;12;CPBoundArrayD;K;6;CP$UIDd;3;728E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;255E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;729E;D;K;6;CP$UIDd;3;730E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;245E;E;E;S;3;AnyS;17;_popUpItemAction:S;3;AllD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;247E;E;E;S;25;of the following are trued;3;700D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;731E;D;K;6;CP$UIDd;3;732E;D;K;6;CP$UIDd;3;733E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;250E;D;K;6;CP$UIDd;3;251E;E;E;S;6;stringD;K;10;$classnameS;20;_CPKeyPathExpressionK;8;$classesA;S;20;_CPKeyPathExpressionS;21;_CPFunctionExpressionS;12;CPExpressionS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;601E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;734E;K;11;CPArgumentsD;K;6;CP$UIDd;3;735E;K;9;CPOperandD;K;6;CP$UIDd;3;737E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;439E;E;S;5;mixedD;K;6;$classD;K;6;CP$UIDd;3;601E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;734E;K;11;CPArgumentsD;K;6;CP$UIDd;3;738E;K;9;CPOperandD;K;6;CP$UIDd;3;737E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;439E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;254E;E;E;S;2;isS;7;matchesd;1;6d;3;300D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;739E;D;K;6;CP$UIDd;3;740E;D;K;6;CP$UIDd;3;741E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;258E;E;E;S;6;numberD;K;6;$classD;K;6;CP$UIDd;3;601E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;734E;K;11;CPArgumentsD;K;6;CP$UIDd;3;742E;K;9;CPOperandD;K;6;CP$UIDd;3;737E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;439E;E;D;K;6;$classD;K;6;CP$UIDd;3;601E;K;14;CPSelectorNameD;K;6;CP$UIDd;3;734E;K;11;CPArgumentsD;K;6;CP$UIDd;3;743E;K;9;CPOperandD;K;6;CP$UIDd;3;737E;K;16;CPExpressionTypeD;K;6;CP$UIDd;3;439E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;260E;E;E;S;15;is greater thanS;22;{{599, 240}, {30, 25}}S;18;{{0, 0}, {30, 25}}S;6;buttonS;17;selected+borderedD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;621E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;744E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;745E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;393E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;395E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;393E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;623E;K;4;nameD;K;6;CP$UIDd;3;746E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;747E;K;5;valueD;K;6;CP$UIDd;3;748E;E;d;2;14S;23;{{705, 36}, {234, 434}}S;20;{{0, 0}, {234, 434}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;636E;E;E;d;2;33S;3;boxD;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;631E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;749E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;633E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;750E;E;S;3;BoxD;K;6;$classD;K;6;CP$UIDd;3;232E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;264E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;806E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;807E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;808E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;264E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;768E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;E;S;20;{{9, 30}, {218, 97}}S;19;{{0, 0}, {218, 97}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;640E;D;K;6;CP$UIDd;3;271E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;641E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;559E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;265E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;751E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;642E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;752E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;265E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;753E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;267E;E;D;K;6;$classD;K;6;CP$UIDd;3;232E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;265E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;265E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;E;S;19;{{0, 0}, {216, 95}}D;K;6;$classD;K;6;CP$UIDd;3;633E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;754E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;633E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;755E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;269E;E;E;d;3;213d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;652E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;756E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;757E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;6;$afontD;K;6;CP$UIDd;3;758E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;550E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;394E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;758E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;550E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;510E;E;D;K;6;$classD;K;6;CP$UIDd;3;278E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;672E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;759E;K;6;$afontD;K;6;CP$UIDd;3;760E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;510E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;447E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;15;$acontent-insetD;K;6;CP$UIDd;3;761E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;394E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;675E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;510E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;550E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;394E;E;S;21;{{1, -37}, {223, 15}}S;19;{{0, 0}, {223, 15}}f;18;0.9953917050691244S;23;{{224, -22}, {15, 102}}S;19;{{0, 0}, {15, 102}}f;18;0.9925373134328358S;20;{{8, 125}, {25, 25}}S;18;{{0, 0}, {25, 25}}S;21;{{9, 302}, {218, 97}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;665E;D;K;6;CP$UIDd;3;274E;D;K;6;CP$UIDd;3;275E;D;K;6;CP$UIDd;3;666E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;559E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;273E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;550E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;751E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;642E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;762E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;273E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;565E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;753E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;276E;E;D;K;6;$classD;K;6;CP$UIDd;3;232E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;273E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;273E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;277E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;652E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;763E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;757E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;553E;K;6;$afontD;K;6;CP$UIDd;3;758E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;550E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;394E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;758E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;550E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;510E;E;D;K;6;$classD;K;6;CP$UIDd;3;278E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;725E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;725E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;672E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;759E;K;6;$afontD;K;6;CP$UIDd;3;764E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;510E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;447E;K;11;$aalignmentD;K;6;CP$UIDd;3;550E;K;15;$acontent-insetD;K;6;CP$UIDd;3;765E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;394E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;675E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;510E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;550E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;394E;E;S;20;{{10, 5}, {136, 17}}S;19;{{0, 0}, {136, 17}}S;9;textfieldD;K;6;$classD;K;6;CP$UIDd;3;621E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;744E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;745E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;395E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;395E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;393E;E;S;10;Key Paths:d;4;3072D;K;6;$classD;K;6;CP$UIDd;3;633E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;766E;E;S;20;{{7, 397}, {25, 25}}d;1;9S;22;{{144, 198}, {84, 21}}S;18;{{0, 0}, {84, 21}}S;9;check-boxS;9;Ends WithS;21;{{14, 198}, {96, 21}}S;18;{{0, 0}, {96, 21}}S;11;Begins Withd;1;5S;21;{{72, 172}, {33, 21}}S;18;{{0, 0}, {33, 21}}S;1;≠S;22;{{127, 172}, {33, 21}}S;1;>d;2;99S;22;{{144, 224}, {78, 21}}S;18;{{0, 0}, {78, 21}}S;8;ContainsS;21;{{14, 172}, {33, 21}}S;1;=S;21;{{14, 224}, {96, 21}}S;7;MatchesS;22;{{189, 172}, {33, 21}}S;1;d;2;99S;22;{{144, 224}, {78, 21}}S;18;{{0, 0}, {78, 21}}S;8;ContainsS;21;{{14, 172}, {33, 21}}S;1;=S;20;{{10, 5}, {136, 17}}S;19;{{0, 0}, {136, 17}}S;10;Key Paths:D;K;6;$classD;K;6;CP$UIDd;3;575E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;772E;E;S;21;{{9, 302}, {218, 97}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;293E;D;K;6;CP$UIDd;3;296E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;712E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;232E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;292E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;739E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;739E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;292E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;558E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;559E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;559E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;401E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;294E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;295E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;668E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;739E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;739E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;773E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;764E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;558E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;555E;K;6;$afontD;K;6;CP$UIDd;3;765E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;559E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;559E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;401E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;400E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;766E;E;D;K;6;$classD;K;6;CP$UIDd;3;236E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;767E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;768E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;573E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;769E;K;11;$aalignmentD;K;6;CP$UIDd;3;555E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;500E;K;6;$afontD;K;6;CP$UIDd;3;566E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;559E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;559E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;401E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;770E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;771E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;399E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;399E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;401E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;659E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;500E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;555E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{8, 125}, {25, 25}}D;K;6;$classD;K;6;CP$UIDd;3;567E;K;4;nameD;K;6;CP$UIDd;3;735E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;736E;K;5;valueD;K;6;CP$UIDd;3;737E;E;S;21;{{14, 224}, {96, 21}}S;7;MatchesS;22;{{189, 172}, {33, 21}}S;1; - - - 1060 - 11E53 - 851 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 851 - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - - - NewApplication - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - NewApplication - - - - About NewApplication - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide NewApplication - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit NewApplication - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - - - 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 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - - - 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 - - - - 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 - - - - 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 - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - - - Font - - 2147483647 - - - submenuAction: - - Font - - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - - - NewApplication Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 15 - 2 - {{335, 417}, {960, 534}} - 1946157056 - Window - NSWindow - - - {1.7976931348623157e+308, 1.7976931348623157e+308} - - - 256 - - - - 268 - {{601, 264}, {30, 30}} - - - YES - - -2080244224 - 134217728 - + - - LucidaGrande - 13 - 1040 - - - -2038021889 - 134 - - LucidaGrande - 13 - 16 - - - - 400 - 75 - - - - - 270 - {{20, 478}, {611, 22}} - - - YES - - -1804468671 - 268436480 - - - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - 3 - MAA - - - - - - - 268 - - - - 2304 - - - - 294 - - - - 274 - - - - 290 - - - - 257 - {{581, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - + - - LucidaGrande-Bold - 12 - 16 - - - - add - - - - - _addOption: - - -2038284033 - 36 - - LucidaGrande - 12 - 4880 - - - 400 - 75 - - - - - -2147483391 - {{561, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - - - - - - remove - - - - - _deleteOption: - - -2038284033 - 36 - - - 400 - 75 - - - - - 256 - {{7, 4}, {58, 19}} - - - -1 - YES - - 67239488 - 4196352 - - LucidaGrande - 11 - 3088 - - - - -2038284033 - 36 - - LucidaGrande - 11 - 16 - - - 400 - 75 - - - Any - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - - YES - - - - - - - All - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - - 3 - YES - YES - 2 - - - - - 256 - {{71, 4}, {167, 19}} - - - -1 - YES - - 67239488 - 4196352 - - - -2038284033 - 36 - - - 400 - 75 - - - of the following are true - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - - - - - - 3 - YES - YES - 2 - - - - {609, 26} - - - 0 - 0 - - - - - - - 2 - {{7, 4}, {58, 19}} - {{71, 4}, {167, 19}} - - - - - 2 - 0 - 0 - 0 - 0 - - - - - NO - NO - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PredicateTransformer - - - - - - 2 - {{7, 4}, {58, 19}} - {{71, 4}, {167, 19}} - - - 0 - 0 - YES - - - - 290 - - - - 257 - {{581, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - + - - - - add - - - - - _addOption: - - -2038284033 - 36 - - - 400 - 75 - - - - - 257 - {{561, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - - - - - - remove - - - - - _deleteOption: - - -2038284033 - 36 - - - 400 - 75 - - - - - 256 - {{37, 4}, {79, 19}} - - - -1 - YES - - 67239488 - 4196352 - - - 3 - valueForKey: - - 1 - - - - 10 - string - - - - - -2038284033 - 36 - - - 400 - 75 - - - string - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - - YES - - - - - - - mixed - - 1048576 - 2147483647 - - - _popUpItemAction: - - 3 - valueForKey: - - - - 10 - mixed - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + string + + + mixed + - - - - - - - 3 - YES - YES - 2 - - - - - 256 - {{122, 4}, {99, 19}} - - - -1 - YES - - 67239488 - 4196352 - - - - -2038284033 - 36 - - - 400 - 75 - - - is - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - - YES - - - - - - - matches - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - - 3 - YES - YES - 2 - - - - - 256 - {{227, 4}, {160, 18}} - - - YES - - 343014976 - 4326400 - - - - YES - - - 6 - System - controlTextColor - - - - - - {{0, 26}, {609, 26}} - - - 1 - 1 - - - - - - - - 3 - {{37, 4}, {79, 19}} - {{122, 4}, {99, 19}} - {{227, 4}, {160, 18}} - - - - - 1 - 0 - 0 - 0 - 700 - - - - - - NO - YES - - - - - - - - - - - - 3 - {{37, 4}, {79, 19}} - {{122, 4}, {99, 19}} - {{227, 4}, {160, 18}} - - - 0 - 0 - YES - - - - 290 - - - - 257 - {{581, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - + - - - - add - - - - - _addOption: - - -2038284033 - 36 - - - 400 - 75 - - - - - 257 - {{561, 4}, {18, 18}} - - - -1 - YES - - 67239424 - 134348800 - - - - - - remove - - - - - _deleteOption: - - -2038284033 - 36 - - - 400 - 75 - - - - - 256 - {{37, 4}, {74, 19}} - - - -1 - YES - - 67239488 - 4196352 - - - 3 - valueForKey: - - - - 10 - number - - - - - -2038284033 - 36 - - - 400 - 75 - - - number - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - - YES - - - - - - - mixed - - 1048576 - 2147483647 - - - _popUpItemAction: - - 3 - valueForKey: - - - - 10 - mixed - + + + + + + + string + + + + + mixed + + + + + + + + + + + + + + + + + + + + number + + + mixed + - - - - - - 3 - YES - YES - 2 - - - - - 256 - {{117, 4}, {82, 19}} - - - -1 - YES - - 67239488 - 4196352 - - - - -2038284033 - 36 - - - 400 - 75 - - - is greater than - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - - YES - - - - - - - 3 - YES - YES - 2 - - - - - 256 - {{205, 4}, {25, 18}} - - - YES - - 343014976 - 4326400 - - - - YES - - - - - - {{0, 52}, {609, 26}} - - - 2 - 1 - - - - - - - - 3 - {{37, 4}, {74, 19}} - {{117, 4}, {82, 19}} - {{205, 4}, {25, 18}} - - - - - 1 - 0 - 0 - 0 - 300 - - - - - - NO - YES - - - - - - - - - - - - 3 - {{37, 4}, {74, 19}} - {{117, 4}, {82, 19}} - {{205, 4}, {25, 18}} - - - 0 - 0 - YES - - - {609, 162} - - - - - - NSRuleEditorItemPBoardType - - {609, 162} - - - YES - 75 - 26 - format.strings - YES - NO - YES - 3 - rowType - subrows - criteria - displayValues - boundArray - NSMutableDictionary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{1, 1}, {609, 162}} - - - - - 3 - MC45MTAwMDAwMjYyAA - - 4 - - - - -2147483392 - {{336, 1}, {15, 84}} - - - - _doScroller: - 0.97701150178909302 - - - - -2147483392 - {{-100, -100}, {360, 15}} - - - 1 - - _doScroller: - - - {{20, 296}, {611, 164}} - - - 133650 - - - - - - - 9 - - - - 274 - - - - 268 - {{9, 11}, {25, 25}} - - - YES - - -2080244224 - 134217728 - + - - - -2038152961 - 134 - - - 400 - 75 - - - - - 268 - - - - 2304 - - - - 256 - {216, 95} - - - YES - - - -2147483392 - {{224, 0}, {16, 17}} - - - - 213 - 40 - 1000 - - 75628096 - 2048 - - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - - - - 337772096 - 2048 - Text Cell - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - - 3 - YES - YES - - - - 3 - 2 - - - 6 - System - gridColor - - 3 - MC41AA - - - 17 - -692060160 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 1}, {216, 95}} - - - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _doScroller: - 0.9925373134328358 - - - - -2147483392 - {{1, 119}, {223, 15}} - - - 1 - - _doScroller: - 0.99539170506912444 - - - {{9, 311}, {218, 97}} - - - 133682 - - - - QSAAAEEgAABBmAAAQZgAAA - - - - 268 - {{144, 219}, {84, 18}} - - - 9 - YES - - 67239424 - 0 - Ends With - - - 1211912703 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - - - - 268 - {{6, 145}, {223, 26}} - - - YES - - -2076049856 - 2048 - - - 109199615 - 129 - - - 400 - 75 - - - Strings - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - - - - Numbers - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Constant Values - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - - - - 268 - {{14, 219}, {96, 18}} - - - 8 - YES - - 67239424 - 0 - Begins With - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{72, 245}, {33, 18}} - - - 5 - YES - - 67239424 - 0 - - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{127, 245}, {33, 18}} - - - 2 - YES - - 67239424 - 0 - > - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{144, 193}, {78, 18}} - - - 99 - YES - - 67239424 - 0 - Contains - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{14, 245}, {33, 18}} - - - 4 - YES - - 67239424 - 0 - = - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{7, 416}, {142, 17}} - - - YES - - 68288064 - 272630784 - Key Paths: - - - - 6 - System - controlColor - - - - - - - - 268 - - - - 2304 - - - - 256 - {216, 95} - - - YES - - - -2147483392 - {{224, 0}, {16, 17}} - - - - 213 - 40 - 1000 - - 75628096 - 2048 - - - - 3 - MC4zMzMzMzI5ODU2AA - - - - - 337772096 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - 3 - 2 - - - 17 - -692060160 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 1}, {216, 95}} - - - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _doScroller: - 0.9925373134328358 - - - - -2147483392 - {{1, 119}, {223, 15}} - - - 1 - - _doScroller: - 0.99539170506912444 - - - {{9, 39}, {218, 97}} - - - 133682 - - - - QSAAAEEgAABBmAAAQZgAAA - - - - 268 - {{10, 283}, {25, 25}} - - - YES - - -2080244224 - 134217728 - + - - - -2038152961 - 134 - - - 400 - 75 - - - - - 268 - {{14, 193}, {96, 18}} - - - 6 - YES - - 67239424 - 0 - Matches - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{189, 245}, {33, 18}} - - - YES - - 67239424 - 0 - < - - - 1211912703 - 2 - - - - - 200 - 25 - - - - {{1, 1}, {240, 438}} - - - - - {{701, 60}, {242, 440}} - - - {0, 0} - - 67239424 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 4 - 0 - NO - - 1 - MC44OTExMjkwMzIzIDAuODkwMTM0MTM1OSAwLjg4OTk0NTgwNTEAA - - - - - 265 - {{837, 20}, {103, 25}} - - YES - - -1543373312 - 134217728 - Add Template - - - -2038152961 - 134 - - - 400 - 75 - - - - {960, 534} - - - - {{0, 0}, {1680, 1028}} - {1.7976931348623157e+308, 1.7976931348623157e+308} - YES - - - AppController - - - - predicate - - YES - YES - - - - - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - 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 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - raiseBaseline: - - - - 426 - - - - lowerBaseline: - - - - 427 - - - - copyFont: - - - - 428 - - - - subscript: - - - - 429 - - - - superscript: - - - - 430 - - - - tightenKerning: - - - - 431 - - - - underline: - - - - 432 - - - - orderFrontColorPanel: - - - - 433 - - - - useAllLigatures: - - - - 434 - - - - loosenKerning: - - - - 435 - - - - pasteFont: - - - - 436 - - - - unscript: - - - - 437 - - - - useStandardKerning: - - - - 438 - - - - useStandardLigatures: - - - - 439 - - - - turnOffLigatures: - - - - 440 - - - - turnOffKerning: - - - - 441 - - - - alignLeft: - - - - 442 - - - - alignJustified: - - - - 443 - - - - copyRuler: - - - - 444 - - - - alignCenter: - - - - 445 - - - - toggleRuler: - - - - 446 - - - - alignRight: - - - - 447 - - - - pasteRuler: - - - - 448 - - - - terminate: - - - - 449 - - - - delegate - - - - 475 - - - - addRow: - - - - 1131 - - - - delegate - - - - 1133 - - - - predicateEditor - - - - 1136 - - - - window - - - - 1138 - - - - leftTable - - - - 1318 - - - - rightExpressionsType - - - - 1320 - - - - rightTable - - - - 1321 - - - - templateBox - - - - 1322 - - - - addLeftKeyPath: - - - - 1323 - - - - addRightConstant: - - - - 1324 - - - - selectRightAttributeType: - - - - 1327 - - - - updateOperators: - - - - 1329 - - - - updateOperators: - - - - 1330 - - - - updateOperators: - - - - 1331 - - - - updateOperators: - - - - 1332 - - - - updateOperators: - - - - 1333 - - - - updateOperators: - - - - 1334 - - - - updateOperators: - - - - 1335 - - - - updateOperators: - - - - 1336 - - - - dataSource - - - - 1337 - - - - delegate - - - - 1338 - - - - dataSource - - - - 1339 - - - - delegate - - - - 1340 - - - - addTemplate: - - - - 1344 - - - - addTemplate - - - - 1345 - - - - value: selection.predicate - - - - - - value: selection.predicate - value - selection.predicate - 2 - - - 1435 - - - - value: selection.predicate - - - - - - value: selection.predicate - value - selection.predicate - - - - PredicateTransformer - - 2 - - - 1439 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - MainMenu - - - 19 - - - - - - - - 56 - - - - - - - - 103 - - - - - - 1 - - - 217 - - - - - - - - 83 - - - - - - - - 81 - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - - - - - - 126 - - - - - 205 - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - - - - 2 - - - 111 - - - - - 57 - - - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - - - - 372 - - - - - - - - - - - - 375 - - - - - - - - 376 - - - - - - - - - 377 - - - - - - - - 378 - - - - - - - - 379 - - - - - - - - - - - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - - - 387 - - - - - 388 - - - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - - - - - - 398 - - - - - - - - 399 - - - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - - - - - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - 471 - - - - - - - - 472 - - - - - 474 - - - AppController - - - 476 - - - - - - - - 477 - - - - - 1051 - - - - - - - - - - 1052 - - - - - 1053 - - - - - 1054 - - - - - - - - - - 1055 - - - - - - - - - 1056 - - - - - - - - - 1057 - - - - - - - - - 1058 - - - - - - - - - 1309 - - - - - - - - - - - - - - - - - - - - - 1280 - - - - - - - - 1281 - - - - - 1239 - - - - - - - - - - 1243 - - - - - - - - 1242 - - - - - 1240 - - - - - 1244 - - - - - - - - 1247 - - - - - 1256 - - - - - - - - 1257 - - - - - 1274 - - - - - - - - 1275 - - - - - - - - 1276 - - - - - - - - - - 1279 - - - - - 1278 - - - - - 1277 - - - - - 1254 - - - - - - - - 1255 - - - - - 1260 - - - - - - - - 1261 - - - - - 1252 - - - - - - - - 1253 - - - - - 1266 - - - - - - - - 1267 - - - - - 1262 - - - - - - - - 1263 - - - - - 1248 - - - - - - - - 1249 - - - - - 1268 - - - - - - - - - - 1271 - - - - - 1270 - - - - - 1269 - - - - - - - - 1272 - - - - - - - - 1273 - - - - - 1250 - - - - - - - - 1251 - - - - - 1264 - - - - - - - - 1265 - - - - - 1310 - - - - - - - - 1311 - - - - - 1342 - - - - - - - - 1343 - - - - - 1346 - - - - - 1347 - - - - - 1350 - - - - - - - - - 1351 - - - - - - - - - 1355 - - - - - - - - 1372 - - - - - 1377 - - - - - 1378 - - - - - 1381 - - - - - 1382 - - - - - 1414 - - - - - 1440 - - - - - - - - - 1441 - - - - - 1442 - - - - - 1443 - - - - - - - - 1444 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{0, 851}, {960, 534}} - com.apple.InterfaceBuilder.CocoaPlugin - {{0, 851}, {960, 534}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 1444 - - - - - AppController - NSObject - - id - id - id - id - id - id - id - id - - - - addLeftKeyPath: - id - - - addRightConstant: - id - - - addTemplate: - id - - - displayPredicate: - id - - - newTemplate: - id - - - predicateEditorAction: - id - - - selectRightAttributeType: - id - - - updateOperators: - id - - - - NSButton - NSTableView - NSPredicateEditor - NSTextField - NSPopUpButton - NSTableView - NSBox - NSWindow - - - - addTemplate - NSButton - - - leftTable - NSTableView - - - predicateEditor - NSPredicateEditor - - - predicateField - NSTextField - - - rightExpressionsType - NSPopUpButton - - - rightTable - NSTableView - - - templateBox - NSBox - - - window - NSWindow - - - - IBProjectSource - ./Classes/AppController.h - - - - NSDocument - - id - id - id - id - id - id - - - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - IBProjectSource - ./Classes/NSDocument.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - - 3 - - {11, 11} - {10, 3} - {15, 15} - - - + + + + + + + number + + + + + mixed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + predicate + + + + \ No newline at end of file diff --git a/Tests/Manual/CPRuleEditorCibTest/RuleDelegate.j b/Tests/Manual/CPRuleEditorCibTest/RuleDelegate.j index 3573e9822..b1caa79bd 100644 --- a/Tests/Manual/CPRuleEditorCibTest/RuleDelegate.j +++ b/Tests/Manual/CPRuleEditorCibTest/RuleDelegate.j @@ -78,7 +78,7 @@ var CPRuleEditorCustomControlClass = @"CPRuleEditorCustomControlClass"; (1) CPMenuItem: not implemented yet. */ -- (id)ruleEditor:(CPRuleEditor)editor displayValueForCriterion:(id)criterion inRow:(int)row +- (id)ruleEditor:(CPRuleEditor)editor displayValueForCriterion:(id)criterion inRow:(CPInteger)row { var custom_control_class = [criterion objectForKey:CPRuleEditorCustomControlClass]; @@ -98,7 +98,7 @@ var CPRuleEditorCustomControlClass = @"CPRuleEditorCustomControlClass"; return [criterion objectForKey:@"valeur"]; } -- (CPDictionary)ruleEditor:(CPRuleEditor)editor predicatePartsForCriterion:(id)criterion withDisplayValue:(id)value inRow:(int)row +- (CPDictionary)ruleEditor:(CPRuleEditor)editor predicatePartsForCriterion:(id)criterion withDisplayValue:(id)value inRow:(CPInteger)row { var predicatePartsForCriterion = @{}; diff --git a/Tests/Manual/CPTabView2/AppController.j b/Tests/Manual/CPTabView2/AppController.j index 9e4018f00..31ac4be3f 100644 --- a/Tests/Manual/CPTabView2/AppController.j +++ b/Tests/Manual/CPTabView2/AppController.j @@ -28,8 +28,8 @@ "First Tab", "a label", "Second Tab", "another label", "Third Tab", "a third label", - "Fourth Tab", "label 4", - /*"5th Tab", "label 5", + /*"Fourth Tab", "label 4", + "5th Tab", "label 5", "6th Tab", "label 6", "7th Tab", "label 7",*/ ]; @@ -45,9 +45,13 @@ [tabView1 addTabViewItem:item]; } + [tabView1 setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; [contentView addSubview:tabView1]; - [tabView1 setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + var insertedItem = [[CPTabViewItem alloc] initWithIdentifier:"inserted"]; + [insertedItem setView:[CPView new]]; + [insertedItem setLabel:"Inserted Tab"]; + [tabView1 insertTabViewItem:insertedItem atIndex:2]; var toggleButton = [CPButton buttonWithTitle:@"Cycle Tab View Type"]; [toggleButton setAction:@selector(switchTabType:)]; diff --git a/Tests/Manual/CPTableViewGroupRows/AppController.j b/Tests/Manual/CPTableViewGroupRows/AppController.j index bf80fb336..9518e2c2e 100644 --- a/Tests/Manual/CPTableViewGroupRows/AppController.j +++ b/Tests/Manual/CPTableViewGroupRows/AppController.j @@ -47,14 +47,14 @@ return [dataSource count]; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex { return dataSource[rowIndex]; } -- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(int)rowIndex +- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(CPInteger)rowIndex { return rowIndex == 5; } -@end \ No newline at end of file +@end diff --git a/Tests/Manual/CPTextFieldMovementsTest/AppController.j b/Tests/Manual/CPTextFieldMovementsTest/AppController.j new file mode 100644 index 000000000..67a6704ce --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/AppController.j @@ -0,0 +1,78 @@ +/* + * AppController.j + * CPTextFieldMovementsTest + * + * Created by Alexandre Wilhelm on October 29, 2013. + */ + +@import +@import +@import "CustomTextField.j" + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +- (void)controlTextDidEndEditing:(CPNotification)aNotification +{ + var movement = [[aNotification userInfo] valueForKey:@"CPTextMovement"]; + + console.log("controlTextDidEndEditing"); + + switch (movement) + { + case CPCancelTextMovement: + console.log(@"CPCancelTextMovement"); + break; + + case CPLeftTextMovement: + console.log(@"CPLeftTextMovement"); + break; + + case CPRightTextMovement: + console.log(@"CPRightTextMovement"); + break; + + case CPUpTextMovement: + console.log(@"CPUpTextMovement"); + break; + + case CPDownTextMovement: + console.log(@"CPDownTextMovement"); + break; + + case CPReturnTextMovement: + console.log(@"CPReturnTextMovement"); + break; + + case CPBacktabTextMovement: + console.log(@"CPBacktabTextMovement"); + break; + + case CPTabTextMovement: + console.log(@"CPTabTextMovement"); + break; + + case CPOtherTextMovement: + console.log(@"CPOtherTextMovement"); + break; + } +} + +@end diff --git a/Tests/Manual/CPTextFieldMovementsTest/CustomTextField.j b/Tests/Manual/CPTextFieldMovementsTest/CustomTextField.j new file mode 100644 index 000000000..8df4caa25 --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/CustomTextField.j @@ -0,0 +1,46 @@ +/* + * CustomTextField.j + * CPTextFieldMovementsTest + * + * Created by Alexandre Wilhelm on October 29, 2013. + */ + +@import +@import + +@implementation CustomTextField : CPTextField +{ +} + +- (id)init +{ + if (self = [super init]) + { + } + return self; +} + +- (void)keyDown:(CPEvent)anEvent +{ + var key = [anEvent charactersIgnoringModifiers]; + + if (key == CPLeftArrowFunctionKey) + { + [[self window] makeFirstResponder:[self previousKeyView]]; + return; + } + + if (key == CPRightArrowFunctionKey || + key == CPUpArrowFunctionKey || + key == CPDownArrowFunctionKey || + key == CPEscapeFunctionKey || + [anEvent keyCode] == CPReturnKeyCode) + { + [[self window] makeFirstResponder:[self nextKeyView]]; + return; + } + + [super keyDown:anEvent]; +} + +@end diff --git a/Tests/Manual/CPTextFieldMovementsTest/Info.plist b/Tests/Manual/CPTextFieldMovementsTest/Info.plist new file mode 100644 index 000000000..6ff2f6f73 --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTextFieldMovementsTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2013, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPTextFieldMovementsTest/Jakefile b/Tests/Manual/CPTextFieldMovementsTest/Jakefile new file mode 100644 index 000000000..702305450 --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/Jakefile @@ -0,0 +1,183 @@ +/* + * Jakefile + * CPTextFieldMovementsTest + * + * Created by Alexandre Wilhelm on October 29, 2013. + */ + +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"), + projectName = "CPTextFieldMovementsTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPTextFieldMovementsTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTextFieldMovementsTest"); + task.setIdentifier("com.yourcompany.CPTextFieldMovementsTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTextFieldMovementsTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +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", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPTextFieldMovementsTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPTextFieldMovementsTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (ENV["CONFIGURATION"] === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPTextFieldMovementsTest/Resources/MainMenu.cib b/Tests/Manual/CPTextFieldMovementsTest/Resources/MainMenu.cib new file mode 100644 index 000000000..78bf6284f --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/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;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;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;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;55E;D;K;6;CP$UIDd;2;57E;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;66E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;135E;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;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;3;102E;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;2;79E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;57E;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;2;57E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;2;11E;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;136E;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;137E;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;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;135E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;125E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;131E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;133E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;129E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;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;21E;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;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;68E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;83E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;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;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;136E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;174E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;175E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;176E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;60E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;177E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;186E;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;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;187E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;188E;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;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;189E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;190E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;67E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;67E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;190E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;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;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;193E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;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;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;71E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;71E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;196E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;197E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;198E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;199E;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;71E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;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;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;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;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;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;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;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;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;208E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;79E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;79E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;208E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;209E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;210E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;215E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;216E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;217E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;218E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;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;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;221E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;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;226E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;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;229E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;230E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;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;232E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;233E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;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;235E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;236E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;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;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;97E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;97E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;239E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;241E;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;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;242E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;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;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;244E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;245E;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;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;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;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;247E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;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;226E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;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;229E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;230E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;251E;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;232E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;233E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;252E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;108E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;252E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;253E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;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;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;255E;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;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;112E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;256E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;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;259E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;260E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;261E;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;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;262E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;263E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;264E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;265E;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;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;266E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;267E;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;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;183E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;185E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;268E;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;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;122E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;178E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;122E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;269E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;270E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;271E;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;122E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;272E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;179E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;273E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;274E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;275E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;276E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;277E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;235E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;262E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;127E;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;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;279E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;279E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;280E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;281E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;283E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;287E;K;11;$aalignmentD;K;6;CP$UIDd;3;288E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;183E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;288E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;183E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;292E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;229E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;288E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;293E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;294E;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;130E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;295E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;287E;K;11;$aalignmentD;K;6;CP$UIDd;3;288E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;183E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;288E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;183E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;292E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;229E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;288E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;296E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;297E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;281E;K;11;$aalignmentD;K;6;CP$UIDd;3;288E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;183E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;298E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;288E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;185E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;185E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;185E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;299E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;229E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;288E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;300E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;287E;K;11;$aalignmentD;K;6;CP$UIDd;3;288E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;183E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;288E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;183E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;183E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;292E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;229E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;288E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;278E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;301E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;302E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;286E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;303E;K;11;$aalignmentD;K;6;CP$UIDd;3;288E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;229E;K;6;$afontD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;282E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;185E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;183E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;288E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;185E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;185E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;185E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;299E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;229E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;288E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;304E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;8;delegateS;9;theWindowS;11;nextKeyViewS;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;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;121E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;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;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;4;EditD;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;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;96E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;107E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;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;105E;D;K;6;CP$UIDd;3;106E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;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;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 128}, {480, 360}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;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;E;E;S;6;normalS;6;{1, 1}S;22;{{170, 92}, {104, 29}}S;19;{{0, 0}, {104, 29}}d;2;36S;9;textfieldS;28;bezeled+editable+placeholderd;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;289E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;305E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;306E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;185E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;185E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;185E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;291E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;307E;E;S;15;CustomTextFieldS;11;CPTextFieldS;22;{{292, 92}, {104, 29}}S;23;{{169, 126}, {107, 17}}S;19;{{0, 0}, {107, 17}}S;16;Custom TextFieldD;K;6;$classD;K;6;CP$UIDd;3;291E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;308E;E;S;21;{{36, 92}, {104, 29}}S;20;{{41, 64}, {-2, 17}}S;18;{{0, 0}, {-2, 17}}S;11;placeholderS;13;AppControllerS;17;.Lucida Grande UId;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;D;K;6;CP$UIDd;3;226E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;309E;D;K;6;CP$UIDd;3;309E;D;K;6;CP$UIDd;3;309E;D;K;6;CP$UIDd;3;226E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTextFieldMovementsTest/Resources/MainMenu.xib b/Tests/Manual/CPTextFieldMovementsTest/Resources/MainMenu.xib new file mode 100644 index 000000000..fd469c9d6 --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/Resources/MainMenu.xib @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/Manual/CPTextFieldMovementsTest/index-debug.html b/Tests/Manual/CPTextFieldMovementsTest/index-debug.html new file mode 100644 index 000000000..d7cd7aef1 --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/index-debug.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + CPTextFieldMovementsTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextFieldMovementsTest/index.html b/Tests/Manual/CPTextFieldMovementsTest/index.html new file mode 100644 index 000000000..1664f234e --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/index.html @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + CPTextFieldMovementsTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextFieldMovementsTest/main.j b/Tests/Manual/CPTextFieldMovementsTest/main.j new file mode 100644 index 000000000..666a222bd --- /dev/null +++ b/Tests/Manual/CPTextFieldMovementsTest/main.j @@ -0,0 +1,17 @@ +/* + * AppController.j + * CPTextFieldMovementsTest + * + * Created by Alexandre Wilhelm on October 29, 2013. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CPTimeZone/AppController.j b/Tests/Manual/CPTimeZone/AppController.j new file mode 100644 index 000000000..f44a9ff5b --- /dev/null +++ b/Tests/Manual/CPTimeZone/AppController.j @@ -0,0 +1,43 @@ +/* + * AppController.j + * CPTimeZone + * + * Created by You on April 16, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPDatePicker datePicker; + @outlet CPPopUpButton popUpButton; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; + [datePicker setDateValue:[CPDate date]]; + [popUpButton addItemsWithTitles:[CPTimeZone knownTimeZoneNames]]; + [datePicker setTimeZone:[CPTimeZone timeZoneWithName:[[CPTimeZone knownTimeZoneNames] firstObject]]]; +} + +- (@action)changedTimeZone:(id)sender +{ + [datePicker setTimeZone:[CPTimeZone timeZoneWithName:[[CPTimeZone knownTimeZoneNames] objectAtIndex:[sender selectedIndex ]]]]; +} + +@end diff --git a/Tests/Manual/CPTimeZone/Info.plist b/Tests/Manual/CPTimeZone/Info.plist new file mode 100644 index 000000000..5a1e4aa3e --- /dev/null +++ b/Tests/Manual/CPTimeZone/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTimeZone + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2013, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPTimeZone/Jakefile b/Tests/Manual/CPTimeZone/Jakefile new file mode 100644 index 000000000..91283f3eb --- /dev/null +++ b/Tests/Manual/CPTimeZone/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * CPTimeZone + * + * Created by You on April 16, 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 ("CPTimeZone", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPTimeZone.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTimeZone"); + task.setIdentifier("com.yourcompany.CPTimeZone"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTimeZone"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CPTimeZone"], 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", "CPTimeZone", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPTimeZone", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPTimeZone")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPTimeZone"), FILE.join("Build", "Deployment", "CPTimeZone")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPTimeZone")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPTimeZone"), FILE.join("Build", "Desktop", "CPTimeZone", "CPTimeZone.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPTimeZone", "CPTimeZone.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPTimeZone")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPTimeZone/Resources/MainMenu.cib b/Tests/Manual/CPTimeZone/Resources/MainMenu.cib new file mode 100644 index 000000000..993375234 --- /dev/null +++ b/Tests/Manual/CPTimeZone/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;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;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;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;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;54E;D;K;6;CP$UIDd;2;56E;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;66E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;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;56E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;3;102E;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;2;56E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;130E;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;133E;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;134E;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;131E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;128E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;130E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;131E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;124E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;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;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;116E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;54E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;96E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;62E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;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;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;131E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;133E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;173E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;174E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;175E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;59E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;176E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;179E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;184E;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;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;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;59E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;186E;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;59E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;187E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;188E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;65E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;188E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;189E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;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;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;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;65E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;193E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;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;65E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;196E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;197E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;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;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;75E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;200E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;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;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;203E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;204E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;205E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;206E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;208E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;210E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;211E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;212E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;213E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;214E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;216E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;86E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;216E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;218E;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;219E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;220E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;221E;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;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;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;224E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;225E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;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;227E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;228E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;229E;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;230E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;86E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;231E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;232E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;93E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;232E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;233E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;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;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;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;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;236E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;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;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;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;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;99E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;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;99E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;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;99E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;244E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;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;230E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;231E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;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;227E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;228E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;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;219E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;220E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;249E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;251E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;254E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;255E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;256E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;258E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;114E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;259E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;260E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;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;114E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;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;108E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;264E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;181E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;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;183E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;265E;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;108E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;177E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;120E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;266E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;267E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;268E;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;120E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;269E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;270E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;271E;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;120E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;178E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;272E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;273E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;274E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;275E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;276E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;224E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;176E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;126E;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;125E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;277E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;278E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;278E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;279E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;280E;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;127E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;277E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;281E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;282E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;126E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;283E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;285E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;136E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;286E;K;6;$afontD;K;6;CP$UIDd;3;288E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;290E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;291E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;277E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;277E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;230E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;292E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;293E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;294E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;290E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;285E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;181E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;181E;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;129E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;3;132E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;277E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;295E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;296E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;126E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;283E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;297E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;298E;K;11;$aalignmentD;K;6;CP$UIDd;3;277E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;291E;K;6;$afontD;K;6;CP$UIDd;3;299E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;300E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;291E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;183E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;277E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;181E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;227E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;277E;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;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;302E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;303E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;304E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;124E;E;E;S;8;delegateS;10;datePickerS;11;popUpButtonS;9;theWindowS;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;16;changedTimeZone:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;71E;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;63E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;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;66E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;67E;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;73E;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;2;78E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;98E;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;2;91E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;88E;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;2;96E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;97E;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;101E;D;K;6;CP$UIDd;3;100E;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;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;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;112E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;118E;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;115E;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;121E;D;K;6;CP$UIDd;3;122E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 128}, {480, 360}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;130E;E;E;S;6;normalS;24;{{119, 105}, {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;284E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;305E;E;S;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;287E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;306E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;307E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;181E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;183E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;181E;E;D;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;289E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;277E;E;d;1;4d;3;238D;K;6;$classD;K;6;CP$UIDd;3;289E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;3;289E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;309E;E;S;22;{{119, 53}, {276, 25}}S;19;{{0, 0}, {276, 25}}S;12;popup-buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;287E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;306E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;300E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;181E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;183E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;181E;E;d;2;-1d;2;12S;13;AppControllerS;10;OtherViewsD;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;3;230E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;230E;D;K;6;CP$UIDd;3;230E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;13d;15;-62135510400000d;14;64092297600000E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTimeZone/Resources/MainMenu.xib b/Tests/Manual/CPTimeZone/Resources/MainMenu.xib new file mode 100644 index 000000000..3d59142b7 --- /dev/null +++ b/Tests/Manual/CPTimeZone/Resources/MainMenu.xib @@ -0,0 +1,1911 @@ + + + + 1050 + 12D78 + 3084 + 1187.37 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + YES + NSCustomObject + NSDatePicker + NSDatePickerCell + NSMenu + NSMenuItem + NSPopUpButton + NSPopUpButtonCell + 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 + + + 7 + 2 + {{335, 390}, {480, 360}} + 1946157056 + Window + NSWindow + + + + + 256 + + YES + + + 268 + {{119, 106}, {277, 148}} + + + _NS:9 + YES + + 71303168 + 0 + + -595929600 + + US/Pacific + + VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ +y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ +5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g +8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ +AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg +DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ +HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g +KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ +OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg +Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ +VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg +Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ +cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg +f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA + + + %Y-%m-%d %H:%M:%S %z + + + LucidaGrande + 13 + 1044 + + _NS:9 + + 0.0 + 238 + 1 + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{117, 280}, {281, 26}} + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + YES + + OtherViews + + YES + + + + -1 + 1 + YES + YES + 2 + + NO + + + {480, 360} + + + + + {{0, 0}, {1440, 878}} + {10000000000000, 10000000000000} + YES + + + AppController + + + + + 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 + + + + datePicker + + + + 468 + + + + popUpButton + + + + 469 + + + + changedTimeZone: + + + + 470 + + + + + 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 + + + + + 460 + + + YES + + + + + + 461 + + + + + 462 + + + YES + + + + + + 463 + + + YES + + + + + + 464 + + + YES + + + + + + + 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 + 460.IBPluginDependency + 461.IBPluginDependency + 462.IBPluginDependency + 463.IBPluginDependency + 464.IBPluginDependency + 5.IBPluginDependency + 56.IBPluginDependency + 57.IBPluginDependency + 58.IBPluginDependency + 72.IBPluginDependency + 73.IBPluginDependency + 75.IBPluginDependency + 79.IBPluginDependency + 80.IBPluginDependency + 81.IBPluginDependency + 82.IBPluginDependency + 83.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 + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + 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 + + + + + 470 + + + + YES + + AppController + NSObject + + changedTimeZone: + id + + + changedTimeZone: + + changedTimeZone: + id + + + + YES + + YES + datePicker + popUpButton + theWindow + + + YES + NSDatePicker + NSPopUpButton + NSWindow + + + + YES + + YES + datePicker + popUpButton + theWindow + + + YES + + datePicker + NSDatePicker + + + popUpButton + NSPopUpButton + + + theWindow + NSWindow + + + + + IBProjectSource + ./Classes/AppController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {11, 11} + {10, 3} + + + + diff --git a/Tools/capp/Resources/Templates/ThemeDescriptor/Resources/spinner.gif b/Tests/Manual/CPTimeZone/Resources/spinner.gif similarity index 100% rename from Tools/capp/Resources/Templates/ThemeDescriptor/Resources/spinner.gif rename to Tests/Manual/CPTimeZone/Resources/spinner.gif diff --git a/Tests/Manual/CPTimeZone/index-debug.html b/Tests/Manual/CPTimeZone/index-debug.html new file mode 100644 index 000000000..577b77b22 --- /dev/null +++ b/Tests/Manual/CPTimeZone/index-debug.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + CPTimeZone + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPTimeZone/index.html b/Tests/Manual/CPTimeZone/index.html new file mode 100644 index 000000000..95dd00e9e --- /dev/null +++ b/Tests/Manual/CPTimeZone/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + CPTimeZone + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPTimeZone/main.j b/Tests/Manual/CPTimeZone/main.j new file mode 100644 index 000000000..f67ea9418 --- /dev/null +++ b/Tests/Manual/CPTimeZone/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTimeZone + * + * Created by You on April 16, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index 0b226e2d6..667122f5e 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -133,6 +133,17 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [[self class] createTokenfieldContents:contentView withDelegate:self]; + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(checkDidFocusNotification:) + name:CPTextFieldDidFocusNotification + object:nil] + + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(checkDidBlurNotification:) + name:CPTextFieldDidBlurNotification + object:nil] + + var popoverButton = [[CPButton alloc] initWithFrame:CGRectMake(15, 310, 0, 0)]; [popoverButton setTitle:"Token Field in a Popover"]; [popoverButton sizeToFit]; @@ -143,6 +154,16 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [theWindow orderFront:self]; } +- (@action)checkDidFocusNotification:(CPNotification)aNotification +{ + console.log("Field did focus"); +} + +- (@action)checkDidBlurNotification:(CPNotification)aNotification +{ + console.log("Field did blur"); +} + - (@action)openPopover:(id)sender { var aPopover = [CPPopover new], diff --git a/Tests/Manual/CopyAndPaste/AppController.j b/Tests/Manual/CopyAndPaste/AppController.j new file mode 100644 index 000000000..ef2039eb4 --- /dev/null +++ b/Tests/Manual/CopyAndPaste/AppController.j @@ -0,0 +1,96 @@ +/* + * AppController.j + * CopyAndPaste + * + * Created by Alexander Ljungberg on June 13, 2013. + * Copyright 2013, SlevenBits, Ltd. All rights reserved. + */ + +@import +@import + +@import "CollectionViewItem.j" + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPCollectionView aCollectionView; + @outlet CPArrayController anArrayController; + @outlet CPTextField selectableTextField; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // http://www.flickr.com/photos/viamoi/2952609526/ + var anImage = CPImageInBundle("2952609526_9fd245dfcd_q.jpg"); + + [anArrayController setContent:@[@"Cat", @"Rabbit", @"Dinosaur", anImage]]; + + [selectableTextField setStringValue:@"Lion"]; + + [theWindow setFullPlatformWindow:YES]; +} + +- (void)copy:(id)sender +{ + var selected = [anArrayController selectedObjects], + strings = [], + images = []; + + for (var i = 0; i < selected.length; i++) + ([selected[i] isKindOfClass:CPImage] ? images : strings).push(selected[i]); + + var stringValue = strings.join(", "), + pasteboard = [CPPasteboard generalPasteboard], + types = []; + + if (stringValue) + [types addObject:CPStringPboardType] + if (images) + [types addObject:CPImagesPboardType] + + [pasteboard declareTypes:types owner:nil]; + if (stringValue) + [pasteboard setString:stringValue forType:CPStringPboardType]; + if (images) + [pasteboard setData:[CPKeyedArchiver archivedDataWithRootObject:images] forType:CPImagesPboardType]; + + CPLog.info("Copied %@.", (stringValue || "") + " " + (images || "")); +} + +- (void)cut:(id)sender +{ + [self copy:sender]; + [anArrayController remove:self]; +} + +- (void)paste:(id)sender +{ + console.log(self + "paste: " + sender); + var pasteboard = [CPPasteboard generalPasteboard], + parts = []; + + if ([[pasteboard types] containsObject:CPStringPboardType]) + { + var stringValue = [pasteboard stringForType:CPStringPboardType]; + + [parts addObjectsFromArray:[stringValue componentsSeparatedByString:@", "]]; + } + + if ([[pasteboard types] containsObject:CPImagesPboardType]) + { + var images = [CPKeyedUnarchiver unarchiveObjectWithData:[pasteboard dataForType:CPImagesPboardType]]; + + [parts addObjectsFromArray:images]; + } + + [anArrayController addObjects:parts]; + CPLog.info("Pasted %@.", parts); +} + +@end diff --git a/Tests/Manual/CopyAndPaste/CollectionView.j b/Tests/Manual/CopyAndPaste/CollectionView.j new file mode 100644 index 000000000..e69de29bb diff --git a/Tests/Manual/CopyAndPaste/CollectionViewItem.j b/Tests/Manual/CopyAndPaste/CollectionViewItem.j new file mode 100644 index 000000000..74d8d2b7e --- /dev/null +++ b/Tests/Manual/CopyAndPaste/CollectionViewItem.j @@ -0,0 +1,51 @@ +@import +@import +@import +@import +@import + +@implementation CollectionViewItem : CPCollectionViewItem +{ +} + +@end + +@implementation CollectionViewView : CPView +{ + @outlet CPTextField textField @accessors; + @outlet CPImageView imageView @accessors; + + boolean selected @accessors; +} + +- (void)setSelected:(BOOL)aFlag +{ + selected = aFlag; + + [self setBackgroundColor:aFlag ? [CPColor blueColor] : nil]; + [textField setTextColor:aFlag ? [CPColor whiteColor] : [CPColor blackColor]]; +} + +- (void)setRepresentedObject:(id)anObject +{ + var stringValue = [anObject isKindOfClass:CPString] ? anObject : "", + image = [anObject isKindOfClass:CPImage] ? anObject : nil; + + [textField setStringValue:stringValue]; + [imageView setImage:image]; +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + textField = [self subviews][1]; + imageView = [self subviews][0]; + } + + return self; +} + +@end diff --git a/Tests/Manual/CopyAndPaste/Info.plist b/Tests/Manual/CopyAndPaste/Info.plist new file mode 100644 index 000000000..e6bebc5b3 --- /dev/null +++ b/Tests/Manual/CopyAndPaste/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CopyAndPaste + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2013, SlevenBits, Ltd. All rights reserved. + + diff --git a/Tests/Manual/CopyAndPaste/Jakefile b/Tests/Manual/CopyAndPaste/Jakefile new file mode 100644 index 000000000..5a58beae2 --- /dev/null +++ b/Tests/Manual/CopyAndPaste/Jakefile @@ -0,0 +1,98 @@ +/* + * Jakefile + * CopyAndPaste + * + * Created by Alexander Ljungberg on June 13, 2013. + * Copyright 2013, SlevenBits, Ltd. 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 ("CopyAndPaste", function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CopyAndPaste.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CopyAndPaste"); + task.setIdentifier("com.yourcompany.CopyAndPaste"); + task.setVersion("1.0"); + task.setAuthor("SlevenBits, Ltd."); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CopyAndPaste"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CopyAndPaste"], 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", "CopyAndPaste", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CopyAndPaste", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CopyAndPaste")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CopyAndPaste"), FILE.join("Build", "Deployment", "CopyAndPaste")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CopyAndPaste")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CopyAndPaste"), FILE.join("Build", "Desktop", "CopyAndPaste", "CopyAndPaste.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CopyAndPaste", "CopyAndPaste.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CopyAndPaste")); + print("----------------------------"); +} diff --git a/Tests/Manual/CopyAndPaste/Resources/2952609526_9fd245dfcd_q.jpg b/Tests/Manual/CopyAndPaste/Resources/2952609526_9fd245dfcd_q.jpg new file mode 100644 index 000000000..ac80facba Binary files /dev/null and b/Tests/Manual/CopyAndPaste/Resources/2952609526_9fd245dfcd_q.jpg differ diff --git a/Tests/Manual/CopyAndPaste/Resources/MainMenu.cib b/Tests/Manual/CopyAndPaste/Resources/MainMenu.cib new file mode 100644 index 000000000..3040ad2fc --- /dev/null +++ b/Tests/Manual/CopyAndPaste/Resources/MainMenu.cib @@ -0,0 +1,6 @@ +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;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;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;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;61E;D;K;6;CP$UIDd;2;62E;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;63E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;133E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;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;1;0E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;1;0E;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;156E;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;1;0E;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;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;84E;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;2;65E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;65E;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;2;11E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;150E;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;2;11E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;159E;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;160E;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;161E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;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;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;141E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;162E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;163E;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;16E;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;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;141E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;155E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;150E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;151E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;133E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;153E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;153E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;156E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;156E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;157E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;171E;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;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;175E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;124E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;182E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;183E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;189E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;193E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;194E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;197E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;71E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;198E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;199E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;202E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;204E;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;60E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;155E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;205E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;206E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;207E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;209E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;155E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;210E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;211E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;211E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;160E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;213E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;214E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;215E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;216E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;68E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;216E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;219E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;220E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;224E;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;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;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;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;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;68E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;74E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;228E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;229E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;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;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;232E;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;74E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;233E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;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;74E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;74E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;74E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;236E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;81E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;236E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;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;81E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;239E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;84E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;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;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;243E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;244E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;245E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;246E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;248E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;250E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;251E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;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;84E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;254E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;95E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;256E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;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;259E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;95E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;261E;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;95E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;262E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;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;264E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;95E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;265E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;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;267E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;95E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;268E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;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;270E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;95E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;271E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;272E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;102E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;272E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;273E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;274E;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;102E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;275E;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;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;276E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;277E;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;102E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;278E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;279E;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;102E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;280E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;280E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;281E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;282E;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;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;283E;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;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;284E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;284E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;286E;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;270E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;271E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;287E;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;267E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;268E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;288E;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;259E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;289E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;289E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;291E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;292E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;293E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;294E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;295E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;296E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;297E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;298E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;299E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;123E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;299E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;300E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;301E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;302E;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;123E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;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;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;304E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;221E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;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;223E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;305E;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;117E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;306E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;217E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;129E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;306E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;307E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;308E;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;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;309E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;218E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;312E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;313E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;314E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;315E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;316E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;264E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;216E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;135E;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;134E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;318E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;318E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;319E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;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;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;321E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;322E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;323E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;328E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;138E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;332E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;333E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;334E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;335E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;337E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;1;0E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;144E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;143E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;338E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;338E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;221E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;221E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;221E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;339E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;267E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;317E;E;D;K;10;$classnameS;16;CPCollectionViewK;8;$classesA;S;16;CPCollectionViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;140E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;337E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;340E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;340E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;337E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;334E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;34;CPCollectionViewMaxNumberOfRowsKeyD;K;6;CP$UIDd;3;317E;K;37;CPCollectionViewMaxNumberOfColumnsKeyD;K;6;CP$UIDd;3;317E;K;29;CPCollectionViewSelectableKeyD;K;6;CP$UIDd;3;221E;K;42;CPCollectionViewAllowsMultipleSelectionKeyD;K;6;CP$UIDd;3;221E;K;33;CPCollectionViewVerticalMarginKeyD;K;6;CP$UIDd;3;341E;K;35;CPCollectionViewBackgroundColorsKeyD;K;6;CP$UIDd;3;342E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;343E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;344E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;139E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;345E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;346E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;347E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;348E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;317E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;139E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;349E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;317E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;223E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;350E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;351E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;139E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;345E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;346E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;347E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;348E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;317E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;139E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;353E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;317E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;221E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;354E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;355E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;356E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;357E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;221E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;358E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;359E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;338E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;317E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;360E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;317E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;361E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;362E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;338E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;363E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;222E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;221E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;221E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;221E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;364E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;365E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;366E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;270E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;368E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;270E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;369E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;366E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;270E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;370E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;270E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;371E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;362E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;338E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;372E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;267E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;222E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;221E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;221E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;364E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;267E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;373E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;1;0E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;374E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;375E;E;D;K;10;$classnameS;17;CPArrayControllerK;8;$classesA;S;17;CPArrayControllerS;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;376E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;221E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;223E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;221E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;221E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;221E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;221E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;221E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;223E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;377E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;379E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;380E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;156E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;381E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;382E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;156E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;383E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;324E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;325E;K;6;$afontD;K;6;CP$UIDd;3;327E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;221E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;384E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;223E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;223E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;330E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;325E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;325E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;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;3;158E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;156E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;385E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;386E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;156E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;334E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;11;$aalignmentD;K;6;CP$UIDd;3;317E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;317E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;317E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;325E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;317E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;133E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;387E;D;K;6;CP$UIDd;3;388E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;390E;D;K;6;CP$UIDd;3;391E;E;E;S;8;delegateS;15;aCollectionViewS;17;anArrayControllerS;19;selectableTextFieldS;9;theWindowS;13;itemPrototypeS;4;viewS;9;textFieldS;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;24;content: arrangedObjectsS;7;contentS;15;arrangedObjectsD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;208E;K;10;CP.objectsD;E;E;S;34;selectionIndexes: selectionIndexesS;16;selectionIndexesD;K;6;$classD;K;6;CP$UIDd;3;208E;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;73E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;80E;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;72E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;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;75E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;76E;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;82E;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;2;87E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;107E;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;100E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;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;105E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;106E;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;110E;D;K;6;CP$UIDd;3;109E;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;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;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;121E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;127E;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;124E;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;130E;D;K;6;CP$UIDd;3;131E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 581}, {791, 447}}S;22;{{0, 0}, {2560, 1418}}d;1;0S;20;{{0, 0}, {791, 447}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;139E;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;145E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;E;E;S;6;normalS;21;{{20, 20}, {231, 17}}S;19;{{0, 0}, {231, 17}}d;2;36S;9;textfieldd;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;326E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;392E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;393E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;223E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;223E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;221E;E;S;36;Collection View with Copyable Items:D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;329E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;394E;E;S;22;{{20, 45}, {751, 127}}S;20;{{0, 0}, {751, 127}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;337E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;339E;E;E;d;2;18S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;336E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;317E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;395E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;340E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;396E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;139E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;345E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;330E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;397E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;141E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;3;134E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;398E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;398E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;320E;E;S;20;{{0, 0}, {749, 125}}d;1;5D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;399E;E;E;S;21;{{1, -32}, {233, 15}}S;19;{{0, 0}, {233, 15}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:f;18;0.6315789222717285S;23;{{234, -17}, {15, 143}}S;19;{{0, 0}, {15, 143}}S;27;_verticalScrollerDidScroll:f;18;0.8965517282485962S;22;{{20, 180}, {751, 17}}S;19;{{0, 0}, {751, 17}}S;29;A label with selectable text.S;23;{{20, 274}, {751, 153}}S;20;{{0, 0}, {751, 153}}S;777;Instructions: + +1. Select text items in the Collection View or the Text Field and copy it to the system clipboard (Cmd-C on the Mac, Ctrl-C on the PC). It's also possible to select text from "a label with selectable text" and "non-editable field". +2. Open this application in a different browser window, or even a different browser. You can test copying from Firefox to Chrome, Safari to Internet Explorer or vice versa and so on. +3. Paste into the Collection View or Text Field of the destination and verify your material transferred correctly. +4. It is not currently possible to copy or paste images between browsers. Using the Cappuccino menus only, you can copy, cut or paste the image item within this app in this browser window (e.g. to and from the same collection view).S;23;{{155, 201}, {617, 29}}S;19;{{0, 0}, {617, 29}}S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;329E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;400E;E;S;22;{{22, 207}, {129, 17}}S;19;{{0, 0}, {129, 17}}d;2;12S;19;Regular Text Field:S;22;{{22, 239}, {129, 17}}S;19;Non-editable Field:S;23;{{155, 233}, {617, 29}}S;19;bezeled+placeholderS;13;AppControllerS;18;CollectionViewItemS;20;CPCollectionViewItemS;19;CPMutableDictionaryS;20;{{0, 0}, {100, 100}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;157E;E;E;S;18;CollectionViewViewS;6;CPViewS;20;{{20, 41}, {60, 17}}S;18;{{0, 0}, {60, 17}}d;2;42S;5;LabelS;20;{{17, 17}, {66, 66}}S;18;{{0, 0}, {66, 66}}S;11;maxItemSizeS;11;minItemSizeD;K;10;$classnameS;7;CPValueK;8;$classesA;S;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;389E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;401E;E;D;K;6;$classD;K;6;CP$UIDd;3;389E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;401E;E;S;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;270E;E;E;S;20;{{1, 1}, {749, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;141E;E;E;S;6;_NS:78S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;3;329E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;403E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;E;E;S;26;{"width":150,"height":150}f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CopyAndPaste/Resources/MainMenu.xib b/Tests/Manual/CopyAndPaste/Resources/MainMenu.xib new file mode 100644 index 000000000..6c1de7629 --- /dev/null +++ b/Tests/Manual/CopyAndPaste/Resources/MainMenu.xib @@ -0,0 +1,2494 @@ + + + + 1050 + 12E55 + 3084 + 1187.39 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + YES + NSArrayController + NSCollectionView + NSCollectionViewItem + NSCustomObject + NSImageCell + NSImageView + NSMenu + NSMenuItem + NSScrollView + NSScroller + NSTextField + NSTextFieldCell + 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 + + + 7 + 2 + {{335, 390}, {791, 447}} + 1946157056 + Window + NSWindow + + + + + 256 + + YES + + + 268 + {{17, 410}, {237, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Collection View with Copyable Items: + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 274 + + YES + + + 2304 + + YES + + + 274 + {749, 125} + + + + _NS:80 + {0, 0} + {0, 0} + 0 + 0 + + YES + + 6 + System + controlBackgroundColor + + + + YES + YES + -1 + 0 + + + {{1, 1}, {749, 125}} + + + + _NS:78 + + + 4 + + + + -2147483392 + {{234, 1}, {15, 143}} + + + + _NS:82 + NO + + _doScroller: + 1 + 0.89655172824859619 + + + + -2147483392 + {{1, 144}, {233, 15}} + + + + _NS:91 + NO + 1 + + _doScroller: + 0.63157892227172852 + + + {{20, 275}, {751, 127}} + + + + _NS:76 + 133682 + + + + 0.25 + 4 + 1 + + + + 290 + {{17, 20}, {757, 153}} + + + + _NS:9 + {250, 750} + YES + + 67108864 + 272629760 + + SW5zdHJ1Y3Rpb25zOgoKMS4gU2VsZWN0IHRleHQgaXRlbXMgaW4gdGhlIENvbGxlY3Rpb24gVmlldyBv +ciB0aGUgVGV4dCBGaWVsZCBhbmQgY29weSBpdCB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCAoQ21kLUMg +b24gdGhlIE1hYywgQ3RybC1DIG9uIHRoZSBQQykuIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZWxlY3Qg +dGV4dCBmcm9tICJhIGxhYmVsIHdpdGggc2VsZWN0YWJsZSB0ZXh0IiBhbmQgIm5vbi1lZGl0YWJsZSBm +aWVsZCIuCjIuIE9wZW4gdGhpcyBhcHBsaWNhdGlvbiBpbiBhIGRpZmZlcmVudCBicm93c2VyIHdpbmRv +dywgb3IgZXZlbiBhIGRpZmZlcmVudCBicm93c2VyLiBZb3UgY2FuIHRlc3QgY29weWluZyBmcm9tIEZp +cmVmb3ggdG8gQ2hyb21lLCBTYWZhcmkgdG8gSW50ZXJuZXQgRXhwbG9yZXIgb3IgdmljZSB2ZXJzYSBh +bmQgc28gb24uCjMuIFBhc3RlIGludG8gdGhlIENvbGxlY3Rpb24gVmlldyBvciBUZXh0IEZpZWxkIG9m +IHRoZSBkZXN0aW5hdGlvbiBhbmQgdmVyaWZ5IHlvdXIgbWF0ZXJpYWwgdHJhbnNmZXJyZWQgY29ycmVj +dGx5Lgo0LiBJdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIGNvcHkgb3IgcGFzdGUgaW1hZ2Vz +IGJldHdlZW4gYnJvd3NlcnMuIFVzaW5nIHRoZSBDYXBwdWNjaW5vIG1lbnVzIG9ubHksIHlvdSBjYW4g +Y29weSwgY3V0IG9yIHBhc3RlIHRoZSBpbWFnZSBpdGVtIHdpdGhpbiB0aGlzIGFwcCBpbiB0aGlzIGJy +b3dzZXIgd2luZG93IChlLmcuIHRvIGFuZCBmcm9tIHRoZSBzYW1lIGNvbGxlY3Rpb24gdmlldykuA + + + LucidaGrande + 13 + 16 + + _NS:9 + + + + + NO + YES + + + + 290 + {{159, 220}, {609, 22}} + + + + _NS:9 + YES + + -1804599231 + 272630784 + + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 292 + {{19, 223}, {135, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Regular Text Field: + + _NS:1535 + + + + + NO + + + + 288 + {{17, 250}, {757, 17}} + + + + _NS:1535 + YES + + 70254657 + 272630784 + A label with selectable text. + + _NS:1535 + + + + + NO + + + + 292 + {{19, 191}, {135, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Non-editable Field: + + _NS:1535 + + + + + NO + + + + 290 + {{159, 188}, {609, 22}} + + + + _NS:9 + YES + + -2073034687 + 272630784 + + + _NS:9 + + YES + + + + NO + + + {791, 447} + + + + + {{0, 0}, {2560, 1418}} + {10000000000000, 10000000000000} + YES + + + AppController + + + + YES + + YES + YES + YES + YES + YES + + + + 256 + + YES + + + 274 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{17, 17}, {66, 66}} + + + + _NS:9 + YES + + 134217728 + 33554432 + _NS:9 + 0 + 0 + 0 + NO + + NO + YES + + + + 298 + {{17, 42}, {66, 17}} + + + + _NS:1535 + YES + + 67108928 + 272631808 + Label + + _NS:1535 + + + + + NO + + + {100, 100} + + + + + + + + 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 + + + + aCollectionView + + + + 474 + + + + anArrayController + + + + 479 + + + + selectableTextField + + + + 503 + + + + itemPrototype + + + + 468 + + + + delegate + + + + 475 + + + + content: arrangedObjects + + + + + + content: arrangedObjects + content + arrangedObjects + 2 + + + 478 + + + + selectionIndexes: selectionIndexes + + + + + + selectionIndexes: selectionIndexes + selectionIndexes + selectionIndexes + + 2 + + + 481 + + + + view + + + + 469 + + + + textField + + + + 488 + + + + + 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 + + + + + 460 + + + YES + + + + + + 461 + + + + + 462 + + + YES + + + + + + + + 463 + + + + + 464 + + + + + 465 + + + + + 466 + + + + + 467 + + + YES + + + + + + + 472 + + + YES + + + + + + 473 + + + + + 476 + + + + + 482 + + + YES + + + + + + 483 + + + + + 489 + + + YES + + + + + + 490 + + + + + 491 + + + YES + + + + + + 492 + + + + + 493 + + + YES + + + + + + 494 + + + + + 497 + + + YES + + + + + + 498 + + + + + 499 + + + YES + + + + + + 500 + + + + + 501 + + + YES + + + + + + 502 + + + + + + + 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 + 460.IBPluginDependency + 461.IBPluginDependency + 462.IBPluginDependency + 463.IBAttributePlaceholdersKey + 463.IBPluginDependency + 464.IBPluginDependency + 465.IBPluginDependency + 466.CustomClassName + 466.IBPluginDependency + 467.CustomClassName + 467.IBPluginDependency + 472.IBPluginDependency + 473.IBPluginDependency + 476.IBPluginDependency + 482.IBPluginDependency + 483.IBPluginDependency + 489.IBPluginDependency + 490.IBPluginDependency + 491.IBPluginDependency + 492.IBPluginDependency + 493.IBPluginDependency + 494.IBPluginDependency + 497.IBPluginDependency + 498.IBPluginDependency + 499.IBPluginDependency + 5.IBPluginDependency + 500.IBPluginDependency + 501.IBPluginDependency + 502.IBPluginDependency + 56.IBPluginDependency + 57.IBPluginDependency + 58.IBPluginDependency + 72.IBPluginDependency + 73.IBPluginDependency + 75.IBPluginDependency + 79.IBPluginDependency + 80.IBPluginDependency + 81.IBPluginDependency + 82.IBPluginDependency + 83.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 + + IBUserDefinedRuntimeAttributesPlaceholderName + + IBUserDefinedRuntimeAttributesPlaceholderName + + + YES + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.size + maxItemSize + + 2 + {150, 150} + + + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.size + minItemSize + + 2 + {150, 150} + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + CollectionViewItem + com.apple.InterfaceBuilder.CocoaPlugin + CollectionViewView + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + 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 + + + + + 503 + + + + YES + + AppController + NSObject + + YES + + YES + aCollectionView + anArrayController + selectableTextField + theWindow + + + YES + NSCollectionView + NSArrayController + NSTextField + NSWindow + + + + YES + + YES + aCollectionView + anArrayController + selectableTextField + theWindow + + + YES + + aCollectionView + NSCollectionView + + + anArrayController + NSArrayController + + + selectableTextField + NSTextField + + + theWindow + NSWindow + + + + + IBProjectSource + ./Classes/AppController.h + + + + CollectionViewItem + NSCollectionViewItem + + IBProjectSource + ./Classes/CollectionViewItem.h + + + + CollectionViewView + NSView + + YES + + YES + imageView + textField + + + YES + NSImageView + NSTextField + + + + YES + + YES + imageView + textField + + + YES + + imageView + NSImageView + + + textField + NSTextField + + + + + IBProjectSource + ./Classes/CollectionViewView.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {11, 11} + {10, 3} + + + + diff --git a/Tests/Manual/CopyAndPaste/Resources/spinner.gif b/Tests/Manual/CopyAndPaste/Resources/spinner.gif new file mode 100644 index 000000000..a5e705f6c Binary files /dev/null and b/Tests/Manual/CopyAndPaste/Resources/spinner.gif differ diff --git a/Tests/Manual/CopyAndPaste/index-debug.html b/Tests/Manual/CopyAndPaste/index-debug.html new file mode 100644 index 000000000..92421e271 --- /dev/null +++ b/Tests/Manual/CopyAndPaste/index-debug.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + CopyAndPaste + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CopyAndPaste/index.html b/Tests/Manual/CopyAndPaste/index.html new file mode 100644 index 000000000..d06e9dbbf --- /dev/null +++ b/Tests/Manual/CopyAndPaste/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + CopyAndPaste + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CopyAndPaste/main.j b/Tests/Manual/CopyAndPaste/main.j new file mode 100644 index 000000000..30305d7ed --- /dev/null +++ b/Tests/Manual/CopyAndPaste/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CopyAndPaste + * + * Created by Alexander Ljungberg on June 13, 2013. + * Copyright 2013, SlevenBits, Ltd. All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/FontEnhancementTest/AppController.j b/Tests/Manual/FontEnhancementTest/AppController.j index 6eff78438..1dd3b1b86 100644 --- a/Tests/Manual/FontEnhancementTest/AppController.j +++ b/Tests/Manual/FontEnhancementTest/AppController.j @@ -51,7 +51,7 @@ var fontLabelField = nil, return 7; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return ["one", "two", "three"][parseInt([aColumn identifier], 10)]; } diff --git a/Tests/Manual/LongBindings/AppController.j b/Tests/Manual/LongBindings/AppController.j index 7f90da839..90330e054 100644 --- a/Tests/Manual/LongBindings/AppController.j +++ b/Tests/Manual/LongBindings/AppController.j @@ -55,7 +55,7 @@ // return [[[self ordersArrayController] arrangedObjects] count]; // } // -// - (id)tableView:(CPTableView)theTableView objectValueForTableColumn:(CPTableColumn)theColumn row:(int)theRow +// - (id)tableView:(CPTableView)theTableView objectValueForTableColumn:(CPTableColumn)theColumn row:(CPInteger)theRow // { // var order = [[[self ordersArrayController] arrangedObjects] objectAtIndex:theRow]; // return [[order customer] valueForKey:[theColumn identifier]]; diff --git a/Tests/Manual/NSBrowserTest/AppController.j b/Tests/Manual/NSBrowserTest/AppController.j index 67e5cd1a0..b972039be 100644 --- a/Tests/Manual/NSBrowserTest/AppController.j +++ b/Tests/Manual/NSBrowserTest/AppController.j @@ -77,7 +77,7 @@ // [theWindow setFullPlatformWindow:YES]; } -- (BOOL)browser:(CPBrowser)aBrowser writeRowsWithIndexes:(CPIndexSet)indexes inColumn:(int)column toPasteboard:(CPPasteboard)pboard +- (BOOL)browser:(CPBrowser)aBrowser writeRowsWithIndexes:(CPIndexSet)indexes inColumn:(CPInteger)column toPasteboard:(CPPasteboard)pboard { var encodedData = [CPKeyedArchiver archivedDataWithRootObject:"Foo"]; [pboard declareTypes:["Type"] owner:self]; @@ -85,11 +85,11 @@ return YES; } -- (BOOL)browser:(id)aBrowser validateDrop:(id)info proposedRow:(int)row column:(int)column dropOperation:(id)op +- (BOOL)browser:(id)aBrowser validateDrop:(id)info proposedRow:(CPInteger)row column:(CPInteger)column dropOperation:(id)op { return CPDragOperationMove; } -- (BOOL)browser:(id)aBrowser acceptDrop:(id)info atRow:(int)row column:(int)column dropOperation:(id)op +- (BOOL)browser:(id)aBrowser acceptDrop:(id)info atRow:(CPInteger)row column:(CPInteger)column dropOperation:(id)op { return YES; } diff --git a/Tests/Manual/NewTextFieldBezel/AppController.j b/Tests/Manual/NewTextFieldBezel/AppController.j index fb92db10c..c0f020a80 100644 --- a/Tests/Manual/NewTextFieldBezel/AppController.j +++ b/Tests/Manual/NewTextFieldBezel/AppController.j @@ -108,12 +108,12 @@ return 7; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)column row:(int)row +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)column row:(CPInteger)row { return "Double-click to edit"; } -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)anObject forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)rowIndex { } diff --git a/Tests/Manual/ScalingTest/AppController.j b/Tests/Manual/ScalingTest/AppController.j new file mode 100644 index 000000000..cd9505389 --- /dev/null +++ b/Tests/Manual/ScalingTest/AppController.j @@ -0,0 +1,81 @@ +/* + * AppController.j + * ScalingTest + * + * Created by You on July 23, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPSlider sliderView1; + @outlet CPSlider sliderView2; + @outlet CPView view1; + @outlet CPView view2; + @outlet CPView view3; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + // In this case, we want the window from Cib to become our full browser window + + [theWindow setFullPlatformWindow:YES]; +} + +- (IBAction)slider1:(id)sender +{ + var factor = [sender objectValue]; + [view1 setScaleSize:CGSizeMake(factor, factor)]; + // [view1 scaleUnitSquareToSize:CGSizeMake(factor, factor)]; + // [view1 setNeedsDisplay:YES]; +} + +- (IBAction)slider2:(id)sender +{ + var factor = [sender objectValue]; + [view2 setScaleSize:CGSizeMake(factor, factor)]; + // [view2 scaleUnitSquareToSize:CGSizeMake(factor, factor)]; + // [view2 setNeedsDisplay:YES]; +} + +- (IBAction)slider3:(id)sender +{ + var factor = [sender objectValue]; + [view3 setScaleSize:CGSizeMake(factor, factor)]; + // [view2 scaleUnitSquareToSize:CGSizeMake(factor, factor)]; + // [view2 setNeedsDisplay:YES]; +} + +- (IBAction)button1:(id)sender +{ + alert("Jolie click !!!"); +} + +- (IBAction)button2:(id)sender +{ + alert("Nice click !!!"); +} + +- (IBAction)button3:(id)sender +{ + alert("Wunderbar !!!"); +} + +- (int)numberOfRowsInTableView:(CPTableView)aTableView +{ + return 15; +} + +@end \ No newline at end of file diff --git a/Tests/Manual/ScalingTest/Info.plist b/Tests/Manual/ScalingTest/Info.plist new file mode 100644 index 000000000..eef08c607 --- /dev/null +++ b/Tests/Manual/ScalingTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + ScalingTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2013, Your Company All rights reserved. + + diff --git a/Tests/Manual/ScalingTest/Jakefile b/Tests/Manual/ScalingTest/Jakefile new file mode 100644 index 000000000..cc68e8e0a --- /dev/null +++ b/Tests/Manual/ScalingTest/Jakefile @@ -0,0 +1,98 @@ +/* + * Jakefile + * ScalingTest + * + * Created by You on July 23, 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 ("ScalingTest", function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "ScalingTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("ScalingTest"); + task.setIdentifier("com.yourcompany.ScalingTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("ScalingTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["ScalingTest"], 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", "ScalingTest", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "ScalingTest", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "ScalingTest")); + OS.system(["press", "-f", FILE.join("Build", "Release", "ScalingTest"), FILE.join("Build", "Deployment", "ScalingTest")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "ScalingTest")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "ScalingTest"), FILE.join("Build", "Desktop", "ScalingTest", "ScalingTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "ScalingTest", "ScalingTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "ScalingTest")); + print("----------------------------"); +} diff --git a/Tests/Manual/ScalingTest/Resources/MainMenu.cib b/Tests/Manual/ScalingTest/Resources/MainMenu.cib new file mode 100644 index 000000000..388f14e67 --- /dev/null +++ b/Tests/Manual/ScalingTest/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;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;66E;D;K;6;CP$UIDd;2;67E;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;68E;D;K;6;CP$UIDd;2;70E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;138E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;1;0E;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;3;163E;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;1;0E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;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;1;0E;D;K;6;CP$UIDd;3;174E;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;70E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;102E;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;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;2;70E;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;2;70E;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;3;129E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;173E;D;K;6;CP$UIDd;2;11E;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;175E;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;176E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;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;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;144E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;177E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;178E;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;151E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;179E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;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;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;147E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;181E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;182E;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;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;183E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;142E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;172E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;138E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;144E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;147E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;151E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;189E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;183E;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;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;191E;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;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;194E;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;195E;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;196E;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;197E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;198E;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;199E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;202E;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;203E;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;204E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;96E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;208E;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;209E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;210E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;111E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;211E;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;212E;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;213E;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;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;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;217E;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;218E;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;219E;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;220E;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;221E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;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;119E;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;142E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;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;173E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;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;3;157E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;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;172E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;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;150E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;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;3;152E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;175E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;230E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;73E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;233E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;236E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;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;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;73E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;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;73E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;73E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;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;73E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;80E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;246E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;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;80E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;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;80E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;251E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;252E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;84E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;80E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;252E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;253E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;254E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;255E;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;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;80E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;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;80E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;257E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;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;80E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;259E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;80E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;261E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;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;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;92E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;264E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;265E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;267E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;268E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;269E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;270E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;271E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;272E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;273E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;274E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;275E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;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;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;277E;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;92E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;278E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;279E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;279E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;280E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;281E;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;282E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;283E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;284E;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;285E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;286E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;287E;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;288E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;289E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;290E;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;291E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;292E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;293E;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;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;294E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;295E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;110E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;295E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;296E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;297E;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;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;298E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;299E;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;110E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;300E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;302E;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;110E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;303E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;305E;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;282E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;283E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;306E;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;285E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;286E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;288E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;289E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;308E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;121E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;92E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;308E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;3;121E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;3;121E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;312E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;125E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;312E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;313E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;314E;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;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;315E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;316E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;3;125E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;318E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;129E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;318E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;319E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;320E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;322E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;239E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;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;241E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;324E;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;129E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;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;234E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;135E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;70E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;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;71E;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;135E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;328E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;235E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;329E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;330E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;331E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;332E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;333E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;291E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;318E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;140E;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;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;335E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;335E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;336E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;338E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;140E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;340E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;341E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;140E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;11;$aalignmentD;K;6;CP$UIDd;3;334E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;334E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;285E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;334E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;143E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;140E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;345E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;346E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;347E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;140E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;348E;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;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;144E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;144E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;353E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;356E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;358E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;334E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;334E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;282E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;359E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;360E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;361E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;358E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;352E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;239E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;3;143E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;144E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;362E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;363E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;364E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;144E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;348E;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;365E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;147E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;353E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;356E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;366E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;334E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;334E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;282E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;359E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;367E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;368E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;366E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;352E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;239E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;239E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;369E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;147E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;371E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;372E;K;11;$aalignmentD;K;6;CP$UIDd;3;285E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;6;$afontD;K;6;CP$UIDd;3;373E;K;7;$aimageD;K;6;CP$UIDd;3;375E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;376E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;334E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;377E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;240E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;334E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;239E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;285E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;334E;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;143E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;379E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;380E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;381E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;147E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;348E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;382E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;371E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;372E;K;11;$aalignmentD;K;6;CP$UIDd;3;285E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;6;$afontD;K;6;CP$UIDd;3;373E;K;7;$aimageD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;334E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;377E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;240E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;334E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;239E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;285E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;334E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;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;153E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;384E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;385E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;386E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;387E;K;11;$aalignmentD;K;6;CP$UIDd;3;344E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;6;$afontD;K;6;CP$UIDd;3;388E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;389E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;240E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;282E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;282E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;239E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;285E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;334E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;390E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;391E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;392E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;11;$aalignmentD;K;6;CP$UIDd;3;285E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;6;$afontD;K;6;CP$UIDd;3;373E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;393E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;282E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;282E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;394E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;341E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;147E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;11;$aalignmentD;K;6;CP$UIDd;3;334E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;334E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;285E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;334E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;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;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;395E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;396E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;397E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;147E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;398E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;161E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;399E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;169E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;168E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;400E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;400E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;400E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;400E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;239E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;239E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;239E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;401E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;285E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;334E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;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;159E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;402E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;403E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;404E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;405E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;163E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;162E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;161E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;403E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;403E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;161E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;406E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;407E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;12;$agrid-colorD;K;6;CP$UIDd;3;408E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;409E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;410E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;334E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;344E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;241E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;239E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;239E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;239E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;239E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;411E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;408E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;334E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;241E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;413E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;3;171E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;414E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;415E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;416E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;418E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;420E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;288E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;241E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;239E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;421E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;415E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;416E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;422E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;423E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;288E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;241E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;239E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;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;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;424E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;425E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;426E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;427E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;428E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;429E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;334E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;159E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;430E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;334E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;241E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;282E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;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;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;431E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;432E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;426E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;427E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;428E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;429E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;334E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;159E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;433E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;334E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;239E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;282E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;170E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;399E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;434E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;434E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;399E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;435E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;3;163E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;144E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;436E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;341E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;144E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;343E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;11;$aalignmentD;K;6;CP$UIDd;3;334E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;334E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;285E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;144E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;437E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;144E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;342E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;371E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;372E;K;11;$aalignmentD;K;6;CP$UIDd;3;285E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;6;$afontD;K;6;CP$UIDd;3;373E;K;7;$aimageD;K;6;CP$UIDd;3;438E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;334E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;344E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;377E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;240E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;241E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;378E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;334E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;239E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;285E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;334E;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;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;439E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;138E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;440E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;441E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;440E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;442E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;440E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;443E;E;E;S;8;delegateS;11;sliderView1S;11;sliderView2S;9;theWindowS;5;view1S;5;view2S;5;view3S;10;dataSourceS;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;8;slider1:S;8;button1:S;8;slider3:S;8;slider2:S;8;button2:S;8;button3:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;134E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;85E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;109E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;120E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;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;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;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;118E;D;K;6;CP$UIDd;3;119E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;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;123E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;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;D;K;6;CP$UIDd;3;133E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;136E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;25;{{335, -157}, {740, 645}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {740, 645}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;144E;E;E;S;6;normalS;10;windowViewS;6;{1, 1}S;21;{{330, 36}, {92, 21}}S;18;{{0, 0}, {92, 21}}d;2;36S;6;sliderd;1;4S;22;{{30, 69}, {693, 540}}S;20;{{0, 0}, {693, 540}}D;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;172E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;146E;E;E;S;6;CPViewS;22;{{20, 19}, {141, 148}}S;20;{{0, 0}, {141, 148}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;444E;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;355E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;445E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;446E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;239E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;239E;E;D;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;334E;E;d;3;224D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;447E;E;D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;448E;E;S;23;{{200, 20}, {400, 411}}S;20;{{0, 0}, {400, 411}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;148E;E;E;S;23;{{241, 72}, {141, 148}}D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;447E;E;D;K;6;$classD;K;6;CP$UIDd;3;357E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;448E;E;S;22;{{131, 248}, {70, 25}}S;18;{{0, 0}, {70, 25}}S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;355E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;445E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;449E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;239E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;239E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;374E;K;4;nameD;K;6;CP$UIDd;3;450E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;451E;K;5;valueD;K;6;CP$UIDd;3;452E;E;S;4;testS;6;Buttond;2;14S;22;{{20, 286}, {360, 96}}S;19;{{0, 0}, {360, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;152E;E;E;S;21;{{145, 10}, {70, 25}}D;K;6;$classD;K;6;CP$UIDd;3;374E;K;4;nameD;K;6;CP$UIDd;3;450E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;451E;K;5;valueD;K;6;CP$UIDd;3;452E;E;S;20;{{18, 36}, {61, 21}}S;18;{{0, 0}, {61, 21}}S;9;check-boxS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;355E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;445E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;449E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;239E;E;S;5;CheckS;22;{{130, 39}, {104, 25}}S;19;{{0, 0}, {104, 25}}S;17;segmented-controlD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;454E;D;K;6;CP$UIDd;3;455E;D;K;6;CP$UIDd;3;456E;E;E;S;22;{{216, 251}, {92, 21}}S;22;{{13, 73}, {214, 148}}S;20;{{0, 0}, {214, 148}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;399E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;401E;E;E;S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;3;160E;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;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;457E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;458E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;459E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;426E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;171E;E;d;2;10D;K;6;$classD;K;6;CP$UIDd;3;139E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;159E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;460E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;E;S;20;{{1, 1}, {212, 130}}S;20;{{0, 0}, {212, 130}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;163E;E;E;d;2;18D;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;461E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;462E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;166E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;412E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;334E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;463E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;463E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;464E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;E;d;3;116d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;417E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;460E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;465E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;466E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;334E;K;12;$atext-colorD;K;6;CP$UIDd;3;467E;K;6;$afontD;K;6;CP$UIDd;3;468E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;240E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;468E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;467E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;334E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;344E;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;419E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;469E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;470E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;471E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;472E;K;11;$aalignmentD;K;6;CP$UIDd;3;334E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;344E;K;6;$afontD;K;6;CP$UIDd;3;388E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;473E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;474E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;239E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;239E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;241E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;352E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;344E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;334E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;d;2;90D;K;6;$classD;K;6;CP$UIDd;3;417E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;460E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;475E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;466E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;334E;K;12;$atext-colorD;K;6;CP$UIDd;3;467E;K;6;$afontD;K;6;CP$UIDd;3;468E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;240E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;468E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;467E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;334E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;3;419E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;469E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;470E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;471E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;472E;K;11;$aalignmentD;K;6;CP$UIDd;3;334E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;344E;K;6;$afontD;K;6;CP$UIDd;3;388E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;473E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;474E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;239E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;239E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;241E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;352E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;344E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;334E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;20;{{1, 14}, {223, 15}}S;19;{{0, 0}, {223, 15}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:S;22;{{224, 29}, {15, 102}}S;19;{{0, 0}, {15, 102}}S;27;_verticalScrollerDidScroll:S;19;{{0, 0}, {212, 25}}S;14;tableHeaderRowS;21;{{43, 183}, {92, 21}}S;21;{{54, 234}, {70, 25}}D;K;6;$classD;K;6;CP$UIDd;3;374E;K;4;nameD;K;6;CP$UIDd;3;450E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;451E;K;5;valueD;K;6;CP$UIDd;3;452E;E;S;13;AppControllerS;15;backgroundColorD;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;476E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;477E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;478E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;13d;15;-62135510400000d;14;64092297600000d;2;-1S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;355E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;479E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;446E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;241E;E;D;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;453E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;240E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;241E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;239E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;334E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;480E;E;D;K;6;$classD;K;6;CP$UIDd;3;453E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;240E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;239E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;239E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;282E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;480E;E;D;K;6;$classD;K;6;CP$UIDd;3;453E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;1;0E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;241E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;239E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;334E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;3;480E;E;S;21;{{1, 131}, {212, 17}}S;19;{{0, 0}, {212, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;481E;D;K;6;CP$UIDd;3;481E;D;K;6;CP$UIDd;3;481E;D;K;6;CP$UIDd;3;282E;E;E;S;18;{{0, 0}, {14, 25}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;483E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;351E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;484E;E;D;K;6;$classD;K;6;CP$UIDd;3;355E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;445E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;485E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;239E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;241E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;239E;E;S;17;{{3, 0}, {-6, 0}}S;17;{{0, 0}, {-6, 0}}S;9;textfieldS;22;tableDataView+editableS;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;486E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;487E;D;K;6;CP$UIDd;3;488E;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;282E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;489E;D;K;6;CP$UIDd;3;490E;D;K;6;CP$UIDd;3;491E;D;K;6;CP$UIDd;3;282E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;282E;D;K;6;CP$UIDd;3;492E;D;K;6;CP$UIDd;3;493E;D;K;6;CP$UIDd;3;282E;E;E;S;13;Lucida Granded;2;32f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;482E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;418E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;460E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;418E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;405E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;241E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;494E;D;K;6;CP$UIDd;3;494E;D;K;6;CP$UIDd;3;494E;D;K;6;CP$UIDd;3;282E;E;E;d;2;11D;K;6;$classD;K;6;CP$UIDd;3;482E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;422E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;460E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;422E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;405E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;241E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;337E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;339E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;241E;E;f;12;0.3742909952f;12;0.6239674838f;11;0.674944629f;12;0.8964206861f;12;0.5172902231f;12;0.6314546156f;12;0.9600587347f;18;0.5019607843137255E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/ScalingTest/Resources/MainMenu.xib b/Tests/Manual/ScalingTest/Resources/MainMenu.xib new file mode 100644 index 000000000..fa7048e9d --- /dev/null +++ b/Tests/Manual/ScalingTest/Resources/MainMenu.xib @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ +y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ +5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g +8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ +AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg +DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ +HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g +KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ +OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg +Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ +VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg +Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ +cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg +f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA + + + + + + + + + + + + + + + + + + + + +VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ +y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ +5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g +8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ +AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg +DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ +HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g +KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ +OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg +Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ +VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg +Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ +cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg +f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/Manual/ScalingTest/Resources/spinner.gif b/Tests/Manual/ScalingTest/Resources/spinner.gif new file mode 100644 index 000000000..a5e705f6c Binary files /dev/null and b/Tests/Manual/ScalingTest/Resources/spinner.gif differ diff --git a/Tests/Manual/ScalingTest/index-debug.html b/Tests/Manual/ScalingTest/index-debug.html new file mode 100644 index 000000000..26bfaf7f1 --- /dev/null +++ b/Tests/Manual/ScalingTest/index-debug.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + ScalingTest + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/ScalingTest/index.html b/Tests/Manual/ScalingTest/index.html new file mode 100644 index 000000000..a873d60d0 --- /dev/null +++ b/Tests/Manual/ScalingTest/index.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + ScalingTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/ScalingTest/main.j b/Tests/Manual/ScalingTest/main.j new file mode 100644 index 000000000..046ecc59c --- /dev/null +++ b/Tests/Manual/ScalingTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * ScalingTest + * + * Created by You on July 23, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/SmartFoldersDemo/BadgedOutlineView.j b/Tests/Manual/SmartFoldersDemo/BadgedOutlineView.j index d8c244bd5..69fd91f91 100644 --- a/Tests/Manual/SmartFoldersDemo/BadgedOutlineView.j +++ b/Tests/Manual/SmartFoldersDemo/BadgedOutlineView.j @@ -198,7 +198,7 @@ var CPSourceListDataSource_sourceList_itemHasBadge_ = 1 << 1, @implementation CPOutlineView (MyExtensions) -- (CPView)preparedViewAtColumn:(int)column row:(int)row +- (CPView)preparedViewAtColumn:(CPInteger)column row:(CPInteger)row { return [self _newDataViewForRow:row tableColumn:_tableColumns[column]]; } diff --git a/Tests/Manual/TableTest/BorderTableTest/AppController.j b/Tests/Manual/TableTest/BorderTableTest/AppController.j index 942d5cdb5..62bd97497 100644 --- a/Tests/Manual/TableTest/BorderTableTest/AppController.j +++ b/Tests/Manual/TableTest/BorderTableTest/AppController.j @@ -42,7 +42,7 @@ CPLogRegister(CPLogConsole); return 10; } -- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row +- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { return String((row + 1) * [[tableColumn identifier] intValue]); } diff --git a/Tests/Manual/TableTest/ColumnResize/AppController.j b/Tests/Manual/TableTest/ColumnResize/AppController.j index e0a4a1f68..539dc8993 100644 --- a/Tests/Manual/TableTest/ColumnResize/AppController.j +++ b/Tests/Manual/TableTest/ColumnResize/AppController.j @@ -83,12 +83,12 @@ return 2000; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return "Column " + [aColumn identifier] + " Row " + aRow; } -- (int)tableView:(CPTableView)aTableView heightOfRow:(int)aRow +- (int)tableView:(CPTableView)aTableView heightOfRow:(CPInteger)aRow { return aRow % 2 ? 200 : 50; return aRow % 2 ? 1010 - (aRow * 10) : 10 + (aRow * 10); diff --git a/Tests/Manual/TableTest/ColumnSizing2/AppController.j b/Tests/Manual/TableTest/ColumnSizing2/AppController.j index e3cf7d71e..682b9dfdb 100644 --- a/Tests/Manual/TableTest/ColumnSizing2/AppController.j +++ b/Tests/Manual/TableTest/ColumnSizing2/AppController.j @@ -97,7 +97,7 @@ HEIGHT = 600; return tableView._meta['x'] + tableView._meta['y'] * 2; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return "Column " + [aColumn identifier] + " Row " + aRow; } diff --git a/Tests/Manual/TableTest/DataView/AppController.j b/Tests/Manual/TableTest/DataView/AppController.j index cca6789ae..9ab88c35b 100644 --- a/Tests/Manual/TableTest/DataView/AppController.j +++ b/Tests/Manual/TableTest/DataView/AppController.j @@ -83,7 +83,7 @@ var AppControllerInstance = nil; } // Don't allow files to be selected during an upload -- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)index +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)index { return !uploading; } diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/AppController.j b/Tests/Manual/TableTest/DelegateSelectionTest/AppController.j new file mode 100755 index 000000000..90698ddd0 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/AppController.j @@ -0,0 +1,140 @@ +/* + * AppController.j + * DelegateSelectionTest + * + * Created by You on October 16, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + CPArray _names; + + @outlet CPWindow theWindow; + @outlet CPTableView tableView; + @outlet CPTableView secondTableView; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. + +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + _names = [@"Alexandre Wilhelm", @"Alexander Ljungberg", @"Antoine Mercadal", @"Aparajita Fishman"]; + [tableView setAllowsMultipleSelection:YES]; + [tableView reloadData]; + + [secondTableView setDelegate:[DelegateSecondTableView new]]; + [secondTableView reloadData]; + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +- (int)numberOfRowsInTableView:(CPTableView)aTableView +{ + return [_names count]; +} + +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRowIndex +{ + return _names[aRowIndex]; +} + +- (void)tableViewSelectionDidChange:(CPNotification)aNotification +{ + console.log(@"tableViewSelectionDidChange") +} + +- (BOOL)selectionShouldChangeInTableView:(CPTableView)aTableView +{ + console.log(@"selectionShouldChangeInTableView") + return YES; +} + +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)rowIndex +{ + console.log(@"shouldSelectRow"); + return YES; +} + +- (void)tableViewSelectionIsChanging:(CPNotification)aNotification +{ + console.log(@"tableViewSelectionIsChanging"); +} + +- (void)tableView:(CPTableView)tableView didClickTableColumn:(CPTableColumn)tableColumn; +{ + console.log(@"didClickTableColumn"); +} + +- (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn +{ + console.log(@"shouldSelectTableColumn"); + return YES; +} + +@end + +@implementation DelegateSecondTableView : CPObject +{ +} + +- (id)init +{ + if (self = [super init]) + { + } + return self; +} + +- (CPIndexSet)tableView:(CPTableView)tableView selectionIndexesForProposedSelection:(CPIndexSet)proposedSelectionIndexes +{ + console.log(@"selectionIndexesForProposedSelection") + return proposedSelectionIndexes; +} + +- (void)tableViewSelectionDidChange:(CPNotification)aNotification +{ + console.log(@"tableViewSelectionDidChange") +} + +- (BOOL)selectionShouldChangeInTableView:(CPTableView)aTableView +{ + console.log(@"selectionShouldChangeInTableView") + return YES; +} + +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)rowIndex +{ + console.log(@"shouldSelectRow"); + return YES; +} + +- (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn +{ + console.log(@"shouldSelectTableColumn"); + return YES; +} + +- (void)tableViewSelectionIsChanging:(CPNotification)aNotification +{ + console.log(@"tableViewSelectionIsChanging"); +} + +- (void)tableView:(CPTableView)tableView didClickTableColumn:(CPTableColumn)tableColumn; +{ + console.log(@"didClickTableColumn"); +} + +@end diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/Info.plist b/Tests/Manual/TableTest/DelegateSelectionTest/Info.plist new file mode 100755 index 000000000..a86aa2954 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + DelegateSelectionTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2013, Your Company All rights reserved. + + diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/Jakefile b/Tests/Manual/TableTest/DelegateSelectionTest/Jakefile new file mode 100755 index 000000000..d13ed81e3 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * DelegateSelectionTest + * + * Created by You on October 16, 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"), + projectName = "DelegateSelectionTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "DelegateSelectionTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("DelegateSelectionTest"); + task.setIdentifier("com.yourcompany.DelegateSelectionTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("DelegateSelectionTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +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", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "DelegateSelectionTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "DelegateSelectionTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (ENV["CONFIGURATION"] === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/Resources/MainMenu.cib b/Tests/Manual/TableTest/DelegateSelectionTest/Resources/MainMenu.cib new file mode 100755 index 000000000..b610329e4 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/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;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;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;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;63E;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;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;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;133E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;1;0E;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;1;0E;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;3;173E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;180E;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;1;0E;D;K;6;CP$UIDd;3;184E;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;1;0E;D;K;6;CP$UIDd;3;190E;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;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;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;135E;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;3;173E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;2;11E;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;198E;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;199E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;184E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;200E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;201E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;178E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;178E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;202E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;190E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;190E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;204E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;205E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;163E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;206E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;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;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;151E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;208E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;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;158E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;158E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;210E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;211E;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;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;197E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;172E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;213E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;141E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;197E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;133E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;172E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;197E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;197E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;141E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;197E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;212E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;128E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;220E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;82E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;83E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;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;29E;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;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;230E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;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;29E;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;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;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;29E;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;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;238E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;239E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;240E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;243E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;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;245E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;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;29E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;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;29E;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;249E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;198E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;68E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;68E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;253E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;256E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;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;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;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;68E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;263E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;68E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;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;68E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;265E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;75E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;75E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;266E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;267E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;268E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;269E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;270E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;271E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;272E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;79E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;79E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;272E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;273E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;274E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;275E;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;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;75E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;277E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;278E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;279E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;280E;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;75E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;281E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;283E;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;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;284E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;87E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;87E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;284E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;286E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;287E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;288E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;289E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;290E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;291E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;292E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;293E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;294E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;295E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;296E;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;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;297E;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;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;298E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;299E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;98E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;98E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;299E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;302E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;303E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;304E;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;305E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;306E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;309E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;311E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;312E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;98E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;314E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;315E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;315E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;316E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;318E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;320E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;322E;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;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;323E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;323E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;324E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;302E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;303E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;326E;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;305E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;306E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;308E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;309E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;282E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;328E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;328E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;331E;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;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;332E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;120E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;120E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;332E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;120E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;335E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;336E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;337E;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;120E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;338E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;124E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;124E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;338E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;339E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;340E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;342E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;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;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;259E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;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;261E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;344E;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;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;345E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;130E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;254E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;130E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;65E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;345E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;347E;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;130E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;348E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;255E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;349E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;350E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;351E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;352E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;353E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;311E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;338E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;135E;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;134E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;355E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;355E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;356E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;359E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;360E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;361E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;363E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;139E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;364E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;147E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;146E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;365E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;259E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;259E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;259E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;367E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;368E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;305E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;354E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;138E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;369E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;371E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;374E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;141E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;140E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;139E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;370E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;139E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;376E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;12;$agrid-colorD;K;6;CP$UIDd;3;377E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;379E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;380E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;354E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;378E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;261E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;259E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;259E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;259E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;259E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;381E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;377E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;354E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;261E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;367E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;3;149E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;382E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;383E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;384E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;386E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;387E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;308E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;261E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;259E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;382E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;383E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;384E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;388E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;389E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;308E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;261E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;259E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;390E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;391E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;393E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;395E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;137E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;396E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;354E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;302E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;397E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;398E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;393E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;395E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;137E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;399E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;354E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;259E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;302E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;148E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;364E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;400E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;364E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;401E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;3;141E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;259E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;402E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;403E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;404E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;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;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;406E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;407E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;411E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;413E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;417E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;418E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;419E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;151E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;421E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;151E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;424E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;425E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;158E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;426E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;427E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;158E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;428E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;158E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;429E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;158E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;158E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;430E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;158E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;158E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;431E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;158E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;432E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;433E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;434E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;435E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;436E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;437E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;438E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;439E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;440E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;441E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;442E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;443E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;444E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;163E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;445E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;136E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;446E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;360E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;447E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;363E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;171E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;448E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;3;176E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;3;175E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;365E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;365E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;259E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;259E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;259E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;449E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;450E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;305E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;3;138E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;369E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;451E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;170E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;374E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;3;140E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;171E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;370E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;370E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;171E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;376E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;12;$agrid-colorD;K;6;CP$UIDd;3;377E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;379E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;380E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;354E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;378E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;261E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;259E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;259E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;259E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;259E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;452E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;377E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;354E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;261E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;449E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;3;177E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;382E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;383E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;384E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;453E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;454E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;308E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;261E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;259E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;142E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;382E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;383E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;384E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;455E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;456E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;308E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;261E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;259E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;390E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;391E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;170E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;393E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;395E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;170E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;396E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;354E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;302E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;145E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;397E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;398E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;170E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;393E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;394E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;395E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;354E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;3;170E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;399E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;354E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;259E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;302E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;148E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;448E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;400E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;448E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;401E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;3;172E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;259E;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;457E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;403E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;458E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;178E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;406E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;407E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;178E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;411E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;178E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;413E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;178E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;178E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;459E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;178E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;461E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;178E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;419E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;178E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;178E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;421E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;178E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;462E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;463E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;464E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;184E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;426E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;427E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;184E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;428E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;184E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;429E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;184E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;184E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;465E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;184E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;184E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;466E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;184E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;184E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;467E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;460E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;184E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;461E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;150E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;468E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;469E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;470E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;435E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;436E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;410E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;437E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;438E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;416E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;471E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;444E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;445E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;439E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;420E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;440E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;422E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;441E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;414E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;11;$aalignmentD;K;6;CP$UIDd;3;378E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;305E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;259E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;442E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;378E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;261E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;412E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;305E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;378E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;472E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;133E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;474E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;475E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;476E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;477E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;478E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;473E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;479E;E;E;S;8;delegateS;15;secondTableViewS;9;tableViewS;9;theWindowS;10;dataSourceS;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;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;129E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;3;104E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;115E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;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;118E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;131E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;26;{{335, -251}, {1038, 739}}S;21;{{0, 0}, {1440, 878}}d;1;0S;21;{{0, 0}, {1038, 739}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;3;190E;E;E;S;6;normalS;6;{1, 1}S;22;{{20, 20}, {240, 265}}S;20;{{0, 0}, {240, 265}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;364E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;367E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;368E;E;E;d;2;36S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;3;138E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;480E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;481E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;482E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;374E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;149E;E;d;2;10D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;366E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;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;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;485E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;137E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;S;20;{{1, 1}, {238, 247}}S;20;{{0, 0}, {238, 247}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;141E;E;E;d;2;18D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;487E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;488E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;489E;E;d;1;4d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;E;E;d;3;116d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;490E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;491E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;492E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;260E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;492E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;354E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;378E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;493E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;494E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;495E;K;11;$aalignmentD;K;6;CP$UIDd;3;354E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;378E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;496E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;497E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;259E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;259E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;374E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;378E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;354E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;498E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;491E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;492E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;260E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;492E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;354E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;378E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;493E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;494E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;495E;K;11;$aalignmentD;K;6;CP$UIDd;3;354E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;378E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;496E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;497E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;259E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;259E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;374E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;378E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;354E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;21;{{1, 131}, {223, 15}}S;19;{{0, 0}, {223, 15}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:S;23;{{224, 146}, {15, 102}}S;19;{{0, 0}, {15, 102}}S;27;_verticalScrollerDidScroll:S;19;{{0, 0}, {238, 25}}S;14;tableHeaderRowS;23;{{268, 20}, {278, 168}}S;20;{{0, 0}, {278, 168}}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;156E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;153E;E;E;S;6;CPViewS;20;{{21, 7}, {193, 17}}S;19;{{0, 0}, {193, 17}}S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;409E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;499E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;500E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;259E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;261E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;261E;E;S;28;Order when selecting a row :D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;501E;E;S;21;{{21, 32}, {231, 31}}S;19;{{0, 0}, {231, 31}}D;K;6;$classD;K;6;CP$UIDd;3;409E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;499E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;500E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;261E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;261E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;261E;E;S;34;- selectionShouldChangeInTableViewS;21;{{21, 64}, {231, 31}}S;17;- shouldSelectRowS;21;{{21, 98}, {231, 31}}S;30;- tableViewSelectionIsChangingS;22;{{21, 137}, {231, 31}}S;29;- tableViewSelectionDidChangeS;24;{{268, 196}, {278, 144}}S;20;{{0, 0}, {278, 144}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;159E;E;E;S;20;{{21, 8}, {227, 17}}S;19;{{0, 0}, {227, 17}}S;34;Order when selecting in the void :S;21;{{21, 33}, {231, 31}}S;21;{{21, 65}, {231, 31}}S;22;{{21, 104}, {231, 31}}S;23;{{554, 20}, {279, 226}}S;20;{{0, 0}, {279, 226}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;164E;E;E;S;20;{{13, 7}, {252, 17}}S;19;{{0, 0}, {252, 17}}S;36;Order when selecting a tableColumn :S;21;{{13, 32}, {231, 31}}S;21;{{13, 97}, {231, 31}}S;22;{{13, 131}, {231, 31}}S;22;{{13, 165}, {231, 31}}S;21;- didClickTableColumnS;21;{{13, 66}, {232, 31}}S;19;{{0, 0}, {232, 31}}S;25;- shouldSelectTableColumnS;23;{{20, 377}, {240, 265}}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;448E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;449E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;450E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;138E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;480E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;481E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;502E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;170E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;374E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;3;366E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;354E;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;170E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;392E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;485E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;170E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;D;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;E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;503E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;491E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;492E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;260E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;492E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;354E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;378E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;493E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;494E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;495E;K;11;$aalignmentD;K;6;CP$UIDd;3;354E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;378E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;496E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;497E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;259E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;259E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;374E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;378E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;354E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;504E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;491E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;354E;K;6;$afontD;K;6;CP$UIDd;3;492E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;260E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;492E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;354E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;378E;E;D;K;6;$classD;K;6;CP$UIDd;3;152E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;493E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;494E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;408E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;495E;K;11;$aalignmentD;K;6;CP$UIDd;3;354E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;378E;K;6;$afontD;K;6;CP$UIDd;3;415E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;496E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;497E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;259E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;259E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;261E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;374E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;378E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;354E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;24;{{268, 377}, {278, 168}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;179E;E;E;S;21;{{21, 64}, {248, 31}}S;19;{{0, 0}, {248, 31}}S;38;- selectionIndexesForProposedSelectionS;24;{{268, 553}, {278, 176}}S;20;{{0, 0}, {278, 176}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;185E;E;E;S;21;{{21, 99}, {231, 31}}S;22;{{21, 138}, {231, 31}}S;21;{{21, 65}, {248, 31}}S;24;{{554, 377}, {279, 241}}S;20;{{0, 0}, {279, 241}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;191E;E;E;S;21;{{13, 63}, {232, 31}}S;13;AppControllerS;15;backgroundColorD;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;505E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;506E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;507E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;508E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;509E;E;D;K;6;$classD;K;6;CP$UIDd;3;373E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;510E;E;S;21;{{1, 248}, {238, 17}}S;19;{{0, 0}, {238, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;149E;E;E;S;20;{{0, 240}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;511E;D;K;6;CP$UIDd;3;511E;D;K;6;CP$UIDd;3;511E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;513E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;409E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;499E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;514E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;261E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;261E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;261E;E;S;17;{{3, 0}, {-6, 0}}S;17;{{0, 0}, {-6, 0}}S;22;tableDataView+editableS;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;515E;E;E;S;17;.Lucida Grande UId;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;516E;D;K;6;CP$UIDd;3;516E;D;K;6;CP$UIDd;3;516E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;177E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;517E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;518E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;519E;D;K;6;CP$UIDd;3;520E;D;K;6;CP$UIDd;3;521E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;522E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;523E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;524E;D;K;6;CP$UIDd;3;525E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;524E;D;K;6;CP$UIDd;3;525E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;522E;D;K;6;CP$UIDd;3;302E;D;K;6;CP$UIDd;3;523E;D;K;6;CP$UIDd;3;302E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;519E;D;K;6;CP$UIDd;3;520E;D;K;6;CP$UIDd;3;521E;D;K;6;CP$UIDd;3;302E;E;E;f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;512E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;386E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;386E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;261E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;d;2;11D;K;6;$classD;K;6;CP$UIDd;3;512E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;388E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;388E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;261E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;3;512E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;453E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;453E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;261E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;3;512E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;455E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;486E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;486E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;455E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;372E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;261E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;357E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;358E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;358E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;261E;E;f;12;0.4198744338f;12;0.6295798448f;11;0.885827106f;12;0.5747093725f;12;0.6224097044f;11;0.686530063f;12;0.8223946111E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/Resources/MainMenu.xib b/Tests/Manual/TableTest/DelegateSelectionTest/Resources/MainMenu.xib new file mode 100755 index 000000000..83c0ef073 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/Resources/MainMenu.xib @@ -0,0 +1,768 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/index-debug.html b/Tests/Manual/TableTest/DelegateSelectionTest/index-debug.html new file mode 100755 index 000000000..e2397e9bb --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + DelegateSelectionTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/index.html b/Tests/Manual/TableTest/DelegateSelectionTest/index.html new file mode 100755 index 000000000..3524786f0 --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + DelegateSelectionTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/TableTest/DelegateSelectionTest/main.j b/Tests/Manual/TableTest/DelegateSelectionTest/main.j new file mode 100755 index 000000000..9ff4519ce --- /dev/null +++ b/Tests/Manual/TableTest/DelegateSelectionTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * DelegateSelectionTest + * + * Created by You on October 16, 2013. + * Copyright 2013, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/TableTest/DragAndDrop/AppController.j b/Tests/Manual/TableTest/DragAndDrop/AppController.j index 0cc82401b..56464a735 100644 --- a/Tests/Manual/TableTest/DragAndDrop/AppController.j +++ b/Tests/Manual/TableTest/DragAndDrop/AppController.j @@ -99,7 +99,7 @@ TableTestDragAndDropTableViewDataType = @"TableTestDragAndDropTableViewDataType" return [rowList count]; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { if ([aColumn identifier] == "Row") return aRow; @@ -118,13 +118,13 @@ TableTestDragAndDropTableViewDataType = @"TableTestDragAndDropTableViewDataType" return YES; } -- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)operation +- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(CPInteger)row proposedDropOperation:(CPTableViewDropOperation)operation { [aTableView setDropRow:row dropOperation:CPTableViewDropAbove]; return CPDragOperationMove; } -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation { var pasteboard = [info draggingPasteboard], encodedData = [pasteboard dataForType:TableTestDragAndDropTableViewDataType], diff --git a/Tests/Manual/TableTest/DrawRowTest/AppController.j b/Tests/Manual/TableTest/DrawRowTest/AppController.j index e40fc6045..e4d09bc80 100644 --- a/Tests/Manual/TableTest/DrawRowTest/AppController.j +++ b/Tests/Manual/TableTest/DrawRowTest/AppController.j @@ -66,7 +66,7 @@ return 10000; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return "Column " + [aColumn identifier] + " Row " + aRow; } diff --git a/Tests/Manual/TableTest/Editing/AppController.j b/Tests/Manual/TableTest/Editing/AppController.j index c1db7c183..f96f3d6e4 100644 --- a/Tests/Manual/TableTest/Editing/AppController.j +++ b/Tests/Manual/TableTest/Editing/AppController.j @@ -32,19 +32,19 @@ var i = numberOfRows; rowData = []; rowEdits = []; - while(i--) + while (i--) { rowData[i] = "Initial Value, Row " + i; var j = numberOfEditsKept; rowEdits[i] = []; - while(j--) + while (j--) rowEdits[i][j] = ""; } // Build the table. - [scroll setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable]; + [scroll setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; var table = [[CPTableView alloc] initWithFrame:CGRectMakeZero()]; [table setDataSource:self]; @@ -66,7 +66,7 @@ [dataColumn setEditable:YES]; [dataColumn setWidth:140]; - for(i = 0; i < numberOfEditsKept; i++) + for (i = 0; i < numberOfEditsKept; i++) { var editColumn = [[CPTableColumn alloc] initWithIdentifier:"Edit" + i]; [table addTableColumn:editColumn]; @@ -86,7 +86,7 @@ return numberOfRows; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { if ([aColumn identifier] == "Row") return aRow; @@ -102,11 +102,11 @@ } } -- (void)tableView:(CPTableView)tableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)tableColumn row:(int)aRow +- (void)tableView:(CPTableView)tableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)tableColumn row:(CPInteger)aRow { var name = [tableColumn identifier]; - switch(name) + switch (name) { case "Current": { diff --git a/Tests/Manual/TableTest/EditingControls/AppController.j b/Tests/Manual/TableTest/EditingControls/AppController.j index 451d4ba94..05fdbbba6 100644 --- a/Tests/Manual/TableTest/EditingControls/AppController.j +++ b/Tests/Manual/TableTest/EditingControls/AppController.j @@ -24,7 +24,7 @@ [CPDictionary dictionaryWithObjects:[YES, NO, @"NO"] forKeys:keys], [CPDictionary dictionaryWithObjects:[NO, YES, @"YES"] forKeys:keys] ]]; - + [self _selectSegment:0]; [theWindow setFullPlatformWindow:YES]; } @@ -37,14 +37,14 @@ - (void)_selectSegment:(CPInteger)anIndex { var EnumerateColumns; - + if (anIndex == 0) { EnumerateColumns = function(column, idx) { [column bind:CPValueBinding toObject:arrayController withKeyPath:(@"arrangedObjects." + [column identifier]) options:nil]; }; - + [tableView setDataSource:nil]; } else @@ -53,10 +53,10 @@ { [column unbind:CPValueBinding]; }; - + [tableView setDataSource:self]; } - + [[tableView tableColumns] enumerateObjectsUsingBlock:EnumerateColumns]; } @@ -70,12 +70,12 @@ return [content count]; } -- (id)tableView:(id)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(int)aRow +- (id)tableView:(id)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow { return [[content objectAtIndex:aRow] objectForKey:[aTableColumn identifier]]; } -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)aTableColumn row:(int)aRow +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow { [[content objectAtIndex:aRow] setObject:aValue forKey:[aTableColumn identifier]]; } diff --git a/Tests/Manual/TableTest/GroupRowTest/AppController.j b/Tests/Manual/TableTest/GroupRowTest/AppController.j index 31a3e565e..e2fbff4c5 100644 --- a/Tests/Manual/TableTest/GroupRowTest/AppController.j +++ b/Tests/Manual/TableTest/GroupRowTest/AppController.j @@ -11,14 +11,15 @@ @implementation AppController : CPObject { + CPImage iconImage; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], - contentView = [theWindow contentView]; + contentView = [theWindow contentView], - tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 400.0)]; + tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 400.0)]; [tableView setAllowsMultipleSelection:YES]; [tableView setAllowsColumnSelection:YES]; @@ -28,7 +29,7 @@ [tableView setDelegate:self]; [tableView setDataSource:self]; - var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16,16,0,0)]; + var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16, 16, 0, 0)]; [iconView setImageScaling:CPImageScaleNone]; var iconColumn = [[CPTableColumn alloc] initWithIdentifier:"icons"]; [iconColumn setWidth:32.0]; @@ -36,7 +37,7 @@ [iconColumn setDataView:iconView]; [tableView addTableColumn:iconColumn]; - iconImage = [[CPImage alloc] initWithContentsOfFile:"http://cappuccino-project.org/images/favicon.png" size:CGSizeMake(16,16)]; + iconImage = [[CPImage alloc] initWithContentsOfFile:"http://www.cappuccino-project.org/img/favicon.ico" size:CGSizeMake(16, 16)]; for (var i = 1; i <= 5; i++) @@ -68,7 +69,7 @@ [tableView setDelegate:self]; [tableView setDataSource:self]; - var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16,16,0,0)]; + var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16, 16, 0, 0)]; [iconView setImageScaling:CPImageScaleNone]; var iconColumn = [[CPTableColumn alloc] initWithIdentifier:"icons"]; [iconColumn setWidth:32.0]; @@ -76,9 +77,6 @@ [iconColumn setDataView:iconView]; [tableView addTableColumn:iconColumn]; - iconImage = [[CPImage alloc] initWithContentsOfFile:"http://cappuccino-project.org/images/favicon.png" size:CGSizeMake(16,16)]; - - for (var i = 1; i <= 5; i++) { var column = [[CPTableColumn alloc] initWithIdentifier:String(i)]; @@ -107,7 +105,7 @@ return 500; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { if ([aColumn identifier] === "icons") return iconImage; @@ -115,7 +113,7 @@ return aRow; } -- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(int)aRow +- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(CPInteger)aRow { var groups = []; diff --git a/Tests/Manual/TableTest/OldTest/AppController.j b/Tests/Manual/TableTest/OldTest/AppController.j index 1ca284229..d28b73b64 100644 --- a/Tests/Manual/TableTest/OldTest/AppController.j +++ b/Tests/Manual/TableTest/OldTest/AppController.j @@ -287,7 +287,7 @@ tableTestDragType = @"CPTableViewTestDragType"; return dataSet3.length; } -- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { if ([aColumn identifier] === "icons") return iconImage; @@ -310,7 +310,7 @@ tableTestDragType = @"CPTableViewTestDragType"; [aTableView reloadData]; } -- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)rowIndex +- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(CPInteger)rowIndex { CPLog.debug(@"tableView:shouldSelectRow"); return true; @@ -337,7 +337,7 @@ tableTestDragType = @"CPTableViewTestDragType"; CPLogConsole(_cmd + [notification description]); } -- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)tableColumn row:(int)row +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { if (aTableView === tableView3) return YES; @@ -345,12 +345,12 @@ tableTestDragType = @"CPTableViewTestDragType"; return NO; } -- (void)tableView:(CPTableView)aTableView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)tableColumn row:(int)row +- (void)tableView:(CPTableView)aTableView willDisplayView:(CPView)aView forTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { //CPLogConsole(_cmd + " column: " + [tableColumn identifier] + " row:" + row) } -- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)tableColumn row:(int)row +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { if (aTableView === tableView3) dataSet3[row] = aValue; @@ -396,7 +396,7 @@ tableTestDragType = @"CPTableViewTestDragType"; return CPDragOperationMove; } -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation { var pboard = [info draggingPasteboard], rowData = [pboard dataForType:tableTestDragType], diff --git a/Tests/Manual/TableTest/TableCibTest/AppController.j b/Tests/Manual/TableTest/TableCibTest/AppController.j index f7ac67c3f..0b0336dec 100644 --- a/Tests/Manual/TableTest/TableCibTest/AppController.j +++ b/Tests/Manual/TableTest/TableCibTest/AppController.j @@ -37,7 +37,7 @@ CPLogRegister(CPLogConsole); return 100000; } -- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row +- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(CPInteger)row { if ([tableColumn identifier] === "icons") return iconImage; @@ -45,4 +45,12 @@ CPLogRegister(CPLogConsole); return String((row + 1) * [[tableColumn identifier] intValue]); } +- (BOOL)tableView:(CPTableView)tableView shouldReorderColumn:(CPInteger)columnIndex toColumn:(CPInteger)newColumnIndex +{ + if (columnIndex === 0 || newColumnIndex === 4) + return NO; + else + return YES; +} + @end \ No newline at end of file diff --git a/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.cib index 4e867d7a0..c0bfaedc4 100644 --- a/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.cib @@ -1 +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;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;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;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;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;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;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;11E;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;2;39E;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;2;40E;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;2;38E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;41E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;38E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;38E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;39E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;44E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;45E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;46E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;47E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;48E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;49E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;50E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;22E;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;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;52E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;52E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;53E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;55E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;56E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;57E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;58E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;61E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;62E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;26E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;27E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;63E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;64E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;64E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;64E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;65E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;66E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;51E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;67E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;51E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;73E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;51E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;64E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;75E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;76E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;77E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;51E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;78E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;51E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;79E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;80E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;61E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;81E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;81E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;61E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;12;$agrid-colorD;K;6;CP$UIDd;2;85E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;86E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;87E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;2;51E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;2;74E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;79E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;64E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;64E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;64E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;88E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;85E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;89E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;64E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;91E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;37E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;92E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;93E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;94E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;95E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;97E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;99E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;79E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;64E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;100E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;101E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;94E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;95E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;103E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;79E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;64E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;104E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;105E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;106E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;107E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;109E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;79E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;64E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;110E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;111E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;112E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;114E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;79E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;64E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;115E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;111E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;116E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;118E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;79E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;64E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;119E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;120E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;121E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;E;E;S;8;delegateS;9;theWindowS;10;dataSourceS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 128}, {686, 348}}S;21;{{0, 0}, {1440, 878}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {686, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;6;normalS;22;{{20, 20}, {646, 308}}S;20;{{0, 0}, {646, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;65E;E;E;d;2;36S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;122E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;81E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;123E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;69E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;37E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;d;1;2S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;19;{{1, 2}, {644, 15}}S;19;{{0, 0}, {644, 15}}S;29;_horizontalScrollerDidScroll:F;f;18;0.9415204678362573S;20;{{0, 0}, {644, 290}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;82E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;128E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;2;82E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;129E;E;d;2;43S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;E;E;d;1;3D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;90E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;51E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;130E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;96E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;6;$afontD;K;6;CP$UIDd;3;136E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;51E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;137E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;136E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;51E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;74E;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;98E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;139E;K;6;$afontD;K;6;CP$UIDd;3;141E;K;12;$atext-colorD;K;6;CP$UIDd;3;142E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;66E;K;11;$aalignmentD;K;6;CP$UIDd;2;51E;K;15;$acontent-insetD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;145E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;146E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;51E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;145E;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;96E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;149E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;150E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;148E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;149E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;139E;K;6;$afontD;K;6;CP$UIDd;3;151E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;74E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;66E;K;11;$aalignmentD;K;6;CP$UIDd;3;149E;K;15;$acontent-insetD;K;6;CP$UIDd;3;152E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;145E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;146E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;74E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;149E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;145E;E;S;5;iconsd;3;188f;21;3.028234663852886e+53D;K;6;$classD;K;6;CP$UIDd;2;96E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;153E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;66E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;155E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;154E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;66E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;74E;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;3;108E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;51E;K;11;$aalignmentD;K;6;CP$UIDd;2;51E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;2;51E;E;f;9;94.078125f;22;3.4028234663852885e+54D;K;6;$classD;K;6;CP$UIDd;2;96E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;156E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;6;$afontD;K;6;CP$UIDd;3;136E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;51E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;157E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;136E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;51E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;74E;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;113E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;158E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;158E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;66E;K;16;$aimage-positionD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;66E;K;11;$aalignmentD;K;6;CP$UIDd;2;66E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;160E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;145E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;79E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;149E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;149E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;64E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;66E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;51E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;161E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;162E;E;d;2;92D;K;6;$classD;K;6;CP$UIDd;2;96E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;6;$afontD;K;6;CP$UIDd;3;136E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;51E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;164E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;136E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;51E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;16;CPLevelIndicatorK;8;$classesA;S;16;CPLevelIndicatorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;165E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;K;11;$aalignmentD;K;6;CP$UIDd;2;51E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;74E;K;24;CPLevelIndicatorStyleKeyD;K;6;CP$UIDd;2;66E;K;27;CPLevelIndicatorMinValueKeyD;K;6;CP$UIDd;2;51E;K;27;CPLevelIndicatorMaxValueKeyD;K;6;CP$UIDd;2;89E;K;31;CPLevelIndicatorWarningValueKeyD;K;6;CP$UIDd;2;89E;K;32;CPLevelIndicatorCriticalValueKeyD;K;6;CP$UIDd;2;89E;K;35;CPLevelIndicatorTickMarkPositionKeyD;K;6;CP$UIDd;2;51E;K;36;CPLevelIndicatorNumberOfTickMarksKeyD;K;6;CP$UIDd;2;51E;K;41;CPLevelIndicatorNumberOfMajorTickMarksKeyD;K;6;CP$UIDd;1;0E;K;29;CPLevelIndicatorIsEditableKeyD;K;6;CP$UIDd;2;79E;E;S;19;{{0, 0}, {644, 25}}S;14;tableHeaderRowS;13;AppControllerS;20;{{1, 1}, {644, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;S;21;{{1, 291}, {644, 17}}S;19;{{0, 0}, {644, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;149E;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;166E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;149E;E;E;S;20;{{502, 0}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;E;E;S;12;columnHeaderD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;169E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;170E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;S;8;Column 1S;9;textfieldS;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;140E;K;4;nameD;K;6;CP$UIDd;3;171E;K;12;defaultValueD;K;6;CP$UIDd;3;172E;K;6;valuesD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;82E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;175E;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;143E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;176E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;177E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;169E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;178E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;64E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;d;1;1S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;140E;K;4;nameD;K;6;CP$UIDd;3;171E;K;12;defaultValueD;K;6;CP$UIDd;3;172E;K;6;valuesD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;3;143E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;180E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;181E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;170E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;S;5;ImageD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;E;E;S;20;Checkbox really longS;17;{{0, 0}, {0, 21}}S;9;check-boxS;5;Checkf;3;0.5f;4;0.05D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;E;E;S;15;Level IndicatorS;15;level-indicatorf;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;97E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;S;13;Lucida Granded;2;11S;4;fontD;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;186E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;64E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;187E;K;6;normalD;K;6;CP$UIDd;3;188E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;149E;E;E;S;39;{"top":0,"right":5,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;3;167E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;102E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;102E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;d;2;20D;K;6;$classD;K;6;CP$UIDd;3;173E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;189E;K;6;normalD;K;6;CP$UIDd;3;190E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;107E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;107E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;S;7;GeorgiaD;K;6;$classD;K;6;CP$UIDd;3;167E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;3;167E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;116E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;116E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;54E;E;d;2;18S;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;191E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;192E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;64E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;185E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;192E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;193E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;178E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;64E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;3;135E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;193E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;178E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;79E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;79E;E;S;17;Arial, sans-serifd;2;12S;15;Times New RomanE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +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;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;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;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;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;11E;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;2;40E;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;2;41E;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;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;21E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;42E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;40E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;45E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;46E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;47E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;48E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;49E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;50E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;51E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;23E;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;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;53E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;54E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;56E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;57E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;58E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;60E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;62E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;63E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;27E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;28E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;64E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;64E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;64E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;64E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;65E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;65E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;65E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;2;66E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;2;67E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;2;52E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;68E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;72E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;52E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;25E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;74E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;52E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;65E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;76E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;77E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;72E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;52E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;25E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;79E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;52E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;2;80E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;81E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;82E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;12;$agrid-colorD;K;6;CP$UIDd;2;86E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;87E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;88E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;2;52E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;2;75E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;80E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;65E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;65E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;65E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;65E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;89E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;86E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;90E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;65E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;92E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;38E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;93E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;94E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;95E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;96E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;98E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;100E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;90E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;65E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;101E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;95E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;96E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;103E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;104E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;90E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;65E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;105E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;106E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;64E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;107E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;108E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;110E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;90E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;65E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;111E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;64E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;112E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;113E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;115E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;90E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;65E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;116E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;64E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;112E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;117E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;119E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;90E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;2;65E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;63E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;120E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;63E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;30E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;122E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;E;E;S;8;delegateS;9;theWindowS;10;dataSourceS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 128}, {686, 348}}S;21;{{0, 0}, {1440, 878}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {686, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;S;6;normalS;22;{{20, 20}, {646, 308}}S;20;{{0, 0}, {646, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;66E;E;E;d;2;36S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;124E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;30E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;38E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;d;1;2S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8d;11;-2147483648S;8;scrollerS;8;disabledS;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;19;{{1, 2}, {644, 15}}S;19;{{0, 0}, {644, 15}}S;29;_horizontalScrollerDidScroll:F;f;18;0.9415204678362573S;20;{{0, 0}, {644, 290}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;129E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;130E;E;d;2;43S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;E;E;d;1;3D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;131E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;52E;K;12;$atext-colorD;K;6;CP$UIDd;3;136E;K;6;$afontD;K;6;CP$UIDd;3;138E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;139E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;138E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;136E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;52E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;75E;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;99E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;143E;K;11;$aalignmentD;K;6;CP$UIDd;2;52E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;75E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;6;$afontD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;147E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;148E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;65E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;65E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;84E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;75E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;52E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;149E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;150E;K;6;$afontD;K;6;CP$UIDd;3;151E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;152E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;151E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;150E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;99E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;143E;K;11;$aalignmentD;K;6;CP$UIDd;3;150E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;75E;K;6;$afontD;K;6;CP$UIDd;3;153E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;147E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;148E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;65E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;65E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;84E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;75E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;150E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;5;iconsd;3;188f;21;3.028234663852886e+53D;K;6;$classD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;154E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;67E;K;6;$afontD;K;6;CP$UIDd;3;155E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;156E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;155E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;67E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;75E;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;3;109E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;157E;K;11;$aalignmentD;K;6;CP$UIDd;2;52E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;52E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;52E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;2;52E;E;f;9;94.078125f;22;3.4028234663852885e+54D;K;6;$classD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;158E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;52E;K;12;$atext-colorD;K;6;CP$UIDd;3;136E;K;6;$afontD;K;6;CP$UIDd;3;138E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;159E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;138E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;136E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;52E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;75E;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;114E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;160E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;160E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;157E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;67E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;52E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;16;$aimage-positionD;K;6;CP$UIDd;2;67E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;67E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;52E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;163E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;164E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;80E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;150E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;150E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;65E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;67E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;52E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;165E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;166E;E;d;2;92D;K;6;$classD;K;6;CP$UIDd;2;97E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;K;16;$atext-alignmentD;K;6;CP$UIDd;2;52E;K;12;$atext-colorD;K;6;CP$UIDd;3;136E;K;6;$afontD;K;6;CP$UIDd;3;138E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;168E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;138E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;3;136E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;2;52E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;16;CPLevelIndicatorK;8;$classesA;S;16;CPLevelIndicatorS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;157E;K;11;$aalignmentD;K;6;CP$UIDd;2;52E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;52E;K;6;$afontD;K;6;CP$UIDd;3;162E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;90E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPLevelIndicatorStyleKeyD;K;6;CP$UIDd;2;67E;K;27;CPLevelIndicatorMinValueKeyD;K;6;CP$UIDd;2;52E;K;27;CPLevelIndicatorMaxValueKeyD;K;6;CP$UIDd;2;90E;K;31;CPLevelIndicatorWarningValueKeyD;K;6;CP$UIDd;2;90E;K;32;CPLevelIndicatorCriticalValueKeyD;K;6;CP$UIDd;2;90E;K;35;CPLevelIndicatorTickMarkPositionKeyD;K;6;CP$UIDd;2;52E;K;36;CPLevelIndicatorNumberOfTickMarksKeyD;K;6;CP$UIDd;2;52E;K;41;CPLevelIndicatorNumberOfMajorTickMarksKeyD;K;6;CP$UIDd;1;0E;K;29;CPLevelIndicatorIsEditableKeyD;K;6;CP$UIDd;2;80E;E;S;19;{{0, 0}, {644, 25}}S;14;tableHeaderRowS;13;AppControllerS;20;{{1, 1}, {644, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;30E;E;E;S;21;{{1, 291}, {644, 17}}S;19;{{0, 0}, {644, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;150E;E;E;S;20;{{502, 0}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;173E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;174E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;175E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;65E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;65E;E;S;8;Column 1S;17;{{3, 0}, {-6, 0}}S;17;{{0, 0}, {-6, 0}}S;9;textfieldS;22;tableDataView+editableD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;144E;K;4;nameD;K;6;CP$UIDd;3;176E;K;12;defaultValueD;K;6;CP$UIDd;3;177E;K;6;valuesD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;174E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;180E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;65E;E;S;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;181E;E;E;d;1;1D;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;182E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;183E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;65E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;184E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;183E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;185E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;186E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;175E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;S;5;ImageS;13;tableDataViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;E;E;S;20;Checkbox really longS;17;{{0, 0}, {0, 21}}S;9;check-boxD;K;6;$classD;K;6;CP$UIDd;3;137E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;182E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;188E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;S;5;CheckS;0;f;3;0.5f;4;0.05D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;E;E;S;15;Level IndicatorS;15;level-indicatorf;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;171E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;98E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;98E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;190E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;150E;E;E;S;28;_CPFontSystemFacePlaceholderd;2;11S;10;text-colorD;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;192E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;10;CP.objectsD;K;43;tableDataView+selectedTableDataView+editingD;K;6;CP$UIDd;3;193E;K;35;tableDataView+selectedTableDataViewD;K;6;CP$UIDd;3;194E;K;6;normalD;K;6;CP$UIDd;3;193E;E;E;d;2;-1D;K;6;$classD;K;6;CP$UIDd;3;171E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;103E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;103E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;190E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;S;13;Lucida Granded;2;20S;15;Times New RomanD;K;6;$classD;K;6;CP$UIDd;3;171E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;108E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;108E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;190E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;S;7;GeorgiaD;K;6;$classD;K;6;CP$UIDd;3;171E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;113E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;113E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;190E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;d;2;13D;K;6;$classD;K;6;CP$UIDd;3;171E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;117E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;117E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;190E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;2;80E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;55E;E;d;2;18f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;3;150E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;195E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;196E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.xib b/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.xib index 5afc744ff..c33ea52b0 100644 --- a/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.xib +++ b/Tests/Manual/TableTest/TableCibTest/Resources/MainMenu.xib @@ -2,13 +2,13 @@ 1050 - 12C60 - 2843 - 1187.34 - 625.00 + 12D78 + 3084 + 1187.37 + 626.00 com.apple.InterfaceBuilder.CocoaPlugin - 2843 + 3084 YES @@ -74,7 +74,7 @@ {644, 290} - + YES NO YES @@ -335,7 +335,7 @@ {{502, 17}, {15, 275}} - + NO _doScroller: @@ -347,7 +347,7 @@ {{1, 291}, {644, 16}} - + NO 1 @@ -425,6 +425,14 @@ 500
+ + + delegate + + + + 513 +
@@ -657,7 +665,7 @@ - 512 + 513 diff --git a/Tests/Manual/TableTest/TestTemplate_AppController.j b/Tests/Manual/TableTest/TestTemplate_AppController.j index 6f3b1440a..9be9584d7 100644 --- a/Tests/Manual/TableTest/TestTemplate_AppController.j +++ b/Tests/Manual/TableTest/TestTemplate_AppController.j @@ -67,7 +67,7 @@ return 10000; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return "Column " + [aColumn identifier] + " Row " + aRow; } diff --git a/Tests/Manual/TableTest/VariableRows/AppController.j b/Tests/Manual/TableTest/VariableRows/AppController.j index 4faf78a5b..e6a32bc50 100644 --- a/Tests/Manual/TableTest/VariableRows/AppController.j +++ b/Tests/Manual/TableTest/VariableRows/AppController.j @@ -83,18 +83,18 @@ var tableTestDragType = "tableTestDragType"; return 2000; } -- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow { return "Column " + [aColumn identifier] + " Row " + aRow; } -- (int)tableView:(CPTableView)aTableView heightOfRow:(int)aRow +- (int)tableView:(CPTableView)aTableView heightOfRow:(CPInteger)aRow { return aRow % 2 ? 200 : 50; return aRow % 2 ? 1010 - (aRow * 10) : 10 + (aRow * 10); } -- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(int)aRow +- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(CPInteger)aRow { return !(aRow % 5); } @@ -131,7 +131,7 @@ var tableTestDragType = "tableTestDragType"; return CPDragOperationMove; } -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation { return YES; } diff --git a/Tests/Manual/TableTest/ViewBased/AppController.j b/Tests/Manual/TableTest/ViewBased/AppController.j index c966a5dd1..7eef5b793 100644 --- a/Tests/Manual/TableTest/ViewBased/AppController.j +++ b/Tests/Manual/TableTest/ViewBased/AppController.j @@ -82,7 +82,7 @@ CPLogRegister(CPLogConsole) return content.length; } -- (void)tableView:(CPTableView)aTableView dataViewForTableColumn:(CPTableColumn)aTableColumn row:(int)aRow +- (void)tableView:(CPTableView)aTableView dataViewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow { var n = (aRow % 3), viewKind = "view_kind_" + n, diff --git a/Tests/Manual/TableTest/ViewBasedCib/AppController.j b/Tests/Manual/TableTest/ViewBasedCib/AppController.j index 4d422d33b..03c720fb3 100644 --- a/Tests/Manual/TableTest/ViewBasedCib/AppController.j +++ b/Tests/Manual/TableTest/ViewBasedCib/AppController.j @@ -112,7 +112,7 @@ CPLogRegister(CPLogConsole) } // DELEGATE METHODS FOR THE TABLE VIEW -- (void)tableView:(CPTableView)aTableView viewForTableColumn:(CPTableColumn)aTableColumn row:(int)aRow +- (void)tableView:(CPTableView)aTableView viewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow { var identifier = [aTableColumn identifier]; @@ -150,7 +150,7 @@ CPLogRegister(CPLogConsole) return CPDragOperationMove; } -- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation +- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation { var pboard = [info draggingPasteboard], sourceIndexes = [pboard dataForType:TABLE_DRAG_TYPE], @@ -168,7 +168,7 @@ CPLogRegister(CPLogConsole) return YES; } -- (int)tableView:(CPTableView)aTableView heightOfRow:(int)aRow +- (int)tableView:(CPTableView)aTableView heightOfRow:(CPInteger)aRow { var height; diff --git a/Tests/Manual/ThemeBrowser/AppController.j b/Tests/Manual/ThemeBrowser/AppController.j index 95660e794..f60e077d3 100644 --- a/Tests/Manual/ThemeBrowser/AppController.j +++ b/Tests/Manual/ThemeBrowser/AppController.j @@ -203,7 +203,7 @@ var BrowserColumnTheme = 0, return description; } -- (CPString)browser:(id)aBrowser titleOfColumn:(int)column +- (CPString)browser:(id)aBrowser titleOfColumn:(CPInteger)column { return ColumnTitles[column]; } diff --git a/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j b/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j index 7da23c129..8eb717751 100644 --- a/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j +++ b/Tests/Manual/UndoRedoWithMenuUpdate/AppController.j @@ -24,10 +24,10 @@ [contentView addSubview:label]; - theSlider = [[CPSlider alloc] initWithFrame:CGRectMake(100,100,180,24)]; + theSlider = [[CPSlider alloc] initWithFrame:CGRectMake(100, 100, 180, 24)]; [theSlider setMinValue:36]; [theSlider setMaxValue:238]; - [theSlider setObjectValue:([theSlider minValue] + [theSlider maxValue])/2]; + [theSlider setObjectValue:([theSlider minValue] + [theSlider maxValue]) / 2]; [theSlider setTarget:self]; [theSlider setAction:@selector(doSlider:)]; [contentView addSubview:theSlider]; @@ -104,8 +104,6 @@ } } - - @end diff --git a/Tests/Objective-J/CFURLTest.j b/Tests/Objective-J/CFURLTest.j index 3b7329546..23cd5ec72 100644 --- a/Tests/Objective-J/CFURLTest.j +++ b/Tests/Objective-J/CFURLTest.j @@ -5,7 +5,7 @@ - (void)testRelativeURLs { - var URLStrings = + var URLStrings = { "g:h" : "g:h", "g" : "http://a/b/c/g", @@ -89,4 +89,11 @@ [self assert:new CFURL(URLString).absoluteString() equals:URLStrings[URLString]]; } +- (void)testDoubleSlash +{ + [self assert:"//a" equals:new CFURL("//a").absoluteString()]; + [self assert:"ftp://a" equals:new CFURL("//a", new CFURL("ftp://example.com/b")).absoluteString()]; + [self assert:"ftp://example.com/a" equals:new CFURL("/a", new CFURL("ftp://example.com/b")).absoluteString()]; +} + @end diff --git a/Tests/Objective-J/Preprocessor/BehaviorTests/ProtocolTest.j b/Tests/Objective-J/Preprocessor/BehaviorTests/ProtocolTest.j new file mode 100644 index 000000000..5b0d6b46f --- /dev/null +++ b/Tests/Objective-J/Preprocessor/BehaviorTests/ProtocolTest.j @@ -0,0 +1,81 @@ +@import + +@protocol MyProtocol + +- (int)myFunction:(int)aValue; + +@end + +@protocol MyProtocol2 + +- (int)myFunction2:(int)aValue; + +@end + +@protocol MyProtocol3 + +@required +@optional +@required +- (int)myFunction3:(int)aValue; +@optional +@required + +@end + +@protocol MyProtocol4 + +@end + +@implementation MyClass : CPObject + +- (int)myOtherFunction:(int)aValue +{ + return aValue * 2; +} + +- (int)myFunction:(int)aValue +{ + return aValue * 2; +} + +@end + +@implementation MyClass2 : CPObject + +- (int)myOtherFunction:(int)aValue +{ + return aValue * 2; +} + +- (int)myFunction:(int)aValue +{ + return aValue * 2; +} + +- (int)myFunction2:(int)aValue +{ + return aValue * 2; +} + +- (int)myFunction3:(int)aValue +{ + return aValue * 2; +} + +@end + + +@implementation ProtocolTest : OJTestCase + +- (void)testConformsToProtocol +{ + [self assert:true equals:[[[MyClass alloc] init] conformsToProtocol:@protocol(MyProtocol)]]; + [self assert:false equals:[[[MyClass alloc] init] conformsToProtocol:@protocol(MyProtocol2)]]; + [self assert:false equals:[[[MyClass alloc] init] conformsToProtocol:@protocol(xxxxxx)]]; + [self assert:true equals:[[[MyClass2 alloc] init] conformsToProtocol:@protocol(MyProtocol)]]; + [self assert:true equals:[[[MyClass2 alloc] init] conformsToProtocol:@protocol(MyProtocol2)]]; + [self assert:true equals:[[[MyClass2 alloc] init] conformsToProtocol:@protocol(MyProtocol3)]]; +} + +@end diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j index 544d76330..50d1fa504 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j @@ -5,6 +5,6 @@ CPArray array; CPString string; - int * pointer; + int integer; } -@end \ No newline at end of file +@end diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js index 9d7573c30..7eba069a9 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js @@ -2,6 +2,6 @@ var the_class = objj_allocateClassPair(Nil, "Class"), meta_class = the_class.isa; -class_addIvars(the_class,[new objj_ivar("ivar"), new objj_ivar("array"), new objj_ivar("string"), new objj_ivar("pointer")]); +class_addIvars(the_class,[new objj_ivar("ivar"), new objj_ivar("array"), new objj_ivar("string"), new objj_ivar("integer")]); objj_registerClassPair(the_class); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.j b/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.j new file mode 100644 index 000000000..f995cbbbd --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.j @@ -0,0 +1,2 @@ + +[object:argument]; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.js new file mode 100644 index 000000000..aff484c53 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/colon-selector.js @@ -0,0 +1,2 @@ + +objj_msgSend(object, ":", argument); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.j b/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.j new file mode 100644 index 000000000..25f637c29 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.j @@ -0,0 +1 @@ +[object for:a in:b nil:nil]; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.js new file mode 100644 index 000000000..bb6a71ee7 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/keyword-in-selector.js @@ -0,0 +1 @@ +objj_msgSend(object,"for:in:nil:",a,b,nil); \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.j b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.j new file mode 100644 index 000000000..c1989bf7e --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.j @@ -0,0 +1,7 @@ +function x() +{ + while(false); + for(;;); + for(var a in []); + var b = 3; +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.js b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.js new file mode 100644 index 000000000..e74f9e029 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-loops.js @@ -0,0 +1,7 @@ +x=function() +{ + while(false); + for(;;); + for(var a in []); + var b = 3; +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.j b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.j new file mode 100644 index 000000000..df63de264 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.j @@ -0,0 +1,7 @@ +function f(x) { + var a = 2, b = 1; + while (a < b); + for (;;); + if (a < b); else; + do {} while (a < b); +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.js b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.js new file mode 100644 index 000000000..1be2ab550 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/empty-statements.js @@ -0,0 +1,13 @@ +f = function(x) +{ + var a = 2, + b = 1; + while (a < b); + for (; ; ); + if (a < b); + else; + do + { + } + while (a < b); +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.j b/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.j new file mode 100644 index 000000000..3ec113070 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.j @@ -0,0 +1,4 @@ +function x() +{ + return([someIval someMethod]); +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.js b/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.js new file mode 100644 index 000000000..6664877bc --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/parenthesis-return.js @@ -0,0 +1,3 @@ +x=function(){ +return objj_msgSend(someIval,"someMethod"); +} \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.j b/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.j new file mode 100644 index 000000000..beb6598fb --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.j @@ -0,0 +1,24 @@ +#define xxxx 3 +#ifndef carlberg + var name = "Martin" + #if xxxx == 3 + var verb = "Was"; + #ifdef yyyy + var action = "Home"; + #else + #if zzzzz + var action = "Away"; + #else + var action = "Here" + #endif + #endif + #else + var verb = "is"; + #endif +#else + var name = "Alexander"; +#endif + +#define f(x) x > 3 + +if (f(4)) var a = 3; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.js b/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.js new file mode 100644 index 000000000..d8486bd74 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/preprocess-if-directives.js @@ -0,0 +1,4 @@ +var name="Martin"; +var verb="Was"; +var action="Here"; +if (4 > 3) var a = 3; \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j index 1859f2b0b..302ce7823 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j @@ -11,10 +11,14 @@ var FILENAMES = [ "Messages/one-parameter", "Messages/multiple-parameters", "Messages/ternary-operator-argument", + "Messages/keyword-in-selector", + "Messages/colon-selector", -// TODO Re-enable this test when the new Objective-J parser has been enabled. -// Before that it will fail with "*** Expected "pragma" to follow # but instead saw "]".". -// "Misc/regex-simple-char-classes" + "Misc/parenthesis-return", + "Misc/preprocess-if-directives", + "Misc/regex-simple-char-classes", + "Misc/empty-loops", + "Misc/empty-statements", ]; @implementation OutputTest : OJTestCase @@ -41,12 +45,12 @@ var FILENAMES = [ correct = FILE.read(FILE.join(FILE.dirname(module.path), filename + ".js")); [self assertNoThrow:function() { - preprocessed = ObjectiveJ.preprocess(unpreprocessed).code(), + preprocessed = ObjectiveJ.ObjJAcornCompiler.compileToExecutable(unpreprocessed).code(); preprocessed = compressor.compress(preprocessed, { charset : "UTF-8", useServer : true }); correct = compressor.compress(correct, { charset : "UTF-8", useServer : true }); }]; - [self assert:preprocessed equals:correct]; + [self assert:correct equals:preprocessed]; }); })(); } diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 3a4678440..e3afc6fcb 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -116,6 +116,7 @@ div.qindex, div.navtab { div.qindex, div.navpath { width: 100%; line-height: 140%; + background: white; } div.qindex+table { @@ -175,7 +176,11 @@ a.elRef { } a.code { - color: #4765A1; + color: #8AACE5; +} + +a.code:visited { + color: #8AACE5; } a.codeRef { @@ -188,24 +193,33 @@ dl.el { margin-left: -1cm; } +.fragment { + margin-top: 20px; + background-color: #27292C; + width: 100%; + border-radius: 3px; +} +.fragment .line:first-child { + padding-top: 20px; +} .fragment .line { font-family: Consolas, Courier, monospace, fixed; white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* Internet Explorer 5.5+ */ font-size: 11px; margin-bottom: 3px; + color: #d4d4d4; } .fragment .lineno { - color: #d4d4d4; + color: #555; margin-right: 10px; } .fragment .lineno a { - color: #d4d4d4; + color: #777; } pre.fragment { @@ -221,21 +235,14 @@ pre.fragment { } div.ah { - background-color: black; + background-color: #333; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); + background-color: #F6F6F6; } div.groupHeader { @@ -252,8 +259,8 @@ div.groupText { body { background-color: white; - color: black; - margin: 0; + color: #333; + margin: 0; } div.contents { @@ -301,7 +308,7 @@ table tr.memlist > td { tr.memlist td { font-family: Consolas, "Lucida Console", Courier, monospace; padding: .25em 0; - border-bottom: 1px solid #eee; + border-bottom: 1px solid #F6F6F6; } /* Don't show the [static] column in full member list */ @@ -340,16 +347,18 @@ address.footer { img.footer { border: 0px; vertical-align: middle; + height: 15px; + margin-top: -5px; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: #D67C7B } span.keywordtype { - color: #604020 + color: #C0A7C6 } span.keywordflow { @@ -357,7 +366,7 @@ span.keywordflow { } span.comment { - color: #A085E4 + color: #6A6C73 } span.preprocessor { @@ -365,7 +374,7 @@ span.preprocessor { } span.stringliteral { - color: #002080 + color: #C2C67F; } span.charliteral { @@ -427,7 +436,7 @@ th.dirtab { hr { height: 0px; border: none; - border-top: 2px solid #ddd; + border-top: 1px solid #ddd; margin: 1em 0; } @@ -458,7 +467,7 @@ table.memberdecls { } .memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #f3f3f3; + border-top: 1px solid #F3F3F3; } .memItemLeft, .memTemplItemLeft { @@ -513,50 +522,27 @@ table.memberdecls { } .memproto, dl.reflist dt { - border-top: 1px solid #BDBDBD; - border-left: 1px solid #BDBDBD; - border-right: 1px solid #BDBDBD; padding: 6px 0px 6px 0px; color: #333; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 8px; - border-top-left-radius: 8px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - /* webkit specific markup */ - -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; - background-color: #E2E2E2; + font-weight: normal; + background-color: #F6F6F6; padding-left: 9px; } .memdoc > p { margin-top: 0; } + +.memdoc > p:last-child { + color: #AAAAAA; + font-size: 80%; +} .memdoc, dl.reflist dd { - border-bottom: 1px solid #BDBDBD; - border-left: 1px solid #BDBDBD; - border-right: 1px solid #BDBDBD; + border-bottom: 1px solid #F6F6F6; + border-left: 1px solid #F6F6F6; + border-right: 1px solid #F6F6F6; background-color: white; border-top-width: 0; - /* opera specific markup */ - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); padding: .8em 12px 0 12px; } @@ -595,6 +581,15 @@ dl.reflist dt { color: #602020; white-space: nowrap; } + +.params .paramname { + color: #602020 !important; + white-space: nowrap; + text-align: right; + font-family: Consolas, "Lucida Console", Courier, monospace; + padding: 3px; +} + .paramname em { font-style: normal; } @@ -751,12 +746,6 @@ table.fieldtable { margin-bottom: 10px; border: 1px solid #A9B9D8; border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { @@ -788,12 +777,6 @@ table.fieldtable { padding-bottom: 4px; padding-top: 5px; text-align:left; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; border-bottom: 1px solid #A9B9D8; } @@ -811,12 +794,11 @@ table.fieldtable { .navpath ul { font-size: 11px; - background: -moz-linear-gradient(-90deg, whiteSmoke, #CCC); - background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); + background-color: white; height:30px; line-height:30px; color:#333; - border:solid 1px #CCC; + border:solid 1px #f3f3f3; overflow:hidden; margin:0px; padding:0px; @@ -824,7 +806,7 @@ table.fieldtable { .navpath li { - list-style-type:none; + list-style-type: none; float:left; padding-left:10px; padding-right: 15px; @@ -843,6 +825,7 @@ table.fieldtable { color: #333; } + .navpath li.navelem a:hover { color:#6985BC; @@ -858,7 +841,7 @@ table.fieldtable { background-image:none; background-repeat:no-repeat; background-position:right; - color:#374E7C; + color:#aaa; font-size: 8pt; } @@ -902,17 +885,14 @@ div.header { background-color: #F9FAFC; margin: 0px; - border-bottom: 1px solid #C5CFE5; + border-bottom: 1px solid #eaeaea; } div.headertitle { padding: 10px 5px 10px 20px; - background: #333; - background: -moz-linear-gradient(-90deg, #444, #333); - background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333)); - color: white; - text-shadow: -1px -1px black; + background-color: #f6f6f6; + color: #333; min-height: 36px; } @@ -977,16 +957,24 @@ dl.bug border-collapse: separate; } -#projectlogo img +#projectlogo { border: 0px none; - max-height: 55px; padding-left: 5px; + margin-top: 8px; + display: block; + float: right; + width: 200px; +} + +#projectlogo img +{ + max-height: 40px; } #projectname { - font: 300% Tahoma, Arial,sans-serif; + font: 200% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } @@ -1010,13 +998,9 @@ dl.bug padding: 0px; margin: 0px; width: 100%; - border-bottom: 1px solid #CCC; color: white; font-weight: bold; - text-shadow: -1px -1px black; - background: #485D77; - background: -moz-linear-gradient(-90deg, #485D77, #252D38); - background: -webkit-gradient(linear, left top, left bottom, from(#485D77), to(#252D38)); + background: #FA7622; } .image @@ -1093,9 +1077,8 @@ dl.citelist dd { /* ADDITIONS */ .tabs, .tabs2, .tabs3 { - background: -moz-linear-gradient(-90deg, #fff, #eee); - background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); - border-bottom: 1px solid #ccc; + background: #F6F6F6 !important; + border-bottom: 1px solid #eaeaea; width: 100%; z-index: 101; font-size: 100%; @@ -1128,17 +1111,15 @@ dl.citelist dd { display: block; padding: 0 20px; font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; outline: none; background: none; color: #444; - border-right: 1px solid #ccc; + border-right: 1px solid #eaeaea; } .tablist a:hover { background: inherit; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); text-decoration: none; text-shadow: none; color: gray; @@ -1164,10 +1145,9 @@ dl.citelist dd { } .tablist li.current a { - background: -moz-linear-gradient(-90deg, #eee, #fff); - background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); + background: #ddd; color: #444; - text-shadow: 0px 1px 1px #f2f2f2; + text-shadow: none; } .tabs2 li{ @@ -1191,7 +1171,7 @@ dl.citelist dd { #nav-tree li { white-space:nowrap; margin:0px; - padding:0px; + padding-top: 5px; } #nav-tree .plus { @@ -1199,17 +1179,23 @@ dl.citelist dd { } #nav-tree .selected { - background: -moz-linear-gradient(-90deg, #62B9ED, #308CD9) !important; - background: -webkit-gradient(linear, left top, left bottom, from(#62B9ED), to(#308CD9)) !important; - border-top: 1px solid #308CD9; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + background-color: #F87631 !important; + border-top: none; + background-image: none; } #nav-tree img { margin:0px; padding:0px; border:0px; - vertical-align: middle; + -webkit-filter: grayscale(1); + width: 8px; + height: 11px; + margin-top: -4px; +} + +#nav-tree .selected img { + -webkit-filter: grayscale(0); } #nav-tree a { @@ -1233,7 +1219,9 @@ dl.citelist dd { text-decoration:none; padding:2px; margin:0px; - color:#fff; + color: white; + text-shadow: none; + font-weight: bold; } #nav-tree .children_ul { @@ -1243,17 +1231,16 @@ dl.citelist dd { #nav-tree .item { margin:0px; - padding:0px; + padding:0px;; } #nav-tree { padding: 0px 0px; - background: #E8EAEE; + background: white; font-size:14px; overflow:auto; padding-right: 0px !important; margin-right: -5px !important; - background: #E8EAEE !important; } #doc-content { @@ -1280,7 +1267,7 @@ dl.citelist dd { } .ui-resizable-e { - background: #CCC !important; + background: #eaeaea !important; cursor:e-resize; height:100%; right:0; @@ -1314,7 +1301,14 @@ dl.citelist dd { right: 5px; } #nav-sync img { - width: 16px; + width: 10px; + height: 10px; } -} \ No newline at end of file +.mlabels-right { + visibility: hidden; +} + +.groupheader { + color: #FA7622; +} diff --git a/Tools/Documentation/preprocess/001.markdown_readme.sh b/Tools/Documentation/preprocess/001.markdown_readme.sh index 62d153707..0e0dfe139 100755 --- a/Tools/Documentation/preprocess/001.markdown_readme.sh +++ b/Tools/Documentation/preprocess/001.markdown_readme.sh @@ -15,7 +15,7 @@ if [ -n "$markdown" ]; then else processor_msg "markdown binary is not installed, documentation cannot be generated." "red" echo "On Mac OS X, install brew with the following command line:" - echo ' ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"' + echo ' ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"' echo "Then use 'brew install markdown' from the command line to install markdown." exit 1 fi diff --git a/Tools/Documentation/preprocess/002.make_headers.sh b/Tools/Documentation/preprocess/002.make_headers.sh index e598f31ef..ea914e3d4 100755 --- a/Tools/Documentation/preprocess/002.make_headers.sh +++ b/Tools/Documentation/preprocess/002.make_headers.sh @@ -28,7 +28,7 @@ bsdtar cf Foundation.doc.tar --exclude='_*' -s /^Foundation/Foundation.doc/ Foun bsdtar xf Foundation.doc.tar rm Foundation.doc.tar -# Remove @import from the source files, doxygen doesn't know what to do with them -processor_msg "Removing @import from source files..." -find AppKit.doc -name *.j -exec sed -e '/@import.*/ d' -i '' {} \; -find Foundation.doc -name *.j -exec sed -e '/@import.*/ d' -i '' {} \; +# Remove @import and @class from the source files, doxygen doesn't know what to do with them +processor_msg "Removing @import and @class from source files..." +find AppKit.doc -name *.j -exec sed -e '/@import.*/ d' -e '/@class.*/ d' -i '' {} \; +find Foundation.doc -name *.j -exec sed -e '/@import.*/ d' -e '/@class.*/ d' -i '' {} \; diff --git a/Tools/XcodeCapp/.gitignore b/Tools/XcodeCapp/.gitignore deleted file mode 100644 index f921bd442..000000000 --- a/Tools/XcodeCapp/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -*.mode1v3 -*.pbxuser -*.perspectivev3 -build diff --git a/Tools/XcodeCapp/AppController.h b/Tools/XcodeCapp/AppController.h deleted file mode 100644 index 1eec6dfb5..000000000 --- a/Tools/XcodeCapp/AppController.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import "PRHEmptyGrowlDelegate.h" -#import "TNXCodeCapp.h" -#import "TNErrorDataView.h" - -@interface AppController : NSObject -{ - IBOutlet NSMenu *statusMenu; - IBOutlet NSMenuItem *menuItemOpenXCode; - IBOutlet NSMenuItem *menuItemStartStop; - IBOutlet NSPanel *errorsPanel; - IBOutlet NSTableView *errorsTable; - IBOutlet NSPanel *aboutWindow; - IBOutlet NSWindow *helpWindow; - IBOutlet NSTextView *helpTextView; - IBOutlet NSTextField *labelVersion; - IBOutlet NSPopUpButton *buttonPreferencesAPIMode; - IBOutlet NSButton *checkBoxPreferencesReactMode; - IBOutlet NSUserDefaultsController *preferencesController; - IBOutlet TNXCodeCapp *__strong xcc; - IBOutlet NSWindow *windowDebug; - IBOutlet NSMenuItem *menuDebug; - IBOutlet NSMenuItem *menuHistory; - IBOutlet TNErrorDataView *dataViewError; - - NSImage *_iconActive; - NSImage *_iconInactive; - NSImage *_iconWorking; - NSStatusItem *_statusItem; - PRHEmptyGrowlDelegate *growlDelegateRef; - NSData *_archivedDataView; -} - -@property BOOL supportsFileModeListening; -@property (strong) TNXCodeCapp *xcc; - -+ (AppController *)sharedAppController; - -- (BOOL)validateMenuItem:(NSMenuItem*)menuItem; -- (void)registerDefaults; -- (void)growlWithTitle:(NSString *)aTitle message:(NSString *)aMessage; -- (void)openCenteredWindow:(NSWindow *)aWindow; -- (void)_prepareHistoryMenu; - -- (IBAction)chooseFolder:(id)aSender; -- (IBAction)openErrors:(id)sender; -- (IBAction)clearErrors:(id)sender; -- (IBAction)openXCode:(id)aSender; -- (IBAction)stopListener:(id)aSender; -- (IBAction)openHelp:(id)aSender; -- (IBAction)openAbout:(id)aSender; -- (IBAction)updatePreferences:(id)aSender; -- (IBAction)switchProject:(id)aSender; -- (IBAction)clearProjectHistory:(id)aSender; - -@end - diff --git a/Tools/XcodeCapp/AppController.m b/Tools/XcodeCapp/AppController.m deleted file mode 100644 index d49925786..000000000 --- a/Tools/XcodeCapp/AppController.m +++ /dev/null @@ -1,443 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#import - -#import "AppController.h" -#include "macros.h" - - -AppController *SharedAppControllerInstance = nil; - -float heightForStringDrawing(NSString *myString, NSFont *myFont, float myWidth) -{ - NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:myString]; - NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)]; - NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; - - [layoutManager addTextContainer:textContainer]; - [textStorage addLayoutManager:layoutManager]; - [textStorage addAttribute:NSFontAttributeName value:myFont range:NSMakeRange(0, [textStorage length])]; - [textContainer setLineFragmentPadding:0.0]; - - (void) [layoutManager glyphRangeForTextContainer:textContainer]; - return [layoutManager usedRectForTextContainer:textContainer].size.height; -} - -@implementation AppController - -@synthesize supportsFileModeListening; -@synthesize xcc; - -+ (AppController *)sharedAppController -{ - return SharedAppControllerInstance; -} - -#pragma mark - -#pragma mark Initialization - -/*! - Called when NIB is ready - */ -- (void)awakeFromNib -{ - SharedAppControllerInstance = self; - - _archivedDataView = [NSKeyedArchiver archivedDataWithRootObject:dataViewError]; - - if (!growlDelegateRef) - growlDelegateRef = [[PRHEmptyGrowlDelegate alloc] init]; - - [GrowlApplicationBridge setGrowlDelegate:growlDelegateRef]; - - NSBundle *bundle = [NSBundle mainBundle]; - - [labelVersion setStringValue:[NSString stringWithFormat:@"Version %@", [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]]]; - - [self registerDefaults]; - - _iconInactive = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"xcodecapp-icon-inactive" ofType:@"png"]]; - _iconActive = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"xcodecapp-icon-active" ofType:@"png"]]; - _iconWorking = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"xcodecapp-icon-working" ofType:@"png"]]; - [_iconActive setSize:NSMakeSize(14.0, 16.0)]; - [_iconInactive setSize:NSMakeSize(14.0, 16.0)]; - [_iconWorking setSize:NSMakeSize(14.0, 16.0)]; - - _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; - [_statusItem setMenu:statusMenu]; - [_statusItem setImage:_iconInactive]; - [_statusItem setHighlightMode:YES]; - [statusMenu setDelegate:self]; - - if ([[NSUserDefaults standardUserDefaults] integerForKey:@"FirstLaunch"]) - { - [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:0] forKey:@"FirstLaunch"]; - [self openHelp:self]; - } - - [xcc setDelegate:self]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(XCodeCappConversionDidStart:) name:XCCConversionStartNotification object:xcc]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(XCodeCappConversionDidStop:) name:XCCConversionStopNotification object:xcc]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(XCodeCappPopulateProject:) name:XCCDidPopulateProjectNotification object:xcc]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(XCodeCappListeningDidStart:) name:XCCListeningStartNotification object:xcc]; - - [helpTextView setTextContainerInset:NSSizeFromCGSize(CGSizeMake(10.0, 10.0))]; - - [xcc start]; - - [self _prepareHistoryMenu]; -} - -/*! - Checks if aplication should show the debug window - */ -- (void)applicationDidFinishLaunching:(NSNotification *)notif -{ - CGEventRef event = CGEventCreate(NULL); - CGEventFlags modifiers = CGEventGetFlags(event); - CFRelease(event); - - if (modifiers & kCGEventFlagMaskAlternate) - { - [statusMenu insertItem:menuDebug atIndex:6]; - } -} - -/*! - Register the application defaults - */ -- (void)registerDefaults -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSNumber *streamEventIdSinceNow = [NSNumber numberWithUnsignedLongLong:kFSEventStreamEventIdSinceNow]; - NSMutableDictionary *appDefaults = [NSMutableDictionary new]; - - [appDefaults setObject:streamEventIdSinceNow forKey:@"lastEventId"]; - [appDefaults setObject:[NSNumber numberWithInt:1] forKey:@"FirstLaunch"]; - [appDefaults setObject:[NSNumber numberWithInt:0] forKey:@"XCCAPIMode"]; - [appDefaults setObject:[NSNumber numberWithInt:1] forKey:@"XCCReactMode"]; - [appDefaults setObject:[NSNumber numberWithInt:1] forKey:@"XCCReopenLastProject"]; - [appDefaults setObject:[[NSArray alloc] init] forKey:@"XCCProjectHistory"]; - - [defaults registerDefaults:appDefaults]; -} - - -#pragma mark - -#pragma mark Notification handlers - -/*! - Handle cleaning operation when application will stop. - It will stop the FSEvent listener, and store the last event id - */ -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app -{ - [xcc clear]; - - return NSTerminateNow; -} - -/*! - Called when XCC start a conversion - @param aNotification the notification - */ -- (void)XCodeCappConversionDidStart:(NSNotification *)aNotification -{ - [_statusItem setImage:_iconWorking]; -} - -/*! - Called when XCC finish a conversion - @param aNotification the notification - */ -- (void)XCodeCappConversionDidStop:(NSNotification *)aNotification -{ - [_statusItem setImage:_iconActive]; - - if ([errorsPanel isVisible]) - [errorsTable reloadData]; -} - -/*! - Called when XCC has populated a project - @param aNotification the notification - */ -- (void)XCodeCappPopulateProject:(NSNotification *)aNotification -{ - [self growlWithTitle:@"Project loaded" message:[[[aNotification userInfo] objectForKey:@"URL"] path]]; -} - -/*! - Called when XCC start a to listen to a project - @param aNotification the notification - */ -- (void)XCodeCappListeningDidStart:(NSNotification *)aNotification -{ - [_statusItem setImage:_iconActive]; - [menuItemStartStop setTitle:[NSString stringWithFormat:@"Stop Listening to “%@”", [xcc currentProjectName]]]; - [menuItemStartStop setAction:@selector(stopListener:)]; - - [self growlWithTitle:@"Listening to project" message:[[xcc currentProjectURL] path]]; -} - - -#pragma mark - -#pragma mark Utilities - -/*! - Simple growl wrapper - @param aTitle the growl title - @param aMessage the growl message - */ -- (void)growlWithTitle:(NSString *)aTitle message:(NSString *)aMessage -{ - [GrowlApplicationBridge notifyWithTitle:aTitle - description:aMessage - notificationName:@"DefaultNotifications" - iconData:nil - priority:0 - isSticky:NO - clickContext:nil]; -} - -/*! - Prepare the history menu - */ -- (void)_prepareHistoryMenu -{ - NSMenu *menu = [[NSMenu alloc] init]; - NSArray *projectHistory = [[NSUserDefaults standardUserDefaults] objectForKey:@"XCCProjectHistory"]; - - for(int i = 0; i < [projectHistory count]; i++) - { - NSString *itemTitle = [[projectHistory objectAtIndex:i] lastPathComponent]; - NSString *projectPath = [[projectHistory objectAtIndex:i] stringByStandardizingPath]; - NSString *currentProjectPath = [[[xcc currentProjectURL] path] stringByStandardizingPath]; - NSMenuItem *item = [menu addItemWithTitle:itemTitle action:@selector(switchProject:) keyEquivalent:@""]; - - [item setRepresentedObject:projectPath]; - - if ([currentProjectPath isEqualToString:projectPath]) - [item setAction:nil]; - } - - [menu addItem:[NSMenuItem separatorItem]]; - [menu addItemWithTitle:@"Clear history" action:@selector(clearProjectHistory:) keyEquivalent:@""]; - - [menuHistory setEnabled:([projectHistory count]) ? YES : NO]; - [menuHistory setSubmenu:menu]; -} - - -#pragma mark - -#pragma mark Actions - -/*! - Save preferences - @param aSender the sender of the action - */ -- (IBAction)updatePreferences:(id)aSender -{ - [preferencesController save:aSender]; - NSLog(@"Preferences change notified"); - - [xcc configure]; -} - -/*! - Open the folder chooser and eventually start to listen - @param aSender the sender of the action - */ -- (IBAction)chooseFolder:(id)aSender -{ - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - - [openPanel setCanChooseDirectories:YES]; - [openPanel setCanCreateDirectories:YES]; - [openPanel setTitle:@"Choose Cappuccino Project"]; - [openPanel setCanChooseFiles:NO]; - - if ([openPanel runModal] != NSFileHandlingPanelOKButton) - return; - - NSString *projectPath = [NSString stringWithFormat:@"%@/", [[[openPanel URLs] objectAtIndex:0] path]]; - NSMutableArray *projectHistory = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"XCCProjectHistory"]]; - - if ([projectHistory containsObject:[projectPath stringByStandardizingPath]]) - [projectHistory removeObject:[projectPath stringByStandardizingPath]]; - - [projectHistory insertObject:[projectPath stringByStandardizingPath] atIndex:0]; - - [[NSUserDefaults standardUserDefaults] setObject:projectHistory forKey:@"XCCProjectHistory"]; - - [xcc listenProjectAtPath:projectPath]; - - [self _prepareHistoryMenu]; -} - -/*! - Stop listening to a project - @param aSender the sender of the action - */ -- (IBAction)stopListener:(id)aSender -{ - [xcc clear]; - - [_statusItem setImage:_iconInactive]; - [menuItemStartStop setTitle:@"Listen to Project…"]; - [menuItemStartStop setAction:@selector(chooseFolder:)]; - [self _prepareHistoryMenu]; - - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"LastOpenedPath"]; -} - -- (IBAction)switchProject:(id)aSender -{ - NSString *newPath = [aSender representedObject]; - - [self stopListener:aSender]; - [xcc listenProjectAtPath:newPath]; - [self _prepareHistoryMenu]; -} - -- (IBAction)clearProjectHistory:(id)aSender -{ - [[NSUserDefaults standardUserDefaults] setObject:[NSArray array] forKey:@"XCCProjectHistory"]; - [self _prepareHistoryMenu]; -} - -/*! - Open the xCode support project in xCode - @param aSender the sender of the action - */ -- (IBAction)openXCode:(id)aSender -{ - if (![xcc currentProjectURL]) - return; - - DLog(@"Opening Xcode project at URL: '%@'", [[xcc XCodeSupportProject] path]); - system([[NSString stringWithFormat:@"open \"%@\"", [[xcc XCodeSupportProject] path]] UTF8String]); -} - -/*! - Open the errors window - @param aSender the sender of the action - */ -- (IBAction)openErrors:(id)aSender -{ - [self openCenteredWindow:errorsPanel]; -} - -/*! - Clear all errors in errors table - @param aSender the sender of the action - */ -- (IBAction)clearErrors:(id)sender -{ - [[xcc errorList] removeAllObjects]; - [errorsTable reloadData]; -} - -/*! - Open the help file - @param aSender the sender of the action - */ -- (IBAction)openHelp:(id)aSender -{ - [helpTextView readRTFDFromFile:[[NSBundle mainBundle] pathForResource:@"help" ofType:@"rtfd"]]; - - [self openCenteredWindow:helpWindow]; -} - -/*! - Open the about window - @param aSender the sender of the action - */ -- (IBAction)openAbout:(id)aSender -{ - [self openCenteredWindow:aboutWindow]; -} - -/*! - Open the preferences window - @param aSender the sender of the action - */ -- (IBAction)openPreferences:(id)aSender -{ - [self openCenteredWindow:windowDebug]; -} - -/*! - Open a centered window. -*/ -- (void)openCenteredWindow:(NSWindow *)aWindow -{ - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - - [aWindow center]; - [aWindow makeKeyAndOrderFront:nil]; -} - - -#pragma mark - -#pragma mark Delegates - -- (BOOL)validateMenuItem:(NSMenuItem *)aMenuItem -{ - if (aMenuItem == menuItemOpenXCode) - return !![xcc currentProjectURL]; - - return YES; -} - -- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView -{ - return [[xcc errorList] count]; -} - -- (id)tableView:(NSTableView*)aTableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row -{ - return [[xcc errorList] objectAtIndex:row]; -} - -- (void)tableViewColumnDidResize:(NSNotification *)tableView -{ - [errorsTable noteHeightOfRowsWithIndexesChanged: - [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[xcc errorList] count])]]; -} - -- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row -{ - return [NSKeyedUnarchiver unarchiveObjectWithData:_archivedDataView]; -} - -- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)aRow -{ - NSString *content = [[[xcc errorList] objectAtIndex:aRow] objectForKey:@"message"]; - NSFont *currentFont = [[dataViewError fieldMessage] font]; - float height = heightForStringDrawing(content, currentFont, [tableView frame].size.width); - - return height + 31; -} - -@end diff --git a/Tools/XcodeCapp/English.lproj/InfoPlist.strings b/Tools/XcodeCapp/English.lproj/InfoPlist.strings deleted file mode 100644 index 5e45963c3..000000000 Binary files a/Tools/XcodeCapp/English.lproj/InfoPlist.strings and /dev/null differ diff --git a/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib b/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib deleted file mode 100644 index 0a71a52a7..000000000 --- a/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib +++ /dev/null @@ -1,1979 +0,0 @@ - - - - 1050 - 12D61 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 3084 - - - NSButton - NSButtonCell - NSCustomObject - NSCustomView - NSMenu - NSMenuItem - NSPopUpButton - NSPopUpButtonCell - NSScrollView - NSScroller - NSTableColumn - NSTableView - NSTextField - NSTextFieldCell - NSTextView - NSUserDefaultsController - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AppController - - - 8215 - 2 - {{196, 240}, {375, 153}} - 1685585920 - About - NSPanel - - - - - 256 - - - - 269 - {{27, 63}, {320, 70}} - - - YES - - 68157504 - 138544128 - WGNvZGVDYXBwIGRldmVsb3BlZCBieSBBbnRvaW5lIE1lcmNhZGFsCnByaW1hbG1vdGlvbkBhcmNoaXBl -bHByb2plY3Qub3JnCgp3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBBcGFyYWppdGEgRmlzaG1hbgphcGFy -YWppdGFAYXBhcmFqaXRhLmNvbQ - - LucidaGrande - 11 - 3100 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 3 - MQA - - - NO - - - - 269 - {{108, 20}, {158, 14}} - - YES - - 68157504 - 138544128 - LABEL VERSION - - - - - - NO - - - {375, 153} - - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - YES - - - - - - - Listen to Project… - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - - - - Open Project in Xcode - - 2147483647 - - - - - - Show Errors & Warnings - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Open Recent - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - About... - - 2147483647 - - - - - - Help - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit - - 2147483647 - - - - - - - 95 - 2 - {{462, 324}, {512, 285}} - 1685585920 - Errors and Warnings - NSPanel - - - - - 256 - - - - 274 - - - - 2304 - - - - 256 - {512, 249} - - - YES - NO - YES - - - -2147483392 - {{413, 0}, {16, 17}} - - - - - error - 509 - 40 - 1000 - - 75497536 - 2048 - Error - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337641472 - 0 - Text Cell - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlBackgroundColor - - - - 6 - System - controlTextColor - - - - 3 - YES - - - - 3 - 2 - - - 1 - MSAxIDEgMAA - - 17 - -759169024 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 1}, {512, 249}} - - - - - 4 - - - - -2147483392 - {{413, 17}, {15, 166}} - - - NO - - _doScroller: - 0.99494949494949492 - - - - -2147483392 - {{1, 183}, {427, 15}} - - - NO - 1 - - _doScroller: - 0.99766355140186913 - - - {{-1, 35}, {514, 251}} - - - 133682 - - - - QSAAAEEgAABBmAAAQZgAAA - 0.25 - 4 - 1 - - - - 289 - {{314, 8}, {85, 19}} - - - YES - - -2080374784 - 134217728 - Clear - - LucidaGrande - 12 - 16 - - - -2038153216 - 164 - - - 400 - 75 - - NO - - - - 289 - {{407, 8}, {85, 19}} - - YES - - -2080374784 - 134217728 - Close - - - -2038153216 - 164 - - - 400 - 75 - - NO - - - {512, 285} - - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - YES - - - 15 - 2 - {{163, 199}, {716, 571}} - 1685586944 - Help - NSWindow - - - - - 256 - - - - 274 - - - - 2304 - - - - 2322 - {716, 571} - - - - - - - - - - - - - - 166 - - - - 716 - 1 - - - 67120389 - 0 - - - - - 6 - System - selectedTextBackgroundColor - - - - 6 - System - selectedTextColor - - - - - - - 1 - MCAwIDEAA - - - {8, -8} - 13 - - - - - - 1 - - 6 - {716, 10000000} - - - - {{1, 1}, {716, 571}} - - - - - - {4, 5} - - 12582912 - - - - - - TU0AKgAAAHCAFUqgBVKsAAAAwdVQUqwaEQeIRGJRGFlYqwWLQ+JxuOQpVRmEx2RROKwOQyOUQSPyaUym -SxqWyKXyeYxyZzWbSuJTScRCbz2Nz+gRKhUOfTqeUai0OSxiWTiBQSHSGFquGwekxyAgAAAOAQAAAwAA -AAEAEAAAAQEAAwAAAAEAEAAAAQIAAwAAAAIACAAIAQMAAwAAAAEABQAAAQYAAwAAAAEAAQAAAREABAAA -AAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAEAAAARcABAAAAAEAAABnARwAAwAA -AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA - - - - - - 3 - MCAwAA - - - - 4 - - - - 256 - {{701, 1}, {16, 571}} - - NO - - _doScroller: - 1 - 0.85256409645080566 - - - - -2147483392 - {{-100, -100}, {87, 18}} - - - NO - 1 - - _doScroller: - 1 - 0.94565218687057495 - - - {{-1, -1}, {718, 573}} - - - 133138 - - - - 0.25 - 4 - 1 - - - {716, 571} - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - YES - - - 3 - 2 - {{529, 541}, {435, 199}} - 1685586944 - Debug - NSWindow - - - - - 256 - - - - 268 - {{103, 39}, {227, 18}} - - - YES - - -2080374784 - 0 - Inode meta information changes - - - 1211912448 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - NO - - - - 268 - {{102, 100}, {120, 26}} - - - YES - - -2076180416 - 2048 - - - 109199360 - 129 - - - 400 - 75 - - - Auto - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - - - - File level - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Folder level - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - NO - - - - 268 - {{30, 40}, {63, 17}} - - - YES - - 68157504 - 272630784 - React To: - - - - - - NO - - - - 268 - {{26, 132}, {67, 17}} - - - YES - - 68157504 - 272630784 - API Mode: - - - - - - NO - - - - 268 - {{102, 132}, {184, 17}} - - - YES - - 68157504 - 272630784 - Current API Mode - - - - - - NO - - - - 268 - {{103, 16}, {284, 17}} - - YES - - 68157504 - 272630784 - In "File level" API mode, react to touch, chown, etc. - - LucidaGrande - 11 - 16 - - - - - 1 - MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA - - - NO - - - - 268 - {{103, 161}, {229, 18}} - - - YES - - -2080374784 - 0 - Listen to the most recent project - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{17, 162}, {76, 17}} - - - YES - - 68157504 - 272630784 - On Launch: - - - - - - NO - - - - 268 - {{103, 69}, {315, 28}} - - - YES - - 68157504 - 272630784 - RmlsZSBtb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggT1MgWCAxMC42LgpVbmxlc3MgeW91IGtub3cg -d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 - - - - - 1 - MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA - - - NO - - - {435, 199} - - - {{0, 0}, {1440, 878}} - {10000000000000, 10000000000000} - xcc-prefs - YES - - - YES - - - TNXCodeCapp - - - Debug… - - 2147483647 - - - - - - 268 - - - - 297 - {{182, 19}, {18, 19}} - - YES - - -2080374784 - 134217728 - - - - -2033958912 - 164 - - NSImage - NSFollowLinkFreestandingTemplate - - - - 400 - 75 - - NO - - - - 274 - {{7, 9}, {170, 18}} - - - YES - - 67108864 - 272629760 - Label - - - - - - NO - - - - 266 - {{7, 30}, {170, 17}} - - - YES - - 67108928 - 272632320 - Label - - LucidaGrande-Bold - 13 - 2072 - - - - - 1 - MC43NzU1OTkzNjA1IDAuMjQ2OTMyOTIzOCAwLjIxOTQ4OTQ4NQA - - - NO - - - {209, 57} - - - TNErrorDataView - - - - - - - terminate: - - - - 458 - - - - delegate - - - - 401 - - - - statusMenu - - - - 453 - - - - chooseFolder: - - - - 454 - - - - openXCode: - - - - 457 - - - - errorsPanel - - - - 475 - - - - errorsTable - - - - 476 - - - - clearErrors: - - - - 482 - - - - helpWindow - - - - 507 - - - - helpTextView - - - - 515 - - - - openHelp: - - - - 517 - - - - labelVersion - - - - 524 - - - - aboutWindow - - - - 525 - - - - openErrors: - - - - 527 - - - - menuItemStartStop - - - - 539 - - - - menuItemOpenXCode - - - - 540 - - - - openAbout: - - - - 571 - - - - buttonPreferencesAPIMode - - - - 573 - - - - checkBoxPreferencesReactMode - - - - 574 - - - - updatePreferences: - - - - 600 - - - - updatePreferences: - - - - 601 - - - - preferencesController - - - - 602 - - - - xcc - - - - 611 - - - - openPreferences: - - - - 646 - - - - menuDebug - - - - 659 - - - - windowDebug - - - - 660 - - - - dataViewError - - - - 682 - - - - menuHistory - - - - 694 - - - - performClose: - - - - 497 - - - - dataSource - - - - 477 - - - - delegate - - - - 478 - - - - value: values.XCCReactMode - - - - - - value: values.XCCReactMode - value - values.XCCReactMode - - NSValidatesImmediately - - - 2 - - - 594 - - - - enabled: isUsingFileLevelAPI - - - - - - enabled: isUsingFileLevelAPI - enabled - isUsingFileLevelAPI - 2 - - - 641 - - - - selectedIndex: values.XCCAPIMode - - - - - - selectedIndex: values.XCCAPIMode - selectedIndex - values.XCCAPIMode - - NSValidatesImmediately - - - 2 - - - 605 - - - - enabled: supportFileLevelAPI - - - - - - enabled: supportFileLevelAPI - enabled - supportFileLevelAPI - - - - - - - 2 - - - 642 - - - - enabled2: isListening - - - - - - enabled2: isListening - enabled2 - isListening - - - - - - NSNegateBoolean - - - 2 - - - 645 - - - - save: - - - - 658 - - - - value: currentAPIMode - - - - - - value: currentAPIMode - value - currentAPIMode - 2 - - - 615 - - - - value: values.XCCReopenLastProject - - - - - - value: values.XCCReopenLastProject - value - values.XCCReopenLastProject - - NSValidatesImmediately - - - 2 - - - 657 - - - - fieldFileName - - - - 678 - - - - fieldMessage - - - - 681 - - - - openFile: - - - - 689 - - - - buttonOpenFile - - - - 690 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 376 - - - - - 427 - - - - - - - - 428 - - - - - - - - - 429 - - - - - - - - 430 - - - - - 446 - - - - - - - - - - - - - - - - - 447 - - - - - 448 - - - - - 450 - - - - - 464 - - - - - - - - 465 - - - - - - - - - - 466 - - - - - - - - - - 467 - - - - - 469 - - - - - 470 - - - - - - - - 472 - - - - - - - - 473 - - - - - 479 - - - - - - - - 480 - - - - - 485 - - - - - 486 - - - - - 494 - - - - - - - - 495 - - - - - 505 - - - - - - - - 506 - - - - - - - - 511 - - - - - - - - - - 512 - - - - - 513 - - - - - 514 - - - - - 516 - - - - - 518 - - - - - 522 - - - - - - - - 523 - - - - - 541 - - - - - - - - 542 - - - - - - - - - - - - - - - - 543 - - - - - - - - 544 - - - - - 545 - - - - - - - - 546 - - - - - - - - 547 - - - - - - - - - - 548 - - - - - 549 - - - - - 550 - - - - - 553 - - - - - - - - 554 - - - - - 555 - - - - - - - - 556 - - - - - 557 - - - - - - - - 558 - - - - - 559 - - - - - - - - 560 - - - - - 570 - - - - - 587 - - - - - 608 - - - - - - - - 609 - - - - - 610 - - - - - 648 - - - - - - - - 649 - - - - - - - - 652 - - - - - 653 - - - - - 456 - - - - - 675 - - - - - - - - - - 676 - - - - - - - - 677 - - - - - 679 - - - - - - - - 680 - - - - - 687 - - - - - - - - 688 - - - - - 691 - - - - - 692 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 694 - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {10, 10} - {11, 11} - {10, 3} - {15, 15} - - - diff --git a/Tools/XcodeCapp/English.lproj/MainMenu.nib/keyedobjects.nib b/Tools/XcodeCapp/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index 8719077ec..000000000 Binary files a/Tools/XcodeCapp/English.lproj/MainMenu.nib/keyedobjects.nib and /dev/null differ diff --git a/Tools/XcodeCapp/FSEvent.m b/Tools/XcodeCapp/FSEvent.m deleted file mode 100644 index b6a215f67..000000000 --- a/Tools/XcodeCapp/FSEvent.m +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is a part of program xcodecapp-cocoa - * Copyright (C) 2011 Antoine Mercadal (primalmotion@archipelproject.org) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "FSEventCallback.h" - -/*! - This is the FSEvent callback - */ -void fsevents_callback(ConstFSEventStreamRef streamRef, - void *userData, - size_t numEvents, - void *eventPaths, - const FSEventStreamEventFlags eventFlags[], - const FSEventStreamEventId eventIds[]) -{ - TNXCodeCapp *xcc = (TNXCodeCapp *)userData; - size_t i; - - for(i = 0; i < numEvents; i++) - { - NSString *path = [(NSArray *)eventPaths objectAtIndex:i]; - - #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) - // kFSEventStreamEventFlagItemIsFile = 0x00010000 - if (!(eventFlags[i] & 0x00010000) - || [xcc isPathMatchingIgnoredPaths:path] - || (![xcc isXIBFile:path] && ![xcc isObjJFile:path] && ![xcc isXCCIgnoreFile:path])) - continue; - - // kFSEventStreamEventFlagItemRemoved = 0x00000200 - if (eventFlags[i] & 0x00000200) - { - [xcc handleFileRemoval:path]; - } - else - { - NSLog(@"this file has been modified or created"); - [xcc handleFileModification:path notify:YES]; - } - #else - NSArray *subpaths = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; - for(NSString *currentPath in subpaths) - [xcc handleFileModification:currentPath notify:YES]; - #endif - - [xcc updateLastEventId:eventIds[i]]; - } -} \ No newline at end of file diff --git a/Tools/XcodeCapp/FSEventCallback.h b/Tools/XcodeCapp/FSEventCallback.h deleted file mode 100644 index eac8aabcf..000000000 --- a/Tools/XcodeCapp/FSEventCallback.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef xcodecapp_cocoa_FSEventCallback_h -#define xcodecapp_cocoa_FSEventCallback_h - -#import "TNXCodeCapp.h" -#import - -#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6 -# define kFSEventStreamCreateFlagFileEvents 0x00000010 -# define kFSEventStreamEventFlagItemIsFile 0x00010000 -# define kFSEventStreamEventFlagItemRemoved 0x00000200 -# define kFSEventStreamEventFlagItemCreated 0x00000200 -# define kFSEventStreamEventFlagItemModified 0x00001000 -# define kFSEventStreamEventFlagItemInodeMetaMod 0x00000400 -# define kFSEventStreamEventFlagItemRenamed 0x00000800 -# define kFSEventStreamEventFlagItemFinderInfoMod 0x00002000 -# define kFSEventStreamEventFlagItemChangeOwner 0x00004000 -# define kFSEventStreamEventFlagItemXattrMod 0x00008000 -#endif - -void fsevents_callback(ConstFSEventStreamRef, void*, size_t, void*, const FSEventStreamEventFlags*, const FSEventStreamEventId*); - -#endif diff --git a/Tools/XcodeCapp/FSEventCallback.m b/Tools/XcodeCapp/FSEventCallback.m deleted file mode 100644 index 6b537a068..000000000 --- a/Tools/XcodeCapp/FSEventCallback.m +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "AppController.h" -#import "FSEventCallback.h" -#import "macros.h" - - -/*! - This is the FSEvent callback for 10.7 - */ -void fsevents_callback(ConstFSEventStreamRef streamRef, - void *userData, - size_t numEvents, - void *eventPaths, - const FSEventStreamEventFlags eventFlags[], - const FSEventStreamEventId eventIds[]) -{ - TNXCodeCapp *xcc = (__bridge TNXCodeCapp *)userData; - BOOL useFileBasedListening = [xcc supportsFileBasedListening]; - size_t i; - - for (i = 0; i < numEvents; i++) - { - [xcc updateLastEventId:eventIds[i]]; - - FSEventStreamEventFlags flags = eventFlags[i]; - - NSString *path = [[(__bridge NSArray *)eventPaths objectAtIndex:i] stringByStandardizingPath]; - - if (useFileBasedListening) - { - BOOL conditionIsFile = flags & kFSEventStreamEventFlagItemIsFile; - BOOL conditionIsDirectory = NO; - BOOL conditionIsIgnored = [xcc isPathMatchingIgnoredPaths:path]; - BOOL conditionIsValidFile = [xcc isXIBFile:path] || [xcc isObjJFile:path] || [xcc isXCCIgnoreFile:path]; - BOOL conditionPathExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&conditionIsDirectory]; - - if (conditionIsIgnored) - continue; - - if (conditionIsFile && !conditionIsValidFile) - continue; - - // Events are not so reliable. For example, moving a folder to the trash is not - // a deletion. In order to simplify the code, we simply tidyUp the project when we receive - // an event. - [xcc tidyShadowedFiles]; - - if (conditionIsDirectory) - continue; - - if (!conditionPathExists) - { - DLog(@"File removed: %@", path); - [xcc handleFileRemoval:path]; - } - else - { - DLog(@"File modified/added: %@", path); - [xcc handleFileModification:path notify:YES]; - } - } - else - { - // We should drop support for Snow Leopard soon. - - BOOL isDir = NO; - [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]; - - // If for some reasons the path is not a directory, - // we don't want to deal with it in this mode. - if (!isDir) - continue; - - [xcc tidyShadowedFiles]; - - NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; - - for (NSString *subpath in subpaths) - { - NSString *fullPath = [[NSString stringWithFormat:@"%@/%@", path, subpath] stringByStandardizingPath]; - - if ([xcc isPathMatchingIgnoredPaths:fullPath] - || (![xcc isXIBFile:fullPath] && ![xcc isObjJFile:fullPath] && ![xcc isXCCIgnoreFile:fullPath])) - continue; - - NSDate *lastModifiedDate = [xcc lastModificationDateForPath:fullPath]; - NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:nil]; - NSDate *fileModDate = [fileAttributes objectForKey:NSFileModificationDate]; - - if ([fileModDate compare:lastModifiedDate] == NSOrderedDescending) - { - [xcc updateLastModificationDate:fileModDate forPath:fullPath]; - [xcc handleFileModification:fullPath notify:YES]; - } - } - } - } - - [xcc updateUserDefaultsWithLastEventId]; -} diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Growl b/Tools/XcodeCapp/Growl.framework/Versions/A/Growl deleted file mode 100755 index a289fe7b6..000000000 Binary files a/Tools/XcodeCapp/Growl.framework/Versions/A/Growl and /dev/null differ diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h b/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h deleted file mode 100644 index e2a44255d..000000000 --- a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h +++ /dev/null @@ -1,6 +0,0 @@ -#include "GrowlDefines.h" - -#ifdef __OBJC__ -# include "GrowlApplicationBridge.h" -#endif -#include "GrowlApplicationBridge-Carbon.h" diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h b/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h deleted file mode 100644 index d4adefd43..000000000 --- a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h +++ /dev/null @@ -1,780 +0,0 @@ -// -// GrowlApplicationBridge-Carbon.h -// Growl -// -// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. -// Based on GrowlApplicationBridge.h by Evan Schoenberg. -// This source code is in the public domain. You may freely link it into any -// program. -// - -#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_ -#define _GROWLAPPLICATIONBRIDGE_CARBON_H_ - -#include -#include - -#ifndef GROWL_EXPORT -#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE -#endif - -/*! @header GrowlApplicationBridge-Carbon.h - * @abstract Declares an API that Carbon applications can use to interact with Growl. - * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX - * to Growl (such as your application's name and what notifications it may - * post) and to provide information to your application (such as that Growl - * is listening for notifications or that a notification has been clicked). - * - * You can set the Growldelegate with Growl_SetDelegate and find out the - * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more - * information about the delegate. - */ - -__BEGIN_DECLS - -/*! @struct Growl_Delegate - * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events. - * @discussion The Growl delegate provides your interface to - * GrowlApplicationBridge. When GrowlApplicationBridge needs information about - * your application, it looks for it in the delegate; when Growl or the user - * does something that you might be interested in, GrowlApplicationBridge - * looks for a callback in the delegate and calls it if present - * (meaning, if it is not NULL). - * XXX on all of that - * @field size The size of the delegate structure. - * @field applicationName The name of your application. - * @field registrationDictionary A dictionary describing your application and the notifications it can send out. - * @field applicationIconData Your application's icon. - * @field growlInstallationWindowTitle The title of the installation window. - * @field growlInstallationInformation Text to display in the installation window. - * @field growlUpdateWindowTitle The title of the update window. - * @field growlUpdateInformation Text to display in the update window. - * @field referenceCount A count of owners of the delegate. - * @field retain Called when GrowlApplicationBridge receives this delegate. - * @field release Called when GrowlApplicationBridge no longer needs this delegate. - * @field growlIsReady Called when GrowlHelperApp is listening for notifications. - * @field growlNotificationWasClicked Called when a Growl notification is clicked. - * @field growlNotificationTimedOut Called when a Growl notification timed out. - */ -struct Growl_Delegate { - /* @discussion This should be sizeof(struct Growl_Delegate). - */ - size_t size; - - /*All of these attributes are optional. - *Optional attributes can be NULL; required attributes that - * are NULL cause setting the Growl delegate to fail. - *XXX - move optional/required status into the discussion for each field - */ - - /* This name is used both internally and in the Growl preferences. - * - * This should remain stable between different versions and incarnations of - * your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - * - * This can be NULL if it is provided elsewhere, namely in an - * auto-discoverable plist file in your app bundle - * (XXX refer to more information on that) or in registrationDictionary. - */ - CFStringRef applicationName; - - /* - * Must contain at least these keys: - * GROWL_NOTIFICATIONS_ALL (CFArray): - * Contains the names of all notifications your application may post. - * - * Can also contain these keys: - * GROWL_NOTIFICATIONS_DEFAULT (CFArray): - * Names of notifications that should be enabled by default. - * If omitted, GROWL_NOTIFICATIONS_ALL will be used. - * GROWL_APP_NAME (CFString): - * Same as the applicationName member of this structure. - * If both are present, the applicationName member shall prevail. - * If this key is present, you may omit applicationName (set it to NULL). - * GROWL_APP_ICON (CFData): - * Same as the iconData member of this structure. - * If both are present, the iconData member shall prevail. - * If this key is present, you may omit iconData (set it to NULL). - * - * If you change the contents of this dictionary after setting the delegate, - * be sure to call Growl_Reregister. - * - * This can be NULL if you have an auto-discoverable plist file in your app - * bundle. (XXX refer to more information on that) - */ - CFDictionaryRef registrationDictionary; - - /* The data can be in any format supported by NSImage. As of - * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and - * PICT formats. - * - * If this is not supplied, Growl will look up your application's icon by - * its application name. - */ - CFDataRef applicationIconData; - - /* Installer display attributes - * - * These four attributes are used by the Growl installer, if this framework - * supports it. - * For any of these being NULL, a localised default will be - * supplied. - */ - - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If Growl is not installed, it will - * be displayed to the user as an explanation of what Growl is and what - * it can do in your application. - * It should probably note that no download is required to install. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationInformation; - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If an older version of Growl is - * installed, it will be displayed to the user as an explanation that an - * updated version of Growl is included in your application and - * no download is required. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateInformation; - - /* This member is provided for use by your retain and release - * callbacks (see below). - * - * GrowlApplicationBridge never directly uses this member. Instead, it - * calls your retain callback (if non-NULL) and your release - * callback (if non-NULL). - */ - unsigned referenceCount; - - //Functions. Currently all of these are optional (any of them can be NULL). - - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRetain and -[NSObject retain].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member would be - * NULL. - * @result A delegate to which GrowlApplicationBridge holds a reference. - */ - void *(*retain)(void *); - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRelease and - * -[NSObject release].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member might be - * free(3). - */ - void (*release)(void *); - - /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was - * launched successfully (or was already running). The application can - * take actions with the knowledge that Growl is installed and functional. - */ - void (*growlIsReady)(void); - - /* Informs the delegate that a Growl notification was clicked. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationWasClicked)(CFPropertyListRef clickContext); - - /* Informs the delegate that a Growl notification timed out. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationTimedOut)(CFPropertyListRef clickContext); -}; - -/*! @struct Growl_Notification - * @abstract Structure describing a Growl notification. - * @discussion XXX - * @field size The size of the notification structure. - * @field name Identifies the notification. - * @field title Short synopsis of the notification. - * @field description Additional text. - * @field iconData An icon for the notification. - * @field priority An indicator of the notification's importance. - * @field reserved Bits reserved for future usage. - * @field isSticky Requests that a notification stay on-screen until dismissed explicitly. - * @field clickContext An identifier to be passed to your click callback when a notification is clicked. - * @field clickCallback A callback to call when the notification is clicked. - */ -struct Growl_Notification { - /* This should be sizeof(struct Growl_Notification). - */ - size_t size; - - /* The notification name distinguishes one type of - * notification from another. The name should be human-readable, as it - * will be displayed in the Growl preference pane. - * - * The name is used in the GROWL_NOTIFICATIONS_ALL and - * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and - * in this member of the Growl_Notification structure. - */ - CFStringRef name; - - /* A notification's title describes the notification briefly. - * It should be easy to read quickly by the user. - */ - CFStringRef title; - - /* The description supplements the title with more - * information. It is usually longer and sometimes involves a list of - * subjects. For example, for a 'Download complete' notification, the - * description might have one filename per line. GrowlMail in Growl 0.6 - * uses a description of '%d new mail(s)' (formatted with the number of - * messages). - */ - CFStringRef description; - - /* The notification icon usually indicates either what - * happened (it may have the same icon as e.g. a toolbar item that - * started the process that led to the notification), or what it happened - * to (e.g. a document icon). - * - * The icon data is optional, so it can be NULL. In that - * case, the application icon is used alone. Not all displays support - * icons. - * - * The data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form - * ats. - */ - CFDataRef iconData; - - /* Priority is new in Growl 0.6, and is represented as a - * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low - * priority, and +2 is Very High priority. - * - * Not all displays support priority. If you do not wish to assign a - * priority to your notification, assign 0. - */ - signed int priority; - - /* These bits are not used in Growl 0.6. Set them to 0. - */ - unsigned reserved: 31; - - /* When the sticky bit is clear, in most displays, - * notifications disappear after a certain amount of time. Sticky - * notifications, however, remain on-screen until the user dismisses them - * explicitly, usually by clicking them. - * - * Sticky notifications were introduced in Growl 0.6. Most notifications - * should not be sticky. Not all displays support sticky notifications, - * and the user may choose in Growl's preference pane to force the - * notification to be sticky or non-sticky, in which case the sticky bit - * in the notification will be ignored. - */ - unsigned isSticky: 1; - - /* If this is not NULL, and your click callback - * is not NULL either, this will be passed to the callback - * when your notification is clicked by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - */ - CFPropertyListRef clickContext; - - /* If this is not NULL, it will be called instead - * of the Growl delegate's click callback when clickContext is - * non-NULL and the notification is clicked on by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - * - * The per-notification click callback is not yet supported as of Growl - * 0.7. - */ - void (*clickCallback)(CFPropertyListRef clickContext); - - CFStringRef identifier; -}; - -#pragma mark - -#pragma mark Easy initialisers - -/*! @defined InitGrowlDelegate - * @abstract Callable macro. Initializes a Growl delegate structure to defaults. - * @discussion Call with a pointer to a struct Growl_Delegate. All of the - * members of the structure will be set to 0 or NULL, except for - * size (which will be set to sizeof(struct Growl_Delegate)) and - * referenceCount (which will be set to 1). - */ -#define InitGrowlDelegate(delegate) \ - do { \ - if (delegate) { \ - (delegate)->size = sizeof(struct Growl_Delegate); \ - (delegate)->applicationName = NULL; \ - (delegate)->registrationDictionary = NULL; \ - (delegate)->applicationIconData = NULL; \ - (delegate)->growlInstallationWindowTitle = NULL; \ - (delegate)->growlInstallationInformation = NULL; \ - (delegate)->growlUpdateWindowTitle = NULL; \ - (delegate)->growlUpdateInformation = NULL; \ - (delegate)->referenceCount = 1U; \ - (delegate)->retain = NULL; \ - (delegate)->release = NULL; \ - (delegate)->growlIsReady = NULL; \ - (delegate)->growlNotificationWasClicked = NULL; \ - (delegate)->growlNotificationTimedOut = NULL; \ - } \ - } while(0) - -/*! @defined InitGrowlNotification - * @abstract Callable macro. Initializes a Growl notification structure to defaults. - * @discussion Call with a pointer to a struct Growl_Notification. All of - * the members of the structure will be set to 0 or NULL, except - * for size (which will be set to - * sizeof(struct Growl_Notification)). - */ -#define InitGrowlNotification(notification) \ - do { \ - if (notification) { \ - (notification)->size = sizeof(struct Growl_Notification); \ - (notification)->name = NULL; \ - (notification)->title = NULL; \ - (notification)->description = NULL; \ - (notification)->iconData = NULL; \ - (notification)->priority = 0; \ - (notification)->reserved = 0U; \ - (notification)->isSticky = false; \ - (notification)->clickContext = NULL; \ - (notification)->clickCallback = NULL; \ - (notification)->identifier = NULL; \ - } \ - } while(0) - -#pragma mark - -#pragma mark Public API - -// @functiongroup Managing the Growl delegate - -/*! @function Growl_SetDelegate - * @abstract Replaces the current Growl delegate with a new one, or removes - * the Growl delegate. - * @param newDelegate - * @result Returns false and does nothing else if a pointer that was passed in - * is unsatisfactory (because it is non-NULL, but at least one - * required member of it is NULL). Otherwise, sets or unsets the - * delegate and returns true. - * @discussion When newDelegate is non-NULL, sets - * the delegate to newDelegate. When it is NULL, - * the current delegate will be unset, and no delegate will be in place. - * - * It is legal for newDelegate to be the current delegate; - * nothing will happen, and Growl_SetDelegate will return true. It is also - * legal for it to be NULL, as described above; again, it will - * return true. - * - * If there was a delegate in place before the call, Growl_SetDelegate will - * call the old delegate's release member if it was non-NULL. If - * newDelegate is non-NULL, Growl_SetDelegate will - * call newDelegate->retain, and set the delegate to its return - * value. - * - * If you are using Growl-WithInstaller.framework, and an older version of - * Growl is installed on the user's system, the user will automatically be - * prompted to update. - * - * GrowlApplicationBridge currently does not copy this structure, nor does it - * retain any of the CF objects in the structure (it regards the structure as - * a container that retains the objects when they are added and releases them - * when they are removed or the structure is destroyed). Also, - * GrowlApplicationBridge currently does not modify any member of the - * structure, except possibly the referenceCount by calling the retain and - * release members. - */ -GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); - -/*! @function Growl_GetDelegate - * @abstract Returns the current Growl delegate, if any. - * @result The current Growl delegate. - * @discussion Returns the last pointer passed into Growl_SetDelegate, or - * NULL if no such call has been made. - * - * This function follows standard Core Foundation reference-counting rules. - * Because it is a Get function, not a Copy function, it will not retain the - * delegate on your behalf. You are responsible for retaining and releasing - * the delegate as needed. - */ -GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void); - -#pragma mark - - -// @functiongroup Posting Growl notifications - -/*! @function Growl_PostNotification - * @abstract Posts a Growl notification. - * @param notification The notification to post. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * NULL (or 0 or false as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. - * If the user cancels, this function will have no effect until the next - * application session, at which time when it is called the user will be - * prompted again. The user is also given the option to not be prompted again. - * If the user does choose to install Growl, the requested notification will - * be displayed once Growl is installed and running. - */ -GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification); - -/*! @function Growl_PostNotificationWithDictionary -* @abstract Notifies using a userInfo dictionary suitable for passing to -* CFDistributedNotificationCenter. -* @param userInfo The dictionary to notify with. -* @discussion Before Growl 0.6, your application would have posted -* notifications using CFDistributedNotificationCenter by creating a userInfo -* dictionary with the notification data. This had the advantage of allowing -* you to add other data to the dictionary for programs besides Growl that -* might be listening. -* -* This function allows you to use such dictionaries without being restricted -* to using CFDistributedNotificationCenter. The keys for this dictionary - * can be found in GrowlDefines.h. -*/ -GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); - -/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext - * @abstract Posts a Growl notification using parameter values. - * @param title The title of the notification. - * @param description The description of the notification. - * @param notificationName The name of the notification as listed in the - * registration dictionary. - * @param iconData Data representing a notification icon. Can be NULL. - * @param priority The priority of the notification (-2 to +2, with -2 - * being Very Low and +2 being Very High). - * @param isSticky If true, requests that this notification wait for a - * response from the user. - * @param clickContext An object to pass to the clickCallback, if any. Can - * be NULL, in which case the clickCallback is not called. - * @discussion Creates a temporary Growl_Notification, fills it out with the - * supplied information, and calls Growl_PostNotification on it. - * See struct Growl_Notification and Growl_PostNotification for more - * information. - * - * The icon data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats. - */ -GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( - /*inhale*/ - CFStringRef title, - CFStringRef description, - CFStringRef notificationName, - CFDataRef iconData, - signed int priority, - Boolean isSticky, - CFPropertyListRef clickContext); - -#pragma mark - - -// @functiongroup Registering - -/*! @function Growl_RegisterWithDictionary - * @abstract Register your application with Growl without setting a delegate. - * @discussion When you call this function with a dictionary, - * GrowlApplicationBridge registers your application using that dictionary. - * If you pass NULL, GrowlApplicationBridge will ask the delegate - * (if there is one) for a dictionary, and if that doesn't work, it will look - * in your application's bundle for an auto-discoverable plist. - * (XXX refer to more information on that) - * - * If you pass a dictionary to this function, it must include the - * GROWL_APP_NAME key, unless a delegate is set. - * - * This function is mainly an alternative to the delegate system introduced - * with Growl 0.6. Without a delegate, you cannot receive callbacks such as - * growlIsReady (since they are sent to the delegate). You can, - * however, set a delegate after registering without one. - * - * This function was introduced in Growl.framework 0.7. - * @result false if registration failed (e.g. if Growl isn't installed). - */ -GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); - -/*! @function Growl_Reregister - * @abstract Updates your registration with Growl. - * @discussion If your application changes the contents of the - * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the - * Growl delegate, or if it changes the value of that member, or if it - * changes the contents of its auto-discoverable plist, call this function - * to have Growl update its registration information for your application. - * - * Otherwise, this function does not normally need to be called. If you're - * using a delegate, your application will be registered when you set the - * delegate if both the delegate and its registrationDictionary member are - * non-NULL. - * - * This function is now implemented using - * Growl_RegisterWithDictionary. - */ -GROWL_EXPORT void Growl_Reregister(void); - -#pragma mark - - -/*! @function Growl_SetWillRegisterWhenGrowlIsReady - * @abstract Tells GrowlApplicationBridge to register with Growl when Growl - * launches (or not). - * @discussion When Growl has started listening for notifications, it posts a - * GROWL_IS_READY notification on the Distributed Notification - * Center. GrowlApplicationBridge listens for this notification, using it to - * perform various tasks (such as calling your delegate's - * growlIsReady callback, if it has one). If this function is - * called with true, one of those tasks will be to reregister - * with Growl (in the manner of Growl_Reregister). - * - * This attribute is automatically set back to false - * (the default) after every GROWL_IS_READY notification. - * @param flag true if you want GrowlApplicationBridge to register with - * Growl when next it is ready; false if not. - */ -GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); -/*! @function Growl_WillRegisterWhenGrowlIsReady - * @abstract Reports whether GrowlApplicationBridge will register with Growl - * when Growl next launches. - * @result true if GrowlApplicationBridge will register with - * Growl when next it posts GROWL_IS_READY; false if not. - */ -GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void); - -#pragma mark - - -// @functiongroup Obtaining registration dictionaries - -/*! @function Growl_CopyRegistrationDictionaryFromDelegate - * @abstract Asks the delegate for a registration dictionary. - * @discussion If no delegate is set, or if the delegate's - * registrationDictionary member is NULL, this - * function returns NULL. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); - -/*! @function Growl_CopyRegistrationDictionaryFromBundle - * @abstract Looks in a bundle for a registration dictionary. - * @discussion This function looks in a bundle for an auto-discoverable - * registration dictionary file using CFBundleCopyResourceURL. - * If it finds one, it loads the file using CFPropertyList and - * returns the result. - * - * If you pass NULL as the bundle, the main bundle is examined. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary: or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); - -/*! @function Growl_CreateBestRegistrationDictionary - * @abstract Obtains a registration dictionary, filled out to the best of - * GrowlApplicationBridge's knowledge. - * @discussion This function creates a registration dictionary as best - * GrowlApplicationBridge knows how. - * - * First, GrowlApplicationBridge examines the Growl delegate (if there is - * one) and gets the registration dictionary from that. If no such dictionary - * was obtained, GrowlApplicationBridge looks in your application's main - * bundle for an auto-discoverable registration dictionary file. If that - * doesn't exist either, this function returns NULL. - * - * Second, GrowlApplicationBridge calls - * Growl_CreateRegistrationDictionaryByFillingInDictionary with - * whatever dictionary was obtained. The result of that function is the - * result of this function. - * - * GrowlApplicationBridge uses this function when you call - * Growl_SetDelegate, or when you call - * Growl_RegisterWithDictionary with NULL. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); - -#pragma mark - - -// @functiongroup Filling in registration dictionaries - -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Keys are only filled in if missing; if a key is present in the dictionary, - * its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @param keys The keys to fill in. If NULL, any missing keys are filled in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Only those keys that are listed in keys will be filled in. - * Other missing keys are ignored. Also, keys are only filled in if missing; - * if a key is present in the dictionary, its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); - -/*! @brief Tries to fill in missing keys in a notification dictionary. - * @param notifDict The dictionary to fill in. - * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. - * @discussion This function examines the \a notifDict for missing keys, and - * tries to get them from the last known registration dictionary. As of 1.1, - * the keys that it will look for are: - * - * \li GROWL_APP_NAME - * \li GROWL_APP_ICON - * - * @since Growl.framework 1.1 - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict); - -#pragma mark - - -// @functiongroup Querying Growl's status - -/*! @function Growl_IsInstalled - * @abstract Determines whether the Growl prefpane and its helper app are - * installed. - * @result Returns true if Growl is installed, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsInstalled(void); - -/*! @function Growl_IsRunning - * @abstract Cycles through the process list to find whether GrowlHelperApp - * is running. - * @result Returns true if Growl is running, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsRunning(void); - -#pragma mark - - -// @functiongroup Launching Growl - -/*! @typedef GrowlLaunchCallback - * @abstract Callback to notify you that Growl is running. - * @param context The context pointer passed to Growl_LaunchIfInstalled. - * @discussion Growl_LaunchIfInstalled calls this callback function if Growl - * was already running or if it launched Growl successfully. - */ -typedef void (*GrowlLaunchCallback)(void *context); - -/*! @function Growl_LaunchIfInstalled - * @abstract Launches GrowlHelperApp if it is not already running. - * @param callback A callback function which will be called if Growl was successfully - * launched or was already running. Can be NULL. - * @param context The context pointer to pass to the callback. Can be NULL. - * @result Returns true if Growl was successfully launched or was already - * running; returns false and does not call the callback otherwise. - * @discussion Returns true and calls the callback (if the callback is not - * NULL) if the Growl helper app began launching or was already - * running. Returns false and performs no other action if Growl could not be - * launched (e.g. because the Growl preference pane is not properly installed). - * - * If Growl_CreateBestRegistrationDictionary returns - * non-NULL, this function will register with Growl atomically. - * - * The callback should take a single argument; this is to allow applications - * to have context-relevant information passed back. It is perfectly - * acceptable for context to be NULL. The callback itself can be - * NULL if you don't want one. - */ -GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); - -#pragma mark - -#pragma mark Constants - -/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER - * @abstract The CFBundleIdentifier of the Growl preference pane bundle. - * @discussion GrowlApplicationBridge uses this to determine whether Growl is - * currently installed, by searching for the Growl preference pane. Your - * application probably does not need to use this macro itself. - */ -#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER -#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel") -#endif - -__END_DECLS - -#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */ diff --git a/Tools/XcodeCapp/Jakefile b/Tools/XcodeCapp/Jakefile index 1fb239767..764cce92f 100644 --- a/Tools/XcodeCapp/Jakefile +++ b/Tools/XcodeCapp/Jakefile @@ -8,21 +8,50 @@ var OS = require("os"), task ("build", function() { + // If sw_vers does not exist, we aren't on Mac OS X + if (!executableExists("sw_vers")) + OS.exit(0); + + // No building on 10.6 + var p = OS.popen(["sw_vers", "-productVersion"]); + + if (p.wait() === 0) + { + var versions = p.stdout.read().split("."), + majorVersion = parseInt(versions[0], 10), + minorVersion = parseInt(versions[1], 10), + buildVersion = parseInt(versions[2], 10); + + if (majorVersion < 10 || minorVersion < 7) + { + colorPrint("XcodeCapp can only be built on Mac OS X 10.7+. You can download the binary here: https://www.dropbox.com/sh/gxdgm356gyb9tqc/rFNyl8hcVG", "red"); + + OS.exit(0); + } + } + if (executableExists("xcodebuild")) { var args = "-sdk macosx -alltargets -configuration Release", - supportPath = FILE.join($BUILD_CJS_CAPPUCCINO, "support", applicationName), installPath = FILE.join("/", "Applications", applicationName); + // Remove an old symlink, the application is built directly into /Applications now. + if (FILE.isLink(installPath)) + FILE.remove(installPath); + if (OS.system("xcodebuild " + args)) OS.exit(1); - rm_rf(supportPath); - FILE.mkdirs(supportPath); - cp_r(FILE.join("build", "Release", "XcodeCapp.app"), supportPath); - FILE.chmod(FILE.join(supportPath, "Contents", "MacOS", "XcodeCapp"), 0755); + if (!executableExists("xcc")) + { + print("\nWould you like to install the xcc command line tool in /usr/local/bin? yes or no:"); - OS.system(["ln", "-sf", supportPath, installPath]); + if (system.stdin.readLine() == "yes\n") + { + sudo(["mkdir", "-p", "/usr/local/bin"]); + sudo(["ln", "-s", "/Applications/XcodeCapp.app/Contents/MacOS/xcc", "/usr/local/bin/"]); + } + } } else { diff --git a/Tools/XcodeCapp/PRHEmptyGrowlDelegate.h b/Tools/XcodeCapp/PRHEmptyGrowlDelegate.h deleted file mode 100644 index 480ea6d46..000000000 --- a/Tools/XcodeCapp/PRHEmptyGrowlDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// PRHEmptyGrowlDelegate.h -// XcodeCapp -// -// Created by Andrea D'Amore on 19/06/11. -// Copyright 2011 by author. All rights reserved. -// -// taken from -// http://groups.google.com/group/growl-development/browse_thread/thread/6b0c3fb9fa31f765 - -#import -#import - -@interface PRHEmptyGrowlDelegate : NSObject { - -} - -@end diff --git a/Tools/XcodeCapp/PRHEmptyGrowlDelegate.m b/Tools/XcodeCapp/PRHEmptyGrowlDelegate.m deleted file mode 100644 index cdd5148a0..000000000 --- a/Tools/XcodeCapp/PRHEmptyGrowlDelegate.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// PRHEmptyGrowlDelegate.h -// XcodeCapp -// -// Created by Andrea D'Amore on 19/06/11. -// Copyright 2011 by author. All rights reserved. -// - -#import "PRHEmptyGrowlDelegate.h" - - -@implementation PRHEmptyGrowlDelegate - -@end diff --git a/Tools/XcodeCapp/README.md b/Tools/XcodeCapp/README.md deleted file mode 100644 index c23a01c80..000000000 --- a/Tools/XcodeCapp/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# xCodeCapp-Cocoa - -xcodecapp-cocoa is a port from the original xcodecapp application. It works basically the same than this -tools shipped with Cappuccino framework but have serveral advantages: - - * It uses the FSEventStream system to be notified when a file changes. So no useless looping - * It consumes about no CPU when idle - * It allows you to choose graphically the project you want to use - * It will keep track of your already generated project helper - * It supports .xcodecapp-ignore - * It uses Growl to notify you when a conversion is done. - -# License - -All the code is distributed under AGPL v3.0 license. The parse.j comes from Cappuccino parser and uses the Cappuccino license. - -# Author - -Antoine Meradal \ No newline at end of file diff --git a/Tools/XcodeCapp/TNErrorDataView.h b/Tools/XcodeCapp/TNErrorDataView.h deleted file mode 100644 index 5a1b10074..000000000 --- a/Tools/XcodeCapp/TNErrorDataView.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2013 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface TNErrorDataView : NSView -{ - IBOutlet NSTextField *fieldFileName; - IBOutlet NSTextField *__strong fieldMessage; - IBOutlet NSButton *buttonOpenFile; - - NSString *_fullPath; -} - -@property (strong) NSTextField *fieldMessage; - -- (IBAction)openFile:(id)aSender; - -@end diff --git a/Tools/XcodeCapp/TNErrorDataView.m b/Tools/XcodeCapp/TNErrorDataView.m deleted file mode 100644 index a8a49d31f..000000000 --- a/Tools/XcodeCapp/TNErrorDataView.m +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2013 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "TNErrorDataView.h" - -@implementation TNErrorDataView - -@synthesize fieldMessage; - -/*! - Set the data view's object value - @param aValue the dictionary representing the error - */ -- (void)setObjectValue:(NSDictionary *)aValue -{ - [fieldMessage setStringValue:[aValue valueForKey:@"message"]]; - [fieldFileName setStringValue:[aValue valueForKey:@"file"]]; - _fullPath = [aValue valueForKey:@"path"]; -} - - -#pragma - -#pragma Actions - -/*! - Open the errored file in default editor - @param aSender the sender of the action - */ -- (IBAction)openFile:(id)aSender -{ - NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; - [workspace openFile:_fullPath]; -} - - -#pragma - -#pragma CPCoding - -- (id)initWithCoder:(NSCoder*)aCoder -{ - if (self = [super initWithCoder:aCoder]) - { - fieldFileName = [aCoder decodeObjectForKey:@"fieldFileName"]; - fieldMessage = [aCoder decodeObjectForKey:@"fieldMessage"]; - buttonOpenFile = [aCoder decodeObjectForKey:@"buttonOpenFile"]; - } - - return self; -} - -- (void)encodeWithCoder:(NSCoder*)aCoder -{ - [super encodeWithCoder:aCoder]; - - [aCoder encodeObject:fieldFileName forKey:@"fieldFileName"]; - [aCoder encodeObject:fieldMessage forKey:@"fieldMessage"]; - [aCoder encodeObject:buttonOpenFile forKey:@"buttonOpenFile"]; -} - -@end diff --git a/Tools/XcodeCapp/TNXCodeCapp.h b/Tools/XcodeCapp/TNXCodeCapp.h deleted file mode 100644 index 6fab4af18..000000000 --- a/Tools/XcodeCapp/TNXCodeCapp.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "PRHEmptyGrowlDelegate.h" -#import "FSEventCallback.h" - -extern NSString * const XCCDidPopulateProjectNotification; -extern NSString * const XCCConversionStartNotification; -extern NSString * const XCCConversionStopNotification; -extern NSString * const XCCListeningStartNotification; - - -@interface TNXCodeCapp : NSObject -{ - FSEventStreamRef stream; - NSFileManager *fm; - NSMutableArray *errorList; - NSMutableSet *ignoredFilePaths; - NSNumber *lastEventId; - NSString *currentAPIMode; - NSString *currentProjectName; - NSString *parserPath; - NSString *XCodeSupportPBXPath; - NSString *XCodeSupportProjectName; - NSString *XCodeTemplatePBXPath; - NSString *profilePath; - NSString *shellPath; - NSString *PBXModifierScriptPath; - NSURL *currentProjectURL; - NSURL *XCodeSupportProject; - NSURL *XCodeSupportProjectSources; - PRHEmptyGrowlDelegate *growlDelegateRef; - NSObject *delegate; - NSDate *appStartedTimestamp; - NSMutableDictionary *pathModificationDates; - BOOL supportsFileBasedListening; - BOOL reactToInodeModification; - BOOL isListening; - BOOL isUsingFileLevelAPI; - BOOL supportFileLevelAPI; -} - -@property (strong) NSObject* delegate; -@property (strong) NSMutableArray* errorList; -@property (strong) NSURL* XCodeSupportProject; -@property (strong) NSURL* currentProjectURL; -@property (strong) NSString* currentProjectName; -@property (strong) NSString* currentAPIMode; -@property BOOL supportsFileBasedListening; -@property BOOL reactToInodeModification; -@property BOOL isListening; -@property BOOL supportFileLevelAPI; -@property BOOL isUsingFileLevelAPI; - -- (BOOL)isObjJFile:(NSString*)path; -- (void)computeIgnoredPaths; -- (BOOL)isPathMatchingIgnoredPaths:(NSString*)aPath; -- (BOOL)isXIBFile:(NSString *)path; -- (BOOL)isXCCIgnoreFile:(NSString *)path; -- (BOOL)prepareXCodeSupportProject; -- (NSURL*)shadowHeaderURLForSourceURL:(NSURL*)aSourceURL; -- (void)cleanUpShadowsRelatedToSourceURL:(NSURL*)aSourceURL; -- (NSURL*)shadowImplementationURLForSourceURL:(NSURL*)aSourceURL; -- (NSURL*)sourceURLForShadowName:(NSString *)aString; -- (void)handleFileModification:(NSString*)fullPath notify:(BOOL)shouldNotify; -- (void)handleFileRemoval:(NSString*)fullPath; -- (void)initializeEventStreamWithPath:(NSString*)aPath; -- (void)stopEventStream; -- (void)updateLastEventId:(uint64_t)eventId; -- (void)updateUserDefaultsWithLastEventId; -- (void)synchronizeUserDefaultsWithDisk; -- (void)listenProjectAtPath:(NSString *)path; -- (void)clear; -- (void)start; -- (void)configure; -- (void)tidyShadowedFiles; - -@end - - -@interface TNXCodeCapp (SnowLeopard) - -- (void)updateLastModificationDate:(NSDate *)date forPath:(NSString *)path; -- (NSDate*)lastModificationDateForPath:(NSString *)path; - -@end diff --git a/Tools/XcodeCapp/TNXCodeCapp.m b/Tools/XcodeCapp/TNXCodeCapp.m deleted file mode 100644 index d6ef190b0..000000000 --- a/Tools/XcodeCapp/TNXCodeCapp.m +++ /dev/null @@ -1,882 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "TNXCodeCapp.h" -#include "macros.h" - -NSString * const XCCUnderscoreReplacement = @"DoNotPutThisStringInFileNameOrWorldWillDie"; -NSString * const XCCDidPopulateProjectNotification = @"XCCDidPopulateProjectNotification"; -NSString * const XCCConversionStartNotification = @"XCCConversionStartNotification"; -NSString * const XCCConversionStopNotification = @"XCCConversionStopNotification"; -NSString * const XCCListeningStartNotification = @"XCCListeningStartNotification"; - - -@implementation TNXCodeCapp - -@synthesize delegate; -@synthesize errorList; -@synthesize XCodeSupportProject; -@synthesize currentProjectURL; -@synthesize currentProjectName; -@synthesize supportsFileBasedListening; -@synthesize reactToInodeModification; -@synthesize currentAPIMode; -@synthesize isListening; -@synthesize supportFileLevelAPI; -@synthesize isUsingFileLevelAPI; - - -#pragma mark - Initialization - -/*! - Initialize the AppController - */ -- (id)init -{ - self = [super init]; - - if (self) - { - errorList = [NSMutableArray arrayWithCapacity:10]; - fm = [NSFileManager defaultManager]; - ignoredFilePaths = [NSMutableSet new]; - parserPath = [[NSBundle mainBundle] pathForResource:@"parser" ofType:@"j"]; - lastEventId = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastEventId"]; - appStartedTimestamp = [NSDate date]; - - [self setIsListening:NO]; - [self setIsUsingFileLevelAPI:NO]; - - SInt32 versionMajor = 0; - SInt32 versionMinor = 0; - Gestalt(gestaltSystemVersionMajor, &versionMajor); - Gestalt(gestaltSystemVersionMinor, &versionMinor); - - [self setSupportFileLevelAPI:versionMajor >= 10 && versionMinor >= 7]; - // Uncomment to simulate 10.6 mode - // [self setSupportFileLevelAPI:NO]; - - [self configure]; - - NSString* myShell = [[[NSProcessInfo processInfo] environment] objectForKey:@"SHELL"]; - - if (myShell) - { - shellPath = myShell; - } - else - { - shellPath = @"/bin/bash"; - } - - if([shellPath isEqualToString:@"/bin/bash"]) - { - if([fm fileExistsAtPath:[@"~/.bash_profile" stringByExpandingTildeInPath]]) - profilePath = [@"source ~/.bash_profile" stringByExpandingTildeInPath]; - else if([fm fileExistsAtPath:[@"~/.bashrc" stringByExpandingTildeInPath]]) - profilePath = [@"source ~/.bashrc" stringByExpandingTildeInPath]; - else if([fm fileExistsAtPath:[@"~/.profile" stringByExpandingTildeInPath]]) - profilePath = [@"source ~/.profile" stringByExpandingTildeInPath]; - else - profilePath = @""; - } - else if ([shellPath isEqualToString:@"/bin/zsh"]) - { - if([fm fileExistsAtPath:[@"~/.zshrc" stringByExpandingTildeInPath]]) - profilePath = [@"source ~/.zshrc" stringByExpandingTildeInPath]; - else if([fm fileExistsAtPath:[@"~/.profile" stringByExpandingTildeInPath]]) - profilePath = [@"source ~/.profile" stringByExpandingTildeInPath]; - else - profilePath = @""; - } - else - { - NSAlert *alert = [NSAlert alertWithMessageText:@"Shell not recognized." - defaultButton:@"OK" - alternateButton:nil - otherButton:nil - informativeTextWithFormat:@"You are running %@ as your shell, which is not supported. Please change your shell to either BASH or ZSH.", shellPath]; - [alert runModal]; - profilePath = @""; - } - } - - return self; -} - -- (void)start -{ - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"XCCReopenLastProject"]) - return; - - NSString *lastOpenedPath = [[NSUserDefaults standardUserDefaults] objectForKey:@"LastOpenedPath"]; - - if (lastOpenedPath) - { - if ([fm fileExistsAtPath:lastOpenedPath]) - { - [self listenProjectAtPath:[NSString stringWithFormat:@"%@/", lastOpenedPath]]; - } - else - { - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"LastOpenedPath"]; - } - } -} - - -#pragma mark - Project Management - -/*! - Check if .XcodeSupport needs to be initialized. - If not needed, check that all J files are mirrored. If no, - then launch conversion for missing mirrored h files - @return YES or NO - */ -- (BOOL)prepareXCodeSupportProject -{ - XCodeSupportProjectName = [NSString stringWithFormat:@"%@.xcodeproj/", currentProjectName]; - XCodeTemplatePBXPath = [[NSBundle mainBundle] pathForResource:@"project.pbxproj" ofType:@"sample"]; - XCodeSupportProject = [NSURL URLWithString:XCodeSupportProjectName relativeToURL:currentProjectURL]; - XCodeSupportProjectSources = [NSURL URLWithString:@".XcodeSupport/" relativeToURL:currentProjectURL]; - XCodeSupportPBXPath = [NSString stringWithFormat:@"%@/project.pbxproj", [XCodeSupportProject path]]; - PBXModifierScriptPath = [[NSBundle mainBundle] pathForResource:@"pbxprojModifier" ofType:@"py"]; - - - //[fm removeItemAtURL:XCodeSupportProjectSources error:nil]; - //[fm removeItemAtURL:XCodeSupportProject error:nil]; - - // create the template project if it doesn't exist - if (![fm fileExistsAtPath:[XCodeSupportProjectSources path]]) - { - NSLog(@"prepareXCodeSupportProject: Xcode support folder created at: %@", [XCodeSupportProject path]); - [fm createDirectoryAtPath:[XCodeSupportProject path] withIntermediateDirectories:YES attributes:nil error:nil]; - - DLog(@"prepareXCodeSupportProject: Copying project.pbxproj from %@ to %@", XCodeTemplatePBXPath, [XCodeSupportProject path]); - [fm copyItemAtPath:XCodeTemplatePBXPath toPath:XCodeSupportPBXPath error:nil]; - - DLog(@"prepareXCodeSupportProject: Reading the content of the project.pbxproj"); - NSMutableString *PBXContent = [NSMutableString stringWithContentsOfFile:XCodeSupportPBXPath encoding:NSUTF8StringEncoding error:nil]; - - [PBXContent writeToFile:XCodeSupportPBXPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; - DLog(@"prepareXCodeSupportProject: PBX file adapted to the project"); - - [self createXcodeSupportProjectSourcesDirIfNecessary]; - return NO; - } - - [self createXcodeSupportProjectSourcesDirIfNecessary]; - return YES; -} - -/*! - Create the .XcodeSupport/Sources folder if necessary. - */ -- (void)createXcodeSupportProjectSourcesDirIfNecessary -{ - if ([fm fileExistsAtPath:[XCodeSupportProjectSources path]]) - return; - - DLog(@"createXcodeSupportProjectSourcesDirIfNecessary: Creating source folder %@", [XCodeSupportProjectSources path]); - [fm createDirectoryAtPath:[XCodeSupportProjectSources path] withIntermediateDirectories:YES attributes:nil error:nil]; -} - -/*! - Initialize the creation of the .XcodeSupport project. This - Operation is threaded - @param arguments Thread arguments (not used) - @param shouldNotify is YES, XCCDidPopulateProjectNotification will be send - */ -- (void)populateXCodeProject:(NSNumber *)shouldNotify -{ - if ([shouldNotify boolValue]) - [delegate performSelector:@selector(growlWithTitle:message:) withObject:@"Loading project" withObject:[currentProjectURL path]]; - - NSArray *subdpaths = [fm subpathsAtPath:[currentProjectURL path]]; - - for (NSString *p in subdpaths) - { - NSString *filePath = [NSString stringWithFormat:@"%@/%@", [currentProjectURL path], p]; - - BOOL isDir = NO; - [fm fileExistsAtPath:filePath isDirectory:&isDir]; - - if (isDir || ![self isObjJFile:filePath] || [self isPathMatchingIgnoredPaths:filePath]) - continue; - - NSURL *eventualShadow = [self shadowHeaderURLForSourceURL:[NSURL fileURLWithPath:filePath]]; - - if (![fm fileExistsAtPath:[eventualShadow path]]) - { - DLog(@"populateXCodeProject: Computing missing shadow file for %@", filePath); - [self handleFileModification:filePath notify:NO]; - } - } - - if ([shouldNotify boolValue]) - { - NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:currentProjectURL, @"URL", nil]; - [[NSNotificationCenter defaultCenter] postNotificationName:XCCDidPopulateProjectNotification object:self userInfo:info]; - } -} - -/*! - Start all needed processes for listening to a given path - @param path The folder path to listen to - */ -- (void)listenProjectAtPath:(NSString *)path -{ - NSMutableString *tempName = [NSMutableString stringWithString:[path lastPathComponent]]; - - currentProjectURL = [NSURL fileURLWithPath:path]; - - [tempName replaceOccurrencesOfString:@" " - withString:@"_" - options:NSCaseInsensitiveSearch - range:NSMakeRange(0, [tempName length])]; - currentProjectName = [NSString stringWithString:tempName]; - - [self computeIgnoredPaths]; - - BOOL isProjectReady = [self prepareXCodeSupportProject]; - - [NSThread detachNewThreadSelector:@selector(populateXCodeProject:) toTarget:self withObject:[NSNumber numberWithBool:!isProjectReady]]; - - [self initializeEventStreamWithPath:[currentProjectURL path]]; - - NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:path, @"path", [NSNumber numberWithInt:(isProjectReady) ? 1 : 0], @"ready", nil]; - [[NSNotificationCenter defaultCenter] postNotificationName:XCCListeningStartNotification object:self userInfo:info]; - - [[NSUserDefaults standardUserDefaults] setObject:[currentProjectURL path] forKey:@"LastOpenedPath"]; -} - - -#pragma mark - Event Stream - -/*! - Initializes the FSEvent stream - @param aPath the path of the folder to listen - */ -- (void)initializeEventStreamWithPath:(NSString*)aPath -{ - if ([self isListening]) - return; - - [self stopEventStream]; - - NSMutableArray *pathsToWatch = [NSMutableArray arrayWithObject:aPath]; - void *appPointer = (__bridge void *)self; - FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL}; - CFTimeInterval latency = 2.0; - FSEventStreamCreateFlags flags = 0; - - if (supportsFileBasedListening) - { - DLog(@"initializeEventStreamWithPath: Initializing the FSEventStream at file level (clean)"); - flags = kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents; - } - else - { - NSLog(@"Initializing the FSEventStream at folder level (dirty)"); - flags = kFSEventStreamCreateFlagUseCFTypes; - } - - // add symlinked directories - NSArray *fileList = [fm contentsOfDirectoryAtPath:aPath error:nil]; - - for (NSString *node in fileList) - { - NSDictionary *attributes = [fm attributesOfItemAtPath:aPath error:nil]; - if ([[attributes objectForKey:@"NSFileType"] isEqualTo:NSFileTypeDirectory]) - { - NSString *subDirectoryPath = [aPath stringByAppendingPathComponent:node]; - NSString *symlinkDestination = [fm destinationOfSymbolicLinkAtPath:subDirectoryPath error:nil]; - - if (symlinkDestination) - { - [pathsToWatch addObject:subDirectoryPath]; - } - } - } - - stream = FSEventStreamCreate(NULL, &fsevents_callback, &context, (__bridge CFArrayRef) pathsToWatch, - [lastEventId unsignedLongLongValue], latency, flags); - - FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - FSEventStreamStart(stream); - [self setIsListening:YES]; -} - -/*! - Stop listening the FSEvent stream if active - */ -- (void)stopEventStream -{ - if (stream) - { - FSEventStreamStop(stream); - FSEventStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - FSEventStreamInvalidate(stream); - FSEventStreamRelease(stream); - stream = NULL; - } - - [self setIsListening:NO]; -} - -/*! - Stops and clear the worker - */ -- (void)clear -{ - [self updateUserDefaultsWithLastEventId]; - [self synchronizeUserDefaultsWithDisk]; - currentProjectURL = nil; - currentProjectName = nil; - [ignoredFilePaths removeAllObjects]; - [self stopEventStream]; -} - -/*! - Choose the API mode according to default - */ -- (void)configure -{ - if (![self supportFileLevelAPI]) - { - DLog(@"configure: System doesn't support file level API"); - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:2] forKey:@"XCCAPIMode"]; - } - - switch ([[NSUserDefaults standardUserDefaults] integerForKey:@"XCCAPIMode"]) - { - case 0: - supportsFileBasedListening = [self supportFileLevelAPI] ? YES : NO; - break; - case 1: - supportsFileBasedListening = YES; - break; - case 2: - supportsFileBasedListening = NO; - break; - } - - if (supportsFileBasedListening) - { - DLog(@"configure: using 10.7+ mode listening (clean)"); - - [self setCurrentAPIMode:@"File level (Lion)"]; - [self setIsUsingFileLevelAPI:YES]; - reactToInodeModification = [[NSUserDefaults standardUserDefaults] boolForKey:@"XCCReactMode"]; - } - else - { - DLog(@"configure: using 10.6 mode listening (dirty)"); - reactToInodeModification = NO; - [self setCurrentAPIMode:@"Folder level (Snow Leopard)"]; - [self setIsUsingFileLevelAPI:NO]; - } -} - -/*! - Update the last event ID. We use a method because - This is called from outside the class, in the FSEvent callback - @param eventId the current event ID value - */ -- (void)updateLastEventId:(uint64_t)eventId -{ - lastEventId = [NSNumber numberWithUnsignedLongLong:eventId]; -} - -/*! - Updates the user defaults with the last recorded event Id. - */ -- (void)updateUserDefaultsWithLastEventId -{ - if (lastEventId && [lastEventId longLongValue] != 0) - { - [[NSUserDefaults standardUserDefaults] setObject:lastEventId forKey:@"lastEventId"]; - } -} - -/*! - Tells the standard user defaults to synchronize with disk. - */ -- (void)synchronizeUserDefaultsWithDisk -{ - [[NSUserDefaults standardUserDefaults] synchronize]; -} - - -#pragma mark - Shell Helpers - -/*! - Run a NSTask with the given arguments - @param arguments NSArray containing the NSTask arguments - @return NSarray containing the return code (int) and the eventual response (string) - */ -- (NSArray *)runTask:(NSArray *)arguments -{ - NSTask *task; - NSData *stdOut; - NSString *response; - NSNumber *status; - - task = [[NSTask alloc] init]; - - [task setLaunchPath:shellPath]; - [task setArguments: arguments]; - [task setStandardOutput:[NSPipe pipe]]; - [task launch]; - [task waitUntilExit]; - - stdOut = [[[task standardOutput] fileHandleForReading] availableData]; - response = [[NSString alloc] initWithData:stdOut encoding:NSUTF8StringEncoding]; - status = [NSNumber numberWithInt:[task terminationStatus]]; - - return [NSArray arrayWithObjects:status, response, nil]; -} - - -#pragma mark - Event Handlers - -/*! - Handle a file modification. If it's a .J or XIB or NIB, it will - perform the according conversion. If it's .xcodecapp-ignore, it will - update the list of ignored files. - @param fullPath the full path of the modified file - @param shouldNotify if YES, Growl notifications will be displayed - */ -- (void)handleFileModification:(NSString*)fullPath notify:(BOOL)shouldNotify -{ - if (![self isXIBFile:fullPath] && ![self isObjJFile:fullPath] && ![self isXCCIgnoreFile:fullPath]) - return; - - if ([self isPathMatchingIgnoredPaths:fullPath] || ![fm fileExistsAtPath:fullPath]) - return; - - DLog(@"handleFileModification:notify: Parsing modified file: %@", fullPath); - - NSArray *arguments = nil; - NSArray *PBXArguments = nil; - NSString *successTitle = nil; - NSString *successMsg = nil; - NSString *response = nil; - NSNumber *status = [NSNumber numberWithInt:0]; - NSString *splitPath = [fullPath substringFromIndex:[[currentProjectURL path] length] + 1]; - NSURL *encodedURL = [NSURL URLWithString:[fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - NSURL *shadowHeaderURL = [self shadowHeaderURLForSourceURL:encodedURL]; - NSURL *shadowImplementationURL = [self shadowImplementationURLForSourceURL:encodedURL]; - - DLog(@"handleFileModification:notify: Shadow header path: %@", shadowHeaderURL); - DLog(@"handleFileModification:notify: Shadow implementation path: %@", shadowImplementationURL); - - [[NSNotificationCenter defaultCenter] postNotificationName:XCCConversionStartNotification object:self]; - - if ([self isXIBFile:fullPath]) - { - arguments = [NSArray arrayWithObjects: @"-c", - [NSString stringWithFormat:@"(%@; nib2cib '%@';) 2>&1", profilePath, fullPath],@"",nil]; - - successTitle = @"XIB converted"; - successMsg = splitPath; - } - else if ([self isObjJFile:fullPath]) - { - arguments = [NSArray arrayWithObjects: @"-c", - [NSString stringWithFormat:@"(%@; objj '%@' '%@' '%@' '%@';) 2>&1", - profilePath, - parserPath, - fullPath, - [shadowHeaderURL path], - [shadowImplementationURL path]],nil]; - - PBXArguments = [NSArray arrayWithObjects: @"-c", - [NSString stringWithFormat:@"(%@; python %@ add '%@' '%@' '%@' '%@' '%@') 2>&1", - profilePath, - PBXModifierScriptPath, - XCodeSupportPBXPath, - [shadowHeaderURL path], - [shadowImplementationURL path], - fullPath, - [currentProjectURL path]],nil]; - - successTitle = @"Objective-J source processed"; - successMsg = splitPath; - } - else if ([self isXCCIgnoreFile:fullPath]) - { - [self computeIgnoredPaths]; - successTitle = @".xcodecapp-ignore processed"; - successMsg = @"Ignored files list updated"; - arguments = nil; - } - - // Run the task and get the response if needed - if (arguments) - { - DLog(@"handleFileModification:notify: Running conversion task..."); - NSArray *statusInfo = [self runTask:arguments]; - - status = [statusInfo objectAtIndex:0]; - response = [statusInfo objectAtIndex:1]; - - DLog(@"handleFileModification:notify: Conversion task result/response: %@/%@", status, response); - - if ([status intValue] == 0 && shouldNotify) - { - [delegate performSelector:@selector(growlWithTitle:message:) withObject:successTitle withObject:successMsg]; - } - else if (![status intValue] == 0) - { - if (response) - { - NSDictionary *errorDictionary = [NSDictionary dictionaryWithObjectsAndKeys:response, @"message", - splitPath, @"file", - fullPath, @"path", nil]; - - [errorList addObject:errorDictionary]; - } - - [delegate performSelector:@selector(growlWithTitle:message:) withObject:@"Error processing file" withObject:splitPath]; - } - } - - if (PBXArguments) - { - DLog(@"handleFileModification:notify: Running update PBX task..."); - NSArray *statusInfo = [self runTask:PBXArguments]; - status = [statusInfo objectAtIndex:0]; - response = [statusInfo objectAtIndex:1]; - DLog(@"handleFileModification:notify: Update PBX Task result/response: %@/%@", status, response); - } - - [[NSNotificationCenter defaultCenter] postNotificationName:XCCConversionStopNotification object:self]; - DLog(@"handleFileModification:notify: Processed: %@", fullPath); -} - -/*! - Handle a file deletion. If it's a .J, it will - remove the shadowed .h file. If it's .xcodecapp-ignore - it will reset the list of ignored files. - @param fullPath the full path of the modified file - @param shouldNotify if YES, Growl notifications will be displayed - */ -- (void)handleFileRemoval:(NSString*)fullPath -{ - if ([self isPathMatchingIgnoredPaths:fullPath] || [fm fileExistsAtPath:fullPath]) - return; - - NSString *encodedPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - if ([self isObjJFile:fullPath]) - [self cleanUpShadowsRelatedToSourceURL:[NSURL URLWithString:encodedPath]]; - else if ([self isXCCIgnoreFile:fullPath]) - [self computeIgnoredPaths]; -} - - -#pragma mark - Source Files Management - -/*! - Check if given full path is Objective-J file - @param path the path to check - @return YES or NO - */ -- (BOOL)isObjJFile:(NSString *)path -{ - return [[[path pathExtension] uppercaseString] isEqual:@"J"]; -} - -/*! - Check if given full path is XIB or NIB file - @param path the path to check - @return YES or NO - */ -- (BOOL)isXIBFile:(NSString *)path -{ - path = [[path pathExtension] uppercaseString]; - return [path isEqual:@"XIB"] || [path isEqual:@"NIB"]; -} - -/*! - Check if given full path is the .xcodecapp-ignore file - @param path the path to check - @return YES or NO - */ -- (BOOL)isXCCIgnoreFile:(NSString *)path -{ - path = [path lastPathComponent]; - return [path isEqual:@".xcodecapp-ignore"]; -} - - -#pragma mark - Shadow Files Management - -/*! - Compute the mirorred (shadow) header file name for a given path - @param aSourceURL the origin path - @return NSURL representing the shadow URL for the header file - */ -- (NSURL *)shadowHeaderURLForSourceURL:(NSURL*)aSourceURL -{ - if (!aSourceURL) - [NSException raise:NSInvalidArgumentException format:@"shadowHeaderURLForSourceURL: aSource URL must not be null"]; - - NSMutableString *flattenedPath = [NSMutableString stringWithString:[aSourceURL path]]; - - // Replace "_" with a substring that is unlikely to be in a filename - [flattenedPath replaceOccurrencesOfString:@"_" - withString:XCCUnderscoreReplacement - options:0 - range:NSMakeRange(0, [flattenedPath length])]; - - [flattenedPath replaceOccurrencesOfString:@"/" - withString:@"_" - options:0 - range:NSMakeRange(0, [flattenedPath length])]; - - DLog(@"shadowHeaderURLForSourceURL: Flattened path: %@", flattenedPath); - NSString *basename = [NSString stringWithFormat:@"%@.h", [[flattenedPath stringByDeletingPathExtension] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - - return [NSURL URLWithString:basename relativeToURL:XCodeSupportProjectSources]; -} - -/*! - Compute the mirorred (shadow) implementation file name for a given path - @param aSourceURL the origin path - @return NSURL representing the shadow URL for the implementation file - */ -- (NSURL *)shadowImplementationURLForSourceURL:(NSURL*)aSourceURL -{ - if (!aSourceURL) - [NSException raise:NSInvalidArgumentException format:@"shadowImplementationURLForSourceURL: aSource URL must not be null"]; - - NSURL *shadowHeaderURL = [self shadowHeaderURLForSourceURL:aSourceURL]; - NSURL *shadowImplPath = [[shadowHeaderURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"m"]; - - return shadowImplPath; -} - -/*! - Compute the Cappuccino source file that is related to the given shadow header file URL - @param aString the origin path - @return NSURL representing the URL for the related Cappuccino source file - */ -- (NSURL *)sourceURLForShadowName:(NSString *)aString -{ - NSMutableString * unshadowedPath = [NSMutableString stringWithString:aString]; - - [unshadowedPath replaceOccurrencesOfString:@"_" - withString:@"/" - options:0 - range:NSMakeRange(0, [unshadowedPath length])]; - - [unshadowedPath replaceOccurrencesOfString:XCCUnderscoreReplacement - withString:@"_" - options:0 - range:NSMakeRange(0, [unshadowedPath length])]; - - [unshadowedPath replaceOccurrencesOfString:@".h" - withString:@".j" - options:0 - range:NSMakeRange(0, [unshadowedPath length])]; - - return [NSURL fileURLWithPath:[NSString stringWithString:unshadowedPath]]; -} - -/*! - Clean up any shadow files and PBX entries related to given the Cappuccino source file URL - @param anURL the Cappuccino source file URL - */ -- (void)cleanUpShadowsRelatedToSourceURL:(NSURL *)anURL -{ - NSURL *shadowHeaderURL = [self shadowHeaderURLForSourceURL:anURL]; - NSURL *shadowImplementationURL = [self shadowImplementationURLForSourceURL:anURL]; - - DLog(@"cleanUpShadowsRelatedToSourceURL: Removing shadow header file: %@", shadowHeaderURL); - [fm removeItemAtURL:shadowHeaderURL error:nil]; - - DLog(@"cleanUpShadowsRelatedToSourceURL: Removing shadow implementation file: %@", shadowImplementationURL); - [fm removeItemAtURL:shadowImplementationURL error:nil]; - - DLog(@"cleanUpShadowsRelatedToSourceURL:Removing PBX reference task..."); - NSArray *PBXArguments = [NSArray arrayWithObjects: @"-c", - [NSString stringWithFormat:@"(%@; python %@ remove '%@' '%@' '%@' '%@' '%@') 2>&1", - profilePath, - PBXModifierScriptPath, - XCodeSupportPBXPath, - [shadowHeaderURL path], - [shadowImplementationURL path], - [anURL path], - [currentProjectURL path]],nil]; - - NSArray *statusInfo = [self runTask:PBXArguments]; - NSNumber *status = [statusInfo objectAtIndex:0]; - NSString *response = [statusInfo objectAtIndex:1]; - DLog(@"cleanUpShadowsRelatedToSourceURL: PBX Reference removal status/response: %@/%@", status, response); -} - -/*! - Clean the support folder according to files present in given path - */ -- (void)tidyShadowedFiles -{ - NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[XCodeSupportProjectSources path] error:NULL]; - - for (NSString *subpath in subpaths) - { - if (![[subpath pathExtension] isEqual:@".h"] || [[subpath lastPathComponent] isEqual:@"xcc_general_include.h"]) - continue; - - NSURL *unshadowed = [self sourceURLForShadowName:subpath]; - - if (![fm fileExistsAtPath:[unshadowed path]]) - { - [self cleanUpShadowsRelatedToSourceURL:unshadowed]; - - if (![self supportFileLevelAPI] && [self respondsToSelector:@selector(updateLastModificationDate:forPath:)]) - [self performSelector:@selector(updateLastModificationDate:forPath:) withObject:nil withObject:unshadowed]; - } - } -} - - -#pragma mark - XCC Ignore management - -/*! - Compute the ignored paths according to any existing - .xcodecapp-ignore file - */ -- (void)computeIgnoredPaths -{ - NSString *ignorePath = [NSString stringWithFormat:@"%@/.xcodecapp-ignore", [currentProjectURL path]]; - [ignoredFilePaths removeAllObjects]; - - if ([fm fileExistsAtPath:ignorePath]) - { - NSString *ignoreFileContent = [NSString stringWithContentsOfFile:ignorePath encoding:NSUTF8StringEncoding error:nil]; - NSArray *ignoredPatterns = [ignoreFileContent componentsSeparatedByString:@"\n"]; - - for (NSString *pattern in ignoredPatterns) - { - if ([pattern length]) - [ignoredFilePaths addObject:pattern]; - } - } - - [ignoredFilePaths addObject:@"*/.git/*"]; - [ignoredFilePaths addObject:@"*/.svn/*"]; - [ignoredFilePaths addObject:@"*/.hg/*"]; - [ignoredFilePaths addObject:@"*/Frameworks/*"]; - [ignoredFilePaths addObject:@"*/.XcodeSupport/*"]; - [ignoredFilePaths addObject:@"*/Build/*"]; - [ignoredFilePaths addObject:@"*/NS_*.j"]; - [ignoredFilePaths addObject:@"*main.j"]; - [ignoredFilePaths addObject:@"*.xcodeproj/*"]; - [ignoredFilePaths addObject:@"*.DS_Store"]; - - NSLog(@"Ignoring file paths: %@", ignoredFilePaths); -} - -/*! - Check is given path should be ignored - @param aPath the path to check - @return YES if it should be ignored, NO otherwise - */ -- (BOOL)isPathMatchingIgnoredPaths:(NSString*)aPath -{ - if ([ignoredFilePaths count] == 0) - return NO; - - for (NSString *ignoredPath in ignoredFilePaths) - { - if ([ignoredPath length] == 0) - continue; - - NSMutableString *regexp = [ignoredPath mutableCopy]; - - [regexp replaceOccurrencesOfString:@"/" - withString:@"\\/" - options:0 - range:NSMakeRange(0, [regexp length])]; - - [regexp replaceOccurrencesOfString:@"." - withString:@"\\." - options:0 - range:NSMakeRange(0, [regexp length])]; - - [regexp replaceOccurrencesOfString:@"*" - withString:@".*" - options:0 - range:NSMakeRange(0, [regexp length])]; - - [regexp replaceOccurrencesOfString:@" " - withString:@"\\ " - options:0 - range:NSMakeRange(0, [regexp length])]; - - NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp]; - - if ([regextest evaluateWithObject:aPath]) - return YES; - } - - return NO; -} - -@end - - -@implementation TNXCodeCapp (SnowLeopard) - -- (void)updateLastModificationDate:(NSDate *)date forPath:(NSString *)path -{ - if (!pathModificationDates) - { - pathModificationDates = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"pathModificationDates"] mutableCopy]; - - if (!pathModificationDates) - pathModificationDates = [NSMutableDictionary new]; - } - - if (date) - [pathModificationDates setObject:date forKey:path]; - else - [pathModificationDates removeObjectForKey:path]; - - [[NSUserDefaults standardUserDefaults] setObject:pathModificationDates forKey:@"pathModificationDates"]; -} - -- (NSDate *)lastModificationDateForPath:(NSString *)path -{ - if (!pathModificationDates) - { - pathModificationDates = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"pathModificationDates"] mutableCopy]; - - if (!pathModificationDates) - pathModificationDates = [NSMutableDictionary new]; - } - - if ([pathModificationDates valueForKey:path] != nil) - return [pathModificationDates valueForKey:path]; - else - return appStartedTimestamp; -} - -@end diff --git a/Tools/XcodeCapp/XcodeCapp.icns b/Tools/XcodeCapp/XcodeCapp.icns deleted file mode 100644 index defc3dc7f..000000000 Binary files a/Tools/XcodeCapp/XcodeCapp.icns and /dev/null differ diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/TemplateIcon.icns b/Tools/XcodeCapp/XcodeCapp.xcodeproj/TemplateIcon.icns deleted file mode 100644 index 62cb7015e..000000000 Binary files a/Tools/XcodeCapp/XcodeCapp.xcodeproj/TemplateIcon.icns and /dev/null differ diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.mode1v3 b/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.mode1v3 deleted file mode 100644 index 9ab3eb4ed..000000000 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.mode1v3 +++ /dev/null @@ -1,1389 +0,0 @@ - - - - - ActivePerspectiveName - Project - AllowedModules - - - BundleLoadPath - - MaxInstances - n - Module - PBXSmartGroupTreeModule - Name - Groups and Files Outline View - - - BundleLoadPath - - MaxInstances - n - Module - PBXNavigatorGroup - Name - Editor - - - BundleLoadPath - - MaxInstances - n - Module - XCTaskListModule - Name - Task List - - - BundleLoadPath - - MaxInstances - n - Module - XCDetailModule - Name - File and Smart Group Detail Viewer - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXBuildResultsModule - Name - Detailed Build Results Viewer - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXProjectFindModule - Name - Project Batch Find Tool - - - BundleLoadPath - - MaxInstances - n - Module - XCProjectFormatConflictsModule - Name - Project Format Conflicts List - - - BundleLoadPath - - MaxInstances - n - Module - PBXBookmarksModule - Name - Bookmarks Tool - - - BundleLoadPath - - MaxInstances - n - Module - PBXClassBrowserModule - Name - Class Browser - - - BundleLoadPath - - MaxInstances - n - Module - PBXCVSModule - Name - Source Code Control Tool - - - BundleLoadPath - - MaxInstances - n - Module - PBXDebugBreakpointsModule - Name - Debug Breakpoints Tool - - - BundleLoadPath - - MaxInstances - n - Module - XCDockableInspector - Name - Inspector - - - BundleLoadPath - - MaxInstances - n - Module - PBXOpenQuicklyModule - Name - Open Quickly Tool - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXDebugSessionModule - Name - Debugger - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXDebugCLIModule - Name - Debug Console - - - BundleLoadPath - - MaxInstances - n - Module - XCSnapshotModule - Name - Snapshots Tool - - - BundlePath - /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources - Description - DefaultDescriptionKey - DockingSystemVisible - - Extension - mode1v3 - FavBarConfig - - PBXProjectModuleGUID - 8E01A8EE0DE51C830008BB35 - XCBarModuleItemNames - - XCBarModuleItems - - - FirstTimeWindowDisplayed - - Identifier - com.apple.perspectives.project.mode1v3 - MajorVersion - 33 - MinorVersion - 0 - Name - Default - Notifications - - OpenEditors - - PerspectiveWidths - - -1 - -1 - - Perspectives - - - ChosenToolbarItems - - active-target-popup - active-buildstyle-popup - action - NSToolbarFlexibleSpaceItem - buildOrClean - build-and-goOrGo - com.apple.ide.PBXToolbarStopButton - get-info - toggle-editor - NSToolbarFlexibleSpaceItem - com.apple.pbx.toolbar.searchfield - - ControllerClassBaseName - - IconName - WindowOfProjectWithEditor - Identifier - perspective.project - IsVertical - - Layout - - - BecomeActive - - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 - 1C08E77C0454961000C914BD - 1C37FABC05509CD000000102 - 1C37FABC05539CD112110102 - E2644B35053B69B200211256 - 1C37FABC04509CD000100104 - 1CC0EA4004350EF90044410B - 1CC0EA4004350EF90041110B - - PBXProjectModuleGUID - 1CE0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - yes - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 269 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 29B97314FDCFA39411CA2CEA - 080E96DDFE201D6D7F000001 - 29B97323FDCFA39411CA2CEA - 1058C7A0FEA54F0111CA2CBB - 1C37FABC05509CD000000102 - 1CC0EA4004350EF90041110B - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 21 - 20 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {269, 430}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - - XCSharingToken - com.apple.Xcode.GFSharingToken - - GeometryConfiguration - - Frame - {{0, 0}, {286, 448}} - GroupTreeTableConfiguration - - MainColumn - 269 - - RubberWindowFrame - 545 -696 601 489 0 -800 1280 800 - - Module - PBXSmartGroupTreeModule - Proportion - 286pt - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1CE0B20306471E060097A5F4 - PBXProjectModuleLabel - MyNewFile14.java - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1CE0B20406471E060097A5F4 - PBXProjectModuleLabel - MyNewFile14.java - - SplitCount - 1 - - StatusBarVisibility - - - GeometryConfiguration - - Frame - {{0, 0}, {310, 0}} - RubberWindowFrame - 545 -696 601 489 0 -800 1280 800 - - Module - PBXNavigatorGroup - Proportion - 0pt - - - ContentConfiguration - - PBXProjectModuleGUID - 1CE0B20506471E060097A5F4 - PBXProjectModuleLabel - Detail - - GeometryConfiguration - - Frame - {{0, 5}, {310, 443}} - RubberWindowFrame - 545 -696 601 489 0 -800 1280 800 - - Module - XCDetailModule - Proportion - 443pt - - - Proportion - 310pt - - - Name - Project - ServiceClasses - - XCModuleDock - PBXSmartGroupTreeModule - XCModuleDock - PBXNavigatorGroup - XCDetailModule - - TableOfContents - - 8E480DF30E980A1F005A51A6 - 1CE0B1FE06471DED0097A5F4 - 8E480DF40E980A1F005A51A6 - 1CE0B20306471E060097A5F4 - 1CE0B20506471E060097A5F4 - - ToolbarConfiguration - xcode.toolbar.config.defaultV3 - - - ControllerClassBaseName - - IconName - WindowOfProject - Identifier - perspective.morph - IsVertical - 0 - Layout - - - BecomeActive - 1 - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 - 1C08E77C0454961000C914BD - 1C37FABC05509CD000000102 - 1C37FABC05539CD112110102 - E2644B35053B69B200211256 - 1C37FABC04509CD000100104 - 1CC0EA4004350EF90044410B - 1CC0EA4004350EF90041110B - - PBXProjectModuleGUID - 11E0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - yes - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 186 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 29B97314FDCFA39411CA2CEA - 1C37FABC05509CD000000102 - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 0 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {186, 337}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - 1 - XCSharingToken - com.apple.Xcode.GFSharingToken - - GeometryConfiguration - - Frame - {{0, 0}, {203, 355}} - GroupTreeTableConfiguration - - MainColumn - 186 - - RubberWindowFrame - 373 269 690 397 0 0 1440 878 - - Module - PBXSmartGroupTreeModule - Proportion - 100% - - - Name - Morph - PreferredWidth - 300 - ServiceClasses - - XCModuleDock - PBXSmartGroupTreeModule - - TableOfContents - - 11E0B1FE06471DED0097A5F4 - - ToolbarConfiguration - xcode.toolbar.config.default.shortV3 - - - PerspectivesBarVisible - - ShelfIsVisible - - SourceDescription - file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' - StatusbarIsVisible - - TimeStamp - 0.0 - ToolbarDisplayMode - 1 - ToolbarIsVisible - - ToolbarSizeMode - 1 - Type - Perspectives - UpdateMessage - The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? - WindowJustification - 5 - WindowOrderList - - 8E01A8EF0DE51C830008BB35 - 1C78EAAD065D492600B07095 - 1CD10A99069EF8BA00B06720 - /Users/awt/xcodecapp-cocoa/xcodecapp-cocoa.xcodeproj - - WindowString - 545 -696 601 489 0 -800 1280 800 - WindowToolsV3 - - - FirstTimeWindowDisplayed - - Identifier - windowTool.build - IsVertical - - Layout - - - Dock - - - BecomeActive - - ContentConfiguration - - PBXProjectModuleGUID - 1CD0528F0623707200166675 - PBXProjectModuleLabel - AppController.m - StatusBarVisibility - - - GeometryConfiguration - - Frame - {{0, 0}, {892, 440}} - RubberWindowFrame - 18 -722 892 722 0 -800 1280 800 - - Module - PBXNavigatorGroup - Proportion - 440pt - - - ContentConfiguration - - PBXProjectModuleGUID - XCMainBuildResultsModuleGUID - PBXProjectModuleLabel - Build - XCBuildResultsTrigger_Collapse - 1021 - XCBuildResultsTrigger_Open - 1011 - - GeometryConfiguration - - Frame - {{0, 445}, {892, 236}} - RubberWindowFrame - 18 -722 892 722 0 -800 1280 800 - - Module - PBXBuildResultsModule - Proportion - 236pt - - - Proportion - 681pt - - - Name - Build Results - ServiceClasses - - PBXBuildResultsModule - - StatusbarIsVisible - - TableOfContents - - 8E01A8EF0DE51C830008BB35 - 8E480DF50E980A1F005A51A6 - 1CD0528F0623707200166675 - XCMainBuildResultsModuleGUID - - ToolbarConfiguration - xcode.toolbar.config.buildV3 - WindowString - 18 -722 892 722 0 -800 1280 800 - WindowToolGUID - 8E01A8EF0DE51C830008BB35 - WindowToolIsVisible - - - - FirstTimeWindowDisplayed - - Identifier - windowTool.debugger - IsVertical - - Layout - - - Dock - - - ContentConfiguration - - Debugger - - HorizontalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {316, 203}} - {{316, 0}, {378, 203}} - - - VerticalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {694, 203}} - {{0, 203}, {694, 178}} - - - - LauncherConfigVersion - 8 - PBXProjectModuleGUID - 1C162984064C10D400B95A72 - PBXProjectModuleLabel - Debug - GLUTExamples (Underwater) - - GeometryConfiguration - - DebugConsoleVisible - None - DebugConsoleWindowFrame - {{200, 200}, {500, 300}} - DebugSTDIOWindowFrame - {{200, 200}, {500, 300}} - Frame - {{0, 0}, {694, 381}} - PBXDebugSessionStackFrameViewKey - - DebugVariablesTableConfiguration - - Name - 120 - Value - 85 - Summary - 148 - - Frame - {{316, 0}, {378, 203}} - RubberWindowFrame - 429 -422 694 422 0 -800 1280 800 - - RubberWindowFrame - 429 -422 694 422 0 -800 1280 800 - - Module - PBXDebugSessionModule - Proportion - 381pt - - - Proportion - 381pt - - - Name - Debugger - ServiceClasses - - PBXDebugSessionModule - - StatusbarIsVisible - - TableOfContents - - 1CD10A99069EF8BA00B06720 - 8E480DF60E980A1F005A51A6 - 1C162984064C10D400B95A72 - 8E480DF70E980A1F005A51A6 - 8E480DF80E980A1F005A51A6 - 8E480DF90E980A1F005A51A6 - 8E480DFA0E980A1F005A51A6 - 8E480DFB0E980A1F005A51A6 - - ToolbarConfiguration - xcode.toolbar.config.debugV3 - WindowString - 429 -422 694 422 0 -800 1280 800 - WindowToolGUID - 1CD10A99069EF8BA00B06720 - WindowToolIsVisible - - - - Identifier - windowTool.find - Layout - - - Dock - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1CDD528C0622207200134675 - PBXProjectModuleLabel - <No Editor> - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1CD0528D0623707200166675 - - SplitCount - 1 - - StatusBarVisibility - 1 - - GeometryConfiguration - - Frame - {{0, 0}, {781, 167}} - RubberWindowFrame - 62 385 781 470 0 0 1440 878 - - Module - PBXNavigatorGroup - Proportion - 781pt - - - Proportion - 50% - - - BecomeActive - 1 - ContentConfiguration - - PBXProjectModuleGUID - 1CD0528E0623707200166675 - PBXProjectModuleLabel - Project Find - - GeometryConfiguration - - Frame - {{8, 0}, {773, 254}} - RubberWindowFrame - 62 385 781 470 0 0 1440 878 - - Module - PBXProjectFindModule - Proportion - 50% - - - Proportion - 428pt - - - Name - Project Find - ServiceClasses - - PBXProjectFindModule - - StatusbarIsVisible - 1 - TableOfContents - - 1C530D57069F1CE1000CFCEE - 1C530D58069F1CE1000CFCEE - 1C530D59069F1CE1000CFCEE - 1CDD528C0622207200134675 - 1C530D5A069F1CE1000CFCEE - 1CE0B1FE06471DED0097A5F4 - 1CD0528E0623707200166675 - - WindowString - 62 385 781 470 0 0 1440 878 - WindowToolGUID - 1C530D57069F1CE1000CFCEE - WindowToolIsVisible - 0 - - - Identifier - MENUSEPARATOR - - - FirstTimeWindowDisplayed - - Identifier - windowTool.debuggerConsole - IsVertical - - Layout - - - Dock - - - BecomeActive - - ContentConfiguration - - PBXProjectModuleGUID - 1C78EAAC065D492600B07095 - PBXProjectModuleLabel - Debugger Console - - GeometryConfiguration - - Frame - {{0, 0}, {1696, 681}} - RubberWindowFrame - 109 222 1696 722 0 0 1920 1178 - - Module - PBXDebugCLIModule - Proportion - 681pt - - - Proportion - 681pt - - - Name - Debugger Console - ServiceClasses - - PBXDebugCLIModule - - StatusbarIsVisible - - TableOfContents - - 1C78EAAD065D492600B07095 - 8E480E040E980B9A005A51A6 - 1C78EAAC065D492600B07095 - - ToolbarConfiguration - xcode.toolbar.config.consoleV3 - WindowString - 109 222 1696 722 0 0 1920 1178 - WindowToolGUID - 1C78EAAD065D492600B07095 - WindowToolIsVisible - - - - Identifier - windowTool.snapshots - Layout - - - Dock - - - Module - XCSnapshotModule - Proportion - 100% - - - Proportion - 100% - - - Name - Snapshots - ServiceClasses - - XCSnapshotModule - - StatusbarIsVisible - Yes - ToolbarConfiguration - xcode.toolbar.config.snapshots - WindowString - 315 824 300 550 0 0 1440 878 - WindowToolIsVisible - Yes - - - Identifier - windowTool.scm - Layout - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1C78EAB2065D492600B07095 - PBXProjectModuleLabel - <No Editor> - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1C78EAB3065D492600B07095 - - SplitCount - 1 - - StatusBarVisibility - 1 - - GeometryConfiguration - - Frame - {{0, 0}, {452, 0}} - RubberWindowFrame - 743 379 452 308 0 0 1280 1002 - - Module - PBXNavigatorGroup - Proportion - 0pt - - - BecomeActive - 1 - ContentConfiguration - - PBXProjectModuleGUID - 1CD052920623707200166675 - PBXProjectModuleLabel - SCM - - GeometryConfiguration - - ConsoleFrame - {{0, 259}, {452, 0}} - Frame - {{0, 7}, {452, 259}} - RubberWindowFrame - 743 379 452 308 0 0 1280 1002 - TableConfiguration - - Status - 30 - FileName - 199 - Path - 197.09500122070312 - - TableFrame - {{0, 0}, {452, 250}} - - Module - PBXCVSModule - Proportion - 262pt - - - Proportion - 266pt - - - Name - SCM - ServiceClasses - - PBXCVSModule - - StatusbarIsVisible - 1 - TableOfContents - - 1C78EAB4065D492600B07095 - 1C78EAB5065D492600B07095 - 1C78EAB2065D492600B07095 - 1CD052920623707200166675 - - ToolbarConfiguration - xcode.toolbar.config.scm - WindowString - 743 379 452 308 0 0 1280 1002 - - - Identifier - windowTool.breakpoints - IsVertical - 0 - Layout - - - Dock - - - BecomeActive - 1 - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C77FABC04509CD000000102 - - PBXProjectModuleGUID - 1CE0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - no - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 168 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 1C77FABC04509CD000000102 - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 0 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {168, 350}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - 0 - - GeometryConfiguration - - Frame - {{0, 0}, {185, 368}} - GroupTreeTableConfiguration - - MainColumn - 168 - - RubberWindowFrame - 315 424 744 409 0 0 1440 878 - - Module - PBXSmartGroupTreeModule - Proportion - 185pt - - - ContentConfiguration - - PBXProjectModuleGUID - 1CA1AED706398EBD00589147 - PBXProjectModuleLabel - Detail - - GeometryConfiguration - - Frame - {{190, 0}, {554, 368}} - RubberWindowFrame - 315 424 744 409 0 0 1440 878 - - Module - XCDetailModule - Proportion - 554pt - - - Proportion - 368pt - - - MajorVersion - 3 - MinorVersion - 0 - Name - Breakpoints - ServiceClasses - - PBXSmartGroupTreeModule - XCDetailModule - - StatusbarIsVisible - 1 - TableOfContents - - 1CDDB66807F98D9800BB5817 - 1CDDB66907F98D9800BB5817 - 1CE0B1FE06471DED0097A5F4 - 1CA1AED706398EBD00589147 - - ToolbarConfiguration - xcode.toolbar.config.breakpointsV3 - WindowString - 315 424 744 409 0 0 1440 878 - WindowToolGUID - 1CDDB66807F98D9800BB5817 - WindowToolIsVisible - 1 - - - Identifier - windowTool.debugAnimator - Layout - - - Dock - - - Module - PBXNavigatorGroup - Proportion - 100% - - - Proportion - 100% - - - Name - Debug Visualizer - ServiceClasses - - PBXNavigatorGroup - - StatusbarIsVisible - 1 - ToolbarConfiguration - xcode.toolbar.config.debugAnimatorV3 - WindowString - 100 100 700 500 0 0 1280 1002 - - - Identifier - windowTool.bookmarks - Layout - - - Dock - - - Module - PBXBookmarksModule - Proportion - 100% - - - Proportion - 100% - - - Name - Bookmarks - ServiceClasses - - PBXBookmarksModule - - StatusbarIsVisible - 0 - WindowString - 538 42 401 187 0 0 1280 1002 - - - Identifier - windowTool.projectFormatConflicts - Layout - - - Dock - - - Module - XCProjectFormatConflictsModule - Proportion - 100% - - - Proportion - 100% - - - Name - Project Format Conflicts - ServiceClasses - - XCProjectFormatConflictsModule - - StatusbarIsVisible - 0 - WindowContentMinSize - 450 300 - WindowString - 50 850 472 307 0 0 1440 877 - - - Identifier - windowTool.classBrowser - Layout - - - Dock - - - BecomeActive - 1 - ContentConfiguration - - OptionsSetName - Hierarchy, all classes - PBXProjectModuleGUID - 1CA6456E063B45B4001379D8 - PBXProjectModuleLabel - Class Browser - NSObject - - GeometryConfiguration - - ClassesFrame - {{0, 0}, {374, 96}} - ClassesTreeTableConfiguration - - PBXClassNameColumnIdentifier - 208 - PBXClassBookColumnIdentifier - 22 - - Frame - {{0, 0}, {630, 331}} - MembersFrame - {{0, 105}, {374, 395}} - MembersTreeTableConfiguration - - PBXMemberTypeIconColumnIdentifier - 22 - PBXMemberNameColumnIdentifier - 216 - PBXMemberTypeColumnIdentifier - 97 - PBXMemberBookColumnIdentifier - 22 - - PBXModuleWindowStatusBarHidden2 - 1 - RubberWindowFrame - 385 179 630 352 0 0 1440 878 - - Module - PBXClassBrowserModule - Proportion - 332pt - - - Proportion - 332pt - - - Name - Class Browser - ServiceClasses - - PBXClassBrowserModule - - StatusbarIsVisible - 0 - TableOfContents - - 1C0AD2AF069F1E9B00FABCE6 - 1C0AD2B0069F1E9B00FABCE6 - 1CA6456E063B45B4001379D8 - - ToolbarConfiguration - xcode.toolbar.config.classbrowser - WindowString - 385 179 630 352 0 0 1440 878 - WindowToolGUID - 1C0AD2AF069F1E9B00FABCE6 - WindowToolIsVisible - 0 - - - Identifier - windowTool.refactoring - IncludeInToolsMenu - 0 - Layout - - - Dock - - - BecomeActive - 1 - GeometryConfiguration - - Frame - {0, 0}, {500, 335} - RubberWindowFrame - {0, 0}, {500, 335} - - Module - XCRefactoringModule - Proportion - 100% - - - Proportion - 100% - - - Name - Refactoring - ServiceClasses - - XCRefactoringModule - - WindowString - 200 200 500 356 0 0 1920 1200 - - - - diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.pbxuser b/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.pbxuser deleted file mode 100644 index f03c50e2b..000000000 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/awt.pbxuser +++ /dev/null @@ -1,152 +0,0 @@ -// !$*UTF8*$! -{ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeArchitecture = i386; - activeBuildConfigurationName = Debug; - activeExecutable = 8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */; - activeTarget = 8D1107260486CEB800E47090 /* xcodecapp-cocoa */; - addToTargets = ( - 8D1107260486CEB800E47090 /* xcodecapp-cocoa */, - ); - breakpoints = ( - 8EF107B90DFCF23200C52EB1 /* AppController.m:30 */, - 8EF107CA0DFCF4A100C52EB1 /* AppController.m:62 */, - ); - codeSenseManager = 8E01A8DC0DE51A060008BB35 /* Code sense */; - executables = ( - 8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */, - ); - perUserDictionary = { - PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; - PBXFileTableDataSourceColumnWidthsKey = ( - 20, - 71, - 20, - 48, - 43, - 43, - 20, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXFileDataSource_FiletypeID, - PBXFileDataSource_Filename_ColumnID, - PBXFileDataSource_Built_ColumnID, - PBXFileDataSource_ObjectSize_ColumnID, - PBXFileDataSource_Errors_ColumnID, - PBXFileDataSource_Warnings_ColumnID, - PBXFileDataSource_Target_ColumnID, - ); - }; - PBXPerProjectTemplateStateSaveDate = 244845075; - PBXWorkspaceStateSaveDate = 244845075; - }; - sourceControlManager = 8E01A8DB0DE51A060008BB35 /* Source Control */; - userBuildSettings = { - }; - }; - 29B97316FDCFA39411CA2CEA /* main.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1176, 392}}"; - sepNavSelRange = "{818, 0}"; - sepNavVisRange = "{297, 521}"; - }; - }; - 8D1107260486CEB800E47090 /* xcodecapp-cocoa */ = { - activeExec = 0; - executables = ( - 8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */, - ); - }; - 8E01A8CD0DE519E70008BB35 /* xcodecapp-cocoa */ = { - isa = PBXExecutable; - activeArgIndices = ( - ); - argumentStrings = ( - ); - autoAttachOnCrash = 1; - breakpointsEnabled = 0; - configStateDict = { - }; - customDataFormattersEnabled = 1; - debuggerPlugin = GDBDebugging; - disassemblyDisplayState = 0; - dylibVariantSuffix = ""; - enableDebugStr = 1; - environmentEntries = ( - ); - executableSystemSymbolLevel = 0; - executableUserSymbolLevel = 0; - libgmallocEnabled = 0; - name = xcodecapp-cocoa; - savedGlobals = { - }; - sourceDirectories = ( - ); - variableFormatDictionary = { - "*eventIds-long long unsigned int-mycallback" = 3; - }; - }; - 8E01A8DB0DE51A060008BB35 /* Source Control */ = { - isa = PBXSourceControlManager; - fallbackIsa = XCSourceControlManager; - isSCMEnabled = 0; - scmConfiguration = { - }; - }; - 8E01A8DC0DE51A060008BB35 /* Code sense */ = { - isa = PBXCodeSenseManager; - indexTemplatePath = ""; - }; - 8E01A91D0DE9EED20008BB35 /* AppController.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {692, 280}}"; - sepNavSelRange = "{234, 37}"; - sepNavVisRange = "{146, 185}"; - sepNavWindowFrame = "{{112, 264}, {1441, 774}}"; - }; - }; - 8E01A91E0DE9EED20008BB35 /* AppController.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {692, 2324}}"; - sepNavSelRange = "{4949, 0}"; - sepNavVisRange = "{3760, 551}"; - sepNavWindowFrame = "{{15, -1}, {1441, 774}}"; - }; - }; - 8EF107B90DFCF23200C52EB1 /* AppController.m:30 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - countType = 0; - delayBeforeContinue = 0; - fileReference = 8E01A91E0DE9EED20008BB35 /* AppController.m */; - functionName = "-awakeFromNib"; - hitCount = 1; - ignoreCount = 0; - lineNumber = 30; - location = xcodecapp-cocoa; - modificationTime = 234708321.122562; - state = 2; - }; - 8EF107CA0DFCF4A100C52EB1 /* AppController.m:62 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - countType = 0; - delayBeforeContinue = 0; - fileReference = 8E01A91E0DE9EED20008BB35 /* AppController.m */; - functionName = "mycallback()"; - hitCount = 0; - ignoreCount = 0; - lineNumber = 62; - location = xcodecapp-cocoa; - modificationTime = 234708306.739971; - state = 2; - }; -} diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 338a5e36d..0154116d1 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -7,393 +7,597 @@ objects = { /* Begin PBXBuildFile section */ - 0218442515D32B5D00A782B8 /* pbxprojModifier.py in Resources */ = {isa = PBXBuildFile; fileRef = 0218442415D32B5D00A782B8 /* pbxprojModifier.py */; }; - 022BCEA71468632000B72910 /* project.pbxproj.sample in Resources */ = {isa = PBXBuildFile; fileRef = 022BCEA61468632000B72910 /* project.pbxproj.sample */; }; - 024A041413699DD400DCBE4D /* parser.j in Resources */ = {isa = PBXBuildFile; fileRef = 024A041113699D6800DCBE4D /* parser.j */; }; - 026F3B6213866B0B00EE5B83 /* xcodecapp-icon-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = 026F3B6113866B0B00EE5B83 /* xcodecapp-icon-inactive.png */; }; - 026F3B6513866E7D00EE5B83 /* xcodecapp-icon-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 026F3B6413866E7D00EE5B83 /* xcodecapp-icon-active.png */; }; - 027D999B13696A7000D3DB13 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; - 027D999C13696A7000D3DB13 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; - 027D999E13696A7000D3DB13 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; - 027D999F13696A7000D3DB13 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E01A91E0DE9EED20008BB35 /* AppController.m */; }; - 027D99A113696A7000D3DB13 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - 027D99A213696A7000D3DB13 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */; }; - 027FE49D1462D74C00B1AB92 /* TNXCodeCapp.m in Sources */ = {isa = PBXBuildFile; fileRef = 027FE49C1462D74C00B1AB92 /* TNXCodeCapp.m */; }; - 027FE4BA1462F64E00B1AB92 /* xcodecapp-icon-working.png in Resources */ = {isa = PBXBuildFile; fileRef = 027FE4B91462F64E00B1AB92 /* xcodecapp-icon-working.png */; }; - 027FE4BD1462F7EB00B1AB92 /* FSEventCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = 027FE4BC1462F7EB00B1AB92 /* FSEventCallback.m */; }; - 0289AC9414668CAF003CD975 /* XcodeCapp.icns in Resources */ = {isa = PBXBuildFile; fileRef = 0289AC9314668CAF003CD975 /* XcodeCapp.icns */; }; - 0294F09315D345A500840547 /* mod_pbxproj.py in Resources */ = {isa = PBXBuildFile; fileRef = 0294F09215D345A500840547 /* mod_pbxproj.py */; }; - 02998CEB1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */; }; - 02998CF71369C339006C73DB /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; }; - 02998CF91369C38A006C73DB /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; }; - 02B1C8D816B25C74003C6E82 /* TNErrorDataView.m in Sources */ = {isa = PBXBuildFile; fileRef = 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */; }; - 4E2D0D01154840B400475C01 /* help.rtfd in Resources */ = {isa = PBXBuildFile; fileRef = 4E2D0D00154840B400475C01 /* help.rtfd */; }; - 4E2D0D03154840BC00475C01 /* help.rtfd in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4E2D0D00154840B400475C01 /* help.rtfd */; }; - 651DAE1F13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 651DAE1D13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m */; }; + E10E4CD717298E5F004AB09E /* project.pbxproj in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2A172188F300263CE3 /* project.pbxproj */; }; + E14015421740248C006C2792 /* XcodeProjectCloser.m in Sources */ = {isa = PBXBuildFile; fileRef = E14015411740248C006C2792 /* XcodeProjectCloser.m */; }; + E1401543174025B8006C2792 /* XcodeProjectCloser.m in Sources */ = {isa = PBXBuildFile; fileRef = E14015411740248C006C2792 /* XcodeProjectCloser.m */; }; + E164FDD31720E77100263CE3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FDD21720E77100263CE3 /* Cocoa.framework */; }; + E164FDDF1720E77100263CE3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E164FDDE1720E77100263CE3 /* main.m */; }; + E164FDF51720EBC100263CE3 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = E164FDF41720EBC100263CE3 /* AppController.m */; }; + E164FDF71720EBD600263CE3 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FDF61720EBD600263CE3 /* Growl.framework */; }; + E164FDFF1720EC5B00263CE3 /* XcodeCapp.m in Sources */ = {isa = PBXBuildFile; fileRef = E164FDFB1720EC5B00263CE3 /* XcodeCapp.m */; }; + E164FE181720F44B00263CE3 /* parser.j in Resources */ = {isa = PBXBuildFile; fileRef = E164FE171720F44B00263CE3 /* parser.j */; }; + E164FE1A1720F49A00263CE3 /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = E164FE191720F49A00263CE3 /* Growl Registration Ticket.growlRegDict */; }; + E164FE1F1720F51E00263CE3 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FE1D1720F50100263CE3 /* CoreServices.framework */; }; + E164FE211720F55600263CE3 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FDF61720EBD600263CE3 /* Growl.framework */; }; + E164FE2F1721A34900263CE3 /* icon-active.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2C1721A34900263CE3 /* icon-active.png */; }; + E164FE301721A34900263CE3 /* icon-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2D1721A34900263CE3 /* icon-inactive.png */; }; + E164FE311721A34900263CE3 /* icon-working.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2E1721A34900263CE3 /* icon-working.png */; }; + E170C3FB17296205003DC489 /* pbxprojModifier.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FE141720F40400263CE3 /* pbxprojModifier.py */; }; + E170C3FC1729620C003DC489 /* mod_pbxproj.py in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FE131720F40400263CE3 /* mod_pbxproj.py */; }; + E170C3FD1729620F003DC489 /* parser.j in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FE171720F44B00263CE3 /* parser.j */; }; + E170C40317298833003DC489 /* icon-active@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E170C3FE17298833003DC489 /* icon-active@2x.png */; }; + E170C40417298833003DC489 /* icon-error.png in Resources */ = {isa = PBXBuildFile; fileRef = E170C3FF17298833003DC489 /* icon-error.png */; }; + E170C40517298833003DC489 /* icon-error@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E170C40017298833003DC489 /* icon-error@2x.png */; }; + E170C40617298833003DC489 /* icon-inactive@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E170C40117298833003DC489 /* icon-inactive@2x.png */; }; + E170C40717298833003DC489 /* icon-working@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E170C40217298833003DC489 /* icon-working@2x.png */; }; + E171D25F173C168C00210893 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E171D25E173C168C00210893 /* Foundation.framework */; }; + E171D262173C168C00210893 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E171D261173C168C00210893 /* main.m */; }; + E171D26A173C1ADD00210893 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FE1D1720F50100263CE3 /* CoreServices.framework */; }; + E171D26C173C1C8300210893 /* xcc in CopyFiles */ = {isa = PBXBuildFile; fileRef = E171D25D173C168C00210893 /* xcc */; }; + E17A822D172700B90095CD83 /* XcodeCapp.iconset in Resources */ = {isa = PBXBuildFile; fileRef = E17A822C172700B90095CD83 /* XcodeCapp.iconset */; }; + E17B55411732F57700809FFB /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E17B55401732F57700809FFB /* Quartz.framework */; }; + E17B55431732F72700809FFB /* help.pdf in Resources */ = {isa = PBXBuildFile; fileRef = E17B55421732F72700809FFB /* help.pdf */; }; + E1A5594A172C5EE20088FB61 /* FindSourceFilesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E1A55949172C5EE20088FB61 /* FindSourceFilesOperation.m */; }; + E1A5594D172CA8D40088FB61 /* ProcessSourceOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E1A5594C172CA8D40088FB61 /* ProcessSourceOperation.m */; }; + E1E90C411735D846005C6D5B /* DDLogLevel.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C391735D846005C6D5B /* DDLogLevel.m */; }; + E1E90C421735D846005C6D5B /* Notifications.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C3C1735D846005C6D5B /* Notifications.m */; }; + E1E90C431735D846005C6D5B /* UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C3F1735D846005C6D5B /* UserDefaults.m */; }; + E1E90C4B1735D8A1005C6D5B /* DDASLLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C461735D8A1005C6D5B /* DDASLLogger.m */; }; + E1E90C4C1735D8A1005C6D5B /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C481735D8A1005C6D5B /* DDLog.m */; }; + E1E90C4D1735D8A1005C6D5B /* DDTTYLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E90C4A1735D8A1005C6D5B /* DDTTYLogger.m */; }; + E1E90C62173B42D0005C6D5B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E1E90C60173B42D0005C6D5B /* MainMenu.xib */; }; + E1E90C67173B44CC005C6D5B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E1E90C65173B44CC005C6D5B /* InfoPlist.strings */; }; + E1ED6B71173414E100641628 /* icon_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = E1ED6B6F173414E100641628 /* icon_128x128.png */; }; + E1ED6B72173414E100641628 /* icon_128x128@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E1ED6B70173414E100641628 /* icon_128x128@2x.png */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + E171D26D173C405C00210893 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E164FDC71720E77100263CE3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E171D25C173C168C00210893; + remoteInfo = xcc; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ - 02998CF81369C383006C73DB /* CopyFiles */ = { + E164FE201720F54800263CE3 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 02998CF91369C38A006C73DB /* Growl.framework in CopyFiles */, - 4E2D0D03154840BC00475C01 /* help.rtfd in CopyFiles */, + E164FE211720F55600263CE3 /* Growl.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E170C3F9172961E6003DC489 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 12; + files = ( + E170C3FB17296205003DC489 /* pbxprojModifier.py in CopyFiles */, + E170C3FC1729620C003DC489 /* mod_pbxproj.py in CopyFiles */, + E170C3FD1729620F003DC489 /* parser.j in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E171D25B173C168C00210893 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + E171D26B173C1C6900210893 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + E171D26C173C1C8300210893 /* xcc in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0218442415D32B5D00A782B8 /* pbxprojModifier.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pbxprojModifier.py; sourceTree = ""; }; - 022BCEA61468632000B72910 /* project.pbxproj.sample */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = project.pbxproj.sample; sourceTree = ""; }; - 024A041113699D6800DCBE4D /* parser.j */ = {isa = PBXFileReference; explicitFileType = sourcecode.javascript; fileEncoding = 4; path = parser.j; sourceTree = ""; }; - 026F3B6113866B0B00EE5B83 /* xcodecapp-icon-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-icon-inactive.png"; sourceTree = ""; }; - 026F3B6413866E7D00EE5B83 /* xcodecapp-icon-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-icon-active.png"; sourceTree = ""; }; - 027D9989136969DD00D3DB13 /* XcodeCapp.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XcodeCapp.pch; sourceTree = ""; }; - 027D99A613696A7000D3DB13 /* XcodeCapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XcodeCapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 027FE49B1462D74C00B1AB92 /* TNXCodeCapp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TNXCodeCapp.h; sourceTree = ""; }; - 027FE49C1462D74C00B1AB92 /* TNXCodeCapp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TNXCodeCapp.m; sourceTree = ""; }; - 027FE4B91462F64E00B1AB92 /* xcodecapp-icon-working.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "xcodecapp-icon-working.png"; sourceTree = ""; }; - 027FE4BB1462F7D600B1AB92 /* FSEventCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSEventCallback.h; sourceTree = ""; }; - 027FE4BC1462F7EB00B1AB92 /* FSEventCallback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSEventCallback.m; sourceTree = ""; }; - 0289AC9314668CAF003CD975 /* XcodeCapp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = XcodeCapp.icns; sourceTree = ""; }; - 0294F09215D345A500840547 /* mod_pbxproj.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mod_pbxproj.py; sourceTree = ""; }; - 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Growl Registration Ticket.growlRegDict"; sourceTree = ""; }; - 02998CF61369C339006C73DB /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Growl.framework; sourceTree = ""; }; - 02B1C8D616B25C74003C6E82 /* TNErrorDataView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TNErrorDataView.h; sourceTree = ""; }; - 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TNErrorDataView.m; sourceTree = ""; }; - 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; - 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 4E2D0D00154840B400475C01 /* help.rtfd */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; path = help.rtfd; sourceTree = ""; }; - 651DAE1C13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.objj.h; path = PRHEmptyGrowlDelegate.h; sourceTree = ""; }; - 651DAE1D13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PRHEmptyGrowlDelegate.m; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; - 8E01A91D0DE9EED20008BB35 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; - 8E01A91E0DE9EED20008BB35 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AppController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - E12AA95F14637828006F55D6 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.objj.h; path = macros.h; sourceTree = ""; }; + E14015401740248C006C2792 /* XcodeProjectCloser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XcodeProjectCloser.h; sourceTree = ""; }; + E14015411740248C006C2792 /* XcodeProjectCloser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XcodeProjectCloser.m; sourceTree = ""; }; + E164FDCF1720E77100263CE3 /* XcodeCapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XcodeCapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E164FDD21720E77100263CE3 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + E164FDD51720E77100263CE3 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + E164FDD61720E77100263CE3 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + E164FDD71720E77100263CE3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + E164FDDE1720E77100263CE3 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + E164FDE01720E77100263CE3 /* XcodeCapp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XcodeCapp-Prefix.pch"; sourceTree = ""; }; + E164FDEF1720E7FA00263CE3 /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + E164FDF01720E7FA00263CE3 /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + E164FDF41720EBC100263CE3 /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AppController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + E164FDF61720EBD600263CE3 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = XcodeCapp/Growl.framework; sourceTree = SOURCE_ROOT; }; + E164FDFB1720EC5B00263CE3 /* XcodeCapp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = XcodeCapp.m; sourceTree = ""; usesTabs = 0; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + E164FE131720F40400263CE3 /* mod_pbxproj.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mod_pbxproj.py; sourceTree = ""; }; + E164FE141720F40400263CE3 /* pbxprojModifier.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pbxprojModifier.py; sourceTree = ""; }; + E164FE171720F44B00263CE3 /* parser.j */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = parser.j; sourceTree = ""; }; + E164FE191720F49A00263CE3 /* Growl Registration Ticket.growlRegDict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Growl Registration Ticket.growlRegDict"; sourceTree = ""; }; + E164FE1D1720F50100263CE3 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; + E164FE2A172188F300263CE3 /* project.pbxproj */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.pbxproject; lineEnding = 0; name = project.pbxproj; path = Resources/project.pbxproj; sourceTree = ""; }; + E164FE2C1721A34900263CE3 /* icon-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-active.png"; path = "Resources/icon-active.png"; sourceTree = ""; }; + E164FE2D1721A34900263CE3 /* icon-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-inactive.png"; path = "Resources/icon-inactive.png"; sourceTree = ""; }; + E164FE2E1721A34900263CE3 /* icon-working.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-working.png"; path = "Resources/icon-working.png"; sourceTree = ""; }; + E170C3FE17298833003DC489 /* icon-active@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-active@2x.png"; path = "Resources/icon-active@2x.png"; sourceTree = ""; }; + E170C3FF17298833003DC489 /* icon-error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-error.png"; path = "Resources/icon-error.png"; sourceTree = ""; }; + E170C40017298833003DC489 /* icon-error@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-error@2x.png"; path = "Resources/icon-error@2x.png"; sourceTree = ""; }; + E170C40117298833003DC489 /* icon-inactive@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-inactive@2x.png"; path = "Resources/icon-inactive@2x.png"; sourceTree = ""; }; + E170C40217298833003DC489 /* icon-working@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-working@2x.png"; path = "Resources/icon-working@2x.png"; sourceTree = ""; }; + E171D25D173C168C00210893 /* xcc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xcc; sourceTree = BUILT_PRODUCTS_DIR; }; + E171D25E173C168C00210893 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + E171D261173C168C00210893 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + E171D264173C168C00210893 /* xcc-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "xcc-Prefix.pch"; sourceTree = ""; }; + E17A822C172700B90095CD83 /* XcodeCapp.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; name = XcodeCapp.iconset; path = Resources/XcodeCapp.iconset; sourceTree = ""; }; + E17B55401732F57700809FFB /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; + E17B55421732F72700809FFB /* help.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = help.pdf; path = Resources/help.pdf; sourceTree = ""; }; + E1A55949172C5EE20088FB61 /* FindSourceFilesOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = FindSourceFilesOperation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + E1A5594C172CA8D40088FB61 /* ProcessSourceOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ProcessSourceOperation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + E1E90C371735D82B005C6D5B /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = ""; }; + E1E90C381735D846005C6D5B /* DDLogLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLogLevel.h; sourceTree = ""; }; + E1E90C391735D846005C6D5B /* DDLogLevel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLogLevel.m; sourceTree = ""; }; + E1E90C3A1735D846005C6D5B /* FindSourceFilesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FindSourceFilesOperation.h; sourceTree = ""; }; + E1E90C3B1735D846005C6D5B /* Notifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Notifications.h; sourceTree = ""; }; + E1E90C3C1735D846005C6D5B /* Notifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Notifications.m; sourceTree = ""; }; + E1E90C3D1735D846005C6D5B /* ProcessSourceOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProcessSourceOperation.h; sourceTree = ""; }; + E1E90C3E1735D846005C6D5B /* UserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserDefaults.h; sourceTree = ""; }; + E1E90C3F1735D846005C6D5B /* UserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserDefaults.m; sourceTree = ""; }; + E1E90C401735D846005C6D5B /* XcodeCapp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XcodeCapp.h; sourceTree = ""; }; + E1E90C451735D8A1005C6D5B /* DDASLLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDASLLogger.h; sourceTree = ""; }; + E1E90C461735D8A1005C6D5B /* DDASLLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDASLLogger.m; sourceTree = ""; }; + E1E90C471735D8A1005C6D5B /* DDLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLog.h; sourceTree = ""; }; + E1E90C481735D8A1005C6D5B /* DDLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLog.m; sourceTree = ""; }; + E1E90C491735D8A1005C6D5B /* DDTTYLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDTTYLogger.h; sourceTree = ""; }; + E1E90C4A1735D8A1005C6D5B /* DDTTYLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDTTYLogger.m; sourceTree = ""; }; + E1E90C61173B42D0005C6D5B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + E1E90C66173B44CC005C6D5B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + E1E90C68173B48DA005C6D5B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E1ED6B6F173414E100641628 /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_128x128.png; path = Resources/icon_128x128.png; sourceTree = ""; }; + E1ED6B70173414E100641628 /* icon_128x128@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon_128x128@2x.png"; path = "Resources/icon_128x128@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 027D99A013696A7000D3DB13 /* Frameworks */ = { + E164FDCC1720E77100263CE3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 027D99A113696A7000D3DB13 /* Cocoa.framework in Frameworks */, - 027D99A213696A7000D3DB13 /* CoreServices.framework in Frameworks */, - 02998CF71369C339006C73DB /* Growl.framework in Frameworks */, + E164FDD31720E77100263CE3 /* Cocoa.framework in Frameworks */, + E164FE1F1720F51E00263CE3 /* CoreServices.framework in Frameworks */, + E17B55411732F57700809FFB /* Quartz.framework in Frameworks */, + E164FDF71720EBD600263CE3 /* Growl.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E171D25A173C168C00210893 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E171D26A173C1ADD00210893 /* CoreServices.framework in Frameworks */, + E171D25F173C168C00210893 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { + E164FDC61720E77100263CE3 = { isa = PBXGroup; children = ( - 651DAE1C13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.h */, - 651DAE1D13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m */, - 02B1C8D616B25C74003C6E82 /* TNErrorDataView.h */, - 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */, - 8E01A91D0DE9EED20008BB35 /* AppController.h */, - 8E01A91E0DE9EED20008BB35 /* AppController.m */, - 027FE49B1462D74C00B1AB92 /* TNXCodeCapp.h */, - 027FE49C1462D74C00B1AB92 /* TNXCodeCapp.m */, - 027FE4BB1462F7D600B1AB92 /* FSEventCallback.h */, - 027FE4BC1462F7EB00B1AB92 /* FSEventCallback.m */, + E164FDD81720E77100263CE3 /* XcodeCapp */, + E171D260173C168C00210893 /* xcc */, + E164FDD11720E77100263CE3 /* Frameworks */, + E164FDD01720E77100263CE3 /* Products */, ); - name = Classes; sourceTree = ""; }; - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + E164FDD01720E77100263CE3 /* Products */ = { isa = PBXGroup; children = ( - 8E01A8DD0DE51A7C0008BB35 /* CoreServices.framework */, - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 29B97324FDCFA39411CA2CEA /* AppKit.framework */, - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, - 29B97325FDCFA39411CA2CEA /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 027D99A613696A7000D3DB13 /* XcodeCapp.app */, + E164FDCF1720E77100263CE3 /* XcodeCapp.app */, + E171D25D173C168C00210893 /* xcc */, ); name = Products; sourceTree = ""; }; - 29B97314FDCFA39411CA2CEA /* xcodecapp-cocoa */ = { + E164FDD11720E77100263CE3 /* Frameworks */ = { isa = PBXGroup; children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, + E164FDD21720E77100263CE3 /* Cocoa.framework */, + E164FE1D1720F50100263CE3 /* CoreServices.framework */, + E164FDF61720EBD600263CE3 /* Growl.framework */, + E171D25E173C168C00210893 /* Foundation.framework */, + E164FDD41720E77100263CE3 /* Other Frameworks */, ); - name = "xcodecapp-cocoa"; + name = Frameworks; sourceTree = ""; }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + E164FDD41720E77100263CE3 /* Other Frameworks */ = { isa = PBXGroup; children = ( - 027D9989136969DD00D3DB13 /* XcodeCapp.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - E12AA95F14637828006F55D6 /* macros.h */, + E164FDD51720E77100263CE3 /* AppKit.framework */, + E164FDD61720E77100263CE3 /* CoreData.framework */, + E164FDD71720E77100263CE3 /* Foundation.framework */, + E17B55401732F57700809FFB /* Quartz.framework */, ); - name = "Other Sources"; + name = "Other Frameworks"; sourceTree = ""; }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { + E164FDD81720E77100263CE3 /* XcodeCapp */ = { isa = PBXGroup; children = ( - 0294F09215D345A500840547 /* mod_pbxproj.py */, - 0218442415D32B5D00A782B8 /* pbxprojModifier.py */, - 4E2D0D00154840B400475C01 /* help.rtfd */, - 022BCEA61468632000B72910 /* project.pbxproj.sample */, - 027FE4B91462F64E00B1AB92 /* xcodecapp-icon-working.png */, - 026F3B6413866E7D00EE5B83 /* xcodecapp-icon-active.png */, - 026F3B6113866B0B00EE5B83 /* xcodecapp-icon-inactive.png */, - 024A041113699D6800DCBE4D /* parser.j */, - 8D1107310486CEB800E47090 /* Info.plist */, - 0289AC9314668CAF003CD975 /* XcodeCapp.icns */, - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, - 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, - 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */, + E1E90C60173B42D0005C6D5B /* MainMenu.xib */, + E164FDF41720EBC100263CE3 /* AppController.m */, + E1E90C371735D82B005C6D5B /* AppController.h */, + E164FDFB1720EC5B00263CE3 /* XcodeCapp.m */, + E1E90C401735D846005C6D5B /* XcodeCapp.h */, + E14015411740248C006C2792 /* XcodeProjectCloser.m */, + E14015401740248C006C2792 /* XcodeProjectCloser.h */, + E1E90C3C1735D846005C6D5B /* Notifications.m */, + E1E90C3B1735D846005C6D5B /* Notifications.h */, + E1E90C3F1735D846005C6D5B /* UserDefaults.m */, + E1E90C3E1735D846005C6D5B /* UserDefaults.h */, + E1E90C391735D846005C6D5B /* DDLogLevel.m */, + E1E90C381735D846005C6D5B /* DDLogLevel.h */, + E1A55947172C5EA80088FB61 /* Operations */, + E1E90C441735D8A1005C6D5B /* Lumberjack */, + E164FE121720F3E100263CE3 /* Scripts */, + E164FE071720F25400263CE3 /* Resources */, + E164FDD91720E77100263CE3 /* Supporting Files */, + ); + path = XcodeCapp; + sourceTree = ""; + }; + E164FDD91720E77100263CE3 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + E1E90C68173B48DA005C6D5B /* Info.plist */, + E1E90C65173B44CC005C6D5B /* InfoPlist.strings */, + E164FDDE1720E77100263CE3 /* main.m */, + E164FDE01720E77100263CE3 /* XcodeCapp-Prefix.pch */, + E164FDEF1720E7FA00263CE3 /* Debug.xcconfig */, + E164FDF01720E7FA00263CE3 /* Release.xcconfig */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + E164FE071720F25400263CE3 /* Resources */ = { + isa = PBXGroup; + children = ( + E1ED6B6F173414E100641628 /* icon_128x128.png */, + E1ED6B70173414E100641628 /* icon_128x128@2x.png */, + E164FE2D1721A34900263CE3 /* icon-inactive.png */, + E170C40117298833003DC489 /* icon-inactive@2x.png */, + E164FE2E1721A34900263CE3 /* icon-working.png */, + E170C40217298833003DC489 /* icon-working@2x.png */, + E164FE2C1721A34900263CE3 /* icon-active.png */, + E170C3FE17298833003DC489 /* icon-active@2x.png */, + E170C3FF17298833003DC489 /* icon-error.png */, + E170C40017298833003DC489 /* icon-error@2x.png */, + E17A822C172700B90095CD83 /* XcodeCapp.iconset */, + E17B55421732F72700809FFB /* help.pdf */, + E164FE2A172188F300263CE3 /* project.pbxproj */, + E164FE191720F49A00263CE3 /* Growl Registration Ticket.growlRegDict */, ); name = Resources; sourceTree = ""; }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + E164FE121720F3E100263CE3 /* Scripts */ = { isa = PBXGroup; children = ( - 02998CF61369C339006C73DB /* Growl.framework */, - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + E164FE171720F44B00263CE3 /* parser.j */, + E164FE141720F40400263CE3 /* pbxprojModifier.py */, + E164FE131720F40400263CE3 /* mod_pbxproj.py */, ); - name = Frameworks; + path = Scripts; + sourceTree = ""; + }; + E171D260173C168C00210893 /* xcc */ = { + isa = PBXGroup; + children = ( + E171D261173C168C00210893 /* main.m */, + E171D263173C168C00210893 /* Supporting Files */, + ); + path = xcc; + sourceTree = ""; + }; + E171D263173C168C00210893 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + E171D264173C168C00210893 /* xcc-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + E1A55947172C5EA80088FB61 /* Operations */ = { + isa = PBXGroup; + children = ( + E1A55949172C5EE20088FB61 /* FindSourceFilesOperation.m */, + E1E90C3A1735D846005C6D5B /* FindSourceFilesOperation.h */, + E1A5594C172CA8D40088FB61 /* ProcessSourceOperation.m */, + E1E90C3D1735D846005C6D5B /* ProcessSourceOperation.h */, + ); + name = Operations; + sourceTree = ""; + }; + E1E90C441735D8A1005C6D5B /* Lumberjack */ = { + isa = PBXGroup; + children = ( + E1E90C451735D8A1005C6D5B /* DDASLLogger.h */, + E1E90C461735D8A1005C6D5B /* DDASLLogger.m */, + E1E90C471735D8A1005C6D5B /* DDLog.h */, + E1E90C481735D8A1005C6D5B /* DDLog.m */, + E1E90C491735D8A1005C6D5B /* DDTTYLogger.h */, + E1E90C4A1735D8A1005C6D5B /* DDTTYLogger.m */, + ); + path = Lumberjack; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 027D999913696A7000D3DB13 /* XcodeCapp */ = { + E164FDCE1720E77100263CE3 /* XcodeCapp */ = { isa = PBXNativeTarget; - buildConfigurationList = 027D99A313696A7000D3DB13 /* Build configuration list for PBXNativeTarget "XcodeCapp" */; + buildConfigurationList = E164FDEC1720E77100263CE3 /* Build configuration list for PBXNativeTarget "XcodeCapp" */; buildPhases = ( - 024699001602C04A00F0AE43 /* ShellScript */, - 027D999A13696A7000D3DB13 /* Resources */, - 027D999D13696A7000D3DB13 /* Sources */, - 02998CF81369C383006C73DB /* CopyFiles */, - 027D99A013696A7000D3DB13 /* Frameworks */, + E164FDCB1720E77100263CE3 /* Sources */, + E164FDCC1720E77100263CE3 /* Frameworks */, + E164FDCD1720E77100263CE3 /* Resources */, + E164FE201720F54800263CE3 /* CopyFiles */, + E170C3F9172961E6003DC489 /* CopyFiles */, + E171D26B173C1C6900210893 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + E171D26E173C405C00210893 /* PBXTargetDependency */, + ); + name = XcodeCapp; + productName = XcodeCapp; + productReference = E164FDCF1720E77100263CE3 /* XcodeCapp.app */; + productType = "com.apple.product-type.application"; + }; + E171D25C173C168C00210893 /* xcc */ = { + isa = PBXNativeTarget; + buildConfigurationList = E171D269173C168C00210893 /* Build configuration list for PBXNativeTarget "xcc" */; + buildPhases = ( + E171D259173C168C00210893 /* Sources */, + E171D25A173C168C00210893 /* Frameworks */, + E171D25B173C168C00210893 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); - name = XcodeCapp; - productInstallPath = "$(HOME)/Applications"; - productName = "xcodecapp-cocoa"; - productReference = 027D99A613696A7000D3DB13 /* XcodeCapp.app */; - productType = "com.apple.product-type.application"; + name = xcc; + productName = xcc; + productReference = E171D25D173C168C00210893 /* xcc */; + productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { + E164FDC71720E77100263CE3 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0440; + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = "Cappuccino Project"; }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "XcodeCapp" */; + buildConfigurationList = E164FDCA1720E77100263CE3 /* Build configuration list for PBXProject "XcodeCapp" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; - hasScannedForEncodings = 1; + hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = 29B97314FDCFA39411CA2CEA /* xcodecapp-cocoa */; + mainGroup = E164FDC61720E77100263CE3; + productRefGroup = E164FDD01720E77100263CE3 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 027D999913696A7000D3DB13 /* XcodeCapp */, + E164FDCE1720E77100263CE3 /* XcodeCapp */, + E171D25C173C168C00210893 /* xcc */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 027D999A13696A7000D3DB13 /* Resources */ = { + E164FDCD1720E77100263CE3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 027D999B13696A7000D3DB13 /* MainMenu.nib in Resources */, - 027D999C13696A7000D3DB13 /* InfoPlist.strings in Resources */, - 024A041413699DD400DCBE4D /* parser.j in Resources */, - 02998CEB1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict in Resources */, - 026F3B6213866B0B00EE5B83 /* xcodecapp-icon-inactive.png in Resources */, - 026F3B6513866E7D00EE5B83 /* xcodecapp-icon-active.png in Resources */, - 027FE4BA1462F64E00B1AB92 /* xcodecapp-icon-working.png in Resources */, - 0289AC9414668CAF003CD975 /* XcodeCapp.icns in Resources */, - 022BCEA71468632000B72910 /* project.pbxproj.sample in Resources */, - 4E2D0D01154840B400475C01 /* help.rtfd in Resources */, - 0218442515D32B5D00A782B8 /* pbxprojModifier.py in Resources */, - 0294F09315D345A500840547 /* mod_pbxproj.py in Resources */, + E10E4CD717298E5F004AB09E /* project.pbxproj in Resources */, + E164FE181720F44B00263CE3 /* parser.j in Resources */, + E164FE1A1720F49A00263CE3 /* Growl Registration Ticket.growlRegDict in Resources */, + E164FE2F1721A34900263CE3 /* icon-active.png in Resources */, + E164FE301721A34900263CE3 /* icon-inactive.png in Resources */, + E164FE311721A34900263CE3 /* icon-working.png in Resources */, + E17A822D172700B90095CD83 /* XcodeCapp.iconset in Resources */, + E170C40317298833003DC489 /* icon-active@2x.png in Resources */, + E170C40417298833003DC489 /* icon-error.png in Resources */, + E170C40517298833003DC489 /* icon-error@2x.png in Resources */, + E170C40617298833003DC489 /* icon-inactive@2x.png in Resources */, + E170C40717298833003DC489 /* icon-working@2x.png in Resources */, + E17B55431732F72700809FFB /* help.pdf in Resources */, + E1ED6B71173414E100641628 /* icon_128x128.png in Resources */, + E1ED6B72173414E100641628 /* icon_128x128@2x.png in Resources */, + E1E90C62173B42D0005C6D5B /* MainMenu.xib in Resources */, + E1E90C67173B44CC005C6D5B /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 024699001602C04A00F0AE43 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/*.m", - "$(SRCROOT)/*.h", - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /usr/bin/perl; - shellScript = "#!/usr/bin/perl\n\nwhile (<>) {\n s/\\s+$//;\n print \"$_\\n\";\n}"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ - 027D999D13696A7000D3DB13 /* Sources */ = { + E164FDCB1720E77100263CE3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 027D999E13696A7000D3DB13 /* main.m in Sources */, - 027D999F13696A7000D3DB13 /* AppController.m in Sources */, - 651DAE1F13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m in Sources */, - 027FE49D1462D74C00B1AB92 /* TNXCodeCapp.m in Sources */, - 027FE4BD1462F7EB00B1AB92 /* FSEventCallback.m in Sources */, - 02B1C8D816B25C74003C6E82 /* TNErrorDataView.m in Sources */, + E164FDDF1720E77100263CE3 /* main.m in Sources */, + E164FDF51720EBC100263CE3 /* AppController.m in Sources */, + E164FDFF1720EC5B00263CE3 /* XcodeCapp.m in Sources */, + E1A5594A172C5EE20088FB61 /* FindSourceFilesOperation.m in Sources */, + E1A5594D172CA8D40088FB61 /* ProcessSourceOperation.m in Sources */, + E1E90C411735D846005C6D5B /* DDLogLevel.m in Sources */, + E1E90C421735D846005C6D5B /* Notifications.m in Sources */, + E1E90C431735D846005C6D5B /* UserDefaults.m in Sources */, + E1E90C4B1735D8A1005C6D5B /* DDASLLogger.m in Sources */, + E1E90C4C1735D8A1005C6D5B /* DDLog.m in Sources */, + E1E90C4D1735D8A1005C6D5B /* DDTTYLogger.m in Sources */, + E14015421740248C006C2792 /* XcodeProjectCloser.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E171D259173C168C00210893 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E171D262173C168C00210893 /* main.m in Sources */, + E1401543174025B8006C2792 /* XcodeProjectCloser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + E171D26E173C405C00210893 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = E171D25C173C168C00210893 /* xcc */; + targetProxy = E171D26D173C405C00210893 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + E1E90C60173B42D0005C6D5B /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( - 089C165DFE840E0CC02AAC07 /* English */, + E1E90C61173B42D0005C6D5B /* en */, ); - name = InfoPlist.strings; + name = MainMenu.xib; sourceTree = ""; }; - 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { + E1E90C65173B44CC005C6D5B /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 29B97319FDCFA39411CA2CEA /* English */, + E1E90C66173B44CC005C6D5B /* en */, ); - name = MainMenu.nib; + name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 027D99A413696A7000D3DB13 /* Debug */ = { + E164FDEA1720E77100263CE3 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E164FDEF1720E7FA00263CE3 /* Debug.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_GC = unsupported; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = XcodeCapp.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Applications; - MACOSX_DEPLOYMENT_TARGET = 10.6.8; - PRODUCT_NAME = XcodeCapp; + DSTROOT = /; }; name = Debug; }; - 027D99A513696A7000D3DB13 /* Release */ = { + E164FDEB1720E77100263CE3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E164FDF01720E7FA00263CE3 /* Release.xcconfig */; + buildSettings = { + COPY_PHASE_STRIP = NO; + DEPLOYMENT_LOCATION = YES; + DSTROOT = /; + }; + name = Release; + }; + E164FDED1720E77100263CE3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/XcodeCapp\"", + ); + MACOSX_DEPLOYMENT_TARGET = 10.6.8; + }; + name = Debug; + }; + E164FDEE1720E77100263CE3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/XcodeCapp\"", + ); + MACOSX_DEPLOYMENT_TARGET = 10.6.8; + }; + name = Release; + }; + E171D267173C168C00210893 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_ENABLE_OBJC_GC = unsupported; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = XcodeCapp.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Applications; - MACOSX_DEPLOYMENT_TARGET = 10.6.8; - PRODUCT_NAME = XcodeCapp; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - FRAMEWORK_SEARCH_PATHS = ""; - GCC_ENABLE_OBJC_GC = required; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; - GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ""; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "xcc/xcc-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.5; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Debug; }; - C01FCF5008A954540054247B /* Release */ = { + E171D268173C168C00210893 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - FRAMEWORK_SEARCH_PATHS = ""; - GCC_ENABLE_OBJC_GC = required; - GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ""; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEPLOYMENT_LOCATION = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "xcc/xcc-Prefix.pch"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.5; - ONLY_ACTIVE_ARCH = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; name = Release; @@ -401,25 +605,34 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 027D99A313696A7000D3DB13 /* Build configuration list for PBXNativeTarget "XcodeCapp" */ = { + E164FDCA1720E77100263CE3 /* Build configuration list for PBXProject "XcodeCapp" */ = { isa = XCConfigurationList; buildConfigurations = ( - 027D99A413696A7000D3DB13 /* Debug */, - 027D99A513696A7000D3DB13 /* Release */, + E164FDEA1720E77100263CE3 /* Debug */, + E164FDEB1720E77100263CE3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "XcodeCapp" */ = { + E164FDEC1720E77100263CE3 /* Build configuration list for PBXNativeTarget "XcodeCapp" */ = { isa = XCConfigurationList; buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, + E164FDED1720E77100263CE3 /* Debug */, + E164FDEE1720E77100263CE3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E171D269173C168C00210893 /* Build configuration list for PBXNativeTarget "xcc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E171D267173C168C00210893 /* Debug */, + E171D268173C168C00210893 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; + rootObject = E164FDC71720E77100263CE3 /* Project object */; } diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.xcworkspace/xcuserdata/Tonio.xcuserdatad/WorkspaceSettings.xcsettings b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.xcworkspace/xcuserdata/Tonio.xcuserdatad/WorkspaceSettings.xcsettings deleted file mode 100644 index 6ff33e603..000000000 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.xcworkspace/xcuserdata/Tonio.xcuserdatad/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,10 +0,0 @@ - - - - - IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges - - IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges - - - diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist deleted file mode 100644 index 05301bc25..000000000 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcschemes/xcschememanagement.plist b/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 202513f40..000000000 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/xcuserdata/Tonio.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - SchemeUserState - - XcodeCapp Debug.xcscheme - - orderHint - 0 - - XcodeCapp Release.xcscheme - - orderHint - 1 - - XcodeCapp.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 027D998A13696A0700D3DB13 - - primary - - - 027D999913696A7000D3DB13 - - primary - - - 8D1107260486CEB800E47090 - - primary - - - - - diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.h b/Tools/XcodeCapp/XcodeCapp/AppController.h new file mode 100644 index 000000000..7278bd236 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/AppController.h @@ -0,0 +1,49 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2011 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#import +#import +#import + +@class XcodeCapp; + +@interface AppController : NSObject + +@property (strong) IBOutlet NSMenu *statusMenu; +@property (unsafe_unretained) IBOutlet NSMenuItem *menuItemHistory; +@property (unsafe_unretained) IBOutlet NSMenuItem *menuItemOpenProject; +@property (unsafe_unretained) IBOutlet NSMenuItem *menuItemShowInFinder; + +@property (strong) IBOutlet NSPanel *aboutWindow; +@property (strong) IBOutlet NSWindow *preferencesWindow; + +@property (strong) IBOutlet NSWindow *helpWindow; +@property (unsafe_unretained) IBOutlet PDFView *helpView; + +@property (strong) IBOutlet NSUserDefaultsController *preferencesController; +@property (strong) IBOutlet XcodeCapp *xcc; + ++ (AppController *)sharedAppController; + +- (IBAction)createProject:(id)sender; +- (IBAction)loadProject:(id)aSender; +- (IBAction)openHelp:(id)aSender; +- (IBAction)openAbout:(id)aSender; + +@end + diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.m b/Tools/XcodeCapp/XcodeCapp/AppController.m new file mode 100644 index 000000000..8cbb1689b --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/AppController.m @@ -0,0 +1,529 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2011 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#import + +#import "AppController.h" +#import "Notifications.h" +#import "XcodeCapp.h" +#import "UserDefaults.h" + + +AppController *SharedAppControllerInstance = nil; + + +@interface AppController () + +@property (nonatomic) NSImage *iconActive; +@property (nonatomic) NSImage *iconInactive; +@property (nonatomic) NSImage *iconWorking; +@property (nonatomic) NSImage *iconError; +@property (nonatomic) NSMenu *recentMenu; +@property NSStatusItem *statusItem; +@property NSString *finderName; +@property BOOL appFinishedLaunching; +@property NSString *pathToOpenAtLaunch; +@property NSFileManager *fm; + +@end + + +@implementation AppController + ++ (AppController *)sharedAppController +{ + return SharedAppControllerInstance; +} + +#pragma mark - Initialization + +- (void)awakeFromNib +{ + SharedAppControllerInstance = self; + self.fm = [NSFileManager defaultManager]; + + [self registerDefaultPreferences]; + [self initLogging]; + + DDLogVerbose(@"\n******************************\n** XcodeCapp started **\n******************************\n"); + + self.aboutWindow.backgroundColor = [NSColor whiteColor]; + [self initStatusItem]; + [self initObservers]; + [self initShowInFinderItem]; + [self pruneProjectHistory]; + [self updateHistoryMenu]; + [self checkFirstLaunch]; +} + +- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename +{ + if (filename) + { + NSString *path = filename.stringByStandardizingPath; + + if (self.appFinishedLaunching) + return [self loadProjectAtPath:path reopening:YES]; + else + self.pathToOpenAtLaunch = path; + } + + return YES; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + self.appFinishedLaunching = YES; + + if (![self.xcc executablesAreAccessible]) + { + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + + NSRunAlertPanel( + @"Executables are missing.", + @"Please make sure that each one of these executables:\n\n" + @"%@\n\n" + @"(or a symlink to it) is within one these directories:\n\n" + @"%@\n\n" + @"They do not all have to be in the same directory.", + @"Quit", + nil, + nil, + [self.xcc.executables componentsJoinedByString:@"\n"], + [self.xcc.environmentPaths componentsJoinedByString:@"\n"]); + + [[NSApplication sharedApplication] terminate:self]; + return; + } + + // If we were opened from the command line, self.pathToOpenAtLaunch will be set. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + if (!self.pathToOpenAtLaunch) + { + if (![defaults boolForKey:kDefaultXCCReopenLastProject]) + return; + + self.pathToOpenAtLaunch = [defaults objectForKey:kDefaultLastOpenedPath]; + } + + if (self.pathToOpenAtLaunch) + { + if ([[NSFileManager defaultManager] fileExistsAtPath:self.pathToOpenAtLaunch]) + [self loadProjectAtPath:self.pathToOpenAtLaunch reopening:YES]; + else + [defaults removeObjectForKey:kDefaultLastOpenedPath]; + } +} + +/*! + Register default values for preferences +*/ +- (void)registerDefaultPreferences +{ + NSDictionary *appDefaults = @{ + kDefaultLastEventId: [NSNumber numberWithUnsignedLongLong:kFSEventStreamEventIdSinceNow], + kDefaultFirstLaunch: @YES, + kDefaultFirstLaunchVersion: @2.0, + kDefaultXCCAPIMode: [NSNumber numberWithInt:kXCCAPIModeAuto], + kDefaultXCCReactToInodeMod: @YES, + kDefaultXCCReopenLastProject: @YES, + kDefaultXCCAutoOpenErrorsPanelOnWarnings: @YES, + kDefaultXCCAutoOpenErrorsPanelOnErrors: @YES, + kDefaultXCCProjectHistory: [NSArray new], + kDefaultMaxRecentProjects: @20, + kDefaultLogLevel: [NSNumber numberWithInt:LOG_LEVEL_WARN], + kDefaultAutoOpenXcodeProject: @YES, + kDefaultShowProcessingNotices: @YES, + kDefaultUseSymlinkWhenCreatingProject: @YES + }; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + [defaults registerDefaults:appDefaults]; + [defaults synchronize]; + + [defaults addObserver:self + forKeyPath:kDefaultMaxRecentProjects + options:NSKeyValueObservingOptionNew + context:NULL]; +} + +- (void)initLogging +{ +#if DEBUG + [DDLog addLogger:[DDTTYLogger sharedInstance]]; + [[DDTTYLogger sharedInstance] setColorsEnabled:YES]; + [DDLogLevel setLogLevel:LOG_LEVEL_VERBOSE]; +#else + [DDLog addLogger:[DDASLLogger sharedInstance]]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + int logLevel = (int)[defaults integerForKey:kDefaultLogLevel]; + NSUInteger modifiers = [NSEvent modifierFlags]; + + if (modifiers & NSAlternateKeyMask) + logLevel = LOG_LEVEL_VERBOSE; + + [DDLogLevel setLogLevel:logLevel]; +#endif +} + +- (void)initStatusItem +{ + self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + self.statusItem.menu = self.statusMenu; + self.statusItem.image = self.iconInactive; + self.statusItem.highlightMode = YES; + self.statusItem.length = self.iconInactive.size.width + 12; // Add some space around the icon + self.statusMenu.delegate = self; +} + +- (void)initObservers +{ + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + + [defaultCenter addObserver:self selector:@selector(batchDidStart:) name:XCCBatchDidStartNotification object:nil]; + [defaultCenter addObserver:self selector:@selector(batchDidEnd:) name:XCCBatchDidEndNotification object:nil]; + [defaultCenter addObserver:self selector:@selector(projectDidFinishLoading:) name:XCCProjectDidFinishLoadingNotification object:nil]; +} + +- (void)initShowInFinderItem +{ + // See if PathFinder is available + NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; + NSString *path = [workspace absolutePathForAppBundleWithIdentifier:@"com.cocoatech.PathFinder"]; + + if (path) + self.finderName = path.lastPathComponent.stringByDeletingPathExtension; + else + self.finderName = @"Finder"; + + self.menuItemShowInFinder.title = [NSString stringWithFormat:self.menuItemShowInFinder.title, self.finderName]; +} + +- (void)pruneProjectHistory +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray *projectHistory = [[defaults arrayForKey:kDefaultXCCProjectHistory] mutableCopy]; + NSFileManager *fm = [NSFileManager new]; + + for (NSInteger i = projectHistory.count - 1; i >= 0; --i) + { + if (![fm fileExistsAtPath:projectHistory[i]]) + [projectHistory removeObjectAtIndex:i]; + } + + NSInteger maxProjects = [defaults integerForKey:kDefaultMaxRecentProjects]; + + if (projectHistory.count > maxProjects) + [projectHistory removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(maxProjects, projectHistory.count - maxProjects)]]; + + [defaults setObject:projectHistory forKey:kDefaultXCCProjectHistory]; +} + +- (void)checkFirstLaunch +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + double firstLaunchVersion = [defaults doubleForKey:kDefaultFirstLaunchVersion]; + + // Note: the scanner will only get the major.minor version numbers, which is what we want. + NSScanner *scanner = [NSScanner scannerWithString:[self bundleVersion]]; + double appVersion = 0.0; + [scanner scanDouble:&appVersion]; + + if ([defaults boolForKey:kDefaultFirstLaunch] || appVersion > firstLaunchVersion) + { + [defaults setBool:NO forKey:kDefaultFirstLaunch]; + [defaults setDouble:appVersion forKey:kDefaultFirstLaunchVersion]; + [self openHelp:self]; + } +} + +#pragma mark - Properties + +- (NSImage *)iconActive +{ + if (!_iconActive) + _iconActive = [NSImage imageNamed:@"icon-active"]; + + return _iconActive; +} + +- (NSImage *)iconInactive +{ + if (!_iconInactive) + _iconInactive = [NSImage imageNamed:@"icon-inactive"]; + + return _iconInactive; +} + +- (NSImage *)iconWorking +{ + if (!_iconWorking) + _iconWorking = [NSImage imageNamed:@"icon-working"]; + + return _iconWorking; +} + +- (NSImage *)iconError +{ + if (!_iconError) + _iconError = [NSImage imageNamed:@"icon-error"]; + + return _iconError; +} + +- (NSMenu *)recentMenu +{ + if (!_recentMenu) + { + _recentMenu = [NSMenu new]; + _recentMenu.delegate = self; + self.menuItemHistory.submenu = _recentMenu; + } + + return _recentMenu; +} + +#pragma mark - Notification handlers + +- (void)batchDidStart:(NSNotification *)note +{ + DDLogVerbose(@"Batch start"); + + self.statusItem.image = self.iconWorking; +} + +- (void)batchDidEnd:(NSNotification *)note +{ + DDLogVerbose(@"Batch end"); + + if (!self.xcc.isLoadingProject) + self.statusItem.image = self.xcc.hasErrors ? self.iconError : self.iconActive; +} + +- (void)projectDidFinishLoading:(NSNotification *)note +{ + self.statusItem.image = self.xcc.hasErrors ? self.iconError : self.iconActive; + self.menuItemOpenProject.title = [NSString stringWithFormat:@"Close “%@”", self.xcc.projectPath.lastPathComponent]; + self.menuItemOpenProject.action = @selector(closeProject:); +} + +// Watch changes to the max recent projects preference +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([keyPath isEqualToString:kDefaultMaxRecentProjects]) + [self pruneProjectHistory]; +} + +#pragma mark - Actions + +- (IBAction)loadProject:(id)aSender +{ + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + + NSOpenPanel *openPanel = [NSOpenPanel openPanel]; + openPanel.title = @"Choose Cappuccino Project"; + openPanel.canChooseDirectories = YES; + openPanel.canCreateDirectories = YES; + openPanel.canChooseFiles = NO; + + if ([openPanel runModal] != NSFileHandlingPanelOKButton) + return; + + NSString *projectPath = [[openPanel.URLs[0] path] stringByStandardizingPath]; + [self loadProjectAtPath:projectPath reopening:YES]; +} + +- (void)closeProject:(id)aSender +{ + [self.xcc stop]; + + self.statusItem.image = self.iconInactive; + self.menuItemOpenProject.title = @"Open Project…"; + self.menuItemOpenProject.action = @selector(loadProject:); + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kDefaultLastOpenedPath]; +} + +- (void)switchToProject:(NSMenuItem *)aSender +{ + [self loadProjectAtPath:aSender.representedObject reopening:NO]; +} + +- (void)clearProjectHistory:(id)aSender +{ + [[NSUserDefaults standardUserDefaults] setObject:[NSArray array] forKey:kDefaultXCCProjectHistory]; + [self updateHistoryMenu]; +} + +- (IBAction)showInFinder:(id)aSender +{ + [[NSWorkspace sharedWorkspace] openFile:self.xcc.projectPath withApplication:self.finderName]; +} + +- (IBAction)openHelp:(id)aSender +{ + if (!self.helpView.document) + { + NSURL *helpURL = [[NSBundle mainBundle] URLForResource:@"help" withExtension:@"pdf"]; + PDFDocument *help = [[PDFDocument alloc] initWithURL:helpURL]; + self.helpView.document = help; + } + + [self openWindow:self.helpWindow]; +} + +- (IBAction)openAbout:(id)aSender +{ + [self openWindow:self.aboutWindow]; +} + +- (IBAction)openPreferences:(id)aSender +{ + [self openWindow:self.preferencesWindow]; +} + +- (IBAction)createProject:(id)sender +{ + NSSavePanel *savePanel = [NSSavePanel savePanel]; + savePanel.title = @"Create a new Cappuccino Project"; + savePanel.canCreateDirectories = YES; + + if ([savePanel runModal] != NSFileHandlingPanelOKButton) + return; + + NSString *projectPath = [[savePanel.URL path] stringByStandardizingPath]; + + NSDictionary *taskResult = [self.xcc createProject:projectPath]; + + if ([taskResult[@"status"] intValue]) + return; + + [self loadProjectAtPath:projectPath reopening:YES]; +} + +#pragma mark - Delegates + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app +{ + [self.xcc stop]; + + return NSTerminateNow; +} + +- (BOOL)validateMenuItem:(NSMenuItem *)aMenuItem +{ + NSMenu *menu = aMenuItem.menu; + + if (menu == self.recentMenu) + { + // Disable recent items if they don't exist or are not directories, + // but enable the Clear History item, which is last in the menu. + if ([menu indexOfItem:aMenuItem] == menu.itemArray.count - 1) + return YES; + + BOOL isDirectory; + BOOL exists = [self.fm fileExistsAtPath:aMenuItem.representedObject isDirectory:&isDirectory]; + + return exists && isDirectory; + } + + return YES; +} + +#pragma mark - Bindings + +- (NSString *)bundleVersion +{ + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; +} + +#pragma mark - Private Helpers + + +- (BOOL)loadProjectAtPath:(NSString *)path reopening:(BOOL)reopen +{ + if (!reopen && [self.xcc.projectPath isEqualToString:path]) + return YES; + + [self closeProject:self]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray *projectHistory = [[defaults arrayForKey:kDefaultXCCProjectHistory] mutableCopy]; + + if ([projectHistory containsObject:path]) + [projectHistory removeObject:path]; + + // The path may no longer be there, validate it + NSFileManager *fm = [NSFileManager defaultManager]; + + BOOL exists, isDirectory; + exists = [fm fileExistsAtPath:path isDirectory:&isDirectory]; + + if (exists && isDirectory) + { + [projectHistory insertObject:path atIndex:0]; + } + else + { + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + NSRunAlertPanel(@"Project not found.", @"%@ %@", nil, nil, nil, path, !exists ? @"no longer exists." : @"is not a directory."); + } + + [defaults setObject:projectHistory forKey:kDefaultXCCProjectHistory]; + [self pruneProjectHistory]; + [self updateHistoryMenu]; + + if (exists && isDirectory) + { + [self.xcc loadProjectAtPath:path]; + return YES; + } + else + return NO; +} + +- (void)openWindow:(NSWindow *)aWindow +{ + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + [aWindow makeKeyAndOrderFront:nil]; +} + +- (void)updateHistoryMenu +{ + [self.recentMenu removeAllItems]; + NSArray *projectHistory = [[NSUserDefaults standardUserDefaults] arrayForKey:kDefaultXCCProjectHistory]; + + for (NSString *path in projectHistory) + { + NSMenuItem *item = [self.recentMenu addItemWithTitle:path.lastPathComponent action:@selector(switchToProject:) keyEquivalent:@""]; + [item setEnabled:YES]; + item.representedObject = path; + } + + [self.recentMenu addItem:[NSMenuItem separatorItem]]; + [self.recentMenu addItemWithTitle:@"Clear history" action:@selector(clearProjectHistory:) keyEquivalent:@""]; + + self.menuItemHistory.enabled = [projectHistory count] > 0; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h new file mode 100644 index 000000000..e1c80eb82 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h @@ -0,0 +1,17 @@ +// +// DDLogLevel.h +// XcodeCapp +// +// Created by Aparajita on 4/29/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +extern int ddLogLevel; + +@interface DDLogLevel : NSObject + ++ (void)setLogLevel:(int)logLevel; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m new file mode 100644 index 000000000..a0fb829b1 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m @@ -0,0 +1,27 @@ +// +// DDLog.m +// XcodeCapp +// +// Created by Aparajita on 4/29/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import "DDLogLevel.h" + + +int ddLogLevel = LOG_LEVEL_OFF; + + +@implementation DDLogLevel + ++ (int)ddLogLevel +{ + return ddLogLevel; +} + ++ (void)setLogLevel:(int)logLevel +{ + ddLogLevel = logLevel; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Debug.xcconfig b/Tools/XcodeCapp/XcodeCapp/Debug.xcconfig new file mode 100644 index 000000000..9ec35ffbf --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Debug.xcconfig @@ -0,0 +1,41 @@ +// +// Debug.xcconfig +// XcodeCapp +// +// Created by Aparajita on 4/18/13. +// +// + +//:configuration = Debug +ARCHS = $(ARCHS_STANDARD_64_BIT) +SDKROOT = macosx +ONLY_ACTIVE_ARCH = YES +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym +COMBINE_HIDPI_IMAGES = YES +INSTALL_PATH = $(LOCAL_APPS_DIR) +MACOSX_DEPLOYMENT_TARGET = 10.6.8 +COPY_PHASE_STRIP = NO +INFOPLIST_FILE = XcodeCapp/Info.plist +PRODUCT_NAME = XcodeCapp +ALWAYS_SEARCH_USER_PATHS = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SRCROOT)/XcodeCapp" +GCC_OPTIMIZATION_LEVEL = 0 +CLANG_ENABLE_OBJC_ARC = YES +GCC_PRECOMPILE_PREFIX_HEADER = YES +GCC_PREFIX_HEADER = XcodeCapp/XcodeCapp-Prefix.pch +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_UNUSED_VARIABLE = YES +WRAPPER_EXTENSION = app +GCC_C_LANGUAGE_STANDARD = gnu99 +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x +CLANG_CXX_LIBRARY = libc++ +CLANG_WARN_EMPTY_BODY = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +GCC_WARN_64_TO_32_BIT_CONVERSION = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_INT_CONVERSION = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES +GCC_WARN_UNUSED_VARIABLE = YES +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES diff --git a/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.h b/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.h new file mode 100644 index 000000000..ce4d5eb04 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.h @@ -0,0 +1,21 @@ +// +// FindSourceFilesOperation.h +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +@class XcodeCapp; + + +extern NSString * const XCCNeedSourceToProjectPathMappingNotification; + + +@interface FindSourceFilesOperation : NSOperation + +- (id)initWithXCC:(XcodeCapp *)xcc projectId:(NSNumber *)projectId path:(NSString *)path; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.m b/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.m new file mode 100644 index 000000000..aa44e4c58 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/FindSourceFilesOperation.m @@ -0,0 +1,172 @@ +// +// FindSourceFilesOperation.m +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import "FindSourceFilesOperation.h" +#import "ProcessSourceOperation.h" +#import "XcodeCapp.h" + +NSString * const XCCNeedSourceToProjectPathMappingNotification = @"XCCNeedSourceToProjectPathMappingNotification"; + + +@interface FindSourceFilesOperation () + +@property XcodeCapp *xcc; +@property NSNumber *projectId; +@property NSString *projectPathToSearch; +@property NSString *projectPath; + +@end + + +@implementation FindSourceFilesOperation + +- (id)initWithXCC:(XcodeCapp *)xcc projectId:(NSNumber *)projectId path:(NSString *)path +{ + self = [super init]; + + if (self) + { + self.xcc = xcc; + self.projectId = projectId; + self.projectPathToSearch = path; + self.projectPath = xcc.projectPath; + } + + return self; +} + +- (void)main +{ + [self findSourceFilesAtProjectPath:self.projectPathToSearch]; +} + +- (void)findSourceFilesAtProjectPath:(NSString *)aProjectPath +{ + if (self.isCancelled) + return; + + DDLogVerbose(@"-->findSourceFiles: %@", aProjectPath); + + NSError *error = NULL; + NSString *projectPath = [self.projectPath stringByAppendingPathComponent:aProjectPath]; + NSFileManager *fm = [NSFileManager defaultManager]; + + NSArray *urls = [fm contentsOfDirectoryAtURL:[NSURL fileURLWithPath:projectPath.stringByResolvingSymlinksInPath] + includingPropertiesForKeys:@[NSURLIsDirectoryKey, NSURLIsSymbolicLinkKey] + options:NSDirectoryEnumerationSkipsHiddenFiles | NSDirectoryEnumerationSkipsPackageDescendants | NSDirectoryEnumerationSkipsSubdirectoryDescendants + error:&error]; + + if (!urls) + return; + + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + for (NSURL *url in urls) + { + if (self.isCancelled) + return; + + NSString *filename = url.lastPathComponent; + + NSString *projectRelativePath = [aProjectPath stringByAppendingPathComponent:filename]; + NSString *realPath = url.path; + NSURL *resolvedURL = url; + + NSNumber *isDirectory, *isSymlink; + [url getResourceValue:&isSymlink forKey:NSURLIsSymbolicLinkKey error:nil]; + + if (isSymlink.boolValue == YES) + { + resolvedURL = [url URLByResolvingSymlinksInPath]; + + if ([resolvedURL checkResourceIsReachableAndReturnError:nil]) + { + filename = resolvedURL.lastPathComponent; + realPath = resolvedURL.path; + } + else + continue; + } + + [resolvedURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil]; + + if (isDirectory.boolValue == YES) + { + if ([self.xcc shouldIgnoreDirectoryNamed:filename]) + { + DDLogVerbose(@"ignored symlinked directory: %@", projectRelativePath); + continue; + } + + // If the resolved path is not within the project directory and is not ignored, add a mapping to it + // so we can map the resolved path back to the project directory later. + if (isSymlink.boolValue == YES) + { + NSString *fullProjectPath = [self.projectPath stringByAppendingPathComponent:projectRelativePath]; + + if (![realPath hasPrefix:fullProjectPath] && ![self.xcc pathMatchesIgnoredPaths:fullProjectPath]) + { + DDLogVerbose(@"symlinked directory: %@ -> %@", projectRelativePath, realPath); + + NSDictionary *info = + @{ + @"projectId":self.projectId, + @"sourcePath":realPath, + @"projectPath":fullProjectPath + }; + + if (self.isCancelled) + return; + + [center postNotificationName:XCCNeedSourceToProjectPathMappingNotification object:self userInfo:info]; + } + else + DDLogVerbose(@"ignored symlinked directory: %@", projectRelativePath); + } + + [self findSourceFilesAtProjectPath:projectRelativePath]; + continue; + } + + if (self.isCancelled) + return; + + if ([self.xcc pathMatchesIgnoredPaths:realPath]) + continue; + + NSString *projectSourcePath = [self.projectPath stringByAppendingPathComponent:projectRelativePath]; + + if ([self.xcc isObjjFile:filename] || [self.xcc isXibFile:filename]) + { + NSString *processedPath; + + if ([self.xcc isObjjFile:filename]) + processedPath = [[self.xcc shadowBasePathForProjectSourcePath:projectSourcePath] stringByAppendingPathExtension:@"h"]; + else + processedPath = [projectSourcePath.stringByDeletingPathExtension stringByAppendingPathExtension:@"cib"]; + + if (![fm fileExistsAtPath:processedPath]) + [self createProcessingOperationForProjectSourcePath:projectSourcePath]; + } + } + + DDLogVerbose(@"<--findSourceFiles: %@", aProjectPath); +} + +- (void)createProcessingOperationForProjectSourcePath:(NSString *)projectSourcePath +{ + if (self.isCancelled) + return; + + ProcessSourceOperation *op = [[ProcessSourceOperation alloc] initWithXCC:self.xcc + projectId:self.projectId + sourcePath:projectSourcePath]; + [[NSOperationQueue currentQueue] addOperation:op]; +} + +@end diff --git a/Tools/XcodeCapp/Growl Registration Ticket.growlRegDict b/Tools/XcodeCapp/XcodeCapp/Growl Registration Ticket.growlRegDict similarity index 100% rename from Tools/XcodeCapp/Growl Registration Ticket.growlRegDict rename to Tools/XcodeCapp/XcodeCapp/Growl Registration Ticket.growlRegDict diff --git a/Tools/XcodeCapp/Growl.framework/Growl b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Growl similarity index 100% rename from Tools/XcodeCapp/Growl.framework/Growl rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Growl diff --git a/Tools/XcodeCapp/Growl.framework/Headers b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Headers similarity index 100% rename from Tools/XcodeCapp/Growl.framework/Headers rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Headers diff --git a/Tools/XcodeCapp/Growl.framework/Resources b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Resources similarity index 100% rename from Tools/XcodeCapp/Growl.framework/Resources rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Resources diff --git a/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Growl b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Growl new file mode 100755 index 000000000..e35673015 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Growl differ diff --git a/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h new file mode 100644 index 000000000..7b1a3247d --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/Growl.h @@ -0,0 +1,5 @@ +#include + +#ifdef __OBJC__ +# include +#endif diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h similarity index 86% rename from Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h index 1e39f8d65..363975762 100644 --- a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h +++ b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h @@ -18,14 +18,11 @@ #import #import -#import "GrowlDefines.h" +#import //Forward declarations @protocol GrowlApplicationBridgeDelegate; -//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) -#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" - //------------------------------------------------------------------------------ #pragma mark - @@ -45,9 +42,9 @@ * @method isGrowlInstalled * @abstract Detects whether Growl is installed. * @discussion Determines if the Growl prefpane and its helper app are installed. - * @result Returns YES if Growl is installed, NO otherwise. + * @result this method will forever return YES. */ -+ (BOOL) isGrowlInstalled; ++ (BOOL) isGrowlInstalled __attribute__((deprecated)); /*! * @method isGrowlRunning @@ -57,6 +54,34 @@ */ + (BOOL) isGrowlRunning; + +/*! + * @method isMistEnabled + * @abstract Gives the caller a fairly good indication of whether or not built-in notifications(Mist) will be used. + * @discussion since this call makes use of isGrowlRunning it is entirely possible for this value to change between call and + * executing a notification dispatch + * @result Returns YES if Growl isn't reachable and the developer has not opted-out of + * Mist and the user hasn't set the global mist enable key to false. + */ ++ (BOOL)isMistEnabled; + +/*! + * @method setShouldUseBuiltInNotifications + * @abstract opt-out mechanism for the mist notification style in the event growl can't be reached. + * @discussion if growl is unavailable due to not being installed or as a result of being turned off then + * this option can enable/disable a built-in fire and forget display style + * @param should Specifies whether or not the developer wants to opt-in (default) or opt out + * of the built-in Mist style in the event Growl is unreachable. + */ ++ (void)setShouldUseBuiltInNotifications:(BOOL)should; + +/*! + * @method shouldUseBuiltInNotifications + * @abstract returns the current opt-in state of the framework's use of the Mist display style. + * @result Returns NO if the developer opt-ed out of Mist, the default value is YES. + */ ++ (BOOL)shouldUseBuiltInNotifications; + #pragma mark - /*! @@ -87,7 +112,7 @@ * * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. */ -+ (void) setGrowlDelegate:(NSObject *)inDelegate; ++ (void) setGrowlDelegate:(id)inDelegate; /*! * @method growlDelegate @@ -95,7 +120,7 @@ * @discussion See setGrowlDelegate: for details. * @result The Growl delegate. */ -+ (NSObject *) growlDelegate; ++ (id) growlDelegate; #pragma mark - @@ -235,6 +260,7 @@ * Growl when next it is ready; NO if not. */ + (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; + /*! @method willRegisterWhenGrowlIsReady * @abstract Reports whether GrowlApplicationBridge will register with Growl * when Growl next launches. @@ -323,7 +349,7 @@ * Key Value * --- ----- * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. + * GROWL_APP_ICON_DATA The data of the icon of the application. * GROWL_APP_LOCATION The location of the application. * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL * @@ -336,6 +362,7 @@ * copy of regDict. */ + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; + /*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: * @abstract Tries to fill in missing keys in a registration dictionary. * @discussion This method examines the passed-in dictionary for missing keys, @@ -344,7 +371,7 @@ * Key Value * --- ----- * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. + * GROWL_APP_ICON_DATA The data of the icon of the application. * GROWL_APP_LOCATION The location of the application. * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL * @@ -368,13 +395,39 @@ * the keys that it will look for are: * * \li GROWL_APP_NAME - * \li GROWL_APP_ICON + * \li GROWL_APP_ICON_DATA * * @since Growl.framework 1.1 */ + (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; + (NSDictionary *) frameworkInfoDictionary; + +#pragma mark - + +/*! + *@method growlURLSchemeAvailable + *@abstract Lets the app know whether growl:// is registered on the system, used for certain methods below this + *@return Returns whether growl:// is registered on the system + *@discussion Methods such as openGrowlPreferences rely on the growl:// URL scheme to function + * Further, this method can provide a check on whether Growl is installed, + * however, the framework will not be relying on this method for choosing when/how to notify, + * and it is not recommended that the app rely on it for other than whether to use growl:// methods + *@since Growl.framework 1.4 + */ ++ (BOOL) isGrowlURLSchemeAvailable; + +/*! + * @method openGrowlPreferences: + * @abstract Open Growl preferences, optionally to this app's settings, growl:// method + * @param showApp Whether to show the application's settings, otherwise just opens to the last position + * @return Return's whether opening the URL was succesfull or not. + * @discussion Will launch if Growl is installed, but not running, and open the preferences window + * Uses growl:// URL scheme + * @since Growl.framework 1.4 + */ ++ (BOOL) openGrowlPreferences:(BOOL)showApp; + @end //------------------------------------------------------------------------------ @@ -383,27 +436,15 @@ /*! * @protocol GrowlApplicationBridgeDelegate * @abstract Required protocol for the Growl delegate. - * @discussion The methods in this protocol are required and are called + * @discussion The methods in this protocol are optional and are called * automatically as needed by GrowlApplicationBridge. See * +[GrowlApplicationBridge setGrowlDelegate:]. * See also GrowlApplicationBridgeDelegate_InformalProtocol. */ -@protocol GrowlApplicationBridgeDelegate +@protocol GrowlApplicationBridgeDelegate -// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. - -@end - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) - * @abstract Methods which may be optionally implemented by the GrowlDelegate. - * @discussion The methods in this informal protocol will only be called if implemented by the delegate. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) +@optional /*! * @method registrationDictionaryForGrowl @@ -510,66 +551,17 @@ */ - (void) growlNotificationTimedOut:(id)clickContext; + +/*! + * @method hasNetworkClientEntitlement + * @abstract Used only in sandboxed situations since we don't know whether the app has com.apple.security.network.client entitlement + * @discussion GrowlDelegate calls to find out if we have the com.apple.security.network.client entitlement, + * since we can't find this out without hitting the sandbox. We only call it if we detect that the application is sandboxed. + */ +- (BOOL) hasNetworkClientEntitlement; + @end #pragma mark - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework. - * @discussion The methods in this informal protocol will only be called if - * implemented by the delegate. They allow greater control of the information - * presented to the user when installing or upgrading Growl from within your - * application when using Growl-WithInstaller.framework. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - -/*! - * @method growlInstallationWindowTitle - * @abstract Return the title of the installation window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlInstallationWindowTitle; - -/*! - * @method growlUpdateWindowTitle - * @abstract Return the title of the upgrade window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlUpdateWindowTitle; - -/*! - * @method growlInstallationInformation - * @abstract Return the information to display when installing. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation of what Growl is and what it can do in your application. It - * should probably note that no download is required to install. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlInstallationInformation; - -/*! - * @method growlUpdateInformation - * @abstract Return the information to display when upgrading. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation that an updated version of Growl is included in your - * application and no download is required. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlUpdateInformation; - -@end - -//private -@interface GrowlApplicationBridge (GrowlInstallationPrompt_private) -+ (void) _userChoseNotToInstallGrowl; -@end #endif /* __GrowlApplicationBridge_h__ */ diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h similarity index 77% rename from Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h index 2b971cfe5..0a196f1e3 100644 --- a/Tools/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h +++ b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Headers/GrowlDefines.h @@ -7,10 +7,8 @@ #ifdef __OBJC__ #define XSTR(x) (@x) -#define STRING_TYPE NSString * #else #define XSTR CFSTR -#define STRING_TYPE CFStringRef #endif /*! @header GrowlDefines.h @@ -56,7 +54,7 @@ * This key is optional. */ #define GROWL_APP_ID XSTR("ApplicationId") -/*! @defined GROWL_APP_ICON +/*! @defined GROWL_APP_ICON_DATA * @abstract The image data for your application's icon. * @discussion Image data representing your application's icon. This may be * superimposed on a notification icon as a badge, used as the notification @@ -66,7 +64,7 @@ * * Optional. Not supported by all display plugins. */ -#define GROWL_APP_ICON XSTR("ApplicationIcon") +#define GROWL_APP_ICON_DATA XSTR("ApplicationIcon") /*! @defined GROWL_NOTIFICATIONS_DEFAULT * @abstract The array of notifications to turn on by default. * @discussion These are the names of the notifications that should be enabled @@ -101,6 +99,14 @@ * This key is optional. */ #define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") +/*! @defined GROWL_NOTIFICATIONS_ICONS + * @abstract A dictionary of icons for each notification + * @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are + * icons for each notification, for GNTP spec + * + * This key is optional. + */ +#define GROWL_NOTIFICATIONS_ICONS XSTR("NotificationIcons") /*! @defined GROWL_TICKET_VERSION * @abstract The version of your registration ticket. @@ -144,20 +150,20 @@ */ #define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") /*! @defined GROWL_NOTIFICATION_ICON - * @discussion Image data for the notification icon. Must be in a format + * @discussion Image data for the notification icon. Image data must be in a format * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. * * Optional. Not supported by all display plugins. */ -#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon") +#define GROWL_NOTIFICATION_ICON_DATA XSTR("NotificationIcon") /*! @defined GROWL_NOTIFICATION_APP_ICON * @discussion Image data for the application icon, in case GROWL_APP_ICON does - * not apply for some reason. Must be in a format supported by NSImage, such + * not apply for some reason. Image data be in a format supported by NSImage, such * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. * * Optional. Not supported by all display plugins. */ -#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon") +#define GROWL_NOTIFICATION_APP_ICON_DATA XSTR("NotificationAppIcon") /*! @defined GROWL_NOTIFICATION_PRIORITY * @discussion The priority of the notification as an integer number from * -2 to +2 (+2 being highest). @@ -185,16 +191,6 @@ */ #define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") -/*! @defined GROWL_DISPLAY_PLUGIN - * @discussion The name of a display plugin which should be used for this notification. - * Optional. If this key is not set or the specified display plugin does not - * exist, the display plugin stored in the application ticket is used. This key - * allows applications to use different default display plugins for their - * notifications. The user can still override those settings in the preference - * pane. - */ -#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin") - /*! @defined GROWL_NOTIFICATION_IDENTIFIER * @abstract An identifier for the notification for coalescing purposes. * Notifications with the same identifier fall into the same class; only @@ -224,6 +220,19 @@ */ #define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") +/*! @defined GROWL_NOTIFICATION_ALREADY_SHOWN + * @abstract If this key is set, it should contain a bool value wrapped + * in a NSNumber which describes whether the notification has + * already been displayed, for instance by built in Notification + * Center support. This value can be used to allow display + * plugins to skip a notification, while still allowing Growl + * actions to run on them. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_ALREADY_SHOWN XSTR("AlreadyShown") + + // Notifications #pragma mark Notifications @@ -245,7 +254,7 @@ * The userInfo dictionary for this notification can contain these keys: *
    *
  • GROWL_APP_NAME
  • - *
  • GROWL_APP_ICON
  • + *
  • GROWL_APP_ICON_DATA
  • *
  • GROWL_NOTIFICATIONS_ALL
  • *
  • GROWL_NOTIFICATIONS_DEFAULT
  • *
@@ -288,12 +297,6 @@ * Growl_PostNotification. */ #define GROWL_NOTIFICATION XSTR("GrowlNotification") -/*! @defined GROWL_SHUTDOWN -* @abstract The distributed notification name that tells Growl to shutdown. -* @discussion The Growl preference pane posts this notification when the -* "Stop Growl" button is clicked. -*/ -#define GROWL_SHUTDOWN XSTR("GrowlShutdown") /*! @defined GROWL_PING * @abstract A distributed notification to check whether Growl is running. * @discussion This is used by the Growl preference pane. If it receives a @@ -313,15 +316,48 @@ * registration dictionary supplied by its delegate. */ #define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") -/*! @defined GROWL_NOTIFICATION_CLICKED - * @abstract The distributed notification sent when a supported notification is clicked. + + +/*! @defined GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX + * @abstract Part of the name of the distributed notification sent when a supported notification is clicked. * @discussion When a Growl notification with a click context is clicked on by - * the user, Growl posts this distributed notification. - * The GrowlApplicationBridge responds to this notification by calling a - * callback in its delegate. + * the user, Growl posts a distributed notification whose name is in the format: + * [NSString stringWithFormat:@"%@-%d-%@", appName, pid, GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX] + * The GrowlApplicationBridge responds to this notification by calling a callback in its delegate. */ -#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!") -#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!") +#define GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX XSTR("GrowlClicked!") + +/*! @defined GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX + * @abstract Part of the name of the distributed notification sent when a supported notification times out without being clicked. + * @discussion When a Growl notification with a click context times out, Growl posts a distributed notification + * whose name is in the format: + * [NSString stringWithFormat:@"%@-%d-%@", appName, pid, GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX] + * The GrowlApplicationBridge responds to this notification by calling a callback in its delegate. + * NOTE: The user may have actually clicked the 'close' button; this triggers an *immediate* time-out of the notification. + */ +#define GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX XSTR("GrowlTimedOut!") + +/*! @defined GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_ON + * @abstract The distributed notification sent when the Notification Center support is toggled on in Growl 2.0 + * @discussion When the user enables Notification Center support in Growl 2.0, this notification is sent + * to inform all running apps that they should now speak to Notification Center directly. + */ +#define GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_ON XSTR("GrowlNotificationCenterOn!") + +/*! @defined GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_OFF + * @abstract The distributed notification sent when the Notification Center support is toggled off in Growl 2.0 + * @discussion When the user enables Notification Center support in Growl 2.0, this notification is sent + * to inform all running apps that they should no longer speak to Notification Center directly. + */ +#define GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_OFF XSTR("GrowlNotificationCenterOff!") + +/*! @defined GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_QUERY + * @abstract The distributed notification sent by an application to query Growl 2.0's notification center support. + * @discussion When an app starts up, it will send this query to get Growl 2.0 to spit out whether notification + * center support is on or off. + */ +#define GROWL_DISTRIBUTED_NOTIFICATION_NOTIFICATIONCENTER_QUERY XSTR("GrowlNotificationCenterYN?") + /*! @group Other symbols */ /* Symbols which don't fit into any of the other categories. */ @@ -345,4 +381,6 @@ #define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" +#define GROWL_PLUGIN_CONFIG_ID XSTR("GrowlPluginConfigurationID") + #endif //ndef _GROWLDEFINES_H diff --git a/Tools/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist similarity index 59% rename from Tools/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist index 5a76a5f19..6a90f41b9 100644 --- a/Tools/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist +++ b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/Resources/Info.plist @@ -2,6 +2,8 @@ + BuildMachineOSBuild + 12C60 CFBundleDevelopmentRegion English CFBundleExecutable @@ -13,11 +15,25 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.2.1 + 2.0.1 CFBundleSignature GRRR CFBundleVersion - 1.2.1 + 2.0.1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 4G2008a + DTPlatformVersion + GM + DTSDKBuild + 12C37 + DTSDKName + macosx10.8 + DTXcode + 0452 + DTXcodeBuild + 4G2008a NSPrincipalClass GrowlApplicationBridge diff --git a/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/_CodeSignature/CodeResources b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 000000000..420b594ac --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,34 @@ + + + + + files + + Resources/Info.plist + + VZb3f8My4te/5JwcjfvotgCXTAs= + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^version.plist$ + + + + diff --git a/Tools/XcodeCapp/Growl.framework/Versions/Current b/Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/Current similarity index 100% rename from Tools/XcodeCapp/Growl.framework/Versions/Current rename to Tools/XcodeCapp/XcodeCapp/Growl.framework/Versions/Current diff --git a/Tools/XcodeCapp/Info.plist b/Tools/XcodeCapp/XcodeCapp/Info.plist similarity index 90% rename from Tools/XcodeCapp/Info.plist rename to Tools/XcodeCapp/XcodeCapp/Info.plist index 53973c70a..2ac7f472c 100644 --- a/Tools/XcodeCapp/Info.plist +++ b/Tools/XcodeCapp/XcodeCapp/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0 + 3.0.6 CFBundleSignature ???? CFBundleVersion - 2.0 + 3.0.6 LSApplicationCategoryType public.app-category.developer-tools LSUIElement @@ -30,5 +30,7 @@ MainMenu NSPrincipalClass NSApplication + XCCCompatibilityVersion + 3 diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h new file mode 100755 index 000000000..0f2e9633e --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h @@ -0,0 +1,41 @@ +#import +#import + +#import "DDLog.h" + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted + * + * + * This class provides a logger for the Apple System Log facility. + * + * As described in the "Getting Started" page, + * the traditional NSLog() function directs it's output to two places: + * + * - Apple System Log + * - StdErr (if stderr is a TTY) so log statements show up in Xcode console + * + * To duplicate NSLog() functionality you can simply add this logger and a tty logger. + * However, if you instead choose to use file logging (for faster performance), + * you may choose to use a file logger and a tty logger. +**/ + +@interface DDASLLogger : DDAbstractLogger +{ + aslclient client; +} + ++ (DDASLLogger *)sharedInstance; + +// Inherited from DDAbstractLogger + +// - (id )logFormatter; +// - (void)setLogFormatter:(id )formatter; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m new file mode 100755 index 000000000..4ec1e7cbf --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m @@ -0,0 +1,99 @@ +#import "DDASLLogger.h" + +#import + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted +**/ + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + + +@implementation DDASLLogger + +static DDASLLogger *sharedInstance; + +/** + * The runtime sends initialize to each class in a program exactly one time just before the class, + * or any class that inherits from it, is sent its first message from within the program. (Thus the + * method may never be invoked if the class is not used.) The runtime sends the initialize message to + * classes in a thread-safe manner. Superclasses receive this message before their subclasses. + * + * This method may also be called directly (assumably by accident), hence the safety mechanism. +**/ ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + + sharedInstance = [[DDASLLogger alloc] init]; + } +} + ++ (DDASLLogger *)sharedInstance +{ + return sharedInstance; +} + +- (id)init +{ + if (sharedInstance != nil) + { + return nil; + } + + if ((self = [super init])) + { + // A default asl client is provided for the main thread, + // but background threads need to create their own client. + + client = asl_open(NULL, "com.apple.console", 0); + } + return self; +} + +- (void)logMessage:(DDLogMessage *)logMessage +{ + NSString *logMsg = logMessage->logMsg; + + if (formatter) + { + logMsg = [formatter formatLogMessage:logMessage]; + } + + if (logMsg) + { + const char *msg = [logMsg UTF8String]; + + int aslLogLevel; + switch (logMessage->logLevel) + { + // Note: By default ASL will filter anything above level 5 (Notice). + // So our mappings shouldn't go above that level. + + case 1 : aslLogLevel = ASL_LEVEL_CRIT; break; + case 2 : aslLogLevel = ASL_LEVEL_ERR; break; + case 3 : aslLogLevel = ASL_LEVEL_WARNING; break; + default : aslLogLevel = ASL_LEVEL_NOTICE; break; + } + + asl_log(client, NULL, aslLogLevel, "%s", msg); + } +} + +- (NSString *)loggerName +{ + return @"cocoa.lumberjack.aslLogger"; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.h new file mode 100755 index 000000000..57c2f096c --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.h @@ -0,0 +1,597 @@ +#import + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted + * + * Otherwise, here is a quick refresher. + * There are three steps to using the macros: + * + * Step 1: + * Import the header in your implementation file: + * + * #import "DDLog.h" + * + * Step 2: + * Define your logging level in your implementation file: + * + * // Log levels: off, error, warn, info, verbose + * static const int ddLogLevel = LOG_LEVEL_VERBOSE; + * + * Step 3: + * Replace your NSLog statements with DDLog statements according to the severity of the message. + * + * NSLog(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!"); + * + * DDLog works exactly the same as NSLog. + * This means you can pass it multiple variables just like NSLog. +**/ + + +@class DDLogMessage; + +@protocol DDLogger; +@protocol DDLogFormatter; + +/** + * This is the single macro that all other macros below compile into. + * This big multiline macro makes all the other macros easier to read. +**/ + +#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \ + [DDLog log:isAsynchronous \ + level:lvl \ + flag:flg \ + context:ctx \ + file:__FILE__ \ + function:fnct \ + line:__LINE__ \ + tag:atag \ + format:(frmt), ##__VA_ARGS__] + +/** + * Define the Objective-C and C versions of the macro. + * These automatically inject the proper function name for either an objective-c method or c function. + * + * We also define shorthand versions for asynchronous and synchronous logging. +**/ + +#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \ + LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__) + +#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \ + LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__) + +#define SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \ + LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \ + LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \ + LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \ + LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +/** + * Define version of the macro that only execute if the logLevel is above the threshold. + * The compiled versions essentially look like this: + * + * if (logFlagForThisLogMsg & ddLogLevel) { execute log message } + * + * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels. + * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques. + * + * Note that when compiler optimizations are enabled (as they are for your release builds), + * the log messages above your logging threshold will automatically be compiled out. + * + * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement + * would execute, and if not it strips it from the binary.) + * + * We also define shorthand versions for asynchronous and synchronous logging. +**/ + +#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \ + do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0) + +#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \ + LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__) + +#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \ + LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__) + +#define SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \ + LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \ + LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \ + LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \ + LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) + +/** + * Define versions of the macros that also accept tags. + * + * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes. + * It may be used to pass custom information to loggers or formatters. + * Or it may be used by 3rd party extensions to the framework. + * + * Thes macros just make it a little easier to extend logging functionality. +**/ + +#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \ + LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__) + +#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \ + LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__) + +#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \ + do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0) + +#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \ + LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__) + +#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \ + LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__) + +/** + * Define the standard options. + * + * We default to only 4 levels because it makes it easier for beginners + * to make the transition to a logging framework. + * + * More advanced users may choose to completely customize the levels (and level names) to suite their needs. + * For more information on this see the "Custom Log Levels" page: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels + * + * Advanced users may also notice that we're using a bitmask. + * This is to allow for custom fine grained logging: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/FineGrainedLogging + * + * -- Flags -- + * + * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations. + * For example, say you have a lot of warning log messages, and you wanted to disable them. + * However, you still needed to see your error and info log messages. + * You could accomplish that with the following: + * + * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO; + * + * Flags may also be consulted when writing custom log formatters, + * as the DDLogMessage class captures the individual flag that caused the log message to fire. + * + * -- Levels -- + * + * Log levels are simply the proper bitmask of the flags. + * + * -- Booleans -- + * + * The booleans may be used when your logging code involves more than one line. + * For example: + * + * if (LOG_VERBOSE) { + * for (id sprocket in sprockets) + * DDLogVerbose(@"sprocket: %@", [sprocket description]) + * } + * + * -- Async -- + * + * Defines the default asynchronous options. + * The default philosophy for asynchronous logging is very simple: + * + * Log messages with errors should be executed synchronously. + * After all, an error just occurred. The application could be unstable. + * + * All other log messages, such as debug output, are executed asynchronously. + * After all, if it wasn't an error, then it was just informational output, + * or something the application was easily able to recover from. + * + * -- Changes -- + * + * You are strongly discouraged from modifying this file. + * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project. + * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h + * + * For an example of customizing your logging experience, see the "Custom Log Levels" page: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels +**/ + +#define LOG_FLAG_ERROR (1 << 0) // 0...0001 +#define LOG_FLAG_WARN (1 << 1) // 0...0010 +#define LOG_FLAG_INFO (1 << 2) // 0...0100 +#define LOG_FLAG_VERBOSE (1 << 3) // 0...1000 + +#define LOG_LEVEL_OFF 0 +#define LOG_LEVEL_ERROR (LOG_FLAG_ERROR) // 0...0001 +#define LOG_LEVEL_WARN (LOG_FLAG_ERROR | LOG_FLAG_WARN) // 0...0011 +#define LOG_LEVEL_INFO (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO) // 0...0111 +#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_VERBOSE) // 0...1111 + +#define LOG_ERROR (ddLogLevel & LOG_FLAG_ERROR) +#define LOG_WARN (ddLogLevel & LOG_FLAG_WARN) +#define LOG_INFO (ddLogLevel & LOG_FLAG_INFO) +#define LOG_VERBOSE (ddLogLevel & LOG_FLAG_VERBOSE) + +#define LOG_ASYNC_ENABLED YES + +#define LOG_ASYNC_ERROR ( NO && LOG_ASYNC_ENABLED) +#define LOG_ASYNC_WARN (YES && LOG_ASYNC_ENABLED) +#define LOG_ASYNC_INFO (YES && LOG_ASYNC_ENABLED) +#define LOG_ASYNC_VERBOSE (YES && LOG_ASYNC_ENABLED) + +#define DDLogError(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) +#define DDLogWarn(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) +#define DDLogInfo(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) +#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) + +#define DDLogCError(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) +#define DDLogCWarn(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) +#define DDLogCInfo(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) +#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) + +/** + * The THIS_FILE macro gives you an NSString of the file name. + * For simplicity and clarity, the file name does not include the full path or file extension. + * + * For example: DDLogWarn(@"%@: Unable to find thingy", THIS_FILE) -> @"MyViewController: Unable to find thingy" +**/ + +NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy); + +#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO)) + +/** + * The THIS_METHOD macro gives you the name of the current objective-c method. + * + * For example: DDLogWarn(@"%@ - Requires non-nil strings") -> @"setMake:model: requires non-nil strings" + * + * Note: This does NOT work in straight C functions (non objective-c). + * Instead you should use the predefined __FUNCTION__ macro. +**/ + +#define THIS_METHOD NSStringFromSelector(_cmd) + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface DDLog : NSObject + +/** + * Provides access to the underlying logging queue. + * This may be helpful to Logger classes for things like thread synchronization. +**/ + ++ (dispatch_queue_t)loggingQueue; + +/** + * Logging Primitive. + * + * This method is used by the macros above. + * It is suggested you stick with the macros as they're easier to use. +**/ + ++ (void)log:(BOOL)synchronous + level:(int)level + flag:(int)flag + context:(int)context + file:(const char *)file + function:(const char *)function + line:(int)line + tag:(id)tag + format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10))); + +/** + * Logging Primitive. + * + * This method can be used if you have a prepared va_list. +**/ + ++ (void)log:(BOOL)asynchronous + level:(int)level + flag:(int)flag + context:(int)context + file:(const char *)file + function:(const char *)function + line:(int)line + tag:(id)tag + format:(NSString *)format + args:(va_list)argList; + + +/** + * Since logging can be asynchronous, there may be times when you want to flush the logs. + * The framework invokes this automatically when the application quits. +**/ + ++ (void)flushLog; + +/** + * Loggers + * + * If you want your log statements to go somewhere, + * you should create and add a logger. +**/ + ++ (void)addLogger:(id )logger; ++ (void)removeLogger:(id )logger; + ++ (void)removeAllLoggers; + +/** + * Registered Dynamic Logging + * + * These methods allow you to obtain a list of classes that are using registered dynamic logging, + * and also provides methods to get and set their log level during run time. +**/ + ++ (NSArray *)registeredClasses; ++ (NSArray *)registeredClassNames; + ++ (int)logLevelForClass:(Class)aClass; ++ (int)logLevelForClassWithName:(NSString *)aClassName; + ++ (void)setLogLevel:(int)logLevel forClass:(Class)aClass; ++ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@protocol DDLogger +@required + +- (void)logMessage:(DDLogMessage *)logMessage; + +/** + * Formatters may optionally be added to any logger. + * + * If no formatter is set, the logger simply logs the message as it is given in logMessage, + * or it may use its own built in formatting style. +**/ +- (id )logFormatter; +- (void)setLogFormatter:(id )formatter; + +@optional + +/** + * Since logging is asynchronous, adding and removing loggers is also asynchronous. + * In other words, the loggers are added and removed at appropriate times with regards to log messages. + * + * - Loggers will not receive log messages that were executed prior to when they were added. + * - Loggers will not receive log messages that were executed after they were removed. + * + * These methods are executed in the logging thread/queue. + * This is the same thread/queue that will execute every logMessage: invocation. + * Loggers may use these methods for thread synchronization or other setup/teardown tasks. +**/ +- (void)didAddLogger; +- (void)willRemoveLogger; + +/** + * Some loggers may buffer IO for optimization purposes. + * For example, a database logger may only save occasionaly as the disk IO is slow. + * In such loggers, this method should be implemented to flush any pending IO. + * + * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it. + * + * Note that DDLog's flushLog method is invoked automatically when the application quits, + * and it may be also invoked manually by the developer prior to application crashes, or other such reasons. +**/ +- (void)flush; + +/** + * Each logger is executed concurrently with respect to the other loggers. + * Thus, a dedicated dispatch queue is used for each logger. + * Logger implementations may optionally choose to provide their own dispatch queue. +**/ +- (dispatch_queue_t)loggerQueue; + +/** + * If the logger implementation does not choose to provide its own queue, + * one will automatically be created for it. + * The created queue will receive its name from this method. + * This may be helpful for debugging or profiling reasons. +**/ +- (NSString *)loggerName; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@protocol DDLogFormatter +@required + +/** + * Formatters may optionally be added to any logger. + * This allows for increased flexibility in the logging environment. + * For example, log messages for log files may be formatted differently than log messages for the console. + * + * For more information about formatters, see the "Custom Formatters" page: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters + * + * The formatter may also optionally filter the log message by returning nil, + * in which case the logger will not log the message. +**/ +- (NSString *)formatLogMessage:(DDLogMessage *)logMessage; + +@optional + +/** + * A single formatter instance can be added to multiple loggers. + * These methods provides hooks to notify the formatter of when it's added/removed. + * + * This is primarily for thread-safety. + * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers. + * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter), + * it could possibly use these hooks to switch to thread-safe versions of the code. +**/ +- (void)didAddToLogger:(id )logger; +- (void)willRemoveFromLogger:(id )logger; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@protocol DDRegisteredDynamicLogging + +/** + * Implement these methods to allow a file's log level to be managed from a central location. + * + * This is useful if you'd like to be able to change log levels for various parts + * of your code from within the running application. + * + * Imagine pulling up the settings for your application, + * and being able to configure the logging level on a per file basis. + * + * The implementation can be very straight-forward: + * + * + (int)ddLogLevel + * { + * return ddLogLevel; + * } + * + * + (void)ddSetLogLevel:(int)logLevel + * { + * ddLogLevel = logLevel; + * } +**/ + ++ (int)ddLogLevel; ++ (void)ddSetLogLevel:(int)logLevel; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The DDLogMessage class encapsulates information about the log message. + * If you write custom loggers or formatters, you will be dealing with objects of this class. +**/ + +enum { + DDLogMessageCopyFile = 1 << 0, + DDLogMessageCopyFunction = 1 << 1, +}; +typedef int DDLogMessageOptions; + +@interface DDLogMessage : NSObject +{ + +// The public variables below can be accessed directly (for speed). +// For example: logMessage->logLevel + +@public + int logLevel; + int logFlag; + int logContext; + NSString *logMsg; + NSDate *timestamp; + char *file; + char *function; + int lineNumber; + mach_port_t machThreadID; + char *queueLabel; + NSString *threadName; + + // For 3rd party extensions to the framework, where flags and contexts aren't enough. + id tag; + + // For 3rd party extensions that manually create DDLogMessage instances. + DDLogMessageOptions options; +} + +/** + * Standard init method for a log message object. + * Used by the logging primitives. (And the macros use the logging primitives.) + * + * If you find need to manually create logMessage objects, there is one thing you should be aware of: + * + * If no flags are passed, the method expects the file and function parameters to be string literals. + * That is, it expects the given strings to exist for the duration of the object's lifetime, + * and it expects the given strings to be immutable. + * In other words, it does not copy these strings, it simply points to them. + * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters, + * so it makes sense to optimize and skip the unnecessary allocations. + * However, if you need them to be copied you may use the options parameter to specify this. + * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction. +**/ +- (id)initWithLogMsg:(NSString *)logMsg + level:(int)logLevel + flag:(int)logFlag + context:(int)logContext + file:(const char *)file + function:(const char *)function + line:(int)line + tag:(id)tag + options:(DDLogMessageOptions)optionsMask; + +/** + * Returns the threadID as it appears in NSLog. + * That is, it is a hexadecimal value which is calculated from the machThreadID. +**/ +- (NSString *)threadID; + +/** + * Convenience property to get just the file name, as the file variable is generally the full file path. + * This method does not include the file extension, which is generally unwanted for logging purposes. +**/ +- (NSString *)fileName; + +/** + * Returns the function variable in NSString form. +**/ +- (NSString *)methodName; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The DDLogger protocol specifies that an optional formatter can be added to a logger. + * Most (but not all) loggers will want to support formatters. + * + * However, writting getters and setters in a thread safe manner, + * while still maintaining maximum speed for the logging process, is a difficult task. + * + * To do it right, the implementation of the getter/setter has strict requiremenets: + * - Must NOT require the logMessage method to acquire a lock. + * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts). + * + * To simplify things, an abstract logger is provided that implements the getter and setter. + * + * Logger implementations may simply extend this class, + * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method! +**/ + +@interface DDAbstractLogger : NSObject +{ + id formatter; + + dispatch_queue_t loggerQueue; +} + +- (id )logFormatter; +- (void)setLogFormatter:(id )formatter; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.m new file mode 100755 index 000000000..7d75d8121 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.m @@ -0,0 +1,1067 @@ +#import "DDLog.h" + +#import +#import +#import +#import +#import + + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted + * +**/ + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +// Does ARC support support GCD objects? +// It does if the minimum deployment target is iOS 6+ or Mac OS X 8+ + +#if TARGET_OS_IPHONE + + // Compiling for iOS + + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 // iOS 6.0 or later + #define NEEDS_DISPATCH_RETAIN_RELEASE 0 + #else // iOS 5.X or earlier + #define NEEDS_DISPATCH_RETAIN_RELEASE 1 + #endif + +#else + + // Compiling for Mac OS X + + #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 // Mac OS X 10.8 or later + #define NEEDS_DISPATCH_RETAIN_RELEASE 0 + #else + #define NEEDS_DISPATCH_RETAIN_RELEASE 1 // Mac OS X 10.7 or earlier + #endif + +#endif + +// We probably shouldn't be using DDLog() statements within the DDLog implementation. +// But we still want to leave our log statements for any future debugging, +// and to allow other developers to trace the implementation (which is a great learning tool). +// +// So we use a primitive logging macro around NSLog. +// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog. + +#define DD_DEBUG NO + +#define NSLogDebug(frmt, ...) do{ if(DD_DEBUG) NSLog((frmt), ##__VA_ARGS__); } while(0) + +// Specifies the maximum queue size of the logging thread. +// +// Since most logging is asynchronous, its possible for rogue threads to flood the logging queue. +// That is, to issue an abundance of log statements faster than the logging thread can keepup. +// Typically such a scenario occurs when log statements are added haphazardly within large loops, +// but may also be possible if relatively slow loggers are being used. +// +// This property caps the queue size at a given number of outstanding log statements. +// If a thread attempts to issue a log statement when the queue is already maxed out, +// the issuing thread will block until the queue size drops below the max again. + +#define LOG_MAX_QUEUE_SIZE 1000 // Should not exceed INT32_MAX + + +@interface DDLoggerNode : NSObject { +@public + id logger; + dispatch_queue_t loggerQueue; +} + ++ (DDLoggerNode *)nodeWithLogger:(id )logger loggerQueue:(dispatch_queue_t)loggerQueue; + +@end + + +@interface DDLog (PrivateAPI) + ++ (void)lt_addLogger:(id )logger; ++ (void)lt_removeLogger:(id )logger; ++ (void)lt_removeAllLoggers; ++ (void)lt_log:(DDLogMessage *)logMessage; ++ (void)lt_flush; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDLog + +// An array used to manage all the individual loggers. +// The array is only modified on the loggingQueue/loggingThread. +static NSMutableArray *loggers; + +// All logging statements are added to the same queue to ensure FIFO operation. +static dispatch_queue_t loggingQueue; + +// Individual loggers are executed concurrently per log statement. +// Each logger has it's own associated queue, and a dispatch group is used for synchrnoization. +static dispatch_group_t loggingGroup; + +// In order to prevent to queue from growing infinitely large, +// a maximum size is enforced (LOG_MAX_QUEUE_SIZE). +static dispatch_semaphore_t queueSemaphore; + +// Minor optimization for uniprocessor machines +static unsigned int numProcessors; + +/** + * The runtime sends initialize to each class in a program exactly one time just before the class, + * or any class that inherits from it, is sent its first message from within the program. (Thus the + * method may never be invoked if the class is not used.) The runtime sends the initialize message to + * classes in a thread-safe manner. Superclasses receive this message before their subclasses. + * + * This method may also be called directly (assumably by accident), hence the safety mechanism. +**/ ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + + loggers = [[NSMutableArray alloc] initWithCapacity:4]; + + NSLogDebug(@"DDLog: Using grand central dispatch"); + + loggingQueue = dispatch_queue_create("cocoa.lumberjack", NULL); + loggingGroup = dispatch_group_create(); + + queueSemaphore = dispatch_semaphore_create(LOG_MAX_QUEUE_SIZE); + + // Figure out how many processors are available. + // This may be used later for an optimization on uniprocessor machines. + + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); + + unsigned int result = (unsigned int)(hostInfo.max_cpus); + unsigned int one = (unsigned int)(1); + + numProcessors = MAX(result, one); + + NSLogDebug(@"DDLog: numProcessors = %u", numProcessors); + + + #if TARGET_OS_IPHONE + NSString *notificationName = @"UIApplicationWillTerminateNotification"; + #else + NSString *notificationName = @"NSApplicationWillTerminateNotification"; + #endif + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationWillTerminate:) + name:notificationName + object:nil]; + } +} + +/** + * Provides access to the logging queue. +**/ ++ (dispatch_queue_t)loggingQueue +{ + return loggingQueue; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Notifications +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (void)applicationWillTerminate:(NSNotification *)notification +{ + [self flushLog]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Logger Management +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (void)addLogger:(id )logger +{ + if (logger == nil) return; + + dispatch_async(loggingQueue, ^{ @autoreleasepool { + + [self lt_addLogger:logger]; + }}); +} + ++ (void)removeLogger:(id )logger +{ + if (logger == nil) return; + + dispatch_async(loggingQueue, ^{ @autoreleasepool { + + [self lt_removeLogger:logger]; + }}); +} + ++ (void)removeAllLoggers +{ + dispatch_async(loggingQueue, ^{ @autoreleasepool { + + [self lt_removeAllLoggers]; + }}); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Master Logging +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (void)queueLogMessage:(DDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag +{ + // We have a tricky situation here... + // + // In the common case, when the queueSize is below the maximumQueueSize, + // we want to simply enqueue the logMessage. And we want to do this as fast as possible, + // which means we don't want to block and we don't want to use any locks. + // + // However, if the queueSize gets too big, we want to block. + // But we have very strict requirements as to when we block, and how long we block. + // + // The following example should help illustrate our requirements: + // + // Imagine that the maximum queue size is configured to be 5, + // and that there are already 5 log messages queued. + // Let us call these 5 queued log messages A, B, C, D, and E. (A is next to be executed) + // + // Now if our thread issues a log statement (let us call the log message F), + // it should block before the message is added to the queue. + // Furthermore, it should be unblocked immediately after A has been unqueued. + // + // The requirements are strict in this manner so that we block only as long as necessary, + // and so that blocked threads are unblocked in the order in which they were blocked. + // + // Returning to our previous example, let us assume that log messages A through E are still queued. + // Our aforementioned thread is blocked attempting to queue log message F. + // Now assume we have another separate thread that attempts to issue log message G. + // It should block until log messages A and B have been unqueued. + + + // We are using a counting semaphore provided by GCD. + // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value. + // Everytime we want to queue a log message we decrement this value. + // If the resulting value is less than zero, + // the semaphore function waits in FIFO order for a signal to occur before returning. + // + // A dispatch semaphore is an efficient implementation of a traditional counting semaphore. + // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked. + // If the calling semaphore does not need to block, no kernel call is made. + + dispatch_semaphore_wait(queueSemaphore, DISPATCH_TIME_FOREVER); + + // We've now sure we won't overflow the queue. + // It is time to queue our log message. + + dispatch_block_t logBlock = ^{ @autoreleasepool { + + [self lt_log:logMessage]; + }}; + + if (asyncFlag) + dispatch_async(loggingQueue, logBlock); + else + dispatch_sync(loggingQueue, logBlock); +} + ++ (void)log:(BOOL)asynchronous + level:(int)level + flag:(int)flag + context:(int)context + file:(const char *)file + function:(const char *)function + line:(int)line + tag:(id)tag + format:(NSString *)format, ... +{ + va_list args; + if (format) + { + va_start(args, format); + + NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args]; + DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg + level:level + flag:flag + context:context + file:file + function:function + line:line + tag:tag + options:0]; + + [self queueLogMessage:logMessage asynchronously:asynchronous]; + + va_end(args); + } +} + ++ (void)log:(BOOL)asynchronous + level:(int)level + flag:(int)flag + context:(int)context + file:(const char *)file + function:(const char *)function + line:(int)line + tag:(id)tag + format:(NSString *)format + args:(va_list)args +{ + if (format) + { + NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args]; + DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg + level:level + flag:flag + context:context + file:file + function:function + line:line + tag:tag + options:0]; + + [self queueLogMessage:logMessage asynchronously:asynchronous]; + } +} + ++ (void)flushLog +{ + dispatch_sync(loggingQueue, ^{ @autoreleasepool { + + [self lt_flush]; + }}); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Registered Dynamic Logging +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (BOOL)isRegisteredClass:(Class)class +{ + SEL getterSel = @selector(ddLogLevel); + SEL setterSel = @selector(ddSetLogLevel:); + +#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR + + // Issue #6 (GoogleCode) - Crashes on iOS 4.2.1 and iPhone 4 + // + // Crash caused by class_getClassMethod(2). + // + // "It's a bug with UIAccessibilitySafeCategory__NSObject so it didn't pop up until + // users had VoiceOver enabled [...]. I was able to work around it by searching the + // result of class_copyMethodList() instead of calling class_getClassMethod()" + + BOOL result = NO; + + unsigned int methodCount, i; + Method *methodList = class_copyMethodList(object_getClass(class), &methodCount); + + if (methodList != NULL) + { + BOOL getterFound = NO; + BOOL setterFound = NO; + + for (i = 0; i < methodCount; ++i) + { + SEL currentSel = method_getName(methodList[i]); + + if (currentSel == getterSel) + { + getterFound = YES; + } + else if (currentSel == setterSel) + { + setterFound = YES; + } + + if (getterFound && setterFound) + { + result = YES; + break; + } + } + + free(methodList); + } + + return result; + +#else + + // Issue #24 (GitHub) - Crashing in in ARC+Simulator + // + // The method +[DDLog isRegisteredClass] will crash a project when using it with ARC + Simulator. + // For running in the Simulator, it needs to execute the non-iOS code. + + Method getter = class_getClassMethod(class, getterSel); + Method setter = class_getClassMethod(class, setterSel); + + if ((getter != NULL) && (setter != NULL)) + { + return YES; + } + + return NO; + +#endif +} + ++ (NSArray *)registeredClasses +{ + int numClasses, i; + + // We're going to get the list of all registered classes. + // The Objective-C runtime library automatically registers all the classes defined in your source code. + // + // To do this we use the following method (documented in the Objective-C Runtime Reference): + // + // int objc_getClassList(Class *buffer, int bufferLen) + // + // We can pass (NULL, 0) to obtain the total number of + // registered class definitions without actually retrieving any class definitions. + // This allows us to allocate the minimum amount of memory needed for the application. + + numClasses = objc_getClassList(NULL, 0); + + // The numClasses method now tells us how many classes we have. + // So we can allocate our buffer, and get pointers to all the class definitions. + + Class *classes = (Class *)malloc(sizeof(Class) * numClasses); + + numClasses = objc_getClassList(classes, numClasses); + + // We can now loop through the classes, and test each one to see if it is a DDLogging class. + + NSMutableArray *result = [NSMutableArray arrayWithCapacity:numClasses]; + + for (i = 0; i < numClasses; i++) + { + Class class = classes[i]; + + if ([self isRegisteredClass:class]) + { + [result addObject:class]; + } + } + + free(classes); + + return result; +} + ++ (NSArray *)registeredClassNames +{ + NSArray *registeredClasses = [self registeredClasses]; + NSMutableArray *result = [NSMutableArray arrayWithCapacity:[registeredClasses count]]; + + for (Class class in registeredClasses) + { + [result addObject:NSStringFromClass(class)]; + } + + return result; +} + ++ (int)logLevelForClass:(Class)aClass +{ + if ([self isRegisteredClass:aClass]) + { + return [aClass ddLogLevel]; + } + + return -1; +} + ++ (int)logLevelForClassWithName:(NSString *)aClassName +{ + Class aClass = NSClassFromString(aClassName); + + return [self logLevelForClass:aClass]; +} + ++ (void)setLogLevel:(int)logLevel forClass:(Class)aClass +{ + if ([self isRegisteredClass:aClass]) + { + [aClass ddSetLogLevel:logLevel]; + } +} + ++ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName +{ + Class aClass = NSClassFromString(aClassName); + + [self setLogLevel:logLevel forClass:aClass]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Logging Thread +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This method should only be run on the logging thread/queue. +**/ ++ (void)lt_addLogger:(id )logger +{ + // Add to loggers array. + // Need to create loggerQueue if loggerNode doesn't provide one. + + dispatch_queue_t loggerQueue = NULL; + + if ([logger respondsToSelector:@selector(loggerQueue)]) + { + // Logger may be providing its own queue + + loggerQueue = [logger loggerQueue]; + } + + if (loggerQueue == nil) + { + // Automatically create queue for the logger. + // Use the logger name as the queue name if possible. + + const char *loggerQueueName = NULL; + if ([logger respondsToSelector:@selector(loggerName)]) + { + loggerQueueName = [[logger loggerName] UTF8String]; + } + + loggerQueue = dispatch_queue_create(loggerQueueName, NULL); + } + + DDLoggerNode *loggerNode = [DDLoggerNode nodeWithLogger:logger loggerQueue:loggerQueue]; + [loggers addObject:loggerNode]; + + if ([logger respondsToSelector:@selector(didAddLogger)]) + { + dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { + + [logger didAddLogger]; + }}); + } +} + +/** + * This method should only be run on the logging thread/queue. +**/ ++ (void)lt_removeLogger:(id )logger +{ + // Find associated loggerNode in list of added loggers + + DDLoggerNode *loggerNode = nil; + + for (DDLoggerNode *node in loggers) + { + if (node->logger == logger) + { + loggerNode = node; + break; + } + } + + if (loggerNode == nil) + { + NSLogDebug(@"DDLog: Request to remove logger which wasn't added"); + return; + } + + // Notify logger + + if ([logger respondsToSelector:@selector(willRemoveLogger)]) + { + dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { + + [logger willRemoveLogger]; + }}); + } + + // Remove from loggers array + + [loggers removeObject:loggerNode]; +} + +/** + * This method should only be run on the logging thread/queue. +**/ ++ (void)lt_removeAllLoggers +{ + // Notify all loggers + + for (DDLoggerNode *loggerNode in loggers) + { + if ([loggerNode->logger respondsToSelector:@selector(willRemoveLogger)]) + { + dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { + + [loggerNode->logger willRemoveLogger]; + }}); + } + } + + // Remove all loggers from array + + [loggers removeAllObjects]; +} + +/** + * This method should only be run on the logging thread/queue. +**/ ++ (void)lt_log:(DDLogMessage *)logMessage +{ + // Execute the given log message on each of our loggers. + + if (numProcessors > 1) + { + // Execute each logger concurrently, each within its own queue. + // All blocks are added to same group. + // After each block has been queued, wait on group. + // + // The waiting ensures that a slow logger doesn't end up with a large queue of pending log messages. + // This would defeat the purpose of the efforts we made earlier to restrict the max queue size. + + for (DDLoggerNode *loggerNode in loggers) + { + dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool { + + [loggerNode->logger logMessage:logMessage]; + + }}); + } + + dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER); + } + else + { + // Execute each logger serialy, each within its own queue. + + for (DDLoggerNode *loggerNode in loggers) + { + dispatch_sync(loggerNode->loggerQueue, ^{ @autoreleasepool { + + [loggerNode->logger logMessage:logMessage]; + + }}); + } + } + + // If our queue got too big, there may be blocked threads waiting to add log messages to the queue. + // Since we've now dequeued an item from the log, we may need to unblock the next thread. + + // We are using a counting semaphore provided by GCD. + // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value. + // When a log message is queued this value is decremented. + // When a log message is dequeued this value is incremented. + // If the value ever drops below zero, + // the queueing thread blocks and waits in FIFO order for us to signal it. + // + // A dispatch semaphore is an efficient implementation of a traditional counting semaphore. + // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked. + // If the calling semaphore does not need to block, no kernel call is made. + + dispatch_semaphore_signal(queueSemaphore); +} + +/** + * This method should only be run on the background logging thread. +**/ ++ (void)lt_flush +{ + // All log statements issued before the flush method was invoked have now been executed. + // + // Now we need to propogate the flush request to any loggers that implement the flush method. + // This is designed for loggers that buffer IO. + + for (DDLoggerNode *loggerNode in loggers) + { + if ([loggerNode->logger respondsToSelector:@selector(flush)]) + { + dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool { + + [loggerNode->logger flush]; + + }}); + } + } + + dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Utilities +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy) +{ + if (filePath == NULL) return nil; + + char *lastSlash = NULL; + char *lastDot = NULL; + + char *p = (char *)filePath; + + while (*p != '\0') + { + if (*p == '/') + lastSlash = p; + else if (*p == '.') + lastDot = p; + + p++; + } + + char *subStr; + NSUInteger subLen; + + if (lastSlash) + { + if (lastDot) + { + // lastSlash -> lastDot + subStr = lastSlash + 1; + subLen = lastDot - subStr; + } + else + { + // lastSlash -> endOfString + subStr = lastSlash + 1; + subLen = p - subStr; + } + } + else + { + if (lastDot) + { + // startOfString -> lastDot + subStr = (char *)filePath; + subLen = lastDot - subStr; + } + else + { + // startOfString -> endOfString + subStr = (char *)filePath; + subLen = p - subStr; + } + } + + if (copy) + { + return [[NSString alloc] initWithBytes:subStr + length:subLen + encoding:NSUTF8StringEncoding]; + } + else + { + // We can take advantage of the fact that __FILE__ is a string literal. + // Specifically, we don't need to waste time copying the string. + // We can just tell NSString to point to a range within the string literal. + + return [[NSString alloc] initWithBytesNoCopy:subStr + length:subLen + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + } +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDLoggerNode + +- (id)initWithLogger:(id )aLogger loggerQueue:(dispatch_queue_t)aLoggerQueue +{ + if ((self = [super init])) + { + logger = aLogger; + + if (aLoggerQueue) { + loggerQueue = aLoggerQueue; + #if NEEDS_DISPATCH_RETAIN_RELEASE + dispatch_retain(loggerQueue); + #endif + } + } + return self; +} + ++ (DDLoggerNode *)nodeWithLogger:(id )logger loggerQueue:(dispatch_queue_t)loggerQueue +{ + return [[DDLoggerNode alloc] initWithLogger:logger loggerQueue:loggerQueue]; +} + +- (void)dealloc +{ + #if NEEDS_DISPATCH_RETAIN_RELEASE + if (loggerQueue) dispatch_release(loggerQueue); + #endif +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDLogMessage + +static char *dd_str_copy(const char *str) +{ + if (str == NULL) return NULL; + + size_t length = strlen(str); + char * result = malloc(length + 1); + strncpy(result, str, length); + result[length] = 0; + + return result; +} + +- (id)initWithLogMsg:(NSString *)msg + level:(int)level + flag:(int)flag + context:(int)context + file:(const char *)aFile + function:(const char *)aFunction + line:(int)line + tag:(id)aTag + options:(DDLogMessageOptions)optionsMask +{ + if ((self = [super init])) + { + logMsg = msg; + logLevel = level; + logFlag = flag; + logContext = context; + lineNumber = line; + tag = aTag; + options = optionsMask; + + if (options & DDLogMessageCopyFile) + file = dd_str_copy(aFile); + else + file = (char *)aFile; + + if (options & DDLogMessageCopyFunction) + file = dd_str_copy(aFunction); + else + function = (char *)aFunction; + + timestamp = [[NSDate alloc] init]; + + machThreadID = pthread_mach_thread_np(pthread_self()); + + queueLabel = dd_str_copy(dispatch_queue_get_label(dispatch_get_current_queue())); + + threadName = [[NSThread currentThread] name]; + } + return self; +} + +- (NSString *)threadID +{ + return [[NSString alloc] initWithFormat:@"%x", machThreadID]; +} + +- (NSString *)fileName +{ + return DDExtractFileNameWithoutExtension(file, NO); +} + +- (NSString *)methodName +{ + if (function == NULL) + return nil; + else + return [[NSString alloc] initWithUTF8String:function]; +} + +- (void)dealloc +{ + if (file && (options & DDLogMessageCopyFile)) + free(file); + + if (function && (options & DDLogMessageCopyFunction)) + free(function); + + if (queueLabel) + free(queueLabel); +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDAbstractLogger + +- (id)init +{ + if ((self = [super init])) + { + const char *loggerQueueName = NULL; + if ([self respondsToSelector:@selector(loggerName)]) + { + loggerQueueName = [[self loggerName] UTF8String]; + } + + loggerQueue = dispatch_queue_create(loggerQueueName, NULL); + } + return self; +} + +- (void)dealloc +{ + #if NEEDS_DISPATCH_RETAIN_RELEASE + if (loggerQueue) dispatch_release(loggerQueue); + #endif +} + +- (void)logMessage:(DDLogMessage *)logMessage +{ + // Override me +} + +- (id )logFormatter +{ + // This method must be thread safe and intuitive. + // Therefore if somebody executes the following code: + // + // [logger setLogFormatter:myFormatter]; + // formatter = [logger logFormatter]; + // + // They would expect formatter to equal myFormatter. + // This functionality must be ensured by the getter and setter method. + // + // The thread safety must not come at a cost to the performance of the logMessage method. + // This method is likely called sporadically, while the logMessage method is called repeatedly. + // This means, the implementation of this method: + // - Must NOT require the logMessage method to acquire a lock. + // - Must NOT require the logMessage method to access an atomic property (also a lock of sorts). + // + // Thread safety is ensured by executing access to the formatter variable on the loggerQueue. + // This is the same queue that the logMessage method operates on. + // + // Note: The last time I benchmarked the performance of direct access vs atomic property access, + // direct access was over twice as fast on the desktop and over 6 times as fast on the iPhone. + // + // + // loggerQueue : Our own private internal queue that the logMessage method runs on. + // Operations are added to this queue from the global loggingQueue. + // + // loggingQueue : The queue that all log messages go through before they arrive in our loggerQueue. + // + // It is important to note that, while the loggerQueue is used to create thread-safety for our formatter, + // changes to the formatter variable are queued through the loggingQueue. + // + // Since this will obviously confuse the hell out of me later, here is a better description. + // Imagine the following code: + // + // DDLogVerbose(@"log msg 1"); + // DDLogVerbose(@"log msg 2"); + // [logger setFormatter:myFormatter]; + // DDLogVerbose(@"log msg 3"); + // + // Our intuitive requirement means that the new formatter will only apply to the 3rd log message. + // But notice what happens if we have asynchronous logging enabled for verbose mode. + // + // Log msg 1 starts executing asynchronously on the loggingQueue. + // The loggingQueue executes the log statement on each logger concurrently. + // That means it executes log msg 1 on our loggerQueue. + // While log msg 1 is executing, log msg 2 gets added to the loggingQueue. + // Then the user requests that we change our formatter. + // So at this exact moment, our queues look like this: + // + // loggerQueue : executing log msg 1, nil + // loggingQueue : executing log msg 1, log msg 2, nil + // + // So direct access to the formatter is only available if requested from the loggerQueue. + // In all other circumstances we need to go through the loggingQueue to get the proper value. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + return formatter; + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + __block id result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(loggerQueue, ^{ + result = formatter; + }); + }); + + return result; + } +} + +- (void)setLogFormatter:(id )logFormatter +{ + // The design of this method is documented extensively in the logFormatter message (above in code). + + dispatch_block_t block = ^{ @autoreleasepool { + + if (formatter != logFormatter) + { + if ([formatter respondsToSelector:@selector(willRemoveFromLogger:)]) { + [formatter willRemoveFromLogger:self]; + } + + formatter = logFormatter; + + if ([formatter respondsToSelector:@selector(didAddToLogger:)]) { + [formatter didAddToLogger:self]; + } + } + }}; + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (dispatch_queue_t)loggerQueue +{ + return loggerQueue; +} + +- (NSString *)loggerName +{ + return NSStringFromClass([self class]); +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.h new file mode 100755 index 000000000..4cbd2e8e9 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.h @@ -0,0 +1,167 @@ +#import +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +#import "DDLog.h" + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted + * + * + * This class provides a logger for Terminal output or Xcode console output, + * depending on where you are running your code. + * + * As described in the "Getting Started" page, + * the traditional NSLog() function directs it's output to two places: + * + * - Apple System Log (so it shows up in Console.app) + * - StdErr (if stderr is a TTY, so log statements show up in Xcode console) + * + * To duplicate NSLog() functionality you can simply add this logger and an asl logger. + * However, if you instead choose to use file logging (for faster performance), + * you may choose to use only a file logger and a tty logger. +**/ + +@interface DDTTYLogger : DDAbstractLogger +{ + NSCalendar *calendar; + NSUInteger calendarUnitFlags; + + NSString *appName; + char *app; + size_t appLen; + + NSString *processID; + char *pid; + size_t pidLen; + + BOOL colorsEnabled; + NSMutableArray *colorProfilesArray; + NSMutableDictionary *colorProfilesDict; +} + ++ (DDTTYLogger *)sharedInstance; + +/* Inherited from the DDLogger protocol: + * + * Formatters may optionally be added to any logger. + * + * If no formatter is set, the logger simply logs the message as it is given in logMessage, + * or it may use its own built in formatting style. + * + * More information about formatters can be found here: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters + * + * The actual implementation of these methods is inherited from DDAbstractLogger. + +- (id )logFormatter; +- (void)setLogFormatter:(id )formatter; + +*/ + +/** + * Want to use different colors for different log levels? + * Enable this property. + * + * If you run the application via the Terminal (not Xcode), + * the logger will map colors to xterm-256color or xterm-color (if available). + * + * Xcode does NOT natively support colors in the Xcode debugging console. + * You'll need to install the XcodeColors plugin to see colors in the Xcode console. + * https://github.com/robbiehanson/XcodeColors + * + * The default value if NO. +**/ +@property (readwrite, assign) BOOL colorsEnabled; + +/** + * The default color set (foregroundColor, backgroundColor) is: + * + * - LOG_FLAG_ERROR = (red, nil) + * - LOG_FLAG_WARN = (orange, nil) + * + * You can customize the colors however you see fit. + * Please note that you are passing a flag, NOT a level. + * + * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO]; // <- Good :) + * BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :( + * + * LOG_FLAG_INFO = 0...00100 + * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR + * + * If you run the application within Xcode, then the XcodeColors plugin is required. + * + * If you run the application from a shell, then DDTTYLogger will automatically map the given color to + * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.) + * + * This method invokes setForegroundColor:backgroundColor:forFlag:context: and passes the default context (0). +**/ +#if TARGET_OS_IPHONE +- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask; +#else +- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask; +#endif + +/** + * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context. + * + * A logging context is often used to identify log messages coming from a 3rd party framework, + * although logging context's can be used for many different functions. + * + * Logging context's are explained in further detail here: + * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomContext +**/ +#if TARGET_OS_IPHONE +- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt; +#else +- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt; +#endif + +/** + * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile. + * For example, you could do something like this: + * + * static NSString *const PurpleTag = @"PurpleTag"; + * + * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__) + * + * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack: + * + * #if TARGET_OS_IPHONE + * UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0]; + * #else + * NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0]; + * + * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag]; + * [DDLog addLogger:[DDTTYLogger sharedInstance]]; + * + * This would essentially give you a straight NSLog replacement that prints in purple: + * + * DDLogPurple(@"I'm a purple log message!"); +**/ +#if TARGET_OS_IPHONE +- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id )tag; +#else +- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id )tag; +#endif + +/** + * Clearing color profiles. +**/ +- (void)clearColorsForFlag:(int)mask; +- (void)clearColorsForFlag:(int)mask context:(int)context; +- (void)clearColorsForTag:(id )tag; +- (void)clearColorsForAllFlags; +- (void)clearColorsForAllTags; +- (void)clearAllColors; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.m new file mode 100755 index 000000000..3157d84e9 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.m @@ -0,0 +1,1480 @@ +#import "DDTTYLogger.h" + +#import +#import + +/** + * Welcome to Cocoa Lumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/robbiehanson/CocoaLumberjack + * + * If you're new to the project you may wish to read the "Getting Started" wiki. + * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted +**/ + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +// We probably shouldn't be using DDLog() statements within the DDLog implementation. +// But we still want to leave our log statements for any future debugging, +// and to allow other developers to trace the implementation (which is a great learning tool). +// +// So we use primitive logging macros around NSLog. +// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog. + +#define LOG_LEVEL 2 + +#define NSLogError(frmt, ...) do{ if(LOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0) +#define NSLogWarn(frmt, ...) do{ if(LOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0) +#define NSLogInfo(frmt, ...) do{ if(LOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0) +#define NSLogVerbose(frmt, ...) do{ if(LOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0) + +// Xcode does NOT natively support colors in the Xcode debugging console. +// You'll need to install the XcodeColors plugin to see colors in the Xcode console. +// https://github.com/robbiehanson/XcodeColors +// +// The following is documentation from the XcodeColors project: +// +// +// How to apply color formatting to your log statements: +// +// To set the foreground color: +// Insert the ESCAPE_SEQ into your string, followed by "fg124,12,255;" where r=124, g=12, b=255. +// +// To set the background color: +// Insert the ESCAPE_SEQ into your string, followed by "bg12,24,36;" where r=12, g=24, b=36. +// +// To reset the foreground color (to default value): +// Insert the ESCAPE_SEQ into your string, followed by "fg;" +// +// To reset the background color (to default value): +// Insert the ESCAPE_SEQ into your string, followed by "bg;" +// +// To reset the foreground and background color (to default values) in one operation: +// Insert the ESCAPE_SEQ into your string, followed by ";" + +#define XCODE_COLORS_ESCAPE_SEQ "\033[" + +#define XCODE_COLORS_RESET_FG XCODE_COLORS_ESCAPE_SEQ "fg;" // Clear any foreground color +#define XCODE_COLORS_RESET_BG XCODE_COLORS_ESCAPE_SEQ "bg;" // Clear any background color +#define XCODE_COLORS_RESET XCODE_COLORS_ESCAPE_SEQ ";" // Clear any foreground or background color + +// Some simple defines to make life easier on ourself + +#if TARGET_OS_IPHONE + #define MakeColor(r, g, b) [UIColor colorWithRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f] +#else + #define MakeColor(r, g, b) [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f] +#endif + +#if TARGET_OS_IPHONE + #define OSColor UIColor +#else + #define OSColor NSColor +#endif + +// If running in a shell, not all RGB colors will be supported. +// In this case we automatically map to the closest available color. +// In order to provide this mapping, we have a hard-coded set of the standard RGB values available in the shell. +// However, not every shell is the same, and Apple likes to think different even when it comes to shell colors. +// +// Map to standard Terminal.app colors (1), or +// map to standard xterm colors (0). + +#define MAP_TO_TERMINAL_APP_COLORS 1 + + +@interface DDTTYLoggerColorProfile : NSObject { +@public + int mask; + int context; + + uint8_t fg_r; + uint8_t fg_g; + uint8_t fg_b; + + uint8_t bg_r; + uint8_t bg_g; + uint8_t bg_b; + + NSUInteger fgCodeIndex; + NSString *fgCodeRaw; + + NSUInteger bgCodeIndex; + NSString *bgCodeRaw; + + char fgCode[24]; + size_t fgCodeLen; + + char bgCode[24]; + size_t bgCodeLen; + + char resetCode[8]; + size_t resetCodeLen; +} + +- (id)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)mask context:(int)ctxt; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDTTYLogger + +static BOOL isaTTY; +static BOOL isaColorTTY; +static BOOL isaColor256TTY; +static BOOL isaXcodeColorTTY; + +static NSArray *codes_fg = nil; +static NSArray *codes_bg = nil; +static NSArray *colors = nil; + +static DDTTYLogger *sharedInstance; + +/** + * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 16 color mode. + * + * This method is used when the application is running from within a shell that only supports 16 color mode. + * This method is not invoked if the application is running within Xcode, or via normal UI app launch. +**/ ++ (void)initialize_colors_16 +{ + if (codes_fg || codes_bg || colors) return; + + NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:16]; + NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:16]; + NSMutableArray *m_colors = [NSMutableArray arrayWithCapacity:16]; + + // In a standard shell only 16 colors are supported. + // + // More information about ansi escape codes can be found online. + // http://en.wikipedia.org/wiki/ANSI_escape_code + + [m_codes_fg addObject:@"30m"]; // normal - black + [m_codes_fg addObject:@"31m"]; // normal - red + [m_codes_fg addObject:@"32m"]; // normal - green + [m_codes_fg addObject:@"33m"]; // normal - yellow + [m_codes_fg addObject:@"34m"]; // normal - blue + [m_codes_fg addObject:@"35m"]; // normal - magenta + [m_codes_fg addObject:@"36m"]; // normal - cyan + [m_codes_fg addObject:@"37m"]; // normal - gray + [m_codes_fg addObject:@"1;30m"]; // bright - darkgray + [m_codes_fg addObject:@"1;31m"]; // bright - red + [m_codes_fg addObject:@"1;32m"]; // bright - green + [m_codes_fg addObject:@"1;33m"]; // bright - yellow + [m_codes_fg addObject:@"1;34m"]; // bright - blue + [m_codes_fg addObject:@"1;35m"]; // bright - magenta + [m_codes_fg addObject:@"1;36m"]; // bright - cyan + [m_codes_fg addObject:@"1;37m"]; // bright - white + + [m_codes_bg addObject:@"40m"]; // normal - black + [m_codes_bg addObject:@"41m"]; // normal - red + [m_codes_bg addObject:@"42m"]; // normal - green + [m_codes_bg addObject:@"43m"]; // normal - yellow + [m_codes_bg addObject:@"44m"]; // normal - blue + [m_codes_bg addObject:@"45m"]; // normal - magenta + [m_codes_bg addObject:@"46m"]; // normal - cyan + [m_codes_bg addObject:@"47m"]; // normal - gray + [m_codes_bg addObject:@"1;40m"]; // bright - darkgray + [m_codes_bg addObject:@"1;41m"]; // bright - red + [m_codes_bg addObject:@"1;42m"]; // bright - green + [m_codes_bg addObject:@"1;43m"]; // bright - yellow + [m_codes_bg addObject:@"1;44m"]; // bright - blue + [m_codes_bg addObject:@"1;45m"]; // bright - magenta + [m_codes_bg addObject:@"1;46m"]; // bright - cyan + [m_codes_bg addObject:@"1;47m"]; // bright - white + +#if MAP_TO_TERMINAL_APP_COLORS + + // Standard Terminal.app colors: + // + // These are the default colors used by Apple's Terminal.app. + + [m_colors addObject:MakeColor( 0, 0, 0)]; // normal - black + [m_colors addObject:MakeColor(194, 54, 33)]; // normal - red + [m_colors addObject:MakeColor( 37, 188, 36)]; // normal - green + [m_colors addObject:MakeColor(173, 173, 39)]; // normal - yellow + [m_colors addObject:MakeColor( 73, 46, 225)]; // normal - blue + [m_colors addObject:MakeColor(211, 56, 211)]; // normal - magenta + [m_colors addObject:MakeColor( 51, 187, 200)]; // normal - cyan + [m_colors addObject:MakeColor(203, 204, 205)]; // normal - gray + [m_colors addObject:MakeColor(129, 131, 131)]; // bright - darkgray + [m_colors addObject:MakeColor(252, 57, 31)]; // bright - red + [m_colors addObject:MakeColor( 49, 231, 34)]; // bright - green + [m_colors addObject:MakeColor(234, 236, 35)]; // bright - yellow + [m_colors addObject:MakeColor( 88, 51, 255)]; // bright - blue + [m_colors addObject:MakeColor(249, 53, 248)]; // bright - magenta + [m_colors addObject:MakeColor( 20, 240, 240)]; // bright - cyan + [m_colors addObject:MakeColor(233, 235, 235)]; // bright - white + +#else + + // Standard xterm colors: + // + // These are the default colors used by most xterm shells. + + [m_colors addObject:MakeColor( 0, 0, 0)]; // normal - black + [m_colors addObject:MakeColor(205, 0, 0)]; // normal - red + [m_colors addObject:MakeColor( 0, 205, 0)]; // normal - green + [m_colors addObject:MakeColor(205, 205, 0)]; // normal - yellow + [m_colors addObject:MakeColor( 0, 0, 238)]; // normal - blue + [m_colors addObject:MakeColor(205, 0, 205)]; // normal - magenta + [m_colors addObject:MakeColor( 0, 205, 205)]; // normal - cyan + [m_colors addObject:MakeColor(229, 229, 229)]; // normal - gray + [m_colors addObject:MakeColor(127, 127, 127)]; // bright - darkgray + [m_colors addObject:MakeColor(255, 0, 0)]; // bright - red + [m_colors addObject:MakeColor( 0, 255, 0)]; // bright - green + [m_colors addObject:MakeColor(255, 255, 0)]; // bright - yellow + [m_colors addObject:MakeColor( 92, 92, 255)]; // bright - blue + [m_colors addObject:MakeColor(255, 0, 255)]; // bright - magenta + [m_colors addObject:MakeColor( 0, 255, 255)]; // bright - cyan + [m_colors addObject:MakeColor(255, 255, 255)]; // bright - white + +#endif + + codes_fg = [m_codes_fg copy]; + codes_bg = [m_codes_bg copy]; + colors = [m_colors copy]; + + NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)"); + NSAssert([codes_fg count] == [colors count], @"Invalid colors/codes array(s)"); +} + +/** + * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 256 color mode. + * + * This method is used when the application is running from within a shell that supports 256 color mode. + * This method is not invoked if the application is running within Xcode, or via normal UI app launch. +**/ ++ (void)initialize_colors_256 +{ + if (codes_fg || codes_bg || colors) return; + + NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:(256-16)]; + NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:(256-16)]; + NSMutableArray *m_colors = [NSMutableArray arrayWithCapacity:(256-16)]; + + #if MAP_TO_TERMINAL_APP_COLORS + + // Standard Terminal.app colors: + // + // These are the colors the Terminal.app uses in xterm-256color mode. + // In this mode, the terminal supports 256 different colors, specified by 256 color codes. + // + // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode. + // These are actually configurable, and thus we ignore them for the purposes of mapping, + // as we can't rely on them being constant. They are largely duplicated anyway. + // + // The next 216 color codes are designed to run the spectrum, with several shades of every color. + // While the color codes are standardized, the actual RGB values for each color code is not. + // Apple's Terminal.app uses different RGB values from that of a standard xterm. + // Apple's choices in colors are designed to be a little nicer on the eyes. + // + // The last 24 color codes represent a grayscale. + // + // Unfortunately, unlike the standard xterm color chart, + // Apple's RGB values cannot be calculated using a simple formula (at least not that I know of). + // Also, I don't know of any ways to programmatically query the shell for the RGB values. + // So this big giant color chart had to be made by hand. + // + // More information about ansi escape codes can be found online. + // http://en.wikipedia.org/wiki/ANSI_escape_code + + // Colors + + [m_colors addObject:MakeColor( 47, 49, 49)]; + [m_colors addObject:MakeColor( 60, 42, 144)]; + [m_colors addObject:MakeColor( 66, 44, 183)]; + [m_colors addObject:MakeColor( 73, 46, 222)]; + [m_colors addObject:MakeColor( 81, 50, 253)]; + [m_colors addObject:MakeColor( 88, 51, 255)]; + + [m_colors addObject:MakeColor( 42, 128, 37)]; + [m_colors addObject:MakeColor( 42, 127, 128)]; + [m_colors addObject:MakeColor( 44, 126, 169)]; + [m_colors addObject:MakeColor( 56, 125, 209)]; + [m_colors addObject:MakeColor( 59, 124, 245)]; + [m_colors addObject:MakeColor( 66, 123, 255)]; + + [m_colors addObject:MakeColor( 51, 163, 41)]; + [m_colors addObject:MakeColor( 39, 162, 121)]; + [m_colors addObject:MakeColor( 42, 161, 162)]; + [m_colors addObject:MakeColor( 53, 160, 202)]; + [m_colors addObject:MakeColor( 45, 159, 240)]; + [m_colors addObject:MakeColor( 58, 158, 255)]; + + [m_colors addObject:MakeColor( 31, 196, 37)]; + [m_colors addObject:MakeColor( 48, 196, 115)]; + [m_colors addObject:MakeColor( 39, 195, 155)]; + [m_colors addObject:MakeColor( 49, 195, 195)]; + [m_colors addObject:MakeColor( 32, 194, 235)]; + [m_colors addObject:MakeColor( 53, 193, 255)]; + + [m_colors addObject:MakeColor( 50, 229, 35)]; + [m_colors addObject:MakeColor( 40, 229, 109)]; + [m_colors addObject:MakeColor( 27, 229, 149)]; + [m_colors addObject:MakeColor( 49, 228, 189)]; + [m_colors addObject:MakeColor( 33, 228, 228)]; + [m_colors addObject:MakeColor( 53, 227, 255)]; + + [m_colors addObject:MakeColor( 27, 254, 30)]; + [m_colors addObject:MakeColor( 30, 254, 103)]; + [m_colors addObject:MakeColor( 45, 254, 143)]; + [m_colors addObject:MakeColor( 38, 253, 182)]; + [m_colors addObject:MakeColor( 38, 253, 222)]; + [m_colors addObject:MakeColor( 42, 253, 252)]; + + [m_colors addObject:MakeColor(140, 48, 40)]; + [m_colors addObject:MakeColor(136, 51, 136)]; + [m_colors addObject:MakeColor(135, 52, 177)]; + [m_colors addObject:MakeColor(134, 52, 217)]; + [m_colors addObject:MakeColor(135, 56, 248)]; + [m_colors addObject:MakeColor(134, 53, 255)]; + + [m_colors addObject:MakeColor(125, 125, 38)]; + [m_colors addObject:MakeColor(124, 125, 125)]; + [m_colors addObject:MakeColor(122, 124, 166)]; + [m_colors addObject:MakeColor(123, 124, 207)]; + [m_colors addObject:MakeColor(123, 122, 247)]; + [m_colors addObject:MakeColor(124, 121, 255)]; + + [m_colors addObject:MakeColor(119, 160, 35)]; + [m_colors addObject:MakeColor(117, 160, 120)]; + [m_colors addObject:MakeColor(117, 160, 160)]; + [m_colors addObject:MakeColor(115, 159, 201)]; + [m_colors addObject:MakeColor(116, 158, 240)]; + [m_colors addObject:MakeColor(117, 157, 255)]; + + [m_colors addObject:MakeColor(113, 195, 39)]; + [m_colors addObject:MakeColor(110, 194, 114)]; + [m_colors addObject:MakeColor(111, 194, 154)]; + [m_colors addObject:MakeColor(108, 194, 194)]; + [m_colors addObject:MakeColor(109, 193, 234)]; + [m_colors addObject:MakeColor(108, 192, 255)]; + + [m_colors addObject:MakeColor(105, 228, 30)]; + [m_colors addObject:MakeColor(103, 228, 109)]; + [m_colors addObject:MakeColor(105, 228, 148)]; + [m_colors addObject:MakeColor(100, 227, 188)]; + [m_colors addObject:MakeColor( 99, 227, 227)]; + [m_colors addObject:MakeColor( 99, 226, 253)]; + + [m_colors addObject:MakeColor( 92, 253, 34)]; + [m_colors addObject:MakeColor( 96, 253, 103)]; + [m_colors addObject:MakeColor( 97, 253, 142)]; + [m_colors addObject:MakeColor( 88, 253, 182)]; + [m_colors addObject:MakeColor( 93, 253, 221)]; + [m_colors addObject:MakeColor( 88, 254, 251)]; + + [m_colors addObject:MakeColor(177, 53, 34)]; + [m_colors addObject:MakeColor(174, 54, 131)]; + [m_colors addObject:MakeColor(172, 55, 172)]; + [m_colors addObject:MakeColor(171, 57, 213)]; + [m_colors addObject:MakeColor(170, 55, 249)]; + [m_colors addObject:MakeColor(170, 57, 255)]; + + [m_colors addObject:MakeColor(165, 123, 37)]; + [m_colors addObject:MakeColor(163, 123, 123)]; + [m_colors addObject:MakeColor(162, 123, 164)]; + [m_colors addObject:MakeColor(161, 122, 205)]; + [m_colors addObject:MakeColor(161, 121, 241)]; + [m_colors addObject:MakeColor(161, 121, 255)]; + + [m_colors addObject:MakeColor(158, 159, 33)]; + [m_colors addObject:MakeColor(157, 158, 118)]; + [m_colors addObject:MakeColor(157, 158, 159)]; + [m_colors addObject:MakeColor(155, 157, 199)]; + [m_colors addObject:MakeColor(155, 157, 239)]; + [m_colors addObject:MakeColor(154, 156, 255)]; + + [m_colors addObject:MakeColor(152, 193, 40)]; + [m_colors addObject:MakeColor(151, 193, 113)]; + [m_colors addObject:MakeColor(150, 193, 153)]; + [m_colors addObject:MakeColor(150, 192, 193)]; + [m_colors addObject:MakeColor(148, 192, 232)]; + [m_colors addObject:MakeColor(149, 191, 253)]; + + [m_colors addObject:MakeColor(146, 227, 28)]; + [m_colors addObject:MakeColor(144, 227, 108)]; + [m_colors addObject:MakeColor(144, 227, 147)]; + [m_colors addObject:MakeColor(144, 227, 187)]; + [m_colors addObject:MakeColor(142, 226, 227)]; + [m_colors addObject:MakeColor(142, 225, 252)]; + + [m_colors addObject:MakeColor(138, 253, 36)]; + [m_colors addObject:MakeColor(137, 253, 102)]; + [m_colors addObject:MakeColor(136, 253, 141)]; + [m_colors addObject:MakeColor(138, 254, 181)]; + [m_colors addObject:MakeColor(135, 255, 220)]; + [m_colors addObject:MakeColor(133, 255, 250)]; + + [m_colors addObject:MakeColor(214, 57, 30)]; + [m_colors addObject:MakeColor(211, 59, 126)]; + [m_colors addObject:MakeColor(209, 57, 168)]; + [m_colors addObject:MakeColor(208, 55, 208)]; + [m_colors addObject:MakeColor(207, 58, 247)]; + [m_colors addObject:MakeColor(206, 61, 255)]; + + [m_colors addObject:MakeColor(204, 121, 32)]; + [m_colors addObject:MakeColor(202, 121, 121)]; + [m_colors addObject:MakeColor(201, 121, 161)]; + [m_colors addObject:MakeColor(200, 120, 202)]; + [m_colors addObject:MakeColor(200, 120, 241)]; + [m_colors addObject:MakeColor(198, 119, 255)]; + + [m_colors addObject:MakeColor(198, 157, 37)]; + [m_colors addObject:MakeColor(196, 157, 116)]; + [m_colors addObject:MakeColor(195, 156, 157)]; + [m_colors addObject:MakeColor(195, 156, 197)]; + [m_colors addObject:MakeColor(194, 155, 236)]; + [m_colors addObject:MakeColor(193, 155, 255)]; + + [m_colors addObject:MakeColor(191, 192, 36)]; + [m_colors addObject:MakeColor(190, 191, 112)]; + [m_colors addObject:MakeColor(189, 191, 152)]; + [m_colors addObject:MakeColor(189, 191, 191)]; + [m_colors addObject:MakeColor(188, 190, 230)]; + [m_colors addObject:MakeColor(187, 190, 253)]; + + [m_colors addObject:MakeColor(185, 226, 28)]; + [m_colors addObject:MakeColor(184, 226, 106)]; + [m_colors addObject:MakeColor(183, 225, 146)]; + [m_colors addObject:MakeColor(183, 225, 186)]; + [m_colors addObject:MakeColor(182, 225, 225)]; + [m_colors addObject:MakeColor(181, 224, 252)]; + + [m_colors addObject:MakeColor(178, 255, 35)]; + [m_colors addObject:MakeColor(178, 255, 101)]; + [m_colors addObject:MakeColor(177, 254, 141)]; + [m_colors addObject:MakeColor(176, 254, 180)]; + [m_colors addObject:MakeColor(176, 254, 220)]; + [m_colors addObject:MakeColor(175, 253, 249)]; + + [m_colors addObject:MakeColor(247, 56, 30)]; + [m_colors addObject:MakeColor(245, 57, 122)]; + [m_colors addObject:MakeColor(243, 59, 163)]; + [m_colors addObject:MakeColor(244, 60, 204)]; + [m_colors addObject:MakeColor(242, 59, 241)]; + [m_colors addObject:MakeColor(240, 55, 255)]; + + [m_colors addObject:MakeColor(241, 119, 36)]; + [m_colors addObject:MakeColor(240, 120, 118)]; + [m_colors addObject:MakeColor(238, 119, 158)]; + [m_colors addObject:MakeColor(237, 119, 199)]; + [m_colors addObject:MakeColor(237, 118, 238)]; + [m_colors addObject:MakeColor(236, 118, 255)]; + + [m_colors addObject:MakeColor(235, 154, 36)]; + [m_colors addObject:MakeColor(235, 154, 114)]; + [m_colors addObject:MakeColor(234, 154, 154)]; + [m_colors addObject:MakeColor(232, 154, 194)]; + [m_colors addObject:MakeColor(232, 153, 234)]; + [m_colors addObject:MakeColor(232, 153, 255)]; + + [m_colors addObject:MakeColor(230, 190, 30)]; + [m_colors addObject:MakeColor(229, 189, 110)]; + [m_colors addObject:MakeColor(228, 189, 150)]; + [m_colors addObject:MakeColor(227, 189, 190)]; + [m_colors addObject:MakeColor(227, 189, 229)]; + [m_colors addObject:MakeColor(226, 188, 255)]; + + [m_colors addObject:MakeColor(224, 224, 35)]; + [m_colors addObject:MakeColor(223, 224, 105)]; + [m_colors addObject:MakeColor(222, 224, 144)]; + [m_colors addObject:MakeColor(222, 223, 184)]; + [m_colors addObject:MakeColor(222, 223, 224)]; + [m_colors addObject:MakeColor(220, 223, 253)]; + + [m_colors addObject:MakeColor(217, 253, 28)]; + [m_colors addObject:MakeColor(217, 253, 99)]; + [m_colors addObject:MakeColor(216, 252, 139)]; + [m_colors addObject:MakeColor(216, 252, 179)]; + [m_colors addObject:MakeColor(215, 252, 218)]; + [m_colors addObject:MakeColor(215, 251, 250)]; + + [m_colors addObject:MakeColor(255, 61, 30)]; + [m_colors addObject:MakeColor(255, 60, 118)]; + [m_colors addObject:MakeColor(255, 58, 159)]; + [m_colors addObject:MakeColor(255, 56, 199)]; + [m_colors addObject:MakeColor(255, 55, 238)]; + [m_colors addObject:MakeColor(255, 59, 255)]; + + [m_colors addObject:MakeColor(255, 117, 29)]; + [m_colors addObject:MakeColor(255, 117, 115)]; + [m_colors addObject:MakeColor(255, 117, 155)]; + [m_colors addObject:MakeColor(255, 117, 195)]; + [m_colors addObject:MakeColor(255, 116, 235)]; + [m_colors addObject:MakeColor(254, 116, 255)]; + + [m_colors addObject:MakeColor(255, 152, 27)]; + [m_colors addObject:MakeColor(255, 152, 111)]; + [m_colors addObject:MakeColor(254, 152, 152)]; + [m_colors addObject:MakeColor(255, 152, 192)]; + [m_colors addObject:MakeColor(254, 151, 231)]; + [m_colors addObject:MakeColor(253, 151, 253)]; + + [m_colors addObject:MakeColor(255, 187, 33)]; + [m_colors addObject:MakeColor(253, 187, 107)]; + [m_colors addObject:MakeColor(252, 187, 148)]; + [m_colors addObject:MakeColor(253, 187, 187)]; + [m_colors addObject:MakeColor(254, 187, 227)]; + [m_colors addObject:MakeColor(252, 186, 252)]; + + [m_colors addObject:MakeColor(252, 222, 34)]; + [m_colors addObject:MakeColor(251, 222, 103)]; + [m_colors addObject:MakeColor(251, 222, 143)]; + [m_colors addObject:MakeColor(250, 222, 182)]; + [m_colors addObject:MakeColor(251, 221, 222)]; + [m_colors addObject:MakeColor(252, 221, 252)]; + + [m_colors addObject:MakeColor(251, 252, 15)]; + [m_colors addObject:MakeColor(251, 252, 97)]; + [m_colors addObject:MakeColor(249, 252, 137)]; + [m_colors addObject:MakeColor(247, 252, 177)]; + [m_colors addObject:MakeColor(247, 253, 217)]; + [m_colors addObject:MakeColor(254, 255, 255)]; + + // Grayscale + + [m_colors addObject:MakeColor( 52, 53, 53)]; + [m_colors addObject:MakeColor( 57, 58, 59)]; + [m_colors addObject:MakeColor( 66, 67, 67)]; + [m_colors addObject:MakeColor( 75, 76, 76)]; + [m_colors addObject:MakeColor( 83, 85, 85)]; + [m_colors addObject:MakeColor( 92, 93, 94)]; + + [m_colors addObject:MakeColor(101, 102, 102)]; + [m_colors addObject:MakeColor(109, 111, 111)]; + [m_colors addObject:MakeColor(118, 119, 119)]; + [m_colors addObject:MakeColor(126, 127, 128)]; + [m_colors addObject:MakeColor(134, 136, 136)]; + [m_colors addObject:MakeColor(143, 144, 145)]; + + [m_colors addObject:MakeColor(151, 152, 153)]; + [m_colors addObject:MakeColor(159, 161, 161)]; + [m_colors addObject:MakeColor(167, 169, 169)]; + [m_colors addObject:MakeColor(176, 177, 177)]; + [m_colors addObject:MakeColor(184, 185, 186)]; + [m_colors addObject:MakeColor(192, 193, 194)]; + + [m_colors addObject:MakeColor(200, 201, 202)]; + [m_colors addObject:MakeColor(208, 209, 210)]; + [m_colors addObject:MakeColor(216, 218, 218)]; + [m_colors addObject:MakeColor(224, 226, 226)]; + [m_colors addObject:MakeColor(232, 234, 234)]; + [m_colors addObject:MakeColor(240, 242, 242)]; + + // Color codes + + int index = 16; + + while (index < 256) + { + [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; + [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; + + index++; + } + + #else + + // Standard xterm colors: + // + // These are the colors xterm shells use in xterm-256color mode. + // In this mode, the shell supports 256 different colors, specified by 256 color codes. + // + // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode. + // These are generally configurable, and thus we ignore them for the purposes of mapping, + // as we can't rely on them being constant. They are largely duplicated anyway. + // + // The next 216 color codes are designed to run the spectrum, with several shades of every color. + // The last 24 color codes represent a grayscale. + // + // While the color codes are standardized, the actual RGB values for each color code is not. + // However most standard xterms follow a well known color chart, + // which can easily be calculated using the simple formula below. + // + // More information about ansi escape codes can be found online. + // http://en.wikipedia.org/wiki/ANSI_escape_code + + int index = 16; + + int r; // red + int g; // green + int b; // blue + + int ri; // r increment + int gi; // g increment + int bi; // b increment + + // Calculate xterm colors (using standard algorithm) + + int r = 0; + int g = 0; + int b = 0; + + for (ri = 0; ri < 6; ri++) + { + r = (ri == 0) ? 0 : 95 + (40 * (ri - 1)); + + for (gi = 0; gi < 6; gi++) + { + g = (gi == 0) ? 0 : 95 + (40 * (gi - 1)); + + for (bi = 0; bi < 6; bi++) + { + b = (bi == 0) ? 0 : 95 + (40 * (bi - 1)); + + [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; + [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; + [m_colors addObject:MakeColor(r, g, b)]; + + index++; + } + } + } + + // Calculate xterm grayscale (using standard algorithm) + + r = 8; + g = 8; + b = 8; + + while (index < 256) + { + [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; + [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; + [m_colors addObject:MakeColor(r, g, b)]; + + r += 10; + g += 10; + b += 10; + + index++; + } + + #endif + + codes_fg = [m_codes_fg copy]; + codes_bg = [m_codes_bg copy]; + colors = [m_colors copy]; + + NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)"); + NSAssert([codes_fg count] == [colors count], @"Invalid colors/codes array(s)"); +} + ++ (void)getRed:(CGFloat *)rPtr green:(CGFloat *)gPtr blue:(CGFloat *)bPtr fromColor:(OSColor *)color +{ + #if TARGET_OS_IPHONE + + // iOS + + if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) + { + [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL]; + } + else + { + // The method getRed:green:blue:alpha: was only available starting iOS 5. + // So in iOS 4 and earlier, we have to jump through hoops. + + CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); + + unsigned char pixel[4]; + CGContextRef context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, rgbColorSpace, kCGImageAlphaNoneSkipLast); + + CGContextSetFillColorWithColor(context, [color CGColor]); + CGContextFillRect(context, CGRectMake(0, 0, 1, 1)); + + if (rPtr) { *rPtr = pixel[0] / 255.0f; } + if (gPtr) { *gPtr = pixel[1] / 255.0f; } + if (bPtr) { *bPtr = pixel[2] / 255.0f; } + + CGContextRelease(context); + CGColorSpaceRelease(rgbColorSpace); + } + + #else + + // Mac OS X + + [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL]; + + #endif +} + +/** + * Maps the given color to the closest available color supported by the shell. + * The shell may support 256 colors, or only 16. + * + * This method loops through the known supported color set, and calculates the closest color. + * The array index of that color, within the colors array, is then returned. + * This array index may also be used as the index within the codes_fg and codes_bg arrays. +**/ ++ (NSUInteger)codeIndexForColor:(OSColor *)inColor +{ + CGFloat inR, inG, inB; + [self getRed:&inR green:&inG blue:&inB fromColor:inColor]; + + NSUInteger bestIndex = 0; + CGFloat lowestDistance = 100.0f; + + NSUInteger i = 0; + for (OSColor *color in colors) + { + // Calculate Euclidean distance (lower value means closer to given color) + + CGFloat r, g, b; + [self getRed:&r green:&g blue:&b fromColor:color]; + + #if CGFLOAT_IS_DOUBLE + CGFloat distance = sqrt(pow(r-inR, 2.0) + pow(g-inG, 2.0) + pow(b-inB, 2.0)); + #else + CGFloat distance = sqrtf(powf(r-inR, 2.0f) + powf(g-inG, 2.0f) + powf(b-inB, 2.0f)); + #endif + + NSLogVerbose(@"DDTTYLogger: %3lu : %.3f,%.3f,%.3f & %.3f,%.3f,%.3f = %.6f", + (unsigned long)i, inR, inG, inB, r, g, b, distance); + + if (distance < lowestDistance) + { + bestIndex = i; + lowestDistance = distance; + + NSLogVerbose(@"DDTTYLogger: New best index = %lu", (unsigned long)bestIndex); + } + + i++; + } + + return bestIndex; +} + +/** + * The runtime sends initialize to each class in a program exactly one time just before the class, + * or any class that inherits from it, is sent its first message from within the program. (Thus the + * method may never be invoked if the class is not used.) The runtime sends the initialize message to + * classes in a thread-safe manner. Superclasses receive this message before their subclasses. + * + * This method may also be called directly (assumably by accident), hence the safety mechanism. +**/ ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + + isaTTY = isatty(STDERR_FILENO); + + char *term = getenv("TERM"); + if (term) + { + if (strcasestr(term, "color") != NULL) + { + isaColorTTY = YES; + isaColor256TTY = (strcasestr(term, "256") != NULL); + + if (isaColor256TTY) + [self initialize_colors_256]; + else + [self initialize_colors_16]; + } + } + else + { + // Xcode does NOT natively support colors in the Xcode debugging console. + // You'll need to install the XcodeColors plugin to see colors in the Xcode console. + // + // PS - Please read the header file before diving into the source code. + + char *xcode_colors = getenv("XcodeColors"); + if (xcode_colors && (strcmp(xcode_colors, "YES") == 0)) + { + isaXcodeColorTTY = YES; + } + } + + NSLogInfo(@"DDTTYLogger: isaColorTTY = %@", (isaColorTTY ? @"YES" : @"NO")); + NSLogInfo(@"DDTTYLogger: isaColor256TTY: %@", (isaColor256TTY ? @"YES" : @"NO")); + NSLogInfo(@"DDTTYLogger: isaXcodeColorTTY: %@", (isaXcodeColorTTY ? @"YES" : @"NO")); + + sharedInstance = [[DDTTYLogger alloc] init]; + } +} + ++ (DDTTYLogger *)sharedInstance +{ + return sharedInstance; +} + +- (id)init +{ + if (sharedInstance != nil) + { + return nil; + } + + if ((self = [super init])) + { + if (isaTTY) + { + calendar = [NSCalendar autoupdatingCurrentCalendar]; + + calendarUnitFlags = 0; + calendarUnitFlags |= NSYearCalendarUnit; + calendarUnitFlags |= NSMonthCalendarUnit; + calendarUnitFlags |= NSDayCalendarUnit; + calendarUnitFlags |= NSHourCalendarUnit; + calendarUnitFlags |= NSMinuteCalendarUnit; + calendarUnitFlags |= NSSecondCalendarUnit; + + // Initialze 'app' variable (char *) + + appName = [[NSProcessInfo processInfo] processName]; + + appLen = [appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + app = (char *)malloc(appLen + 1); + + [appName getCString:app maxLength:(appLen+1) encoding:NSUTF8StringEncoding]; + + // Initialize 'pid' variable (char *) + + processID = [NSString stringWithFormat:@"%i", (int)getpid()]; + + pidLen = [processID lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + pid = (char *)malloc(pidLen + 1); + + [processID getCString:pid maxLength:(pidLen+1) encoding:NSUTF8StringEncoding]; + + // Initialize color stuff + + colorsEnabled = NO; + colorProfilesArray = [[NSMutableArray alloc] initWithCapacity:8]; + colorProfilesDict = [[NSMutableDictionary alloc] initWithCapacity:8]; + } + } + return self; +} + +- (void)loadDefaultColorProfiles +{ + [self setForegroundColor:MakeColor(214, 57, 30) backgroundColor:nil forFlag:LOG_FLAG_ERROR]; + [self setForegroundColor:MakeColor(204, 121, 32) backgroundColor:nil forFlag:LOG_FLAG_WARN]; +} + +- (BOOL)colorsEnabled +{ + // The design of this method is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + return colorsEnabled; + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + __block BOOL result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(loggerQueue, ^{ + result = colorsEnabled; + }); + }); + + return result; + } +} + +- (void)setColorsEnabled:(BOOL)newColorsEnabled +{ + dispatch_block_t block = ^{ @autoreleasepool { + + colorsEnabled = newColorsEnabled; + + if ([colorProfilesArray count] == 0) { + [self loadDefaultColorProfiles]; + } + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask +{ + [self setForegroundColor:txtColor backgroundColor:bgColor forFlag:mask context:0]; +} + +- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask context:(int)ctxt +{ + dispatch_block_t block = ^{ @autoreleasepool { + + DDTTYLoggerColorProfile *newColorProfile = + [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor + backgroundColor:bgColor + flag:mask + context:ctxt]; + + NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile); + + NSUInteger i = 0; + for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray) + { + if ((colorProfile->mask == mask) && (colorProfile->context == ctxt)) + { + break; + } + + i++; + } + + if (i < [colorProfilesArray count]) + [colorProfilesArray replaceObjectAtIndex:i withObject:newColorProfile]; + else + [colorProfilesArray addObject:newColorProfile]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forTag:(id )tag +{ + NSAssert([(id )tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag"); + + dispatch_block_t block = ^{ @autoreleasepool { + + DDTTYLoggerColorProfile *newColorProfile = + [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor + backgroundColor:bgColor + flag:0 + context:0]; + + NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile); + + [colorProfilesDict setObject:newColorProfile forKey:tag]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)clearColorsForFlag:(int)mask +{ + [self clearColorsForFlag:mask context:0]; +} + +- (void)clearColorsForFlag:(int)mask context:(int)context +{ + dispatch_block_t block = ^{ @autoreleasepool { + + NSUInteger i = 0; + for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray) + { + if ((colorProfile->mask == mask) && (colorProfile->context == context)) + { + break; + } + + i++; + } + + if (i < [colorProfilesArray count]) + { + [colorProfilesArray removeObjectAtIndex:i]; + } + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)clearColorsForTag:(id )tag +{ + NSAssert([(id )tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag"); + + dispatch_block_t block = ^{ @autoreleasepool { + + [colorProfilesDict removeObjectForKey:tag]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)clearColorsForAllFlags +{ + dispatch_block_t block = ^{ @autoreleasepool { + + [colorProfilesArray removeAllObjects]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)clearColorsForAllTags +{ + dispatch_block_t block = ^{ @autoreleasepool { + + [colorProfilesDict removeAllObjects]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)clearAllColors +{ + dispatch_block_t block = ^{ @autoreleasepool { + + [colorProfilesArray removeAllObjects]; + [colorProfilesDict removeAllObjects]; + }}; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + dispatch_queue_t currentQueue = dispatch_get_current_queue(); + if (currentQueue == loggerQueue) + { + block(); + } + else + { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(currentQueue != globalLoggingQueue, @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(loggerQueue, block); + }); + } +} + +- (void)logMessage:(DDLogMessage *)logMessage +{ + if (!isaTTY) return; + + NSString *logMsg = logMessage->logMsg; + BOOL isFormatted = NO; + + if (formatter) + { + logMsg = [formatter formatLogMessage:logMessage]; + isFormatted = logMsg != logMessage->logMsg; + } + + if (logMsg) + { + // Search for a color profile associated with the log message + + DDTTYLoggerColorProfile *colorProfile = nil; + + if (colorsEnabled) + { + if (logMessage->tag) + { + colorProfile = [colorProfilesDict objectForKey:logMessage->tag]; + } + if (colorProfile == nil) + { + for (DDTTYLoggerColorProfile *cp in colorProfilesArray) + { + if ((logMessage->logFlag & cp->mask) && (logMessage->logContext == cp->context)) + { + colorProfile = cp; + break; + } + } + } + } + + // Convert log message to C string. + // + // We use the stack instead of the heap for speed if possible. + // But we're extra cautious to avoid a stack overflow. + + NSUInteger msgLen = [logMsg lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + const BOOL useStack = msgLen < (1024 * 4); + + char msgStack[useStack ? (msgLen + 1) : 1]; // Analyzer doesn't like zero-size array, hence the 1 + char *msg = useStack ? msgStack : (char *)malloc(msgLen + 1); + + [logMsg getCString:msg maxLength:(msgLen + 1) encoding:NSUTF8StringEncoding]; + + // Write the log message to STDERR + + if (isFormatted) + { + // The log message has already been formatted. + + struct iovec v[4]; + + if (colorProfile) + { + v[0].iov_base = colorProfile->fgCode; + v[0].iov_len = colorProfile->fgCodeLen; + + v[3].iov_base = colorProfile->resetCode; + v[3].iov_len = colorProfile->resetCodeLen; + } + else + { + v[0].iov_base = ""; + v[0].iov_len = 0; + + v[3].iov_base = ""; + v[3].iov_len = 0; + } + + v[1].iov_base = (char *)msg; + v[1].iov_len = msgLen; + + v[2].iov_base = "\n"; + v[2].iov_len = (msg[msgLen] == '\n') ? 0 : 1; + + writev(STDERR_FILENO, v, 4); + } + else + { + // The log message is unformatted, so apply standard NSLog style formatting. + + int len; + + // Calculate timestamp. + // The technique below is faster than using NSDateFormatter. + + NSDateComponents *components = [calendar components:calendarUnitFlags fromDate:logMessage->timestamp]; + + NSTimeInterval epoch = [logMessage->timestamp timeIntervalSinceReferenceDate]; + int milliseconds = (int)((epoch - floor(epoch)) * 1000); + + char ts[24]; + len = snprintf(ts, 24, "%04ld-%02ld-%02ld %02ld:%02ld:%02ld:%03d", // yyyy-MM-dd HH:mm:ss:SSS + (long)components.year, + (long)components.month, + (long)components.day, + (long)components.hour, + (long)components.minute, + (long)components.second, milliseconds); + + size_t tsLen = MIN(24-1, len); + + // Calculate thread ID + // + // How many characters do we need for the thread id? + // logMessage->machThreadID is of type mach_port_t, which is an unsigned int. + // + // 1 hex char = 4 bits + // 8 hex chars for 32 bit, plus ending '\0' = 9 + + char tid[9]; + len = snprintf(tid, 9, "%x", logMessage->machThreadID); + + size_t tidLen = MIN(9-1, len); + + // Here is our format: "%s %s[%i:%s] %s", timestamp, appName, processID, threadID, logMsg + + struct iovec v[12]; + + if (colorProfile) + { + v[0].iov_base = colorProfile->fgCode; + v[0].iov_len = colorProfile->fgCodeLen; + + v[11].iov_base = colorProfile->resetCode; + v[11].iov_len = colorProfile->resetCodeLen; + } + else + { + v[0].iov_base = ""; + v[0].iov_len = 0; + + v[11].iov_base = ""; + v[11].iov_len = 0; + } + + v[1].iov_base = ts; + v[1].iov_len = tsLen; + + v[2].iov_base = " "; + v[2].iov_len = 1; + + v[3].iov_base = app; + v[3].iov_len = appLen; + + v[4].iov_base = "["; + v[4].iov_len = 1; + + v[5].iov_base = pid; + v[5].iov_len = pidLen; + + v[6].iov_base = ":"; + v[6].iov_len = 1; + + v[7].iov_base = tid; + v[7].iov_len = MIN((size_t)8, tidLen); // snprintf doesn't return what you might think + + v[8].iov_base = "] "; + v[8].iov_len = 2; + + v[9].iov_base = (char *)msg; + v[9].iov_len = msgLen; + + v[10].iov_base = "\n"; + v[10].iov_len = (msg[msgLen] == '\n') ? 0 : 1; + + writev(STDERR_FILENO, v, 12); + } + + if (!useStack) { + free(msg); + } + } +} + +- (NSString *)loggerName +{ + return @"cocoa.lumberjack.ttyLogger"; +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation DDTTYLoggerColorProfile + +- (id)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)aMask context:(int)ctxt +{ + if ((self = [super init])) + { + mask = aMask; + context = ctxt; + + CGFloat r, g, b; + + if (fgColor) + { + [DDTTYLogger getRed:&r green:&g blue:&b fromColor:fgColor]; + + fg_r = (uint8_t)(r * 255.0f); + fg_g = (uint8_t)(g * 255.0f); + fg_b = (uint8_t)(b * 255.0f); + } + if (bgColor) + { + [DDTTYLogger getRed:&r green:&g blue:&b fromColor:bgColor]; + + bg_r = (uint8_t)(r * 255.0f); + bg_g = (uint8_t)(g * 255.0f); + bg_b = (uint8_t)(b * 255.0f); + } + + if (fgColor && isaColorTTY) + { + // Map foreground color to closest available shell color + + fgCodeIndex = [DDTTYLogger codeIndexForColor:fgColor]; + fgCodeRaw = [codes_fg objectAtIndex:fgCodeIndex]; + + NSString *escapeSeq = @"\033["; + + NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSUInteger len2 = [fgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [escapeSeq getCString:(fgCode) maxLength:(len1+1) encoding:NSUTF8StringEncoding]; + [fgCodeRaw getCString:(fgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding]; + + fgCodeLen = len1+len2; + } + else if (fgColor && isaXcodeColorTTY) + { + // Convert foreground color to color code sequence + + const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ; + + int result = snprintf(fgCode, 24, "%sfg%u,%u,%u;", escapeSeq, fg_r, fg_g, fg_b); + fgCodeLen = MIN(result, (24-1)); + } + else + { + // No foreground color or no color support + + fgCode[0] = '\0'; + fgCodeLen = 0; + } + + if (bgColor && isaColorTTY) + { + // Map background color to closest available shell color + + bgCodeIndex = [DDTTYLogger codeIndexForColor:bgColor]; + bgCodeRaw = [codes_bg objectAtIndex:bgCodeIndex]; + + NSString *escapeSeq = @"\033["; + + NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSUInteger len2 = [bgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [escapeSeq getCString:(bgCode) maxLength:(len1+1) encoding:NSUTF8StringEncoding]; + [bgCodeRaw getCString:(bgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding]; + + bgCodeLen = len1+len2; + } + else if (bgColor && isaXcodeColorTTY) + { + // Convert background color to color code sequence + + const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ; + + int result = snprintf(bgCode, 24, "%sbg%u,%u,%u;", escapeSeq, bg_r, bg_g, bg_b); + bgCodeLen = MIN(result, (24-1)); + } + else + { + // No background color or no color support + + bgCode[0] = '\0'; + bgCodeLen = 0; + } + + if (isaColorTTY) + { + resetCodeLen = snprintf(resetCode, 8, "\033[0m"); + } + else if (isaXcodeColorTTY) + { + resetCodeLen = snprintf(resetCode, 8, XCODE_COLORS_RESET); + } + else + { + resetCode[0] = '\0'; + resetCodeLen = 0; + } + } + return self; +} + +- (NSString *)description +{ + return [NSString stringWithFormat: + @"", + self, mask, context, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b, fgCodeRaw, bgCodeRaw]; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Notifications.h b/Tools/XcodeCapp/XcodeCapp/Notifications.h new file mode 100644 index 000000000..b5478399a --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Notifications.h @@ -0,0 +1,19 @@ +// +// Notifications.h +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#ifndef XcodeCapp_Notifications_h +#define XcodeCapp_Notifications_h + +extern NSString * const XCCProjectDidFinishLoadingNotification; +extern NSString * const XCCBatchDidStartNotification; +extern NSString * const XCCBatchDidEndNotification; +extern NSString * const XCCConversionDidStartNotification; +extern NSString * const XCCConversionDidEndNotification; +extern NSString * const XCCConversionDidGenerateErrorNotification; + +#endif diff --git a/Tools/XcodeCapp/XcodeCapp/Notifications.m b/Tools/XcodeCapp/XcodeCapp/Notifications.m new file mode 100644 index 000000000..b8df14b4f --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Notifications.m @@ -0,0 +1,17 @@ +// +// Notifications.m +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// +// + +#include "Notifications.h" + + +NSString * const XCCProjectDidFinishLoadingNotification = @"XCCProjectDidFinishLoadingNotification"; +NSString * const XCCBatchDidStartNotification = @"XCCBatchDidStartNotification"; +NSString * const XCCBatchDidEndNotification = @"XCCBatchDidEndNotification"; +NSString * const XCCConversionDidStartNotification = @"XCCConversionDidStartNotification"; +NSString * const XCCConversionDidEndNotification = @"XCCConversionDidStopNotification"; +NSString * const XCCConversionDidGenerateErrorNotification = @"XCCConversionDidGenerateErrorNotification"; \ No newline at end of file diff --git a/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.h b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.h new file mode 100644 index 000000000..e8254ddd4 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.h @@ -0,0 +1,19 @@ +// +// ProcessSourceOperation.h +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +@class XcodeCapp; + + +@interface ProcessSourceOperation : NSOperation + +// sourcePath should be a path within the project (no resolved symlinks) +- (id)initWithXCC:(XcodeCapp *)xcc projectId:(NSNumber *)projectId sourcePath:(NSString *)sourcePath; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m new file mode 100644 index 000000000..e40530853 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m @@ -0,0 +1,200 @@ +// +// ProcessSourceOperation.m +// XcodeCapp +// +// Created by Aparajita on 4/27/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import "ProcessSourceOperation.h" +#import "Notifications.h" +#import "XcodeCapp.h" + + +@interface ProcessSourceOperation () + +@property XcodeCapp *xcc; +@property NSNumber *projectId; +@property NSString *sourcePath; +@property NSString *projectPath; + +@end + + +@implementation ProcessSourceOperation + +- (id)initWithXCC:(XcodeCapp *)xcc projectId:(NSNumber *)projectId sourcePath:(NSString *)sourcePath +{ + self = [super init]; + + if (self) + { + self.xcc = xcc; + self.projectId = projectId; + self.sourcePath = sourcePath; + self.projectPath = xcc.projectPath; + } + + return self; +} + +- (void)main +{ + if (self.isCancelled) + return; + + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + NSDictionary *info = @{ @"projectId":self.projectId, @"path":self.sourcePath }; + [center postNotificationName:XCCConversionDidStartNotification object:self userInfo:info]; + + DDLogVerbose(@"Conversion started: %@", self.sourcePath); + + NSString *launchPath = nil; + NSArray *arguments = nil; + NSString *response = nil; + NSString *projectRelativePath = [self.sourcePath substringFromIndex:self.projectPath.length + 1]; + NSString *notificationTitle = nil; + NSString *notificationMessage = projectRelativePath.lastPathComponent; + + if ([self.xcc isXibFile:self.sourcePath]) + { + launchPath = self.xcc.executablePaths[@"nib2cib"]; + arguments = @[ + @"--no-colors", + self.sourcePath + ]; + + notificationTitle = @"Xib converted"; + } + else if ([self.xcc isObjjFile:self.sourcePath]) + { + launchPath = self.xcc.executablePaths[@"objj"]; + arguments = @[ + self.xcc.parserPath, + self.projectPath, + self.sourcePath + ]; + + notificationTitle = @"Objective-J source processed"; + } + else if ([self.xcc isXCCIgnoreFile:self.sourcePath]) + { + if (self.isCancelled) + return; + + [self.xcc performSelectorOnMainThread:@selector(computeIgnoredPaths) withObject:nil waitUntilDone:NO]; + + notificationTitle = @"Parsed .xcodecapp-ignore"; + notificationMessage = @"Ignored paths updated"; + } + + // Run the task and get the response if needed + NSInteger status = 0; + + if (arguments) + { + if (self.isCancelled) + return; + + DDLogVerbose(@"Running processing task: %@", launchPath); + + NSDictionary *taskResult = [self.xcc runTaskWithLaunchPath:launchPath + arguments:arguments + returnType:kTaskReturnTypeAny]; + + status = [taskResult[@"status"] intValue]; + response = taskResult[@"response"]; + + DDLogInfo(@"Processed %@: [%ld, %@]", self.sourcePath, status, status ? response : @""); + + if (self.isCancelled) + return; + + if (status != 0) + { + if ([self.xcc isXibFile:self.sourcePath]) + { + if (response.length == 0) + response = @"An unspecified error occurred"; + + notificationTitle = @"Error converting xib"; + NSString *message = [NSString stringWithFormat:@"%@\n%@", self.sourcePath.lastPathComponent, response]; + + NSDictionary *info = + @{ + @"projectId":self.projectId, + @"message":message, + @"path":self.sourcePath, + @"status":taskResult[@"status"] + }; + + if (self.isCancelled) + return; + + [center postNotificationName:XCCConversionDidGenerateErrorNotification object:self userInfo:info]; + } + else + { + notificationTitle = [(status == XCCStatusCodeError ? @"Error" : @"Warning") stringByAppendingString:@" parsing Objective-J source"]; + + @try + { + NSArray *errors = [response propertyList]; + + for (NSDictionary *error in errors) + { + [self postErrorNotificationForPath:error[@"path"] line:[error[@"line"] intValue] message:error[@"message"] status:status]; + } + } + @catch (NSException *exception) + { + [self postErrorNotificationForPath:self.sourcePath line:0 message:response status:status]; + } + } + + [self notifyUserWithTitle:notificationTitle message:notificationMessage]; + } + else if (!self.xcc.isLoadingProject) + { + [self notifyUserWithTitle:notificationTitle message:notificationMessage]; + } + } + + if (!self.isCancelled) + { + DDLogVerbose(@"Conversion ended: %@", self.sourcePath); + + [center postNotificationName:XCCConversionDidEndNotification object:self userInfo:@{ @"projectId":self.projectId, @"path":self.sourcePath }]; + } +} + +- (void)postErrorNotificationForPath:(NSString *)path line:(int)line message:(NSString *)message status:(NSInteger)status +{ + NSMutableDictionary *info = [NSMutableDictionary dictionaryWithObjectsAndKeys: + path, @"path", + [NSNumber numberWithInt:line], @"line", + [NSNumber numberWithInteger:status], @"status", + nil]; + + info[@"projectId"] = self.projectId; + info[@"message"] = [NSString stringWithFormat:@"%@, line %d\n%@", [self.sourcePath lastPathComponent], 0, message]; + + if (self.isCancelled) + return; + + [[NSNotificationCenter defaultCenter] postNotificationName:XCCConversionDidGenerateErrorNotification object:self userInfo:info]; +} + +- (void)notifyUserWithTitle:(NSString *)title message:(NSString *)message +{ + NSDictionary *info = @{ @"projectId":self.projectId, @"title":title, @"message":message }; + + if (self.isCancelled) + return; + + // nib2cib can take a while to run, show a message while the conversion is happening + [self.xcc wantUserNotificationWithInfo:info]; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Release.xcconfig b/Tools/XcodeCapp/XcodeCapp/Release.xcconfig new file mode 100644 index 000000000..047a9cf0d --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Release.xcconfig @@ -0,0 +1,41 @@ +// +// Release.xcconfig +// XcodeCapp +// +// Created by Aparajita on 4/18/13. +// +// + +//:configuration = Release +ARCHS = $(ARCHS_STANDARD_64_BIT) +SDKROOT = macosx +ONLY_ACTIVE_ARCH = YES +DEBUG_INFORMATION_FORMAT = dwarf +COMBINE_HIDPI_IMAGES = YES +INSTALL_PATH = $(LOCAL_APPS_DIR) +MACOSX_DEPLOYMENT_TARGET = 10.6.8 +COPY_PHASE_STRIP = YES +INFOPLIST_FILE = XcodeCapp/Info.plist +PRODUCT_NAME = XcodeCapp +ALWAYS_SEARCH_USER_PATHS = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SRCROOT)/XcodeCapp" +GCC_OPTIMIZATION_LEVEL = s +CLANG_ENABLE_OBJC_ARC = YES +GCC_PRECOMPILE_PREFIX_HEADER = YES +GCC_PREFIX_HEADER = XcodeCapp/XcodeCapp-Prefix.pch +GCC_PREPROCESSOR_DEFINITIONS = +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_UNUSED_VARIABLE = YES +WRAPPER_EXTENSION = app +GCC_C_LANGUAGE_STANDARD = gnu99 +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x +CLANG_CXX_LIBRARY = libc++ +CLANG_WARN_EMPTY_BODY = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +GCC_WARN_64_TO_32_BIT_CONVERSION = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_INT_CONVERSION = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES +GCC_WARN_UNUSED_VARIABLE = YES +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages new file mode 100644 index 000000000..73b168d3f Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128.psd new file mode 100644 index 000000000..f9b147f49 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128@2x.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128@2x.psd new file mode 100644 index 000000000..9e8acc137 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_128x128@2x.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16.psd new file mode 100644 index 000000000..6ecca284b Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16@2x.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16@2x.psd new file mode 100644 index 000000000..de7233474 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_16x16@2x.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256.psd new file mode 100644 index 000000000..e51922d81 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256@2x.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256@2x.psd new file mode 100644 index 000000000..14e0b7bc4 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_256x256@2x.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32.psd new file mode 100644 index 000000000..de7233474 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32@2x.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32@2x.psd new file mode 100644 index 000000000..7bfbf9dbc Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_32x32@2x.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512.psd new file mode 100644 index 000000000..d74c37eed Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512@2x.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512@2x.psd new file mode 100644 index 000000000..b20fc47dc Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp icons/icon_512x512@2x.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp-status-icons.psd b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp-status-icons.psd new file mode 100644 index 000000000..79c2a012a Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp-status-icons.psd differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.icns b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.icns new file mode 100644 index 000000000..628a931f0 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.icns differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128.png new file mode 100644 index 000000000..ae7b61b39 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128@2x.png new file mode 100644 index 000000000..2828424ba Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_128x128@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16.png new file mode 100644 index 000000000..2d980b6e6 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16@2x.png new file mode 100644 index 000000000..d852f1502 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_16x16@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256.png new file mode 100644 index 000000000..2828424ba Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256@2x.png new file mode 100644 index 000000000..5459552f2 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_256x256@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32.png new file mode 100644 index 000000000..d852f1502 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32@2x.png new file mode 100644 index 000000000..d90892068 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_32x32@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512.png new file mode 100644 index 000000000..8428a569f Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512@2x.png new file mode 100644 index 000000000..8b2cc8ce7 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp.iconset/icon_512x512@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf b/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf new file mode 100644 index 000000000..550ba1d08 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-active.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-active.png new file mode 100644 index 000000000..3d8fd512c Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-active.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-active@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-active@2x.png new file mode 100644 index 000000000..63189ad30 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-active@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-error.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-error.png new file mode 100644 index 000000000..1686d61eb Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-error.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-error@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-error@2x.png new file mode 100644 index 000000000..c91c63304 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-error@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive.png new file mode 100644 index 000000000..526d15262 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive@2x.png new file mode 100644 index 000000000..dab411e5f Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-inactive@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-working.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-working.png new file mode 100644 index 000000000..537e5d6f9 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-working.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon-working@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon-working@2x.png new file mode 100644 index 000000000..24007f775 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon-working@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128.png new file mode 100644 index 000000000..ae7b61b39 Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128@2x.png b/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128@2x.png new file mode 100644 index 000000000..2828424ba Binary files /dev/null and b/Tools/XcodeCapp/XcodeCapp/Resources/icon_128x128@2x.png differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/project.pbxproj b/Tools/XcodeCapp/XcodeCapp/Resources/project.pbxproj new file mode 100644 index 000000000..717e5dcd2 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Resources/project.pbxproj @@ -0,0 +1,72 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXFileReference section */ + E164FE29172185F500263CE3 /* Resources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Resources; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + E164FE221721857400263CE3 = { + isa = PBXGroup; + children = ( + E164FE29172185F500263CE3 /* Resources */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXProject section */ + E164FE231721857400263CE3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0460; + }; + buildConfigurationList = E164FE261721857400263CE3 /* Build configuration list for PBXProject "Cappuccino" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = E164FE221721857400263CE3; + projectDirPath = ""; + projectRoot = ""; + targets = ( + ); + }; +/* End PBXProject section */ + +/* Begin XCBuildConfiguration section */ + E164FE271721857400263CE3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + E164FE281721857400263CE3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E164FE261721857400263CE3 /* Build configuration list for PBXProject "Cappuccino" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E164FE271721857400263CE3 /* Debug */, + E164FE281721857400263CE3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E164FE231721857400263CE3 /* Project object */; +} diff --git a/Tools/XcodeCapp/mod_pbxproj.py b/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py similarity index 56% rename from Tools/XcodeCapp/mod_pbxproj.py rename to Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py index c7aaed2fc..f5c8d4a77 100755 --- a/Tools/XcodeCapp/mod_pbxproj.py +++ b/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py @@ -1,16 +1,16 @@ # Copyright 2012 Calvin Rien # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # A pbxproj file is an OpenStep format plist # {} represents dictionary of key=value pairs delimited by ; @@ -32,11 +32,22 @@ # the pbxproj file. Plutil is available in OS X 10.2 and higher # Plutil can't write OpenStep plists, so I save as XML -import re, uuid, sys, os, shutil, subprocess, datetime, json +import datetime +import json +import ntpath +import os +import plistlib +import re +import shutil +import subprocess +import uuid from UserDict import IterableUserDict from UserList import UserList +regex = '[a-zA-Z0-9\\._/-]*' + + class PBXEncoder(json.JSONEncoder): def default(self, obj): @@ -51,7 +62,7 @@ class PBXEncoder(json.JSONEncoder): class PBXDict(IterableUserDict): def __init__(self, d=None): if d: - d = dict([(PBXType.Convert(k),PBXType.Convert(v)) for k,v in d.items()]) + d = dict([(PBXType.Convert(k), PBXType.Convert(v)) for k, v in d.items()]) IterableUserDict.__init__(self, d) @@ -62,7 +73,6 @@ class PBXDict(IterableUserDict): self.data.pop(PBXType.Convert(key), None) - class PBXList(UserList): def __init__(self, l=None): if isinstance(l, basestring): @@ -97,7 +107,7 @@ class PBXType(PBXDict): def __init__(self, d=None): PBXDict.__init__(self, d) - if not self.has_key('isa'): + if 'isa' not in self: self['isa'] = self.__class__.__name__ self.id = None @@ -140,18 +150,20 @@ class PBXFileReference(PBXType): self.build_phase = None types = { - '.a':('archive.ar', 'PBXFrameworksBuildPhase'), + '.a': ('archive.ar', 'PBXFrameworksBuildPhase'), '.app': ('wrapper.application', None), '.s': ('sourcecode.asm', 'PBXSourcesBuildPhase'), '.c': ('sourcecode.c.c', 'PBXSourcesBuildPhase'), '.cpp': ('sourcecode.cpp.cpp', 'PBXSourcesBuildPhase'), - '.framework': ('wrapper.framework','PBXFrameworksBuildPhase'), + '.framework': ('wrapper.framework', 'PBXFrameworksBuildPhase'), '.h': ('sourcecode.c.h', None), - '.icns': ('image.icns','PBXResourcesBuildPhase'), + '.icns': ('image.icns', 'PBXResourcesBuildPhase'), '.m': ('sourcecode.c.objc', 'PBXSourcesBuildPhase'), + '.j': ('sourcecode.c.objc', 'PBXSourcesBuildPhase'), '.mm': ('sourcecode.cpp.objcpp', 'PBXSourcesBuildPhase'), '.nib': ('wrapper.nib', 'PBXResourcesBuildPhase'), '.plist': ('text.plist.xml', 'PBXResourcesBuildPhase'), + '.json': ('text.json', 'PBXResourcesBuildPhase'), '.png': ('image.png', 'PBXResourcesBuildPhase'), '.rtf': ('text.rtf', 'PBXResourcesBuildPhase'), '.tiff': ('image.tiff', 'PBXResourcesBuildPhase'), @@ -164,25 +176,30 @@ class PBXFileReference(PBXType): } trees = [ - '', - '', - 'BUILT_PRODUCTS_DIR', - 'DEVELOPER_DIR', - 'SDKROOT', - 'SOURCE_ROOT', - ] + '', + '', + 'BUILT_PRODUCTS_DIR', + 'DEVELOPER_DIR', + 'SDKROOT', + 'SOURCE_ROOT', + ] - def guess_file_type(self): + def guess_file_type(self, ignore_unknown_type=False): self.remove('explicitFileType') self.remove('lastKnownFileType') - ext = os.path.splitext(self.get('name', ''))[1] - f_type, build_phase = PBXFileReference.types.get(ext, ('?', None)) + if os.path.isdir(self.get('path')): + f_type = 'folder' + build_phase = None + ext = '' + else: + ext = os.path.splitext(self.get('name', ''))[1] + f_type, build_phase = PBXFileReference.types.get(ext, ('?', None)) self['lastKnownFileType'] = f_type self.build_phase = build_phase - if f_type == '?': + if f_type == '?' and not ignore_unknown_type: print 'unknown file extension: %s' % ext print 'please add extension and Xcode type to PBXFileReference.types' @@ -195,7 +212,7 @@ class PBXFileReference(PBXType): self['explicitFileType'] = ft @classmethod - def Create(cls, os_path, tree='SOURCE_ROOT'): + def Create(cls, os_path, tree='SOURCE_ROOT', ignore_unknown_type=False): if tree not in cls.trees: print 'Not a valid sourceTree type: %s' % tree return None @@ -205,10 +222,11 @@ class PBXFileReference(PBXType): fr['path'] = os_path fr['name'] = os.path.split(os_path)[1] fr['sourceTree'] = '' if os.path.isabs(os_path) else tree - fr.guess_file_type() + fr.guess_file_type(ignore_unknown_type=ignore_unknown_type) return fr + class PBXBuildFile(PBXType): def set_weak_link(self, weak=False): k_settings = 'settings' @@ -218,7 +236,7 @@ class PBXBuildFile(PBXType): if not s: if weak: - self[k_settings] = PBXDict({k_attributes:PBXList(['Weak'])}) + self[k_settings] = PBXDict({k_attributes: PBXList(['Weak'])}) return True @@ -243,10 +261,10 @@ class PBXBuildFile(PBXType): k_settings = 'settings' k_attributes = 'COMPILER_FLAGS' - if not self.has_key(k_settings): + if k_settings not in self: self[k_settings] = PBXDict() - if not self[k_settings].has_key(k_attributes): + if k_attributes not in self[k_settings]: self[k_settings][k_attributes] = flag return True @@ -273,6 +291,7 @@ class PBXBuildFile(PBXType): return bf + class PBXGroup(PBXType): def add_child(self, ref): if not isinstance(ref, PBXDict): @@ -283,7 +302,7 @@ class PBXGroup(PBXType): if isa != 'PBXFileReference' and isa != 'PBXGroup': return None - if not self.has_key('children'): + if 'children' not in self: self['children'] = PBXList() self['children'].add(ref.id) @@ -291,7 +310,7 @@ class PBXGroup(PBXType): return ref.id def remove_child(self, id): - if not self.has_key('children'): + if 'children' not in self: self['children'] = PBXList() return @@ -301,7 +320,7 @@ class PBXGroup(PBXType): self['children'].remove(id) def has_child(self, id): - if not self.has_key('children'): + if 'children' not in self: self['children'] = PBXList() return False @@ -311,7 +330,7 @@ class PBXGroup(PBXType): return id in self['children'] def get_name(self): - path_name = os.path.split(self.get('path',''))[1] + path_name = os.path.split(self.get('path', ''))[1] return self.get('name', path_name) @classmethod @@ -350,12 +369,16 @@ class PBXVariantGroup(PBXType): pass +class PBXTargetDependency(PBXType): + pass + + class PBXBuildPhase(PBXType): def add_build_file(self, bf): if bf.get('isa') != 'PBXBuildFile': return False - if not self.has_key('files'): + if 'files' not in self: self['files'] = PBXList() self['files'].add(bf.id) @@ -363,14 +386,14 @@ class PBXBuildPhase(PBXType): return True def remove_build_file(self, id): - if not self.has_key('files'): + if 'files' not in self: self['files'] = PBXList() return self['files'].remove(id) def has_build_file(self, id): - if not self.has_key('files'): + if 'files' not in self: self['files'] = PBXList() return False @@ -401,26 +424,30 @@ class PBXCopyFilesBuildPhase(PBXBuildPhase): class XCBuildConfiguration(PBXType): - def add_search_paths(self, paths, base, key, recursive=True): + def add_search_paths(self, paths, base, key, recursive=True, escape=True): modified = False if not isinstance(paths, list): paths = [paths] - if not self.has_key(base): + if base not in self: self[base] = PBXDict() for path in paths: if recursive and not path.endswith('/**'): path = os.path.join(path, '**') - if not self[base].has_key(key): + if key not in self[base]: self[base][key] = PBXList() elif isinstance(self[base][key], basestring): self[base][key] = PBXList(self[base][key]) - if self[base][key].add('\\"%s\\"' % path): - modified = True + if escape: + if self[base][key].add('\\"%s\\"' % path): # '\\"%s\\"' % path + modified = True + else: + if self[base][key].add(path): # '\\"%s\\"' % path + modified = True return modified @@ -430,6 +457,9 @@ class XCBuildConfiguration(PBXType): def add_library_search_paths(self, paths, recursive=True): return self.add_search_paths(paths, 'buildSettings', 'LIBRARY_SEARCH_PATHS', recursive=recursive) + def add_framework_search_paths(self, paths, recursive=True): + return self.add_search_paths(paths, 'buildSettings', 'FRAMEWORK_SEARCH_PATHS', recursive=recursive, escape=False) + def add_other_cflags(self, flags): modified = False @@ -439,12 +469,11 @@ class XCBuildConfiguration(PBXType): if isinstance(flags, basestring): flags = PBXList(flags) - if not self.has_key(base): + if base not in self: self[base] = PBXDict() for flag in flags: - - if not self[base].has_key(key): + if key not in self[base]: self[base][key] = PBXList() elif isinstance(self[base][key], basestring): self[base][key] = PBXList(self[base][key]) @@ -455,6 +484,52 @@ class XCBuildConfiguration(PBXType): return modified + def add_other_ldflags(self, flags): + modified = False + + base = 'buildSettings' + key = 'OTHER_LDFLAGS' + + if isinstance(flags, basestring): + flags = PBXList(flags) + + if base not in self: + self[base] = PBXDict() + + for flag in flags: + if key not in self[base]: + self[base][key] = PBXList() + elif isinstance(self[base][key], basestring): + self[base][key] = PBXList(self[base][key]) + + if self[base][key].add(flag): + self[base][key] = [e for e in self[base][key] if e] + modified = True + + return modified + + def remove_other_ldflags(self, flags): + modified = False + + base = 'buildSettings' + key = 'OTHER_LDFLAGS' + + if isinstance(flags, basestring): + flags = PBXList(flags) + + if base in self: # there are flags, so we can "remove" something + for flag in flags: + if key not in self[base]: + return False + elif isinstance(self[base][key], basestring): + self[base][key] = PBXList(self[base][key]) + + if self[base][key].remove(flag): + self[base][key] = [e for e in self[base][key] if e] + modified = True + + return modified + class XCConfigurationList(PBXType): pass @@ -468,7 +543,7 @@ class XcodeProject(PBXDict): if not path: path = os.path.join(os.getcwd(), 'project.pbxproj') - self.pbxproj_path =os.path.abspath(path) + self.pbxproj_path = os.path.abspath(path) self.source_root = os.path.abspath(os.path.join(os.path.split(path)[0], '..')) IterableUserDict.__init__(self, d) @@ -478,6 +553,7 @@ class XcodeProject(PBXDict): self.modified = False root_id = self.get('rootObject') + if root_id: self.root_object = self.objects[root_id] root_group_id = self.root_object.get('mainGroup') @@ -487,7 +563,7 @@ class XcodeProject(PBXDict): self.root_object = None self.root_group = None - for k,v in self.objects.iteritems(): + for k, v in self.objects.iteritems(): v.id = k def add_other_cflags(self, flags): @@ -497,6 +573,20 @@ class XcodeProject(PBXDict): if b.add_other_cflags(flags): self.modified = True + def add_other_ldflags(self, flags): + build_configs = [b for b in self.objects.values() if b.get('isa') == 'XCBuildConfiguration'] + + for b in build_configs: + if b.add_other_ldflags(flags): + self.modified = True + + def remove_other_ldflags(self, flags): + build_configs = [b for b in self.objects.values() if b.get('isa') == 'XCBuildConfiguration'] + + for b in build_configs: + if b.remove_other_ldflags(flags): + self.modified = True + def add_header_search_paths(self, paths, recursive=True): build_configs = [b for b in self.objects.values() if b.get('isa') == 'XCBuildConfiguration'] @@ -504,6 +594,13 @@ class XcodeProject(PBXDict): if b.add_header_search_paths(paths, recursive): self.modified = True + def add_framework_search_paths(self, paths, recursive=True): + build_configs = [b for b in self.objects.values() if b.get('isa') == 'XCBuildConfiguration'] + + for b in build_configs: + if b.add_framework_search_paths(paths, recursive): + self.modified = True + def add_library_search_paths(self, paths, recursive=True): build_configs = [b for b in self.objects.values() if b.get('isa') == 'XCBuildConfiguration'] @@ -511,42 +608,46 @@ class XcodeProject(PBXDict): if b.add_library_search_paths(paths, recursive): self.modified = True - # TODO: need to return value if project has been modified + # TODO: need to return value if project has been modified def get_obj(self, id): return self.objects.get(id) + def get_ids(self): + return self.objects.keys() + def get_files_by_os_path(self, os_path, tree='SOURCE_ROOT'): files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference' - and f.get('path') == os_path] + and f.get('path') == os_path + and f.get('sourceTree') == tree] return files def get_files_by_name(self, name, parent=None): if parent: files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference' - and f.get(name) == name - and parent.has_child(f)] + and f.get(name) == name + and parent.has_child(f)] else: files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference' - and f.get(name) == name] + and f.get(name) == name] return files def get_build_files(self, id): files = [f for f in self.objects.values() if f.get('isa') == 'PBXBuildFile' - and f.get('fileRef') == id] + and f.get('fileRef') == id] return files def get_groups_by_name(self, name, parent=None): if parent: groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup' - and g.get_name() == name - and parent.has_child(g)] + and g.get_name() == name + and parent.has_child(g)] else: groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup' - and g.get_name() == name] + and g.get_name() == name] return groups @@ -579,7 +680,7 @@ class XcodeProject(PBXDict): path = os.path.abspath(path) groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup' - and os.path.abspath(g.get('path','/dev/null')) == path] + and os.path.abspath(g.get('path', '/dev/null')) == path] return groups @@ -618,7 +719,7 @@ class XcodeProject(PBXDict): # assume it's an id parent = self.objects.get(parent, self.root_group) - path_dict = {os.path.split(os_path)[0]:parent} + path_dict = {os.path.split(os_path)[0]: parent} special_list = [] for (grp_path, subdirs, files) in os.walk(os_path): @@ -635,7 +736,6 @@ class XcodeProject(PBXDict): if os.path.splitext(grp_path)[1] in XcodeProject.special_folders: # if this file has a special extension (bundle or framework mainly) treat it as a file special_list.append(grp_path) - new_files = self.verify_files([folder_name], parent=parent) if new_files: @@ -644,7 +744,7 @@ class XcodeProject(PBXDict): continue # create group - grp = self.get_or_create_group(folder_name, path=self.get_relative_path(grp_path) , parent=parent) + grp = self.get_or_create_group(folder_name, path=self.get_relative_path(grp_path), parent=parent) path_dict[grp_path] = grp results.append(grp) @@ -652,7 +752,7 @@ class XcodeProject(PBXDict): file_dict = {} for f in files: - if f[0] == '.' or [m for m in excludes if re.match(m,f)]: + if f[0] == '.' or [m for m in excludes if re.match(m, f)]: continue kwds = { @@ -667,7 +767,7 @@ class XcodeProject(PBXDict): new_files = self.verify_files([n.get('name') for n in file_dict.values()], parent=grp) - add_files = [(k,v) for k,v in file_dict.items() if v.get('name') in new_files] + add_files = [(k, v) for k, v in file_dict.items() if v.get('name') in new_files] for path, kwds in add_files: kwds.pop('name', None) @@ -682,9 +782,20 @@ class XcodeProject(PBXDict): return results - def add_file(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False): - results = [] + def path_leaf(self, path): + head, tail = ntpath.split(path) + return tail or ntpath.basename(head) + def add_file_if_doesnt_exist(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=False): + for obj in self.objects.values(): + if 'path' in obj: + if self.path_leaf(f_path) == self.path_leaf(obj.get('path')): + return [] + + return self.add_file(f_path, parent, tree, create_build_files, weak, ignore_unknown_type=ignore_unknown_type) + + def add_file(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=False): + results = [] abs_path = '' if os.path.isabs(f_path): @@ -703,9 +814,10 @@ class XcodeProject(PBXDict): # assume it's an id parent = self.objects.get(parent, self.root_group) - file_ref = PBXFileReference.Create(f_path, tree) + file_ref = PBXFileReference.Create(f_path, tree, ignore_unknown_type=ignore_unknown_type) parent.add_child(file_ref) results.append(file_ref) + # create a build file for the file ref if file_ref.build_phase and create_build_files: phases = self.get_build_phases(file_ref.build_phase) @@ -716,13 +828,18 @@ class XcodeProject(PBXDict): phase.add_build_file(build_file) results.append(build_file) - if abs_path and tree == 'SOURCE_ROOT' and os.path.isfile(abs_path)\ - and file_ref.build_phase == 'PBXFrameworksBuildPhase': - + if abs_path and tree == 'SOURCE_ROOT' \ + and os.path.isfile(abs_path) \ + and file_ref.build_phase == 'PBXFrameworksBuildPhase': library_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0]) - self.add_library_search_paths([library_path], recursive=False) + if abs_path and tree == 'SOURCE_ROOT' \ + and not os.path.isfile(abs_path) \ + and file_ref.build_phase == 'PBXFrameworksBuildPhase': + framework_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0]) + self.add_framework_search_paths([framework_path, '$(inherited)'], recursive=False) + for r in results: self.objects[r.id] = r @@ -731,14 +848,44 @@ class XcodeProject(PBXDict): return results + def check_and_repair_framework(self, base): + name = os.path.basename(base) + + if ".framework" in name: + basename = name[:-len(".framework")] + + finalHeaders = os.path.join(base, "Headers") + finalCurrent = os.path.join(base, "Versions/Current") + finalLib = os.path.join(base, basename) + srcHeaders = "Versions/A/Headers" + srcCurrent = "A" + srcLib = "Versions/A/" + basename + + if not os.path.exists(finalHeaders): + os.symlink(srcHeaders, finalHeaders) + if not os.path.exists(finalCurrent): + os.symlink(srcCurrent, finalCurrent) + if not os.path.exists(finalLib): + os.symlink(srcLib, finalLib) + def remove_group(self, grp): pass - def remove_file(self, path, parent): - files = self.get_files_by_os_path(path) - for r in files: - del self.objects[r.id] - self.modified = True + def remove_file(self, id, recursive=True): + if not PBXType.IsGuid(id): + id = id.id + + if id in self.objects: + self.objects.remove(id) + + if recursive: + groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup'] + + for group in groups: + if id in group['children']: + group.remove_child(id) + + self.modified = True def move_file(self, id, dest_grp=None): pass @@ -750,7 +897,7 @@ class XcodeProject(PBXDict): print 'applying "%s" to "%s"' % (patch_path, xcode_path) - return subprocess.call(['patch', '-p1', '--forward', '--directory=%s'%xcode_path, '--input=%s'%patch_path]) + return subprocess.call(['patch', '-p1', '--forward', '--directory=%s' % xcode_path, '--input=%s' % patch_path]) def apply_mods(self, mod_dict, default_path=None): if not default_path: @@ -760,7 +907,6 @@ class XcodeProject(PBXDict): for k in keys: v = mod_dict.pop(k) - mod_dict[k.lower()] = v parent = mod_dict.pop('group', None) @@ -775,7 +921,7 @@ class XcodeProject(PBXDict): compiler_flags = mod_dict.pop('compiler_flags', {}) - for k,v in mod_dict.items(): + for k, v in mod_dict.items(): if k == 'patches': for p in v: if not os.path.isabs(p): @@ -822,7 +968,6 @@ class XcodeProject(PBXDict): continue p = self.get_relative_path(p) - paths.append(os.path.join('$(SRCROOT)', p, "**")) if k == 'headerpaths': @@ -831,6 +976,8 @@ class XcodeProject(PBXDict): self.add_library_search_paths(paths) elif k == 'other_cflags': self.add_other_cflags(v) + elif k == 'other_ldflags': + self.add_other_ldflags(v) elif k == 'libs' or k == 'frameworks' or k == 'files': paths = {} @@ -847,7 +994,7 @@ class XcodeProject(PBXDict): file_path = os.path.join(default_path, p) search_path, file_name = os.path.split(file_path) - if [m for m in excludes if re.match(m,file_name)]: + if [m for m in excludes if re.match(m, file_name)]: continue try: @@ -859,10 +1006,10 @@ class XcodeProject(PBXDict): file_list = os.listdir(search_path) for f in file_list: - if [m for m in excludes if re.match(m,f)]: + if [m for m in excludes if re.match(m, f)]: continue - if re.search(expr,f): + if re.search(expr, f): kwds['name'] = f paths[os.path.join(search_path, f)] = kwds p = None @@ -876,10 +1023,10 @@ class XcodeProject(PBXDict): kwds['name'] = file_name if k == 'libs': - p = os.path.join('usr','lib',p) + p = os.path.join('usr', 'lib', p) kwds['tree'] = 'SDKROOT' elif k == 'frameworks': - p = os.path.join('System','Library','Frameworks',p) + p = os.path.join('System', 'Library', 'Frameworks', p) kwds['tree'] = 'SDKROOT' elif k == 'files' and not os.path.exists(file_path): # don't add non-existent files to the project. @@ -888,49 +1035,237 @@ class XcodeProject(PBXDict): paths[p] = kwds new_files = self.verify_files([n.get('name') for n in paths.values()]) - - add_files = [(k,v) for k,v in paths.items() if v.get('name') in new_files] + add_files = [(k, v) for k, v in paths.items() if v.get('name') in new_files] for path, kwds in add_files: kwds.pop('name', None) - if not kwds.has_key('parent') and parent: + if 'parent' not in kwds and parent: kwds['parent'] = parent self.add_file(path, **kwds) if compiler_flags: - for k,v in compiler_flags.items(): + for k, v in compiler_flags.items(): filerefs = [] for f in v: filerefs.extend([fr.id for fr in self.objects.values() if fr.get('isa') == 'PBXFileReference' - and fr.get('name') == f]) - + and fr.get('name') == f]) buildfiles = [bf for bf in self.objects.values() if bf.get('isa') == 'PBXBuildFile' - and bf.get('fileRef') in filerefs] + and bf.get('fileRef') in filerefs] for bf in buildfiles: if bf.add_compiler_flag(k): self.modified = True - - def backup(self, file_name=None): + def backup(self, file_name=None, backup_name=None): if not file_name: file_name = self.pbxproj_path - backup_name = "%s.%s.backup" % (file_name, datetime.datetime.now().strftime('%d%m%y-%H%M%S')) + if not backup_name: + backup_name = "%s.%s.backup" % (file_name, datetime.datetime.now().strftime('%d%m%y-%H%M%S')) shutil.copy2(file_name, backup_name) def save(self, file_name=None): + """Saves in old (xml) format""" if not file_name: file_name = self.pbxproj_path - # JSON serialize the project and convert that json to an xml plist - p = subprocess.Popen([XcodeProject.plutil_path, '-convert', 'xml1', '-o', file_name, '-'], stdin=subprocess.PIPE) - p.communicate(PBXEncoder().encode(self.data)) + # This code is adapted from plistlib.writePlist + with open(file_name, "w") as f: + writer = PBXWriter(f) + writer.writeln("") + writer.writeValue(self.data) + writer.writeln("") + + def saveFormat3_2(self, file_name=None): + """Save in Xcode 3.2 compatible (new) format""" + if not file_name: + file_name = self.pbxproj_path + + # process to get the section's info and names + objs = self.data.get('objects') + sections = dict() + uuids = dict() + + for key in objs: + l = list() + + if objs.get(key).get('isa') in sections: + l = sections.get(objs.get(key).get('isa')) + + l.append(tuple([key, objs.get(key)])) + sections[objs.get(key).get('isa')] = l + + if 'name' in objs.get(key): + uuids[key] = objs.get(key).get('name') + elif 'path' in objs.get(key): + uuids[key] = objs.get(key).get('path') + else: + if objs.get(key).get('isa') == 'PBXProject': + uuids[objs.get(key).get('buildConfigurationList')] = 'Build configuration list for PBXProject "Unity-iPhone"' + elif objs.get(key).get('isa')[0:3] == 'PBX': + uuids[key] = objs.get(key).get('isa')[3:-10] + else: + uuids[key] = 'Build configuration list for PBXNativeTarget "TARGET_NAME"' + + ro = self.data.get('rootObject') + uuids[ro] = 'Project Object' + + for key in objs: + # transitive references (used in the BuildFile section) + if 'fileRef' in objs.get(key) and objs.get(key).get('fileRef') in uuids: + uuids[key] = uuids[objs.get(key).get('fileRef')] + + # transitive reference to the target name (used in the Native target section) + if objs.get(key).get('isa') == 'PBXNativeTarget': + uuids[objs.get(key).get('buildConfigurationList')] = uuids[objs.get(key).get('buildConfigurationList')].replace('TARGET_NAME', uuids[key]) + + self.uuids = uuids + self.sections = sections + + out = open(file_name, 'w') + out.write('// !$*UTF8*$!\n') + self._printNewXCodeFormat(out, self.data, '', enters=True) + out.close() + + @classmethod + def addslashes(cls, s): + d = {'"': '\\"', "'": "\\'", "\0": "\\\0", "\\": "\\\\"} + return ''.join(d.get(c, c) for c in s) + + def _printNewXCodeFormat(self, out, root, deep, enters=True): + if isinstance(root, IterableUserDict): + out.write('{') + + if enters: + out.write('\n') + + isa = root.pop('isa', '') + + if isa != '': # keep the isa in the first spot + if enters: + out.write('\t' + deep) + + out.write('isa = ') + self._printNewXCodeFormat(out, isa, '\t' + deep, enters=enters) + out.write(';') + + if enters: + out.write('\n') + else: + out.write(' ') + + for key in sorted(root.iterkeys()): # keep the same order as Apple. + if enters: + out.write('\t' + deep) + + if re.match(regex, key).group(0) == key: + out.write(key.encode("utf-8") + ' = ') + else: + out.write('"' + key.encode("utf-8") + '" = ') + + if key == 'objects': + out.write('{') # open the objects section + + if enters: + out.write('\n') + #root.remove('objects') # remove it to avoid problems + + sections = [ + ('PBXBuildFile', False), + ('PBXCopyFilesBuildPhase', True), + ('PBXFileReference', False), + ('PBXFrameworksBuildPhase', True), + ('PBXGroup', True), + ('PBXNativeTarget', True), + ('PBXProject', True), + ('PBXResourcesBuildPhase', True), + ('PBXShellScriptBuildPhase', True), + ('PBXSourcesBuildPhase', True), + ('XCBuildConfiguration', True), + ('XCConfigurationList', True), + ('PBXTargetDependency', True), + ('PBXVariantGroup', True), + ('PBXReferenceProxy', True), + ('PBXContainerItemProxy', True)] + + for section in sections: # iterate over the sections + if self.sections.get(section[0]) is None: + continue + + out.write('\n/* Begin %s section */' % section[0].encode("utf-8")) + self.sections.get(section[0]).sort(cmp=lambda x, y: cmp(x[0], y[0])) + + for pair in self.sections.get(section[0]): + key = pair[0] + value = pair[1] + out.write('\n') + + if enters: + out.write('\t\t' + deep) + + out.write(key.encode("utf-8")) + + if key in self.uuids: + out.write(" /* " + self.uuids[key].encode("utf-8") + " */") + + out.write(" = ") + self._printNewXCodeFormat(out, value, '\t\t' + deep, enters=section[1]) + out.write(';') + + out.write('\n/* End %s section */\n' % section[0].encode("utf-8")) + + out.write(deep + '\t}') # close of the objects section + else: + self._printNewXCodeFormat(out, root[key], '\t' + deep, enters=enters) + + out.write(';') + + if enters: + out.write('\n') + else: + out.write(' ') + + root['isa'] = isa # restore the isa for further calls + + if enters: + out.write(deep) + + out.write('}') + + elif isinstance(root, UserList): + out.write('(') + + if enters: + out.write('\n') + + for value in root: + if enters: + out.write('\t' + deep) + + self._printNewXCodeFormat(out, value, '\t' + deep, enters=enters) + out.write(',') + + if enters: + out.write('\n') + + if enters: + out.write(deep) + + out.write(')') + + else: + if len(root) > 0 and re.match(regex, root).group(0) == root: + out.write(root.encode("utf-8")) + else: + out.write('"' + XcodeProject.addslashes(root.encode("utf-8")) + '"') + + if root in self.uuids: + out.write(" /* " + self.uuids[root].encode("utf-8") + " */") @classmethod def Load(cls, path): @@ -939,30 +1274,54 @@ class XcodeProject(PBXDict): if not os.path.isfile(XcodeProject.plutil_path): cls.plutil_path = 'plutil' - if subprocess.call([XcodeProject.plutil_path,'-lint','-s',path]): - print 'ERROR: not a valid .pbxproj file' + # load project by converting to xml and then convert that using plistlib + p = subprocess.Popen([XcodeProject.plutil_path, '-convert', 'xml1', '-o', '-', path], stdout=subprocess.PIPE) + stdout, stderr = p.communicate() + + # If the plist was malformed, returncode will be non-zero + if p.returncode != 0: + print stdout return None - # load project by converting to JSON and parse - p = subprocess.Popen([XcodeProject.plutil_path, '-convert', 'json', '-o', '-', path], stdout=subprocess.PIPE) - tree = json.loads(p.communicate()[0]) - + tree = plistlib.readPlistFromString(stdout) return XcodeProject(tree, path) -def test(argv=None): - if not argv: - argv = sys.argv +# The code below was adapted from plistlib.py. - proj = XcodeProject.Load('../../Build/Unity-iPhone.xcodeproj/project.pbxproj') +class PBXWriter(plistlib.PlistWriter): + def writeValue(self, value): + if isinstance(value, (PBXList, PBXDict)): + plistlib.PlistWriter.writeValue(self, value.data) + else: + plistlib.PlistWriter.writeValue(self, value) - proj.add_folder('../Assets/Editor/Airship/UI/Default/StoreFront') + def simpleElement(self, element, value=None): + """ + We have to override this method to deal with Unicode text correctly. + Non-ascii characters have to get encoded as character references. + """ + if value is not None: + value = _escapeAndEncode(value) + self.writeln("<%s>%s" % (element, value, element)) + else: + self.writeln("<%s/>" % element) - proj.add_file('../Assets/Editor/Airship/libUAirship-1.1.4.a') - proj.add_file('../Assets/Plugins/Airship/AirshipConfig.plist') - proj.backup() - proj.save() +# Regex to find any control chars, except for \t \n and \r +_controlCharPat = re.compile( + r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f" + r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]") - print str(proj) +def _escapeAndEncode(text): + m = _controlCharPat.search(text) + if m is not None: + raise ValueError("strings can't contains control characters; " + "use plistlib.Data instead") + text = text.replace("\r\n", "\n") # convert DOS line endings + text = text.replace("\r", "\n") # convert Mac line endings + text = text.replace("&", "&") # escape '&' + text = text.replace("<", "<") # escape '<' + text = text.replace(">", ">") # escape '>' + return text.encode("ascii", "xmlcharrefreplace") # encode as ascii with xml character references diff --git a/Tools/XcodeCapp/parser.j b/Tools/XcodeCapp/XcodeCapp/Scripts/parser.j similarity index 72% rename from Tools/XcodeCapp/parser.j rename to Tools/XcodeCapp/XcodeCapp/Scripts/parser.j index 0855eed36..1d4a27fea 100644 --- a/Tools/XcodeCapp/parser.j +++ b/Tools/XcodeCapp/XcodeCapp/Scripts/parser.j @@ -2,7 +2,7 @@ * parser.j * * Created by Francisco Tolmasky. - * Modified by Antoine Mercadal, with great help of Martin Carlberg + * Modified by Antoine Mercadal, with great help from Martin Carlberg * Copyright 2008-2013, 280 North, Inc. * * This library is free software; you can redistribute it and/or @@ -22,29 +22,37 @@ @import -var FILE = require("file"); +var FILE = require("file"), + OS = require("os"), + stream = require("narwhal/term").stream, + + SLASH_REPLACEMENT = "∕"; // DIVISION SLASH, Unicode: U+2215 // Debug function to print some JS objects function dump(obj) { - CPLogPrint(JSON.stringify(obj)); + print(JSON.stringify(obj)); } -var xcc = ObjectiveJ.acorn.walk.make( +function raise(pos, message) +{ + var syntaxError = new SyntaxError(message); + syntaxError.line = pos.line; + + throw syntaxError; +} + +var errors = [], + xcc = ObjectiveJ.acorn.walk.make( { ClassDeclarationStatement: function(node, st, c) { - if (node.categoryname) - { - CPLogPrint("Categories are not supported yet. Ignoring it."); - return; - } - var className = node.classname.name, - superclassname = node.superclassname.name, + superclassname = node.superclassname ? node.superclassname.name : "", declaredOutletsName = [], classInfo = { "name": className, + "category": node.categoryname ? node.categoryname.name : "", "superClass": superclassname, "outlets": [], "actions": [], @@ -63,7 +71,7 @@ var xcc = ObjectiveJ.acorn.walk.make( if (ivarHasOutlet) { if (declaredOutletsName.indexOf(ivarName) !== -1) - throw("Outlet named '" + ivarName + "' is declared multiple times."); + raise(ivarDecl.loc.start, "Outlet '" + ivarName + "' declared more than once"); declaredOutletsName.push(ivarName); classInfo.outlets.push({"type": ivarType, "name": ivarName}); @@ -84,29 +92,31 @@ var xcc = ObjectiveJ.acorn.walk.make( methodReturnType = [node.returntype ? node.returntype.name : "id"], methodHasAction = node.action ? "IBAction" : null, selector = selectors[0].name, - actionInformations = {"name": selector, "arguments":[]}; + actionInfo = {"name": selector, "arguments":[]}; - if (methodHasAction && arguments.length == 1) + if (methodHasAction) { - if (st.actionNames.indexOf(selector) !== -1) - throw("Action named '" + selector + "' is declared multiple times."); - - st.actionNames.push(selector); - - for (var i = 0; i < arguments.length; i++) + if (arguments.length == 1) { - var argument = arguments[i], - argumentName = argument.identifier.name, - argumentType = argument.type ? argument.type.name : null; + if (st.actionNames.indexOf(selector) !== -1) + raise(node.loc.start, "Action '" + selector + "' declared more than once"); - actionInformations.arguments.push({"type": argumentType, "name": argumentName}); + st.actionNames.push(selector); + + for (var i = 0; i < arguments.length; i++) + { + var argument = arguments[i], + argumentName = argument.identifier.name, + argumentType = argument.type ? argument.type.name : null; + + actionInfo.arguments.push({"type": argumentType, "name": argumentName}); + } + + st.actions.push(actionInfo) } - - st.actions.push(actionInformations) + else + raise(node.loc.start, "Action methods must have exactly one parameter"); } - else if (methodHasAction) - throw("Method '" + selector + "' is an action but has more than one parameter."); - } } ); @@ -121,63 +131,109 @@ function compile(node, state, visitor) c(node, state); }; +function shadowBaseNameForPath(projectBasePath, path) +{ + // Make the path project-relative + path = path.substring(projectBasePath.length + 1, path.length); + // strip the extension and replace slashes + return path.substring(0, path.length - 2).replace(/[/]/g, SLASH_REPLACEMENT); +} + +/* + $1 Project base path + $2 Full project source path +*/ function main(args) { - var fileURL = new CFURL(args[1]), - outputHeaderURL = new CFURL(args[2]), - outputSourceURL = new CFURL(args[3]), - source = FILE.read(fileURL, { charset: "UTF-8" }), - flags = ObjectiveJ.Preprocessor.Flags.IncludeDebugSymbols | ObjectiveJ.Preprocessor.Flags.IncludeTypeSignatures, - tokens = ObjectiveJ.acorn.parse(source), - classesInformation = [], - ObjectiveCSource = "", - ObjectiveCHeader = ""; - - - compile(tokens, classesInformation, xcc); - - // dump(classesInformation) - - ObjectiveCHeader += - "#import \n" + - "#import \n" + - "#import \"xcc_general_include.h\"\n\n"; - - ObjectiveCSource += "#import \"" + outputHeaderURL.absoluteString().replace(/\\/g,'/').replace(/(.*\/)/g, '') + "\"\n\n"; - - // Traverse each found classes - classesInformation.forEach(function(aClass) + try { - // add new class definition - ObjectiveCHeader += "@interface " + aClass.name + " : " + NSCompatibleClassName(aClass.superClass) + "\n\n"; + var projectBasePath = args[1], + sourcePath = args[2], + outputDirectory = [projectBasePath stringByAppendingPathComponent:@".XcodeSupport"], + baseFilename = shadowBaseNameForPath(projectBasePath, sourcePath), + outputHeaderURL = new CFURL([outputDirectory stringByAppendingPathComponent:baseFilename + ".h"]), + outputImplementationURL = new CFURL([outputDirectory stringByAppendingPathComponent:baseFilename + ".m"]), + source = FILE.read(sourcePath, { charset: "UTF-8" }), + flags = ObjectiveJ.Preprocessor.Flags.IncludeDebugSymbols | ObjectiveJ.Preprocessor.Flags.IncludeTypeSignatures, + tokens = ObjectiveJ.acorn.parse(source, { locations:true, sourceFile:sourcePath }), + classesInformation = [], + ObjectiveCSource = "", + ObjectiveCHeader = "", + hasErrors = NO; - // Add each outlets in header - aClass.outlets.forEach(function(anOutlet) + compile(tokens, classesInformation, xcc); + + // dump(classesInformation) + + ObjectiveCHeader += + "#import \n" + + '#import "xcc_general_include.h"\n'; + + ObjectiveCSource += "#import \"" + outputHeaderURL.lastPathComponent() + "\"\n"; + + // Traverse each found classes + classesInformation.forEach(function(aClass) { - ObjectiveCHeader += "@property (assign) IBOutlet " + NSCompatibleClassName(anOutlet.type, YES) + " " + anOutlet.name + ";\n"; + // add new class definition + if (aClass.superClass) + ObjectiveCHeader += [CPString stringWithFormat:@"\n@interface %@ : %@", aClass.name, NSCompatibleClassName(aClass.superClass)]; + else + ObjectiveCHeader += [CPString stringWithFormat:@"\n@interface %@ (%@)", aClass.name, aClass.category]; + + // add each outlet in header + if (aClass.outlets.length > 0) + ObjectiveCHeader += "\n"; + + aClass.outlets.forEach(function(anOutlet) + { + ObjectiveCHeader += [CPString stringWithFormat:@"\n@property (assign) IBOutlet %@ %@;", NSCompatibleClassName(anOutlet.type, YES), anOutlet.name]; + }); + + if (aClass.actions.length > 0) + ObjectiveCHeader += "\n"; + + // add each action in header + aClass.actions.forEach(function(anAction) + { + ObjectiveCHeader += [CPString stringWithFormat:@"\n- (IBAction)%@:(%@)%@;", anAction.name, anAction.arguments[0].type, anAction.arguments[0].name]; + }); + + if (aClass.outlets.length > 0 || aClass.actions.length > 0) + ObjectiveCHeader += "\n"; + + ObjectiveCHeader += "\n@end\n"; + + // fill up the implementation file + ObjectiveCSource += "\n@implementation " + aClass.name + "\n@end\n"; }); - ObjectiveCHeader += "\n"; + if (ObjectiveCSource.length) + FILE.write(outputImplementationURL, ObjectiveCSource, { charset:"UTF-8" }); - // Add each actions in header - aClass.actions.forEach(function(anAction) - { - ObjectiveCHeader += "- (IBAction)" + anAction.name + ":(" + anAction.arguments[0].type + ")" + anAction.arguments[0].name + ";\n"; - }); + if (ObjectiveCHeader.length) + FILE.write(outputHeaderURL, ObjectiveCHeader, { charset:"UTF-8" }); + } + catch (e) + { + [errors addObject:@{ + @"message": e.message, + @"path": sourcePath, + @"line": e.line + }]; - ObjectiveCHeader += "\n@end\n\n\n"; + hasErrors = YES; + } - // fill up the implementation file - ObjectiveCSource += "@implementation " + aClass.name + "\n@end\n\n"; - }); + if ([errors count]) + { + var plist = [CPPropertyListSerialization dataFromPropertyList:errors format:CPPropertyListXMLFormat_v1_0]; - // write files - if (ObjectiveCSource.length) - FILE.write(outputSourceURL, ObjectiveCSource, { charset:"UTF-8" }); + stream.printError([plist rawString]); - if (ObjectiveCHeader.length) - FILE.write(outputHeaderURL, ObjectiveCHeader, { charset:"UTF-8" }); + // If there were category warnings, hasErrors is NO, so return a warning status + OS.exit(hasErrors ? 1 : 2); + } } function NSCompatibleClassName(aClassName, asPointer) @@ -514,6 +570,7 @@ var NSClasses = { "NSStepper" : YES, "NSStepperCell" : YES, "NSString Application Kit Additions" : YES, + "NSTableCellView" : YES, "NSTableColumn" : YES, "NSTableHeaderCell" : YES, "NSTableHeaderView" : YES, diff --git a/Tools/XcodeCapp/XcodeCapp/Scripts/pbxprojModifier.py b/Tools/XcodeCapp/XcodeCapp/Scripts/pbxprojModifier.py new file mode 100755 index 000000000..ac2a21a82 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Scripts/pbxprojModifier.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +import os.path +import re +import sys +from mod_pbxproj import XcodeProject + + +class PBXModifier (object): + + XCODE_SUPPORT_FOLDER = u".XcodeSupport" + SLASH_REPLACEMENT = u"∕" # DIVISION SLASH Unicode U+2215 + FRAMEWORKS_RE = re.compile(ur"^(.+/Frameworks/(?:Debug|Source)/([^/]+))/.+$") + XCC_GENERAL_INCLUDE = u"xcc_general_include.h" + + def __init__(self, projectRootPath=None): + self.projectRootPath = projectRootPath + projectName = os.path.basename(projectRootPath) + self.pbxPath = os.path.join(projectRootPath, projectName + u".xcodeproj", u"project.pbxproj") + self.project = XcodeProject.Load(self.pbxPath) + + self._shadowGroup = None + self._sourceGroup = None + self._frameworksGroup = None + + @property + def frameworksGroup(self): + if self._frameworksGroup is None: + self._frameworksGroup = self.project.get_or_create_group(u"Frameworks", parent=self.sourceGroup) + + return self._frameworksGroup + + @property + def shadowGroup(self): + if self._shadowGroup is None: + self._shadowGroup = self.project.get_or_create_group(u"Cocoa Classes") + + return self._shadowGroup + + @property + def sourceGroup(self): + if self._sourceGroup is None: + self._sourceGroup = self.project.get_or_create_group(u"Cappuccino Source") + + return self._sourceGroup + + def update_general_include(self): + xcc_general_include_path = os.path.join(self.projectRootPath, self.XCODE_SUPPORT_FOLDER, self.XCC_GENERAL_INCLUDE) + content = u"" + + for path in os.listdir(os.path.join(self.projectRootPath, self.XCODE_SUPPORT_FOLDER)): + filename = unicode(os.path.basename(path)) + + if filename.endswith(".h") and filename != self.XCC_GENERAL_INCLUDE: + content += u'#include "{0}"\n'.format(filename) + + f = open(xcc_general_include_path, "w") + f.write(content.encode("utf-8")) + f.close() + + if len(self.project.get_files_by_os_path(os.path.join(self.XCODE_SUPPORT_FOLDER, self.XCC_GENERAL_INCLUDE))) == 0: + self.project.add_file(xcc_general_include_path, parent=self.shadowGroup) + + def file_with_path(self, projectSourcePath): + relativePath = os.path.relpath(projectSourcePath, self.projectRootPath) + + for fileRef in [f for f in self.project.objects.values() if f.get("isa") == "PBXFileReference"]: + filePath = projectSourcePath if fileRef.get("sourceTree") == "" else relativePath + + if fileRef.get("path") == filePath: + return fileRef + + return None + + def group_with_name(self, name): + groups = self.project.get_groups_by_name(name) + + return groups[0] if len(groups) == 1 else None + + def add_file(self, projectSourcePath, shadowHeaderPath, shadowImplementationPath): + resolvedPath = os.path.realpath(projectSourcePath) + + # Shadow files are always project-relative + if not self.file_with_path(shadowHeaderPath): + self.project.add_file(shadowHeaderPath, parent=self.shadowGroup, tree="SOURCE_ROOT", create_build_files=False) + + if not self.file_with_path(shadowImplementationPath): + self.project.add_file(shadowImplementationPath, parent=self.shadowGroup, tree="SOURCE_ROOT", create_build_files=False) + + # If the file is within the project directory, the file reference will be project-relative, otherwise absolute + if resolvedPath.startswith(self.projectRootPath): + tree = "SOURCE_ROOT" + else: + tree = "" + + if not self.file_with_path(resolvedPath): + relativePath = os.path.relpath(projectSourcePath, self.projectRootPath) + + if relativePath.startswith(u"Frameworks/"): + parent = self.frameworksGroup + else: + parent = self.sourceGroup + + self.project.add_file(resolvedPath, parent=parent, tree=tree, create_build_files=False) + + def remove_file(self, projectSourcePath, shadowHeaderPath, shadowImplementationPath): + resolvedPath = os.path.realpath(projectSourcePath) + + for path in (shadowHeaderPath, shadowImplementationPath, resolvedPath): + fileRef = self.file_with_path(path) + + if fileRef: + self.project.remove_file(fileRef) + + def add_framework_resources(self, framework, resourcesPath): + files = self.project.get_files_by_os_path(resourcesPath, tree="") + + if not files: + files = self.project.add_file(resourcesPath, parent=None, tree="", create_build_files=False) + + if files: + files[0]['name'] = framework + u" Resources" + + def compare_file_ids(self, id1, id2): + # A few special cases: + # - Frameworks group always goes last + # - XCC_GENERAL_INCLUDE always goes after another file + # - Frameworks/* file always goes after a non-Frameworks file + obj1 = self.project.get_obj(id1) + name1 = obj1.get("name", obj1.get("path")) + + obj2 = self.project.get_obj(id2) + name2 = obj2.get("name", obj2.get("path")) + + # Note: the "∕" in "Frameworks∕" is actually Unicode DIVISION_SLASH, not SOLIDUS (forward slash) + if name1 == u"Frameworks" and obj1.get("isa") == u"PBXGroup": + return 1 + elif name2 == u"Frameworks" and obj2.get("isa") == u"PBXGroup": + return -1 + elif name1 == self.XCC_GENERAL_INCLUDE and obj2.get("isa") == u"PBXFileReference": + return 1 + elif name2 == self.XCC_GENERAL_INCLUDE and obj1.get("isa") == u"PBXFileReference": + return -1 + elif name1.startswith(u"Frameworks∕") and not name2.startswith(u"Frameworks∕"): + return 1 + elif name2.startswith(u"Frameworks∕") and not name1.startswith(u"Frameworks∕"): + return -1 + + return cmp(name1.lower(), name2.lower()) + + def compare_resource_folder_ids(self, id1, id2): + folder1 = self.project.get_obj(id1) + name1 = folder1.get("name", folder1.get("path")) + + folder2 = self.project.get_obj(id2) + name2 = folder2.get("name", folder2.get("path")) + + if name1 == u"Resources": + return -1 + elif name2 == u"Resources": + return 1 + + return cmp(name1.lower(), name2.lower()) + + def sort_project(self): + # Sort the files alphabetically in our groups. + for group in (self.sourceGroup, self.shadowGroup, self._frameworksGroup): + if group is None: + continue + + group.get("children").data.sort(cmp=self.compare_file_ids) + + # Move resource folders to the top, Resources at the very top + root_ids = self.project.root_group.get("children").data + folder_ids = [] + + for id in root_ids: + item = self.project.get_obj(id) + name = item.get("name", item.get("path")) + + if name.endswith(u"Resources") and item.get("lastKnownFileType") == "folder": + folder_ids.append(id) + + folder_ids.sort(cmp=self.compare_resource_folder_ids, reverse=True) + + for id in folder_ids: + index = root_ids.index(id) + del root_ids[index] + root_ids.insert(0, id) + + def save_project(self): + if self.project.modified: + self.project.backup(backup_name=self.project.pbxproj_path + ".backup") + self.sort_project() + self.project.saveFormat3_2() + + def update_project_with_source(self, action, projectSourcePath): + relativePath = os.path.relpath(projectSourcePath, self.projectRootPath) + + shadowBasePath = os.path.join(projectRootPath, self.XCODE_SUPPORT_FOLDER) + shadowBaseName = os.path.splitext(relativePath)[0].replace(u"/", self.SLASH_REPLACEMENT) + shadowHeaderPath = os.path.join(shadowBasePath, shadowBaseName + ".h") + shadowImplementationPath = os.path.join(shadowBasePath, shadowBaseName + ".m") + + if action == "add": + fileRef = self.file_with_path(shadowHeaderPath) + + if not fileRef: + self.update_general_include() + self.add_file(projectSourcePath, shadowHeaderPath, shadowImplementationPath) + + match = self.FRAMEWORKS_RE.match(projectSourcePath) + + if match: + framework = match.group(2) + resourcesPath = os.path.realpath(os.path.join(match.group(1), u"Resources")) + + if os.path.isdir(resourcesPath): + self.add_framework_resources(framework, resourcesPath) + + elif action == "remove": + self.update_general_include() + self.remove_file(projectSourcePath, shadowHeaderPath, shadowImplementationPath) + + +# +# Possible ways to call this script: +# +# "add" projectRootPath file +# "remove" projectRootPath file +# "update" projectRootPath action file... [action file...] +# +# File paths are full project paths, no resolved symlinks. +# action is "add" or "remove". +# +if __name__ == "__main__": + + action = sys.argv[1] + projectRootPath = unicode(sys.argv[2]) + modifier = PBXModifier(projectRootPath) + + if action in ("add", "remove"): + projectSourcePath = unicode(sys.argv[3]) + modifier.update_project_with_source(action, projectSourcePath) + + elif action == "update": + # When the action is "update", it is followed by "add" or "remove", followed by 1+ paths + args = sys.argv[3:] + action = unicode(args.pop(0)) + + while len(args): + arg = unicode(args.pop(0)) + + if arg in ("add", "remove"): + action = arg + continue + else: + modifier.update_project_with_source(action, arg) + + modifier.save_project() diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.h b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h new file mode 100644 index 000000000..7e7726099 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h @@ -0,0 +1,31 @@ +// +// UserDefaults.h +// XcodeCapp +// +// Created by Aparajita on 4/9/13. +// +// + +#ifndef XcodeCapp_UserDefaults_h +#define XcodeCapp_UserDefaults_h + +#import + +extern NSString * const kDefaultLastEventId; +extern NSString * const kDefaultFirstLaunch; +extern NSString * const kDefaultFirstLaunchVersion; +extern NSString * const kDefaultXCCAPIMode; +extern NSString * const kDefaultXCCReactToInodeMod; +extern NSString * const kDefaultXCCReopenLastProject; +extern NSString * const kDefaultXCCAutoOpenErrorsPanelOnWarnings; +extern NSString * const kDefaultXCCAutoOpenErrorsPanelOnErrors; +extern NSString * const kDefaultXCCProjectHistory; +extern NSString * const kDefaultLastOpenedPath; +extern NSString * const kDefaultPathModificationDates; +extern NSString * const kDefaultMaxRecentProjects; +extern NSString * const kDefaultLogLevel; +extern NSString * const kDefaultAutoOpenXcodeProject; +extern NSString * const kDefaultShowProcessingNotices; +extern NSString * const kDefaultUseSymlinkWhenCreatingProject; + +#endif diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.m b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m new file mode 100644 index 000000000..4701d7052 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m @@ -0,0 +1,27 @@ +// +// UserDefaults.m +// XcodeCapp +// +// Created by Aparajita on 4/9/13. +// +// + +#include "UserDefaults.h" + + +NSString * const kDefaultLastEventId = @"lastEventId"; +NSString * const kDefaultFirstLaunch = @"FirstLaunch"; +NSString * const kDefaultFirstLaunchVersion = @"firstLaunchVersion"; +NSString * const kDefaultXCCAPIMode = @"XCCAPIMode"; +NSString * const kDefaultXCCReactToInodeMod = @"XCCReactMode"; +NSString * const kDefaultXCCReopenLastProject = @"XCCReopenLastProject"; +NSString * const kDefaultXCCAutoOpenErrorsPanelOnWarnings = @"XCCAutoOpenErrorsPanelOnWarnings"; +NSString * const kDefaultXCCAutoOpenErrorsPanelOnErrors = @"XCCAutoOpenErrorsPanelOnErrors"; +NSString * const kDefaultXCCProjectHistory = @"XCCProjectHistory"; +NSString * const kDefaultLastOpenedPath = @"LastOpenedPath"; +NSString * const kDefaultPathModificationDates = @"pathModificationDates"; +NSString * const kDefaultMaxRecentProjects = @"maxRecentProjects"; +NSString * const kDefaultLogLevel = @"logLevel"; +NSString * const kDefaultAutoOpenXcodeProject = @"autoOpenXcodeProject"; +NSString * const kDefaultShowProcessingNotices = @"showProcessingNotices"; +NSString * const kDefaultUseSymlinkWhenCreatingProject = @"useSymlinkWhenCreatingProject"; diff --git a/Tools/XcodeCapp/XcodeCapp.pch b/Tools/XcodeCapp/XcodeCapp/XcodeCapp-Prefix.pch similarity index 53% rename from Tools/XcodeCapp/XcodeCapp.pch rename to Tools/XcodeCapp/XcodeCapp/XcodeCapp-Prefix.pch index c3ac0cfad..92f4e2158 100644 --- a/Tools/XcodeCapp/XcodeCapp.pch +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp-Prefix.pch @@ -4,4 +4,13 @@ #ifdef __OBJC__ #import + #import "DDLog.h" + +#if DEBUG + #import "DDTTYLogger.h" +#else + #import "DDASLLogger.h" +#endif + + #import "DDLogLevel.h" #endif diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h new file mode 100644 index 000000000..f6a5df812 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h @@ -0,0 +1,152 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2011 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#import +#import + +// FSEvent listening mode we use +enum XCCAPIMode { + kXCCAPIModeAuto = 0, + kXCCAPIModeFile, + kXCCAPIModeFolder +}; + +// Type of output expected from runTaskWithLaunchPath:arguments:returnType: +enum XCCTaskReturnType { + kTaskReturnTypeNone, + kTaskReturnTypeStdOut, + kTaskReturnTypeStdError, + kTaskReturnTypeAny +}; +typedef enum XCCTaskReturnType XCCTaskReturnType; + +// Status codes returned by support scripts run as tasks +enum { + XCCStatusCodeError = 1, + XCCStatusCodeWarning = 2 +}; + +// Notifications we send +extern NSString * const XCCConversionDidStartNotification; +extern NSString * const XCCConversionDidEndNotification; +extern NSString * const XCCProjectDidFinishLoadingNotification; + + +@interface XcodeCapp : NSObject + +/* + Every time the user opens or closes a project, this is incremented. It is passed to threaded operations + which load the project. These threaded operations generate notifications that get queued up + on the main thread. Because the user may cancel and start a new load while notifications are + still queued from the previous load, we compare the projectId returned by a notification + with the current projectId. If they don't match, we let the notification drain. +*/ +@property NSInteger projectId; + +// An array of paths we add to the NSTask environment +@property NSArray *environmentPaths; + +// An array of executable names we need to have available +@property NSArray *executables; + +// Full path to .XcodeSupport +@property NSString *supportPath; + +// Full path to the Cappuccino project root directory +@property NSString *projectPath; + +// Full path to the .xcodeproj +@property NSString *xcodeProjectPath; + +// Full path to parser.j +@property NSString *parserPath; + +// Full path to pbxprojModifier.py +@property NSString *pbxModifierScriptPath; + +// Tooltip for the radio button symlink +@property NSString *toolTipSymlinkRadioButton; + +// Full paths to the executables we rely on: jsc, objj, nib2cib, python +@property NSMutableDictionary *executablePaths; + +// Whether the current OS supports file-level FSEvents (10.7+) +@property BOOL supportsFileLevelAPI; + +// Whether we are actually using file-level FSEvents +@property BOOL isUsingFileLevelAPI; + +// Whether we should process source files that have inode-only modifications +@property BOOL reactToInodeModification; + +// Whether we are in the process of loading a project +@property BOOL isLoadingProject; + +// Whether we are currently processing source files +@property BOOL isProcessing; + +// Whether $CAPP_BUILD is defined or not +@property BOOL isCappBuildDefined; + +// A mapping from full paths to project-relative paths +@property NSMutableDictionary *projectPathsForSourcePaths; + +// A list of errors generated from the current batch of source processing +@property NSMutableArray *errorList; + +// Panel, table and controller used to display errors +@property (strong) IBOutlet NSPanel *errorsPanel; +@property (unsafe_unretained) IBOutlet NSTableView *errorTable; +@property (strong) IBOutlet NSArrayController *errorListController; + +- (IBAction)openErrorsPanel:(id)sender; +- (IBAction)clearErrors:(id)sender; +- (IBAction)openErrorInEditor:(id)sender; +- (IBAction)openXcodeProject:(id)aSender; +- (IBAction)synchronizeProject:(id)aSender; + +- (BOOL)executablesAreAccessible; +- (void)stop; +- (void)loadProjectAtPath:(NSString *)path; +- (BOOL)pathMatchesIgnoredPaths:(NSString*)aPath; + +- (BOOL)notificationBelongsToCurrentProject:(NSNotification *)note; + +- (BOOL)isObjjFile:(NSString *)path; +- (BOOL)isXibFile:(NSString *)path; +- (BOOL)isXCCIgnoreFile:(NSString *)path; + +- (NSString *)shadowBasePathForProjectSourcePath:(NSString *)path; +- (BOOL)hasErrors; + +- (void)computeIgnoredPaths; +- (BOOL)shouldIgnoreDirectoryNamed:(NSString *)filename; + +- (void)wantUserNotificationWithInfo:(NSDictionary *)info; +- (NSDictionary *)runTaskWithLaunchPath:(NSString *)launchPath arguments:(NSArray *)arguments returnType:(XCCTaskReturnType)returnType; + +- (NSDictionary*)createProject:(NSString*)aPath; + +@end + +@interface XcodeCapp (SnowLeopard) + +- (void)updateLastModificationDate:(NSDate *)date forPath:(NSString *)path; +- (NSDate *)lastModificationDateForPath:(NSString *)path; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m new file mode 100644 index 000000000..9b1e3af35 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -0,0 +1,1757 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2011 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#import + +#import "XcodeCapp.h" +#import "AppController.h" +#import "FindSourceFilesOperation.h" +#import "Notifications.h" +#import "ProcessSourceOperation.h" +#import "UserDefaults.h" +#import "XcodeProjectCloser.h" + + +#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_6 +# define kFSEventStreamCreateFlagFileEvents 0x00000010 +# define kFSEventStreamEventFlagItemIsFile 0x00010000 +# define kFSEventStreamEventFlagItemRemoved 0x00000200 +# define kFSEventStreamEventFlagItemCreated 0x00000200 +# define kFSEventStreamEventFlagItemModified 0x00001000 +# define kFSEventStreamEventFlagItemInodeMetaMod 0x00000400 +# define kFSEventStreamEventFlagItemRenamed 0x00000800 +# define kFSEventStreamEventFlagItemFinderInfoMod 0x00002000 +# define kFSEventStreamEventFlagItemChangeOwner 0x00004000 +# define kFSEventStreamEventFlagItemXattrMod 0x00008000 +#endif + + +enum XCCLineSpecifier { + kLineSpecifierNone, + kLineSpecifierColon, + kLineSpecifierMinusL, + kLineSpecifierPlus +}; +typedef enum XCCLineSpecifier XCCLineSpecifier; + +// Where we put the generated Cocoa class files +static NSString * const XCCSupportFolderName = @".XcodeSupport"; + +// We store a compatibility version in .XcodeSupport/Info.plist. +// If the version is less than the version in XcodeCapp's Info.plist, we regenerate .XcodeSupport. +static NSString * const XCCCompatibilityVersionKey = @"XCCCompatibilityVersion"; + +// We replace "/" in a path with this. It looks like "/", +// but is actually an obscure Unicode character we hope no one uses in a filename. +static NSString * const XCCSlashReplacement = @"∕"; // DIVISION SLASH, Unicode: U+2215 + +// When scanning the project, we immediately ignore directories that match this regex. +static NSString * const XCCDirectoriesToIgnorePattern = @"^(?:Build|F(?:rameworks|oundation)|AppKit|Objective-J|(?:Browser|CommonJS)\\.environment|Resources|XcodeSupport|.+\\.xcodeproj)$"; + +// The key for an Info.plist array of the mandatory executables XCC needs. +static NSString * const XCCMandatoryExecutablesKey = @"XCCMandatoryExecutables"; + +// The regex above is used with this predicate for testing. +static NSPredicate * XCCDirectoriesToIgnorePredicate = nil; + +// An array of the default predicates used to ignore paths. +static NSArray *XCCDefaultIgnoredPathPredicates = nil; + + +@interface XcodeCapp () + +// Only used with 10.6 when we don't have file-level FSEvents +@property (nonatomic) NSMutableDictionary *pathModificationDates; + +@property FSEventStreamRef stream; + +// Whether the FSEventStream is started or stopped. +@property BOOL streamStarted; + +// The last FSEvent id we received. This is stored in the user prefs +// so we can get all changes since the last time XcodeCapp was launched. +@property NSNumber *lastEventId; + +@property NSDate *appStartedTimestamp; + +@property NSFileManager *fm; + +// An NSString version of XCCCloseXcodeProjectScript +@property NSString *closeXcodeProjectScriptSource; + +// Full path to .xcodecapp-ignore +@property NSString *xcodecappIgnorePath; + +// The current array of predicates used to ignore paths +@property NSMutableArray *ignoredPathPredicates; + +// The environment we pass to tasks launched from XcodeCapp +@property NSMutableDictionary *environment; + +// We keep a file descriptor open for the project directory +// so we can locate it if it moves. +@property int projectPathFileDescriptor; + +// Coalesces the modifications that have to be made to the Xcode project +// after changes are made to source files. Keys are the actions "add" or "remove", +// values are arrays of full paths to source files that need to be added or removed. +@property NSMutableDictionary *pbxOperations; + +// A queue for threaded operations to perform +@property NSOperationQueue *operationQueue; + +// We have to declare this because it is referenced by the fsevents_callback function +- (void)handleFSEventsWithPaths:(NSArray *)paths flags:(const FSEventStreamEventFlags[])eventFlags ids:(const FSEventStreamEventId[])eventIds; + +@end + + +void fsevents_callback(ConstFSEventStreamRef streamRef, + void *userData, + size_t numEvents, + void *eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + XcodeCapp *xcc = (__bridge XcodeCapp *)userData; + NSArray *paths = (__bridge NSArray *)eventPaths; + + [xcc handleFSEventsWithPaths:paths flags:eventFlags ids:eventIds]; +} + + +@implementation XcodeCapp + +#pragma mark - Initialization + ++ (void)initialize +{ + if (self != [XcodeCapp class]) + return; + + // Initialize static values that can't be initialized in their declarations + + XCCDirectoriesToIgnorePredicate = [NSPredicate predicateWithFormat:@"SELF matches %@", XCCDirectoriesToIgnorePattern]; + + NSArray *defaultIgnoredPaths = @[ + @"*/Frameworks/", + @"!*/Frameworks/Debug/", + @"!*/Frameworks/Source/", + @"*/AppKit/", + @"*/Foundation/", + @"*/Objective-J/", + @"*/*.environment/", + @"*/Build/", + @"*/*.xcodeproj/", + @"*/.*/", + @"*/NS_*.j", + @"*/main.j", + @"*/.*", + @"!*/.xcodecapp-ignore" + ]; + + XCCDefaultIgnoredPathPredicates = [self parseIgnorePaths:defaultIgnoredPaths]; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + self.errorList = [NSMutableArray arrayWithCapacity:10]; + self.fm = [NSFileManager defaultManager]; + self.ignoredPathPredicates = [NSMutableArray new]; + self.parserPath = [[NSBundle mainBundle].sharedSupportPath stringByAppendingPathComponent:@"parser.j"]; + self.appStartedTimestamp = [NSDate date]; + self.projectPathsForSourcePaths = [NSMutableDictionary new]; + self.xcodecappIgnorePath = @""; + self.operationQueue = [NSOperationQueue new]; + self.pbxOperations = [NSMutableDictionary new]; + self.executablePaths = [NSMutableDictionary new]; + self.projectPathFileDescriptor = -1; + self.isCappBuildDefined = YES; + self.toolTipSymlinkRadioButton = @"If this is checked, when a Cappuccino project is created, the frameworks of the new project will be symlinked from the $CAPP_BUILD"; + + [self initTaskEnvironment]; + + self.isUsingFileLevelAPI = NO; + self.isLoadingProject = NO; + self.isProcessing = NO; + + // File-level FSEvents are only supported on 10.7+ + SInt32 versionMajor = 0; + SInt32 versionMinor = 0; + Gestalt(gestaltSystemVersionMajor, &versionMajor); + Gestalt(gestaltSystemVersionMinor, &versionMinor); + + self.supportsFileLevelAPI = versionMajor >= 10 && versionMinor >= 7; + + // Uncomment to simulate 10.6 mode + // self.supportsFileLevelAPI = NO; + + [self configureFileAPI]; + + [NSUserNotificationCenter defaultUserNotificationCenter].delegate = self; + [GrowlApplicationBridge setGrowlDelegate:self]; + + [self initObservers]; + } + + return self; +} + +- (void)initTaskEnvironment +{ + // Add possible executable paths to PATH + self.environment = [NSProcessInfo processInfo].environment.mutableCopy; + + self.environmentPaths = + @[ + @"/usr/local/bin", + @"/usr/local/narwhal/bin", + @"~/narwhal/bin", + @"~/bin" + ]; + + NSMutableArray *paths = [self.environmentPaths mutableCopy]; + + for (NSInteger i = 0; i < paths.count; ++i) + paths[i] = [paths[i] stringByExpandingTildeInPath]; + + self.environment[@"PATH"] = [[paths componentsJoinedByString:@":"] stringByAppendingFormat:@":%@", self.environment[@"PATH"]]; + + // Make sure we are using jsc as the narwhal engine! + self.environment[@"NARWHAL_ENGINE"] = @"jsc"; + + self.executables = @[@"python", @"narwhal-jsc", @"objj", @"nib2cib", @"capp"]; + + // This is used to get the env var of $CAPP_BUILD + NSDictionary *processEnvironment = [[NSProcessInfo processInfo] environment]; + NSArray *arguments = [NSArray arrayWithObjects:@"-l", @"-c", @"echo $CAPP_BUILD", nil]; + + NSDictionary *taskResult = [self runTaskWithLaunchPath:[processEnvironment objectForKey:@"SHELL"] + arguments:arguments + returnType:kTaskReturnTypeStdOut]; + + // Make sure to remove the \n at the end of the response + NSString *response = [taskResult[@"response"] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + self.environment[@"CAPP_BUILD"] = response; + + // Make sure we have found a CAPP_BUILD + if ([response length] == 0 || [taskResult[@"status"] intValue] == -1) + { + self.toolTipSymlinkRadioButton = @"To use this option you need to have the variable $CAPP_BUILD in your environement (export CAPP_BUILD='path/to/your/cappuccino/build')"; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:@NO forKey:kDefaultUseSymlinkWhenCreatingProject]; + self.isCappBuildDefined = NO; + } +} + +- (void)initObservers +{ + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + [center addObserver:self selector:@selector(addSourceToProjectPathMappingHandler:) name:XCCNeedSourceToProjectPathMappingNotification object:nil]; + [center addObserver:self selector:@selector(sourceConversionDidStartHandler:) name:XCCConversionDidStartNotification object:nil]; + [center addObserver:self selector:@selector(sourceConversionDidEndHandler:) name:XCCConversionDidEndNotification object:nil]; + [center addObserver:self selector:@selector(sourceConversionDidGenerateErrorHandler:) name:XCCConversionDidGenerateErrorNotification object:nil]; +} + +#pragma mark - Properties + +- (id)pathModificationDates +{ + if (!_pathModificationDates) + { + _pathModificationDates = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:kDefaultPathModificationDates] mutableCopy]; + + if (!_pathModificationDates) + _pathModificationDates = [NSMutableDictionary new]; + } + + return _pathModificationDates; +} + +- (BOOL)xcodeProjectCanBeOpened +{ + return (self.xcodeProjectPath && + !self.isProcessing && + [self.fm fileExistsAtPath:self.xcodeProjectPath]); +} + +#pragma mark - Project Management + +- (void)loadProjectAtPath:(NSString *)path +{ + DDLogInfo(@"Loading project: %@", path); + + self.isLoadingProject = YES; + ++self.projectId; + + [self notifyUserWithTitle:@"Loading project…" message:path.lastPathComponent]; + + self.projectPath = path; + self.xcodecappIgnorePath = [self.projectPath stringByAppendingPathComponent:@".xcodecapp-ignore"]; + self.projectPathsForSourcePaths = [NSMutableDictionary new]; + [self.pbxOperations removeAllObjects]; + self.lastEventId = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultLastEventId]; + + [self clearErrors:self]; + [self computeIgnoredPaths]; + + [self prepareXcodeSupport]; + [self populateXcodeProject]; + [self waitForOperationQueueToFinishWithSelector:@selector(projectDidFinishLoading)]; +} + +/*! + Create Xcode project and .XcodeSupport directory if necessary. + + @return YES if both exist +*/ +- (BOOL)prepareXcodeSupport +{ + NSString *projectName = [self.projectPath.lastPathComponent stringByAppendingString:@".xcodeproj"]; + + self.xcodeProjectPath = [self.projectPath stringByAppendingPathComponent:projectName]; + self.supportPath = [self.projectPath stringByAppendingPathComponent:XCCSupportFolderName]; + self.pbxModifierScriptPath = [[NSBundle mainBundle].sharedSupportPath stringByAppendingPathComponent:@"pbxprojModifier.py"]; + + // If either the project or the support directory are missing, recreate them both to ensure they are in sync + BOOL projectExists, projectIsDirectory; + projectExists = [self.fm fileExistsAtPath:self.xcodeProjectPath isDirectory:&projectIsDirectory]; + + BOOL supportExists, supportIsDirectory; + supportExists = [self.fm fileExistsAtPath:self.supportPath isDirectory:&supportIsDirectory]; + + if (!projectExists || !projectIsDirectory || !supportExists) + [self createXcodeProject]; + + // If the project did not exist, reset the XcodeSupport directory to force the new empty project to be populated + if (!supportExists || !supportIsDirectory || !projectExists || ![self xcodeSupportIsCompatible]) + [self createXcodeSupportDirectory]; + + return projectExists && supportExists; +} + +- (BOOL)xcodeSupportIsCompatible +{ + double appCompatibilityVersion = [[[NSBundle mainBundle] objectForInfoDictionaryKey:XCCCompatibilityVersionKey] doubleValue]; + + NSString *infoPath = [self.supportPath stringByAppendingPathComponent:@"Info.plist"]; + NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:infoPath]; + NSNumber *projectCompatibilityVersion = info[XCCCompatibilityVersionKey]; + + if (projectCompatibilityVersion == nil) + { + DDLogVerbose(@"No compatibility version in project"); + return NO; + } + + DDLogVerbose(@"XcodeCapp/project compatibility version: %0.1f/%0.1f", projectCompatibilityVersion.doubleValue, appCompatibilityVersion); + + return projectCompatibilityVersion.doubleValue >= appCompatibilityVersion; +} + +- (void)createXcodeProject +{ + if ([self.fm fileExistsAtPath:self.xcodeProjectPath]) + [self.fm removeItemAtPath:self.xcodeProjectPath error:nil]; + + [self.fm createDirectoryAtPath:self.xcodeProjectPath withIntermediateDirectories:YES attributes:nil error:nil]; + + NSString *pbxPath = [self.xcodeProjectPath stringByAppendingPathComponent:@"project.pbxproj"]; + + [self.fm copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"project" ofType:@"pbxproj"] toPath:pbxPath error:nil]; + + NSMutableString *content = [NSMutableString stringWithContentsOfFile:pbxPath encoding:NSUTF8StringEncoding error:nil]; + + [content writeToFile:pbxPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; + + DDLogInfo(@"Xcode support project created at: %@", self.xcodeProjectPath); +} + +- (void)createXcodeSupportDirectory +{ + if ([self.fm fileExistsAtPath:self.supportPath]) + [self.fm removeItemAtPath:self.supportPath error:nil]; + + [self.fm createDirectoryAtPath:self.supportPath withIntermediateDirectories:YES attributes:nil error:nil]; + + NSNumber *appCompatibilityVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:XCCCompatibilityVersionKey]; + NSData *data = [NSPropertyListSerialization dataFromPropertyList:@{ XCCCompatibilityVersionKey:appCompatibilityVersion } + format:NSPropertyListXMLFormat_v1_0 + errorDescription:nil]; + [data writeToFile:[self.supportPath stringByAppendingPathComponent:@"Info.plist"] atomically:YES]; + + DDLogInfo(@".XcodeSupport directory created at: %@", self.supportPath); +} + +- (void)populateXcodeProject +{ + // Populate with all non-framework code + [self populateXcodeProjectWithProjectRelativePath:@""]; + + // Populate with any user source debug frameworks + [self populateXcodeProjectWithProjectRelativePath:@"Frameworks/Debug"]; + + // Populate with any source frameworks + [self populateXcodeProjectWithProjectRelativePath:@"Frameworks/Source"]; + + // Populate resources + [self populateXcodeProjectWithProjectRelativePath:@"Resources"]; +} + +- (void)populateXcodeProjectWithProjectRelativePath:(NSString *)path +{ + FindSourceFilesOperation *op = [[FindSourceFilesOperation alloc] initWithXCC:self projectId:[NSNumber numberWithInteger:self.projectId] path:path]; + [self.operationQueue addOperation:op]; +} + +- (IBAction)openXcodeProject:(id)aSender +{ + BOOL isDirectory, opened = YES; + BOOL exists = [self.fm fileExistsAtPath:self.xcodeProjectPath isDirectory:&isDirectory]; + + if (exists && isDirectory) + { + DDLogVerbose(@"Opening Xcode project at: %@", self.xcodeProjectPath); + + opened = [[NSWorkspace sharedWorkspace] openFile:self.xcodeProjectPath]; + } + + if (!exists || !isDirectory || !opened) + { + NSString *text; + + if (!opened) + text = @"The project exists, but failed to open."; + else + text = [NSString stringWithFormat:@"%@ %@.", self.xcodeProjectPath, !exists ? @"does not exist" : @"is not an Xcode project"]; + + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + NSInteger response = NSRunAlertPanel(@"The project could not be opened.", @"%@\n\nWould you like to regenerate the project?", @"Yes", @"No", nil, text); + + if (response == NSAlertDefaultReturn) + [self synchronizeProject:self]; + } +} + +- (void)resetProject +{ + NSString *projectPath = self.projectPath; + + [self stop]; + [self removeSupportFilesAtPath:projectPath]; + [self removeAllCibsAtPath:[projectPath stringByAppendingPathComponent:@"Resources"]]; + + self.projectPath = projectPath; +} + +- (IBAction)synchronizeProject:(id)aSender +{ + [self resetProject]; + [self loadProjectAtPath:self.projectPath]; +} + +- (void)removeAllCibsAtPath:(NSString *)path +{ + NSArray *paths = [self.fm contentsOfDirectoryAtPath:path error:nil]; + + for (NSString *filePath in paths) + { + if ([filePath.pathExtension.lowercaseString isEqualToString:@"cib"]) + [self.fm removeItemAtPath:[path stringByAppendingPathComponent:filePath] error:nil]; + } +} + +- (void)removeSupportFilesAtPath:(NSString *)projectPath +{ + [XcodeProjectCloser closeXcodeProjectForProject:projectPath]; + + [self.fm removeItemAtPath:self.xcodeProjectPath error:nil]; + [self.fm removeItemAtPath:self.supportPath error:nil]; +} + +- (void)stop +{ + // Increment the projectId to ensure remaining notifications in the queue for the current project are ignored + ++self.projectId; + + self.isLoadingProject = NO; + [self stopEventStream]; + [self.operationQueue cancelAllOperations]; + + self.projectPath = nil; + [self clearErrors:self]; + [self.ignoredPathPredicates removeAllObjects]; + + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +#pragma mark - Processing + +- (void)waitForOperationQueueToFinishWithSelector:(SEL)selector +{ + self.isProcessing = YES; + + [[NSNotificationCenter defaultCenter] postNotificationName:XCCBatchDidStartNotification object:self]; + + // Poll every half second to see if the queue has finished + [NSTimer scheduledTimerWithTimeInterval:0.5 + target:self + selector:@selector(didQueueTimerFinish:) + userInfo:NSStringFromSelector(selector) + repeats:YES]; +} + +- (void)didQueueTimerFinish:(NSTimer *)timer +{ + if (self.operationQueue.operationCount == 0) + { + SEL selector = NSSelectorFromString(timer.userInfo); + + [timer invalidate]; + + // Can't use plain performSelect: here because ARC doesn't know what the return value is + // because the selector is determined at runtime. So we use performSelectorOnMainThread: + // which has no return value. + [self performSelectorOnMainThread:selector withObject:nil waitUntilDone:NO]; + } +} + +- (void)batchDidFinish +{ + if (self.pbxOperations.count) + { + // See pbxprojModifier.py for info on the arguments + NSMutableArray *arguments = [[NSMutableArray alloc] initWithObjects:self.pbxModifierScriptPath, @"update", self.projectPath, nil]; + + for (NSString *action in self.pbxOperations) + { + NSArray *paths = self.pbxOperations[action]; + + if (paths.count) + { + [arguments addObject:action]; + [arguments addObjectsFromArray:paths]; + } + } + + // This task takes less than a second to execute, no need to put it a separate thread + + NSDictionary *taskResult = [self runTaskWithLaunchPath:self.executablePaths[@"python"] + arguments:arguments + returnType:kTaskReturnTypeStdError]; + + NSInteger status = [taskResult[@"status"] intValue]; + NSString *response = taskResult[@"response"]; + + DDLogVerbose(@"Updated Xcode project: [%ld, %@]", status, status ? response : @""); + } + + [self showErrors]; + + // If the event stream was temporarily stopped, restart it + [self startFSEventStream]; + + self.isProcessing = NO; + + [[NSNotificationCenter defaultCenter] postNotificationName:XCCBatchDidEndNotification object:self]; +} + +- (void)projectDidFinishLoading +{ + [self batchDidFinish]; + + DDLogVerbose(@"Project finished loading"); + + self.isLoadingProject = NO; + + [[NSNotificationCenter defaultCenter] postNotificationName:XCCProjectDidFinishLoadingNotification object:self]; + [[NSUserDefaults standardUserDefaults] setObject:self.projectPath forKey:kDefaultLastOpenedPath]; + + [self notifyUserWithTitle:@"Project loaded" message:self.projectPath.lastPathComponent]; + + [self startEventStream]; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:kDefaultAutoOpenXcodeProject]) + [self openXcodeProject:self]; +} + +- (NSDictionary*)createProject:(NSString*)aPath +{ + NSDictionary *taskResult; + NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"gen", aPath ,@"-t", @"NibApplication", nil]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // This is used when an user wants to replace an existing project + NSArray *argumentsRemove = [NSArray arrayWithObjects:@"-rf", aPath, nil]; + [self runTaskWithLaunchPath:@"/bin/rm" arguments:argumentsRemove returnType:kTaskReturnTypeAny]; + + if ([defaults boolForKey:kDefaultUseSymlinkWhenCreatingProject]) + [arguments addObject:@"-l"]; + + taskResult = [self runTaskWithLaunchPath:self.executablePaths[@"capp"] + arguments:arguments + returnType:kTaskReturnTypeStdOut]; + + NSInteger status = [taskResult[@"status"] intValue]; + NSString *response = taskResult[@"response"]; + + if (!status) + { + DDLogVerbose(@"Created Xcode project: [%ld, %@]", status, status ? response : @""); + [self notifyUserWithTitle:@"Project created" message:aPath.lastPathComponent]; + } + else + { + DDLogVerbose(@"Created Xcode project failed: [%ld, %@]", status, status ? response : @""); + NSDictionary *dictionary = [NSDictionary dictionaryWithObject:response forKey:@"message"]; + [self.errorListController addObject:dictionary]; + [self showErrors]; + } + + return taskResult; +} + +#pragma mark - Notification handlers + +/* + NOTE: All methods in this section which end with "Handler" are called + from threaded NSOperations. +*/ + +/* + Notifications sent by operations contain an int projectId. + The notifications are queued up on the main thread. When the main thread + handles them, it first checks to see if the current projectId + matches the notification's projectId. If not, the notification is ignored. +*/ +- (BOOL)notificationBelongsToCurrentProject:(NSNotification *)note +{ + return [note.userInfo[@"projectId"] intValue] == self.projectId; +} + +- (void)addSourceToProjectPathMappingHandler:(NSNotification *)note +{ + [self performSelectorOnMainThread:@selector(addSourceToProjectPathMapping:) withObject:note waitUntilDone:NO]; +} + +- (void)addSourceToProjectPathMapping:(NSNotification *)note +{ + if (![self notificationBelongsToCurrentProject:note]) + return; + + NSDictionary *info = note.userInfo; + NSString *sourcePath = info[@"sourcePath"]; + + DDLogVerbose(@"Adding source to project mapping: %@ -> %@", sourcePath, info[@"projectPath"]); + + self.projectPathsForSourcePaths[info[@"sourcePath"]] = info[@"projectPath"]; +} + +- (void)sourceConversionDidStartHandler:(NSNotification *)note +{ + [self performSelectorOnMainThread:@selector(sourceConversionDidStart:) withObject:note waitUntilDone:NO]; +} + +- (void)sourceConversionDidStart:(NSNotification *)note +{ + if (![self notificationBelongsToCurrentProject:note]) + return; + + NSDictionary *info = note.userInfo; + NSString *projectPath = info[@"path"]; + + DDLogVerbose(@"%@ %@", NSStringFromSelector(_cmd), projectPath); + + [self pruneProcessingErrorsForProjectPath:projectPath]; +} + +- (void)sourceConversionDidGenerateErrorHandler:(NSNotification *)note +{ + [self performSelectorOnMainThread:@selector(sourceConversionDidGenerateError:) withObject:note waitUntilDone:NO]; +} + +- (void)sourceConversionDidGenerateError:(NSNotification *)note +{ + if (![self notificationBelongsToCurrentProject:note]) + return; + + NSMutableDictionary *info = [note.userInfo mutableCopy]; + + DDLogVerbose(@"%@ %@", NSStringFromSelector(_cmd), info[@"path"]); + + [self.errorListController addObject:info]; +} + +- (void)sourceConversionDidEndHandler:(NSNotification *)note +{ + [self performSelectorOnMainThread:@selector(sourceConversionDidEnd:) withObject:note waitUntilDone:NO]; +} + +- (void)sourceConversionDidEnd:(NSNotification *)note +{ + if (![self notificationBelongsToCurrentProject:note]) + return; + + NSString *path = note.userInfo[@"path"]; + + if ([self isObjjFile:path]) + { + NSMutableArray *addPaths = [self.pbxOperations[@"add"] mutableCopy]; + + if (!addPaths) + self.pbxOperations[@"add"] = @[path]; + else + { + [addPaths addObject:path]; + self.pbxOperations[@"add"] = addPaths; + } + } + + DDLogVerbose(@"%@ %@", NSStringFromSelector(_cmd), path); +} + +#pragma mark - Event Stream + +- (void)startEventStream +{ + if (self.stream) + return; + + [self stopEventStream]; + + FSEventStreamCreateFlags flags = kFSEventStreamCreateFlagUseCFTypes | + kFSEventStreamCreateFlagWatchRoot | + kFSEventStreamCreateFlagIgnoreSelf | + kFSEventStreamCreateFlagNoDefer; + + if (self.supportsFileLevelAPI) + flags |= kFSEventStreamCreateFlagFileEvents; + + // Get a file descriptor to the project directory so we can locate it if it moves + self.projectPathFileDescriptor = open(self.projectPath.UTF8String, O_EVTONLY); + + NSArray *pathsToWatch = [self getPathsToWatch]; + + void *appPointer = (__bridge void *)self; + FSEventStreamContext context = { 0, appPointer, NULL, NULL, NULL }; + CFTimeInterval latency = 2.0; + UInt64 lastEventId = self.lastEventId.unsignedLongLongValue; + + self.stream = FSEventStreamCreate(NULL, + &fsevents_callback, + &context, + (__bridge CFArrayRef) pathsToWatch, + lastEventId, + latency, + flags); + + FSEventStreamScheduleWithRunLoop(self.stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + [self startFSEventStream]; + + DDLogVerbose(@"FSEventStream started for paths: %@", pathsToWatch); +} + +- (void)startFSEventStream +{ + if (self.stream && !self.streamStarted) + { + FSEventStreamStart(self.stream); + self.streamStarted = YES; + } +} + +- (NSArray *)getPathsToWatch +{ + NSMutableArray *pathsToWatch = [NSMutableArray arrayWithObject:self.projectPath]; + NSArray *otherPathsToWatch = @[@"", @"Frameworks/Debug", @"Frameworks/Source"]; + + for (NSString *path in otherPathsToWatch) + { + NSString *fullPath = [self.projectPath stringByAppendingPathComponent:path]; + + BOOL exists, isDirectory; + exists = [self.fm fileExistsAtPath:fullPath isDirectory:&isDirectory]; + + if (exists && isDirectory) + [self watchSymlinkedDirectoriesAtPath:path pathsToWatch:pathsToWatch]; + } + + return [pathsToWatch copy]; +} + +- (void)watchSymlinkedDirectoriesAtPath:(NSString *)projectPath pathsToWatch:(NSMutableArray *)pathsToWatch +{ + NSString *fullProjectPath = [self.projectPath stringByAppendingPathComponent:projectPath]; + NSError *error = NULL; + + NSArray *urls = [self.fm contentsOfDirectoryAtURL:[NSURL fileURLWithPath:fullProjectPath] + includingPropertiesForKeys:@[NSURLIsDirectoryKey, NSURLIsSymbolicLinkKey] + options:NSDirectoryEnumerationSkipsHiddenFiles | NSDirectoryEnumerationSkipsPackageDescendants | NSDirectoryEnumerationSkipsSubdirectoryDescendants + error:&error]; + + for (NSURL *url in urls) + { + NSNumber *isSymlink; + [url getResourceValue:&isSymlink forKey:NSURLIsSymbolicLinkKey error:nil]; + + if (isSymlink.boolValue == NO) + continue; + + NSURL *resolvedURL = [url URLByResolvingSymlinksInPath]; + + if (![resolvedURL checkResourceIsReachableAndReturnError:nil]) + continue; + + NSNumber *isDirectory; + [resolvedURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil]; + + if (isDirectory.boolValue == NO) + continue; + + NSString *path = resolvedURL.path; + NSString *filename = path.lastPathComponent; + + if (![self shouldIgnoreDirectoryNamed:filename] && ![self pathMatchesIgnoredPaths:path]) + { + DDLogVerbose(@"Watching symlinked directory: %@", path); + + [pathsToWatch addObject:path]; + } + } +} + +- (void)stopEventStream +{ + if (self.stream) + { + [self updateUserDefaultsWithLastEventId]; + + [self stopFSEventStream]; + FSEventStreamUnscheduleFromRunLoop(self.stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + FSEventStreamInvalidate(self.stream); + FSEventStreamRelease(self.stream); + self.stream = NULL; + } + + if (self.projectPathFileDescriptor >= 0) + { + close(self.projectPathFileDescriptor); + self.projectPathFileDescriptor = -1; + } +} + +- (void)stopFSEventStream +{ + if (self.stream && self.streamStarted) + { + FSEventStreamStop(self.stream); + self.streamStarted = NO; + } +} + +- (void)configureFileAPI +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + if (!self.supportsFileLevelAPI) + { + DDLogInfo(@"System doesn't support file level API, user folder level API"); + + [defaults setObject:[NSNumber numberWithInt:kXCCAPIModeFolder] forKey:kDefaultXCCAPIMode]; + } + + switch ([defaults integerForKey:kDefaultXCCAPIMode]) + { + case kXCCAPIModeAuto: + self.isUsingFileLevelAPI = self.supportsFileLevelAPI; + break; + + case kXCCAPIModeFolder: + self.isUsingFileLevelAPI = NO; + break; + } + + self.reactToInodeModification = self.isUsingFileLevelAPI ? [defaults boolForKey:kDefaultXCCReactToInodeMod] : NO; +} + +- (void)updateUserDefaultsWithLastEventId +{ + UInt64 lastEventId = FSEventStreamGetLatestEventId(self.stream); + + // Just in case the stream callback was never called... + if (lastEventId != 0) + self.lastEventId = [NSNumber numberWithUnsignedLongLong:lastEventId]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:self.lastEventId forKey:kDefaultLastEventId]; + [defaults synchronize]; +} + +- (NSString *)dumpFSEventFlags:(FSEventStreamEventFlags)flags +{ + BOOL created = (flags & kFSEventStreamEventFlagItemCreated) != 0; + BOOL removed = (flags & kFSEventStreamEventFlagItemRemoved) != 0; + BOOL inodeMetaModified = (flags & kFSEventStreamEventFlagItemInodeMetaMod) != 0; + BOOL renamed = (flags & kFSEventStreamEventFlagItemRenamed) != 0; + BOOL modified = (flags & kFSEventStreamEventFlagItemModified) != 0; + BOOL finderInfoModified = (flags & kFSEventStreamEventFlagItemFinderInfoMod) != 0; + BOOL changedOwner = (flags & kFSEventStreamEventFlagItemChangeOwner) != 0; + BOOL xattrModified = (flags & kFSEventStreamEventFlagItemXattrMod) != 0; + BOOL isFile = (flags & kFSEventStreamEventFlagItemIsFile) != 0; + BOOL isDir = (flags & kFSEventStreamEventFlagItemIsDir) != 0; + BOOL isSymlink = (flags & kFSEventStreamEventFlagItemIsSymlink) != 0; + + NSMutableArray *flagNames = [NSMutableArray new]; + + if (created) + [flagNames addObject:@"created"]; + + if (removed) + [flagNames addObject:@"removed"]; + + if (inodeMetaModified) + [flagNames addObject:@"inode"]; + + if (renamed) + [flagNames addObject:@"renamed"]; + + if (modified) + [flagNames addObject:@"modified"]; + + if (finderInfoModified) + [flagNames addObject:@"Finder info"]; + + if (changedOwner) + [flagNames addObject:@"owner"]; + + if (xattrModified) + [flagNames addObject:@"xattr"]; + + if (isFile) + [flagNames addObject:@"file"]; + + if (isDir) + [flagNames addObject:@"dir"]; + + if (isSymlink) + [flagNames addObject:@"symlink"]; + + return [flagNames componentsJoinedByString:@", "]; +} + +#pragma mark - Event Handlers + +- (void)handleFSEventsWithPaths:(NSArray *)paths flags:(const FSEventStreamEventFlags[])eventFlags ids:(const FSEventStreamEventId[])eventIds +{ + DDLogVerbose(@"FSEvents: %ld path(s)", paths.count); + + [self.pbxOperations removeAllObjects]; + + NSMutableArray *modifiedPaths = [NSMutableArray new]; + NSMutableArray *renamedDirectories = [NSMutableArray new]; + + BOOL needUpdate = NO; + + for (size_t i = 0; i < paths.count; ++i) + { + FSEventStreamEventFlags flags = eventFlags[i]; + NSString *path = [paths[i] stringByStandardizingPath]; + + BOOL rootChanged = (flags & kFSEventStreamEventFlagRootChanged) != 0; + + if (rootChanged) + { + DDLogVerbose(@"Watched path changed: %@", path); + + [self resetProjectForWatchedPath:path]; + return; + } + + BOOL isHistoryDoneSentinalEvent = (flags & kFSEventStreamEventFlagHistoryDone) != 0; + + if (isHistoryDoneSentinalEvent) + { + DDLogVerbose(@"History done sentinal event"); + continue; + } + + BOOL isMountEvent = (flags & kFSEventStreamEventFlagMount) || (flags & kFSEventStreamEventFlagUnmount); + + if (isMountEvent) + { + DDLogVerbose(@"Volume %@: %@", (flags & kFSEventStreamEventFlagMount) ? @"mounted" : @"unmounted", path); + continue; + } + + BOOL needRescan = (flags & kFSEventStreamEventFlagMustScanSubDirs) != 0; + + if (needRescan) + { + // A rescan requires a reset + [self resetProjectForWatchedPath:path]; + + return; + } + + if (self.isUsingFileLevelAPI) + { + // BOOL finderInfoModified = (flags & kFSEventStreamEventFlagItemFinderInfoMod) != 0; + // BOOL changedOwner = (flags & kFSEventStreamEventFlagItemChangeOwner) != 0; + // BOOL xattrModified = (flags & kFSEventStreamEventFlagItemXattrMod) != 0; + // BOOL isSymlink = (flags & kFSEventStreamEventFlagItemIsSymlink) != 0; + BOOL inodeMetaModified = (flags & kFSEventStreamEventFlagItemInodeMetaMod) != 0; + BOOL isFile = (flags & kFSEventStreamEventFlagItemIsFile) != 0; + BOOL isDir = (flags & kFSEventStreamEventFlagItemIsDir) != 0; + BOOL renamed = (flags & kFSEventStreamEventFlagItemRenamed) != 0; + BOOL modified = (flags & kFSEventStreamEventFlagItemModified) != 0; + BOOL created = (flags & kFSEventStreamEventFlagItemCreated) != 0; + BOOL removed = (flags & kFSEventStreamEventFlagItemRemoved) != 0; + + DDLogVerbose(@"FSEvent: %@ (%@)", path, [self dumpFSEventFlags:flags]); + + if (isDir) + { + /* + When a project is opened for the first time after it is created, + we get an event where the first path is a create for the root directory. + In that case all of the paths have been processed, and we ignore the event. + */ + if (created && [path isEqualToString:self.projectPath.stringByResolvingSymlinksInPath]) + return; + + if (renamed && + !(created || removed) && + ![self shouldIgnoreDirectoryNamed:path.lastPathComponent] && + ![self pathMatchesIgnoredPaths:path]) + { + DDLogVerbose(@"Renamed directory: %@", path); + + [renamedDirectories addObject:path]; + } + + continue; + } + else if (isFile && + (created || modified || renamed || removed || (self.reactToInodeModification && inodeMetaModified)) && + [self isSourceFile:path]) + { + DDLogVerbose(@"FSEvent accepted"); + + if ([self.fm fileExistsAtPath:path]) + [modifiedPaths addObject:path]; + else if ([path.pathExtension isEqualToString:@"xib"]) + { + // If a xib is deleted, delete its cib. There is no need to update when a xib is deleted, + // it is inside a folder in Xcode, which updates automatically. + + if (![self.fm fileExistsAtPath:path]) + { + NSString *cibPath = [path.stringByDeletingPathExtension stringByAppendingPathExtension:@"cib"]; + + if ([self.fm fileExistsAtPath:cibPath]) + [self.fm removeItemAtPath:cibPath error:nil]; + + continue; + } + } + + needUpdate = YES; + } + else if (isFile && (renamed || removed) && !(modified || created) && [path.pathExtension isEqualToString:@"cib"]) + { + // If a cib is deleted, mark its xib as needing update so the cib is regenerated + NSString *xibPath = [path.stringByDeletingPathExtension stringByAppendingPathExtension:@"xib"]; + + if ([self.fm fileExistsAtPath:xibPath]) + { + [modifiedPaths addObject:xibPath]; + needUpdate = YES; + } + } + } + else // directory-based listening + { + // We should drop support for Snow Leopard soon. + + BOOL isDirectory = NO; + [self.fm fileExistsAtPath:path isDirectory:&isDirectory]; + + // If for some reason the path is not a directory, + // we don't want to deal with it in this mode. + if (!isDirectory) + continue; + + NSFileManager *fm = [NSFileManager defaultManager]; + NSArray *subpaths = [fm contentsOfDirectoryAtPath:path error:NULL]; + + for (NSString *subpath in subpaths) + { + NSString *fullPath = [path stringByAppendingPathComponent:subpath]; + + if (![self isSourceFile:fullPath]) + continue; + + NSDate *lastModifiedDate = [self lastModificationDateForPath:fullPath]; + NSDictionary *fileAttributes = [fm attributesOfItemAtPath:fullPath error:nil]; + NSDate *fileModDate = [fileAttributes objectForKey:NSFileModificationDate]; + + if ([fileModDate compare:lastModifiedDate] == NSOrderedDescending) + { + [self updateLastModificationDate:fileModDate forPath:fullPath]; + [modifiedPaths addObject:fullPath]; + needUpdate = YES; + } + } + } + } + + // If directories were renamed, we take the easy way out and reset the project + if (renamedDirectories.count) + [self handleRenamedDirectories:renamedDirectories]; + else if (needUpdate) + [self updateSupportFilesWithModifiedPaths:modifiedPaths]; +} + +- (void)handleRenamedDirectories:(NSArray *)directories +{ + // Make sure we don't get any more events while handling these events + [self stopFSEventStream]; + + DDLogVerbose(@"Renamed directories: %@", directories); + + [self tidyShadowedFiles]; + + for (NSString *directory in directories) + { + // If it doesn't exist, it's the old name. Nothing to do. + // If it does exist, populate the project with the directory. + + if ([self.fm fileExistsAtPath:directory]) + { + // If the directory is within the project, we can populate it directly. + // Otherwise we have to start at the top level and repopulate everything. + if ([directory hasPrefix:self.projectPath]) + [self populateXcodeProjectWithProjectRelativePath:[self projectRelativePathForPath:directory]]; + else + { + [self populateXcodeProject]; + + // Since everything has been repopulated, no point in continuing + break; + } + } + } + + [self waitForOperationQueueToFinishWithSelector:@selector(batchDidFinish)]; +} + +- (void)updateSupportFilesWithModifiedPaths:(NSArray *)modifiedPaths +{ + // Make sure we don't get any more events while handling these events + [self stopFSEventStream]; + + NSArray *removedFiles = [self tidyShadowedFiles]; + + if (removedFiles.count || modifiedPaths.count) + { + for (NSString *path in modifiedPaths) + [self handleFileModificationAtPath:path]; + + [self waitForOperationQueueToFinishWithSelector:@selector(batchDidFinish)]; + } +} + +- (void)resetProjectForWatchedPath:(NSString *)path +{ + // If a watched path changes we don't have much choice but to reset the project. + [self stopFSEventStream]; + + if ([path isEqualToString:self.projectPath]) + { + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + NSInteger response = NSRunAlertPanel(@"The project moved.", @"Your project directory has moved. Would you like to reload the project or quit XcodeCapp?", @"Reload", @"Quit", nil); + + BOOL shouldQuit = YES; + + if (response == NSAlertDefaultReturn) + { + char newPathBuf[MAXPATHLEN + 1]; + + int result = fcntl(self.projectPathFileDescriptor, F_GETPATH, newPathBuf); + + if (result == 0) + { + self.projectPath = [NSString stringWithUTF8String:newPathBuf]; + shouldQuit = NO; + } + else + NSRunAlertPanel(@"The project can’t be located.", @"I’m sorry Dave, but I don’t know where the project went. I’m afraid I have to quit now.", @"OK, HAL", nil, nil); + } + + if (shouldQuit) + { + [[NSApplication sharedApplication] terminate:self]; + return; + } + } + + [self synchronizeProject:self]; +} + +/*! + Handle a file modification. If it's a .j or xib/nib, + perform the appropriate conversion. If it's .xcodecapp-ignore, it will + update the list of ignored files. + + @param path The full resolved path of the modified file +*/ +- (void)handleFileModificationAtPath:(NSString*)resolvedPath +{ + if (![self.fm fileExistsAtPath:resolvedPath]) + return; + + NSString *projectPath = [self projectPathForSourcePath:resolvedPath]; + + ProcessSourceOperation *op = [[ProcessSourceOperation alloc] initWithXCC:self + projectId:[NSNumber numberWithInteger:self.projectId] + sourcePath:projectPath]; + [self.operationQueue addOperation:op]; +} + +#pragma mark - Shell Helpers + +/*! + Run an NSTask with the given arguments + + @param launchPath The executable to launch + @param arguments NSArray containing the NSTask arguments + @param returnType Determines whether to return stdout, stderr, either, or nothing in the response + @return NSDictionary containing the return status (NSNumber) and the response (NSString) + */ +- (NSDictionary *)runTaskWithLaunchPath:(NSString *)launchPath arguments:(NSArray *)arguments returnType:(XCCTaskReturnType)returnType +{ + NSTask *task = [NSTask new]; + + task.launchPath = launchPath; + task.arguments = arguments; + task.environment = self.environment; + task.standardOutput = [NSPipe pipe]; + task.standardError = [NSPipe pipe]; + + [task launch]; + + DDLogVerbose(@"Task launched: %@\n%@", launchPath, arguments); + + if (returnType != kTaskReturnTypeNone) + { + [task waitUntilExit]; + + DDLogVerbose(@"Task exited: %@:%d", launchPath, task.terminationStatus); + + NSData *data = nil; + + if (returnType == kTaskReturnTypeStdOut || returnType == kTaskReturnTypeAny) + data = [[task.standardOutput fileHandleForReading] availableData]; + + if (returnType == kTaskReturnTypeStdError || (returnType == kTaskReturnTypeAny && [data length] == 0)) + data = [[task.standardError fileHandleForReading] availableData]; + + NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSNumber *status = [NSNumber numberWithInt:task.terminationStatus]; + + return @{ @"status":status, @"response":response }; + } + else + { + return @{ @"status":@0, @"response":@"" }; + } +} + +- (BOOL)executablesAreAccessible +{ + for (NSString *executable in self.executables) + { + NSDictionary *response = [self runTaskWithLaunchPath:@"/usr/bin/which" + arguments:@[executable] + returnType:kTaskReturnTypeStdOut]; + + NSString *path = [response[@"response"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + if (path.length) + self.executablePaths[executable] = path; + else + { + DDLogError(@"Could not find executable '%@' in PATH: %@", executable, self.environment[@"PATH"]); + return NO; + } + } + + DDLogVerbose(@"Executable paths: %@", self.executablePaths); + + return YES; +} + +#pragma mark - Source Files Management + +- (BOOL)isObjjFile:(NSString *)path +{ + return [path.pathExtension.lowercaseString isEqual:@"j"]; +} + +- (BOOL)isXibFile:(NSString *)path +{ + NSString *extension = path.pathExtension.lowercaseString; + + if ([extension isEqual:@"xib"] || [extension isEqual:@"nib"]) + { + // Xcode creates temp files called ~.xib. Filter those out. + NSString *baseFilename = path.lastPathComponent.stringByDeletingPathExtension; + + return [baseFilename characterAtIndex:baseFilename.length - 1] != '~'; + } + + return NO; +} + +- (BOOL)isXCCIgnoreFile:(NSString *)path +{ + return [path isEqualToString:self.xcodecappIgnorePath]; +} + +- (BOOL)isSourceFile:(NSString *)path +{ + return ([self isXibFile:path] || [self isObjjFile:path] || [self isXCCIgnoreFile:path]) && ![self pathMatchesIgnoredPaths:path]; +} + +- (NSString *)projectPathForSourcePath:(NSString *)path +{ + NSString *base = path.stringByDeletingLastPathComponent; + NSString *projectPath = self.projectPathsForSourcePaths[base]; + + return projectPath ? [projectPath stringByAppendingPathComponent:path.lastPathComponent] : path; +} + +- (NSString *)projectRelativePathForPath:(NSString *)path +{ + return [path substringFromIndex:self.projectPath.length + 1]; +} + +#pragma mark - Shadow Files Management + +- (NSString *)shadowBasePathForProjectSourcePath:(NSString *)path +{ + if (path.isAbsolutePath) + path = [self projectRelativePathForPath:path]; + + NSString *filename = [path.stringByDeletingPathExtension stringByReplacingOccurrencesOfString:@"/" withString:XCCSlashReplacement]; + + return [self.supportPath stringByAppendingPathComponent:filename]; +} + +- (NSString *)sourcePathForShadowPath:(NSString *)path +{ + NSString *filename = [path stringByReplacingOccurrencesOfString:XCCSlashReplacement withString:@"/"]; + filename = [filename.stringByDeletingPathExtension stringByAppendingPathExtension:@"j"]; + + return [self.projectPath stringByAppendingPathComponent:filename]; +} + +/*! + Clean up any shadow files and PBX entries related to given the Cappuccino source file path +*/ +- (void)removeReferencesToSourcePaths:(NSArray *)sourcePaths +{ + BOOL updateLastModDate = !self.supportsFileLevelAPI && [self respondsToSelector:@selector(updateLastModificationDate:forPath:)]; + + for (NSString *sourcePath in sourcePaths) + { + if (updateLastModDate) + [self updateLastModificationDate:nil forPath:sourcePath]; + + NSString *shadowBasePath = [self shadowBasePathForProjectSourcePath:sourcePath]; + NSString *shadowHeaderPath = [shadowBasePath stringByAppendingPathExtension:@"h"]; + NSString *shadowImplementationPath = [shadowBasePath stringByAppendingPathExtension:@"m"]; + + [self.fm removeItemAtPath:shadowHeaderPath error:nil]; + [self.fm removeItemAtPath:shadowImplementationPath error:nil]; + + [self pruneProcessingErrorsForProjectPath:sourcePath]; + } + + if (sourcePaths.count) + DDLogVerbose(@"Removed shadow references to: %@", sourcePaths); +} + +- (NSArray *)tidyShadowedFiles +{ + NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.supportPath error:nil]; + NSMutableArray *pathsToRemove = [NSMutableArray new]; + + for (NSString *path in subpaths) + { + NSString *extension = path.pathExtension; + + if ([extension isEqualToString:@"h"] && ![path.lastPathComponent isEqualToString:@"xcc_general_include.h"]) + { + NSString *sourcePath = [self sourcePathForShadowPath:path]; + + if (![self.fm fileExistsAtPath:sourcePath]) + [pathsToRemove addObject:sourcePath]; + } + } + + [self removeReferencesToSourcePaths:pathsToRemove]; + + if (pathsToRemove.count) + self.pbxOperations[@"remove"] = pathsToRemove; + + return pathsToRemove; +} + +#pragma mark - XCC Ignore management + ++ (NSString *)globToRegexPattern:(NSString *)glob +{ + NSMutableString *regex = [glob mutableCopy]; + + if ([regex characterAtIndex:0] == '!') + [regex deleteCharactersInRange:NSMakeRange(0, 1)]; + + [regex replaceOccurrencesOfString:@"." + withString:@"\\." + options:0 + range:NSMakeRange(0, [regex length])]; + + [regex replaceOccurrencesOfString:@"*" + withString:@".*" + options:0 + range:NSMakeRange(0, [regex length])]; + + // If the glob ends with "/", match that directory and anything below it. + if ([regex characterAtIndex:regex.length - 1] == '/') + [regex replaceCharactersInRange:NSMakeRange(regex.length - 1, 1) withString:@"(?:/.*)?"]; + + return [NSString stringWithFormat:@"^%@$", regex]; +} + ++ (NSArray *)parseIgnorePaths:(NSArray *)paths +{ + NSMutableArray *parsedPaths = [NSMutableArray array]; + NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet]; + + for (NSString *pattern in paths) + { + if ([pattern stringByTrimmingCharactersInSet:whitespace].length == 0) + continue; + + NSString *regexPattern = [self globToRegexPattern:pattern]; + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", regexPattern]; + [parsedPaths addObject:@{ @"predicate": predicate, @"exclude": @([pattern characterAtIndex:0] != '!') }]; + } + + return parsedPaths; +} + +/*! + Compute the ignored paths according to any existing .xcodecapp-ignore file +*/ +- (void)computeIgnoredPaths +{ + self.ignoredPathPredicates = [XCCDefaultIgnoredPathPredicates mutableCopy]; + NSString *ignorePath = [self.projectPath stringByAppendingPathComponent:@".xcodecapp-ignore"]; + + if ([self.fm fileExistsAtPath:ignorePath]) + { + NSString *ignoreFileContent = [NSString stringWithContentsOfFile:ignorePath encoding:NSUTF8StringEncoding error:nil]; + NSArray *ignoredPatterns = [ignoreFileContent componentsSeparatedByString:@"\n"]; + NSArray *parsedPaths = [[self class] parseIgnorePaths:ignoredPatterns]; + [self.ignoredPathPredicates addObjectsFromArray:parsedPaths]; + } + + DDLogVerbose(@"Ignoring file paths: %@", self.ignoredPathPredicates); +} + +- (BOOL)pathMatchesIgnoredPaths:(NSString*)aPath +{ + BOOL ignore = NO; + + for (NSDictionary *ignoreInfo in self.ignoredPathPredicates) + { + BOOL matches = [ignoreInfo[@"predicate"] evaluateWithObject:aPath]; + + if (matches) + ignore = [ignoreInfo[@"exclude"] boolValue]; + } + + return ignore; +} + +- (BOOL)shouldIgnoreDirectoryNamed:(NSString *)filename +{ + return [XCCDirectoriesToIgnorePredicate evaluateWithObject:filename]; +} + +#pragma mark - Errors + +- (IBAction)openErrorsPanel:(id)aSender +{ + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + [self.errorsPanel makeKeyAndOrderFront:nil]; +} + +- (IBAction)openErrorInEditor:(id)sender +{ + id info = self.errorListController.selection; + + NSString *path = [info valueForKey:@"path"]; + + if (path == NSNoSelectionMarker) + return; + + if ([self isObjjFile:path]) + { + [self openObjjFile:path line:[[info valueForKey:@"line"] intValue]]; + } + else // xib + { + [[NSWorkspace sharedWorkspace] openFile:path]; + } +} + +- (void)openObjjFile:(NSString *)path line:(NSInteger)line +{ + NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; + + NSString *app, *type; + BOOL success = [workspace getInfoForFile:path application:&app type:&type]; + + if (!success) + { + NSBeep(); + return; + } + + NSBundle *bundle = [NSBundle bundleWithPath:app]; + NSString *identifier = bundle.bundleIdentifier; + NSString *executablePath = nil; + XCCLineSpecifier lineSpecifier = kLineSpecifierNone; + + if ([identifier hasPrefix:@"com.sublimetext."]) + { + lineSpecifier = kLineSpecifierColon; + executablePath = [[bundle sharedSupportPath] stringByAppendingPathComponent:@"bin/subl"]; + } + else if ([identifier isEqualToString:@"com.barebones.textwrangler"]) + { + lineSpecifier = kLineSpecifierColon; + executablePath = [[bundle bundlePath] stringByAppendingPathComponent:@"Contents/Helpers/edit"]; + } + else if ([identifier isEqualToString:@"com.barebones.bbedit"]) + { + lineSpecifier = kLineSpecifierColon; + executablePath = [[bundle bundlePath] stringByAppendingPathComponent:@"Contents/Helpers/bbedit"]; + } + else if ([identifier isEqualToString:@"com.macromates.textmate"]) // TextMate 1.x + { + lineSpecifier = kLineSpecifierMinusL; + executablePath = [[bundle sharedSupportPath] stringByAppendingPathComponent:@"Support/bin/mate"]; + } + else if ([identifier hasPrefix:@"com.macromates.TextMate"]) // TextMate 2.x + { + lineSpecifier = kLineSpecifierMinusL; + executablePath = [bundle pathForResource:@"mate" ofType:@""]; + } + else if ([identifier isEqualToString:@"com.chocolatapp.Chocolat"]) + { + lineSpecifier = kLineSpecifierMinusL; + executablePath = [[bundle sharedSupportPath] stringByAppendingPathComponent:@"choc"]; + } + else if ([identifier isEqualToString:@"org.vim.MacVim"]) + { + lineSpecifier = kLineSpecifierPlus; + executablePath = @"/usr/local/bin/mvim"; + } + else if ([identifier isEqualToString:@"org.gnu.Aquamacs"]) + { + if ([self.fm isExecutableFileAtPath:@"/usr/bin/aquamacs"]) + executablePath = @"/usr/bin/aquamacs"; + else if ([self.fm isExecutableFileAtPath:@"/usr/local/bin/aquamacs"]) + executablePath = @"/usr/local/bin/aquamacs"; + } + else if ([identifier isEqualToString:@"com.apple.dt.Xcode"]) + { + executablePath = [[bundle bundlePath] stringByAppendingPathComponent:@"Contents/Developer/usr/bin/xed"]; + } + + if (!executablePath || ![self.fm isExecutableFileAtPath:executablePath]) + { + [workspace openFile:path]; + return; + } + + NSArray *args; + + switch (lineSpecifier) + { + case kLineSpecifierNone: + args = @[path]; + break; + + case kLineSpecifierColon: + args = @[[NSString stringWithFormat:@"%1$@:%2$ld", path, line]]; + break; + + case kLineSpecifierMinusL: + args = @[@"-l", [NSString stringWithFormat:@"%ld", line], path]; + break; + + case kLineSpecifierPlus: + args = @[[NSString stringWithFormat:@"+%ld", line], path]; + break; + } + + [self runTaskWithLaunchPath:executablePath arguments:args returnType:kTaskReturnTypeNone]; +} + +- (void)showErrors +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + if (([defaults boolForKey:kDefaultXCCAutoOpenErrorsPanelOnErrors] && self.hasErrors) || + ([defaults boolForKey:kDefaultXCCAutoOpenErrorsPanelOnWarnings] && self.errorList.count)) + { + [self openErrorsPanel:self]; + } +} + +- (void)pruneProcessingErrorsForProjectPath:(NSString *)path +{ + // Remove all errors for the path being processed + NSIndexSet *matchingErrors = [self.errorList indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) + { + return [[obj valueForKey:@"path"] isEqualToString:path]; + }]; + + [self.errorListController removeObjectsAtArrangedObjectIndexes:matchingErrors]; +} + +- (IBAction)clearErrors:(id)sender +{ + [self.errorList removeAllObjects]; + self.errorListController.content = self.errorList; +} + +- (BOOL)hasErrors +{ + NSInteger index = [self.errorList indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) + { + return [[obj valueForKey:@"status"] intValue] == XCCStatusCodeError; + }]; + + return index != NSNotFound; +} + +#pragma mark - User notifications + +- (NSString *)applicationNameForGrowl +{ + return @"XcodeCapp"; +} + +- (void)notifyUserWithTitle:(NSString *)aTitle message:(NSString *)aMessage +{ + if ([NSUserNotificationCenter class]) + { + NSUserNotification *note = [NSUserNotification new]; + note.title = aTitle; + note.informativeText = aMessage; + + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:note]; + } + else + { + [GrowlApplicationBridge notifyWithTitle:aTitle + description:aMessage + notificationName:GROWL_NOTIFICATIONS_DEFAULT + iconData:nil + priority:0 + isSticky:NO + clickContext:nil]; + } +} + +- (void)wantUserNotificationWithInfo:(NSDictionary *)info +{ + [self performSelectorOnMainThread:@selector(notifyUserWithInfo:) withObject:info waitUntilDone:NO]; +} + +- (void)notifyUserWithInfo:(NSDictionary *)info +{ + if ([info[@"projectId"] intValue] != self.projectId) + return; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:kDefaultShowProcessingNotices]) + [self notifyUserWithTitle:info[@"title"] message:info[@"message"]]; +} + +- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification +{ + // Notification Center may decide not to show a notification. We always want them to show. + return YES; +} + +@end + + +@implementation XcodeCapp (SnowLeopard) + +- (void)updateLastModificationDate:(NSDate *)date forPath:(NSString *)path +{ + if (date) + [self.pathModificationDates setObject:date forKey:path]; + else + [self.pathModificationDates removeObjectForKey:path]; + + [[NSUserDefaults standardUserDefaults] setObject:self.pathModificationDates forKey:kDefaultPathModificationDates]; +} + +- (NSDate *)lastModificationDateForPath:(NSString *)path +{ + if (!self.pathModificationDates) + { + self.pathModificationDates = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:kDefaultPathModificationDates] mutableCopy]; + + if (!self.pathModificationDates) + self.pathModificationDates = [NSMutableDictionary new]; + } + + if ([self.pathModificationDates valueForKey:path] != nil) + return [self.pathModificationDates valueForKey:path]; + else + return self.appStartedTimestamp; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.h b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.h new file mode 100644 index 000000000..56dc8d3ae --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.h @@ -0,0 +1,15 @@ +// +// XcodeProjectCloser.h +// XcodeCapp +// +// Created by Aparajita on 5/12/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +@interface XcodeProjectCloser : NSObject + ++ (void)closeXcodeProjectForProject:(NSString *)projectPath; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m new file mode 100644 index 000000000..325df5feb --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m @@ -0,0 +1,40 @@ +// +// XcodeProjectCloser.m +// XcodeCapp +// +// Created by Aparajita on 5/12/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import "XcodeProjectCloser.h" + + +// Used to close the Xcode project if it is open. +static const char *kCloseXcodeProjectScript = + "tell application \"Xcode\"\n" + "set docs to (document of every window)\n" + "repeat with doc in docs\n" + "if class of doc is workspace document then\n" + "set docPath to path of doc\n" + "if docPath begins with \"%@\" then\n" + "close doc\n" + "return\n" + "end if\n" + "end if\n" + "end repeat\n" + "end tell"; + + +@implementation XcodeProjectCloser + ++ (void)closeXcodeProjectForProject:(NSString *)projectPath +{ + NSString *format = [NSString stringWithUTF8String:kCloseXcodeProjectScript]; + NSString *source = [NSString stringWithFormat:format, projectPath]; + NSAppleScript *script = [[NSAppleScript alloc] initWithSource:source]; + + NSAppleEventDescriptor *descriptor; + descriptor = [script executeAndReturnError:nil]; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/en.lproj/InfoPlist.strings b/Tools/XcodeCapp/XcodeCapp/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib new file mode 100644 index 000000000..3fa8d38e3 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib @@ -0,0 +1,2576 @@ + + + + 1060 + 12E55 + 4457.6 + 1187.39 + 626.00 + + 4457.6 + 3330 + + + NSArrayController + NSBox + NSButton + NSButtonCell + NSCustomObject + NSImageCell + NSImageView + NSMenu + NSMenuItem + NSPopUpButton + NSPopUpButtonCell + NSScrollView + NSScroller + NSTableColumn + NSTableView + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + PDFView + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.pdfkit.ibplugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + NSFontManager + + + + + + + Create Project... + + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + + + + Open Project… + + 2147483647 + + + + + + Open Recent + + 2147483647 + + + + + + Open Xcode Project + + 2147483647 + + + 1 + + + + YES + YES + + + 2147483647 + + + + + + Synchronize Project + + 2147483647 + + + + + + Show in %@ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Errors & Warnings + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + About XcodeCapp... + + 2147483647 + + + + + + Preferences… + + 2147483647 + + + + + + XcodeCapp Help + + 2147483647 + + + 7 + + + + YES + YES + + + 2147483647 + + + + + + Quit XcodeCapp + + 2147483647 + + + + + + + AppController + + + 3 + 2 + {{196, 240}, {402, 202}} + 1685586944 + About + NSPanel + + + + + 1792 + + + + 1804 + + {{164, 20}, {203, 98}} + + YES + + 68157504 + 4326400 + WGNvZGVDYXBwIDMgZGV2ZWxvcGVkIGJ5OgogICAgQXBhcmFqaXRhIEZpc2htYW4KICAgIGFwYXJhaml0 +YUBhcGFyYWppdGEuY29tCgpPcmlnaW5hbCBDb2NvYSB2ZXJzaW9uIGRldmVsb3BlZCBieToKICAgIEFu +dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA + + LucidaGrande + 11 + 3100 + + + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 3 + MC4zMTM0MzA2NDI2AA + + + NO + + + + 1802 + + {{164, 126}, {221, 74}} + + YES + + 68157504 + 4326400 + XcodeCapp 3.0.0 + + Zapfino + 18 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + textColor + + 3 + MAA + + + + NO + + + + 1804 + + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{17, 63}, {128, 128}} + + YES + + 0 + 33554432 + + NSImage + icon_128x128 + + 0 + 0 + 0 + NO + + NO + YES + + + + {402, 202} + + {{0, 0}, {2560, 1418}} + {10000000000000, 10000000000000} + NO + + + 15 + 2 + {{1826, 825}, {550, 237}} + 1685586944 + Errors & Warnings + NSPanel + + + {315, 77} + + + 1792 + + + + 1810 + + + + 3858 + + + + 1792 + + {550, 201} + + + YES + NO + YES + + + -2147481856 + {15, 20} + + + + error + 536 + 40 + 1000 + + 75497536 + 2048 + Error + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + + + + 69206081 + 2304 + Text Cell + + + + 6 + System + controlBackgroundColor + + + + 6 + System + controlTextColor + + + + 1 + YES + + + + 14 + 10 + + + 1 + MSAxIDEgMAA + + 30 + -1832910848 + + + 5 + -1 + 0 + NO + 0 + 1 + + + {{1, 1}, {550, 201}} + + + + + + 4 + + + + -2147481856 + + {{1, 273}, {512, 16}} + + + NO + 1 + + _doScroller: + + + + -2147481856 + + {{535, 1}, {16, 45}} + + + NO + + _doScroller: + + + + {{-1, 35}, {552, 203}} + + + + 133682 + + + + QSAAAEEgAABCIAAAQiAAAA + 0.25 + 4 + 1 + + + + 1825 + + {{352, 8}, {85, 19}} + + + {250, 750} + YES + + -2080374784 + 134217728 + Clear + + LucidaGrande + 12 + 4883 + + + -2038284288 + 164 + + + + 400 + 75 + + NO + + + + 1828 + + {{20, 8}, {85, 19}} + + + {250, 750} + YES + + -1543503872 + 134217728 + Open + + + -2038284288 + 164 + + + + 400 + 75 + + NO + + + + 1825 + + {{445, 8}, {85, 19}} + + + {250, 750} + YES + + -2080374784 + 134217728 + Close + + + -2038284288 + 164 + + + + 400 + 75 + + NO + + + + {550, 237} + + + + {{0, 0}, {2560, 1418}} + {315, 99} + {10000000000000, 10000000000000} + errorPanel + YES + + + 3 + 2 + {{1964, 505}, {431, 321}} + 1685586944 + Preferences + NSWindow + + + + + 1792 + + + + 1548 + + + + 1810 + + + + 1804 + + {{16, 81}, {271, 18}} + + + YES + + -2080374784 + 0 + Load the most recent project on launch + + LucidaGrande + 13 + 1044 + + + 1211912448 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 400 + 75 + + NO + + + + 1804 + + {{16, 51}, {241, 18}} + + + YES + + -2080374784 + 0 + Automatically open Xcode projects + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + + + + 1804 + + {{16, 109}, {298, 18}} + + + YES + + -2080374784 + 0 + Symlink frameworks when creating projects + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + + + + 1804 + + {{15, 20}, {106, 17}} + + + YES + + 68157504 + 272630784 + Recent projects: + + + + + + NO + + + + 1804 + + {{124, 14}, {56, 26}} + + + YES + + -2076180416 + 2048 + + LucidaGrande + 13 + 1301 + + + 109199360 + 129 + + LucidaGrande + 13 + 16 + + + + 400 + 75 + + + 30 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + 10 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 20 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 2 + 1 + YES + YES + 2 + + NO + + + + {{1, 1}, {395, 139}} + + + + + + {{17, 151}, {397, 155}} + + + {0, 0} + + 67108864 + 134217728 + Projects + + LucidaGrande + 11 + 16 + + + + 3 + MCAwLjgAA + + + + 1 + 0 + 2 + NO + + + + 1548 + + + + 1810 + + + + 1804 + + {{16, 73}, {363, 18}} + + + YES + + -2080374784 + 0 + Show notifications when individual files are processed + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + + + + 1804 + + {{35, 17}, {81, 18}} + + + YES + + -2080374784 + 0 + Warnings + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + + + + 1804 + + {{137, 17}, {60, 18}} + + + YES + + -2080374784 + 0 + Errors + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + + + + 1804 + + {{16, 43}, {306, 17}} + + + YES + + 68157504 + 272630784 + Automatically open Errors & Warnings panel on: + + + + + + NO + + + + {{1, 1}, {395, 104}} + + + + + + {{17, 16}, {397, 120}} + + + {0, 0} + + 67108864 + 134217728 + File processing + + + + 3 + MCAwLjgAA + + + + 1 + 0 + 2 + NO + + + + {431, 321} + + + + {{0, 0}, {2560, 1418}} + {10000000000000, 10000000000000} + xcc-prefs + YES + + + 15 + 2 + {{163, 199}, {716, 654}} + 1685586944 + XcodeCapp Help + NSWindow + + + + + 1792 + + + + 1554 + + + + NSFilenamesPboardType + + {716, 654} + + 1 + NO + 1 + YES + + + + {716, 654} + + {{0, 0}, {2560, 1418}} + {10000000000000, 10000000000000} + YES + + + YES + + + XcodeCapp + + + + message + file + + YES + + YES + YES + YES + + + + NO + + + + terminate: + + + + 695 + + + + delegate + + + + 694 + + + + delegate + + + + 874 + + + + createProject: + + + + kGC-iR-GHt + + + + loadProject: + + + + 864 + + + + openAbout: + + + + 615 + + + + openHelp: + + + + 612 + + + + openPreferences: + + + + 796 + + + + showInFinder: + + + + 872 + + + + aboutWindow + + + + 613 + + + + helpView + + + + 858 + + + + helpWindow + + + + 610 + + + + menuItemHistory + + + + 621 + + + + menuItemOpenProject + + + + 869 + + + + menuItemOpenXcodeProject + + + + 873 + + + + menuItemShowInFinder + + + + 871 + + + + preferencesController + + + + 616 + + + + preferencesWindow + + + + 795 + + + + statusMenu + + + + 607 + + + + xcc + + + + 617 + + + + performClose: + + + + 625 + + + + save: + + + + 634 + + + + save: + + + + 792 + + + + save: + + + + 821 + + + + save: + + + + 841 + + + + save: + + + + 849 + + + + save: + + + + 854 + + + + save: + + + + Qld-lL-7rM + + + + clearErrors: + + + + 751 + + + + openErrorInEditor: + + + + 786 + + + + openErrorsPanel: + + + + 774 + + + + openXcodeProject: + + + + 866 + + + + synchronizeProject: + + + + 867 + + + + clearErrors + + + + 749 + + + + errorListController + + + + 760 + + + + errorsPanel + + + + 775 + + + + symlinkRadioButton + + + + UhG-7c-NP8 + + + + errorTable + + + + 748 + + + + values.XCCReopenLastProject + + + + + + value: values.XCCReopenLastProject + value + values.XCCReopenLastProject + + NSValidatesImmediately + + + 2 + + + 636 + + + + dataSource + + + + 752 + + + + errorTable + + + + + + doubleClickArgument: errorTable + doubleClickArgument + errorTable + + NSSelectorName + openErrorInEditor: + + 2 + + + 787 + + + + delegate + + + + 753 + + + + self + + + + + + doubleClickTarget: self + doubleClickTarget + self + + NSSelectorName + openErrorInEditor: + + + 2 + + + 788 + + + + arrangedObjects.message + + + + + + value: arrangedObjects.message + value + arrangedObjects.message + 2 + + + 770 + + + + bundleVersion + + + + + + displayPatternValue1: bundleVersion + displayPatternValue1 + bundleVersion + + NSDisplayPattern + XcodeCapp %{value1}@ + + 2 + + + 800 + + + + projectPath.length + + + + + + enabled: projectPath.length + enabled + projectPath.length + 2 + + + 875 + + + + xcodeProjectCanBeOpened + + + + + + enabled: xcodeProjectCanBeOpened + enabled + xcodeProjectCanBeOpened + + 2 + + + 876 + + + + selection.@count + + + + + + enabled: selection.@count + enabled + selection.@count + 2 + + + 765 + + + + errorList + + + + + + contentArray: errorList + contentArray + errorList + 2 + + + 762 + + + + values.XCCAutoOpenErrorsPanelOnWarnings + + + + + + value: values.XCCAutoOpenErrorsPanelOnWarnings + value + values.XCCAutoOpenErrorsPanelOnWarnings + + NSValidatesImmediately + + + 2 + + + 823 + + + + values.maxRecentProjects + + + + + + selectedValue: values.maxRecentProjects + selectedValue + values.maxRecentProjects + 2 + + + 810 + + + + projectPath.length + + + + + + enabled: projectPath.length + enabled + projectPath.length + 2 + + + 812 + + + + values.XCCAutoOpenErrorsPanelOnErrors + + + + + + value: values.XCCAutoOpenErrorsPanelOnErrors + value + values.XCCAutoOpenErrorsPanelOnErrors + + NSValidatesImmediately + + + 2 + + + 824 + + + + values.autoOpenXcodeProject + + + + + + value: values.autoOpenXcodeProject + value + values.autoOpenXcodeProject + + NSValidatesImmediately + + + 2 + + + 851 + + + + values.showProcessingNotices + + + + + + value: values.showProcessingNotices + value + values.showProcessingNotices + + NSValidatesImmediately + + + 2 + + + 856 + + + + projectPath.length + + + + + + enabled: projectPath.length + enabled + projectPath.length + 2 + + + 861 + + + + isCappBuildDefined + + + + + + enabled: isCappBuildDefined + enabled + isCappBuildDefined + 2 + + + HUA-hI-eLR + + + + toolTipSymlinkRadioButton + + + + + + toolTip: toolTipSymlinkRadioButton + toolTip + toolTipSymlinkRadioButton + 2 + + + bWz-Mw-z56 + + + + values.useSymlinkWhenCreatingProject + + + + + + value: values.useSymlinkWhenCreatingProject + value + values.useSymlinkWhenCreatingProject + + NSValidatesImmediately + + + 2 + + + aRN-Fd-MPN + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 420 + + + + + 538 + + + + + + + + + + + + + + + + + + + + + + itE-v1-Sv4 + + + + + 605 + + + + + 597 + + + + + 606 + + + + + 859 + + + + + 811 + + + + + 860 + + + + + 603 + + + + + 604 + + + + + 598 + + + + + 600 + + + + + 537 + + + + + 601 + + + + + 599 + + + + + 602 + + + + + 539 + + + + + 540 + + + + + + + + 592 + + + + + + + + + + 593 + + + + + + + + 596 + + + + + 594 + + + + + + + + 595 + + + + + 797 + + + + + + + + 798 + + + + + 541 + + + + + + + + 581 + + + + + + + + + + + 582 + + + + + + + + + + 588 + + + + + 589 + + + + + 584 + + + + + + + + 585 + + + + + 754 + + + + + + + + 755 + + + + + 583 + + + + + + + + 586 + + + + + 542 + + + + + + + + 558 + + + + + + + + + 847 + + + + + + + + + + + + 563 + + + + + + + + 576 + + + + + 839 + + + + + + + + 840 + + + + + 1qI-ol-J5k + + + + + + + + 272-W8-Ygy + + + + + 801 + + + + + + + + 802 + + + + + 803 + + + + + + + + 804 + + + + + + + + 805 + + + + + + + + + + 806 + + + + + 807 + + + + + 808 + + + + + 848 + + + + + + + + + + + 843 + + + + + + + + 844 + + + + + 789 + + + + + + + + 790 + + + + + 819 + + + + + + + + 820 + + + + + 817 + + + + + + + + 818 + + + + + 543 + + + + + + + + 553 + + + + + + + + 857 + + + + + 544 + + + + + 545 + + + XCodeCapp + + + 759 + + + Errors Controller + + + 587 + + + + + + + + 590 + + + + + + + + 591 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + When an error or warning occurs, automatically open the Errors & Warnings panel + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + When an error or warning occurs, automatically open the Errors & Warnings panel + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + If this is checked, when a Cappuccino project is opened, the project’s Xcode support project will be opened automatically + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + If this is checked, when a Cappuccino project is opened, the project’s Xcode support project will be opened automatically + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.pdfkit.ibplugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + + + AppController + NSObject + + id + id + id + id + id + id + + + + createProject: + id + + + loadProject: + id + + + openAbout: + id + + + openHelp: + id + + + openPreferences: + id + + + showInFinder: + id + + + + NSPanel + PDFView + NSWindow + NSMenuItem + NSMenuItem + NSMenuItem + NSUserDefaultsController + NSWindow + NSMenu + XcodeCapp + + + + aboutWindow + NSPanel + + + helpView + PDFView + + + helpWindow + NSWindow + + + menuItemHistory + NSMenuItem + + + menuItemOpenProject + NSMenuItem + + + menuItemShowInFinder + NSMenuItem + + + preferencesController + NSUserDefaultsController + + + preferencesWindow + NSWindow + + + statusMenu + NSMenu + + + xcc + XcodeCapp + + + + IBProjectSource + ./Classes/AppController.h + + + + XcodeCapp + NSObject + + id + id + id + id + id + + + + clearErrors: + id + + + openErrorInEditor: + id + + + openErrorsPanel: + id + + + openXcodeProject: + id + + + synchronizeProject: + id + + + + NSArrayController + NSTableView + NSPanel + + + + errorListController + NSArrayController + + + errorTable + NSTableView + + + errorsPanel + NSPanel + + + + IBProjectSource + ./Classes/XcodeCapp.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {11, 11} + {10, 3} + {15, 15} + {128, 128} + + + diff --git a/Tools/XcodeCapp/XcodeCapp/main.m b/Tools/XcodeCapp/XcodeCapp/main.m new file mode 100644 index 000000000..c4385ce48 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/main.m @@ -0,0 +1,14 @@ +// +// main.m +// XcodeCapp +// +// Created by Aparajita on 4/18/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/Tools/XcodeCapp/help.rtfd/TXT.rtf b/Tools/XcodeCapp/help.rtfd/TXT.rtf deleted file mode 100644 index 26ff5110a..000000000 --- a/Tools/XcodeCapp/help.rtfd/TXT.rtf +++ /dev/null @@ -1,166 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1187 -{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 Courier; -} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww16380\viewh15560\viewkind0 -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0\b\fs36 \cf0 XcodeCapp Help -\b0 \ -\ - -\b\fs24 What is XcodeCapp?\ - -\b0\fs36 \ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\fs24 \cf0 One of Cappuccino\'92s greatest features is the ability to use Xcode 4 to create the user interface for your web applications. Xcode creates .xib files which then must be converted by the command line utility -\b nib2cib -\b0 to .cib files for use with Cappuccino. But beginning with Xcode 4, there is no way to directly create outlets and actions without editing Objective-C header files.\ -\ -XcodeCapp acts as a bridge between Xcode and Cappuccino. It performs two main functions:\ -\ -\'95 Reads your source files when they are modified and automatically creates outlets and actions in the .xib file.\ -\'95 Automatically converts .xib files to .cib files when the .xib file is modified.\ -\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\b \cf0 Using XcodeCapp -\b0 \ -\ -XcodeCapp is very easy to use and requires very little user interaction. When you build Cappuccino with jake, it will create a symlink to the XcodeCapp application in your Applications folder. Launch XcodeCapp from there and the XcodeCapp icon will appear in your menu bar. Clicking on the icon will display the XcodeCapp menu:\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f1 \cf0 {{\NeXTGraphic menu1.png \width4220 \height3440 -}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\ -\ -If this is the first time you have run XcodeCapp, or if you were not listening to a project when XcodeCapp was last quit, you need to choose a Cappuccino project. Select "Listen to Project\'85\'94, and a folder chooser will appear. Navigate to the root folder of your project \'97 the one that contains index.html and Jakefile \'97 and click Open.\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural -\cf0 \ -Once you select a project, XcodeCapp will import your project and create a hidden folder called \'93.XcodeSupport\'94 in the root project directory. This folder contains files built by XcodeCapp that it needs to perform its magic, so you should never directly modify those files. You will probably want to ignore this folder in your IDE and source code management system as well.\ -\ -After XcodeCapp has imported a project, it will listen to changes in the following files anywhere in the project:\ -\ -\'95 *.xib \'96 Interface Builder files\ -\'95 *.j - Objective-J source\ -\'95 .xcodecapp-ignore - specifies files XcodeCapp should ignore\ -\ -Any time these files are modified, XcodeCapp will process the files and show a Growl notification when the processing is done.\ -\ -\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural - -\b \cf0 Declaring Outlets and Actions\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural - -\b0 \cf0 \ -The most important function XcodeCapp performs is to create outlets and actions for use with Interface Builder. You create outlets by prefixing them in your source files with -\b @outlet -\b0 or -\b IBOutlet -\b0 . For example, in the class below, there are seven outlets defined:\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f1 \cf0 {{\NeXTGraphic outlets.png \width10580 \height4580 -}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural -\cf0 Similarly, you declare actions by declaring the return type of the method to be -\b @action -\b0 or -\b IBAction -\b0 . For example, the following method can serve as an action for a control:\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f1 \cf0 {{\NeXTGraphic action.png \width14180 \height2440 -}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural -\cf0 \ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural - -\b \cf0 Editing XIBs\ -\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural - -\b0 \cf0 XcodeCapp creates an Xcode 4 project that allows you to edit your project\'92s xibs. To open the project, click on the XcodeCapp menu and select \'93Open Project in Xcode\'94.\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural -\cf0 \ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f1 \cf0 {{\NeXTGraphic menu2.png \width5220 \height3480 -}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\ -Once the Xcode project is open, you can edit your xibs with the interface builder. All of the outlets and actions you declared in your source will be available in interface builder for connection to views. For example, the InfoPanelController shown above would have these outlets in interface builder:\ -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural -\cf0 \ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f1 \cf0 {{\NeXTGraphic outlets2.png \width8040 \height4160 -}}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\b \cf0 Ignoring Files and Folders\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\b0 \cf0 To have XcodeCapp ignore files and folders, create a file in the root project directory named \'93.xcodecapp-ignore\'94, and enter one line for each pattern you would like to ignore. Patterns may use \'93*\'94 as a wildcard to match zero or more characters (it is -\b not -\b0 a shell glob) and are matched against the -\b absolute -\b0 path of the file or folder, so in most cases your patterns should begin with \'93*\'94. To safely match a folder name, the pattern should be -\f2 *//* -\f0 , where -\f2 name -\f0 is the name of the folder.\ -\ -For example, to ignore the \'93Modules\'94 directory and the xib file \'93foo.xib\'94 in your project, enter these lines in .xcodecapp-ignore:\ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f2 \cf0 */Modules/*\ -*/foo.xib -\f0 \ -\ -Note that in addition to whatever patterns you specify (if any), XcodeCapp -\b always -\b0 ignores the following patterns:\ -\ - -\f2 */.git/*\ -*/.svn/*\ -*/.hg/*\ -*/Frameworks/*\ -*/.XcodeSupport/*\ -*/Build/*\ -*/NS_*.j\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0 \cf0 \ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\b \cf0 Credits -\fs28 \ -\ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\b0\fs24 \cf0 XcodeCapp was originally written by Francisco Tolmasky.\ -The Cocoa port was written by Antoine Mercadal with contributions from Aparajita Fishman.\ -XcodeCapp (Cocoa version, formerly known as XcodeCapp-cocoa) was originally built for the Archipel Project (archipelproject.org) and is now part of Cappuccino.} \ No newline at end of file diff --git a/Tools/XcodeCapp/help.rtfd/action.png b/Tools/XcodeCapp/help.rtfd/action.png deleted file mode 100644 index 409188785..000000000 Binary files a/Tools/XcodeCapp/help.rtfd/action.png and /dev/null differ diff --git a/Tools/XcodeCapp/help.rtfd/menu1.png b/Tools/XcodeCapp/help.rtfd/menu1.png deleted file mode 100644 index 546d52de3..000000000 Binary files a/Tools/XcodeCapp/help.rtfd/menu1.png and /dev/null differ diff --git a/Tools/XcodeCapp/help.rtfd/menu2.png b/Tools/XcodeCapp/help.rtfd/menu2.png deleted file mode 100644 index 64bc9317f..000000000 Binary files a/Tools/XcodeCapp/help.rtfd/menu2.png and /dev/null differ diff --git a/Tools/XcodeCapp/help.rtfd/outlets.png b/Tools/XcodeCapp/help.rtfd/outlets.png deleted file mode 100644 index 95ecd57f9..000000000 Binary files a/Tools/XcodeCapp/help.rtfd/outlets.png and /dev/null differ diff --git a/Tools/XcodeCapp/help.rtfd/outlets2.png b/Tools/XcodeCapp/help.rtfd/outlets2.png deleted file mode 100644 index c85045d17..000000000 Binary files a/Tools/XcodeCapp/help.rtfd/outlets2.png and /dev/null differ diff --git a/Tools/XcodeCapp/macros.h b/Tools/XcodeCapp/macros.h deleted file mode 100644 index 7e337dfd6..000000000 --- a/Tools/XcodeCapp/macros.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Aparajita Fishman () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef xcodecapp_cocoa_macros_h -#define xcodecapp_cocoa_macros_h - -#if DEBUG -# define DLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__) -#else -# define DLog(...) -#endif - -#endif diff --git a/Tools/XcodeCapp/main.m b/Tools/XcodeCapp/main.m deleted file mode 100644 index 1dc23cbfb..000000000 --- a/Tools/XcodeCapp/main.m +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is a part of program XcodeCapp - * Copyright (C) 2011 Antoine Mercadal () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#import -#include - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **) argv); -} diff --git a/Tools/XcodeCapp/pbxprojModifier.py b/Tools/XcodeCapp/pbxprojModifier.py deleted file mode 100755 index 8904d2367..000000000 --- a/Tools/XcodeCapp/pbxprojModifier.py +++ /dev/null @@ -1,63 +0,0 @@ -import sys, os -from mod_pbxproj import XcodeProject - -XCODESUPPORTFOLDER = ".XcodeSupport" - -def update_general_include(project, projectBaseURL): - xcc_general_include_file = "%s/%s/xcc_general_include.h" % (projectBaseURL, XCODESUPPORTFOLDER) - content = "" - - for file in os.listdir("%s/%s" % (projectBaseURL, XCODESUPPORTFOLDER)): - if file.endswith(".h"): - content += "#include \"%s\"\n" % file - - f = open(xcc_general_include_file, "w") - f.write(content) - f.close() - - if len(project.get_files_by_os_path("%s/%s" % (XCODESUPPORTFOLDER, os.path.basename(xcc_general_include_file)))) == 0: - project.add_file(xcc_general_include_file, parent=shadowGroup) - - -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): - project.remove_file("%s/%s" % (XCODESUPPORTFOLDER, os.path.basename(shadowHeaderPath)), parent=shadowGroup) - project.remove_file("%s/%s" % (XCODESUPPORTFOLDER, os.path.basename(shadowImplementationFilePath)), parent=shadowGroup) - project.remove_file(os.path.relpath(sourcePath, projectBaseURL), parent=sourceGroup) - - -if __name__ == '__main__': - - action = sys.argv[1] - PBXProjectFilePath = sys.argv[2] - shadowHeaderFilePath = sys.argv[3] - shadowImplementationFilePath = sys.argv[4] - sourceFilePath = sys.argv[5] - projectBaseURL = sys.argv[6] - - project = XcodeProject.Load(PBXProjectFilePath) - - shadowGroup = project.get_or_create_group('Classes') - sourceGroup = project.get_or_create_group('Sources') - - if "main.j" in sourceFilePath: - sys.exit(0) - - files = project.get_files_by_os_path("%s/%s" % (XCODESUPPORTFOLDER, os.path.basename(shadowHeaderFilePath))) - - if action == "add" and len(files) == 0: - update_general_include(project, projectBaseURL) - add_file(project, shadowGroup, sourceGroup, shadowHeaderFilePath, shadowImplementationFilePath, sourceFilePath, projectBaseURL) - project.save() - - elif action == "remove" and len(files) == 1: - update_general_include(project, projectBaseURL) - remove_file(project, shadowGroup, sourceGroup, shadowHeaderFilePath, shadowImplementationFilePath, sourceFilePath, projectBaseURL) - project.save() diff --git a/Tools/XcodeCapp/project.pbxproj.sample b/Tools/XcodeCapp/project.pbxproj.sample deleted file mode 100644 index 45e5b705f..000000000 --- a/Tools/XcodeCapp/project.pbxproj.sample +++ /dev/null @@ -1,226 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 9EEC4498135749D200615446 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EEC4497135749D200615446 /* Cocoa.framework */; }; - 9EEC44CC13574A0B00615446 /* CappuccinoResources in Resources */ = {isa = PBXBuildFile; fileRef = 9EEC44CB13574A0B00615446 /* CappuccinoResources */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 9EEC4493135749D200615446 /* Another.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Another.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 9EEC4497135749D200615446 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 9EEC449A135749D300615446 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 9EEC449B135749D300615446 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 9EEC449C135749D300615446 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 9EEC44CB13574A0B00615446 /* CappuccinoResources */ = {isa = PBXFileReference; lastKnownFileType = folder; name = CappuccinoResources; path = Resources; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 9EEC4490135749D200615446 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9EEC4498135749D200615446 /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9EEC4488135749D200615446 = { - isa = PBXGroup; - children = ( - 9EEC44CB13574A0B00615446 /* CappuccinoResources */, - 9EEC4496135749D200615446 /* Frameworks */, - ); - sourceTree = ""; - }; - 9EEC4494135749D200615446 /* Products */ = { - isa = PBXGroup; - children = ( - 9EEC4493135749D200615446 /* Another.app */, - ); - name = Products; - sourceTree = ""; - }; - 9EEC4496135749D200615446 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 9EEC4497135749D200615446 /* Cocoa.framework */, - 9EEC4499135749D300615446 /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9EEC4499135749D300615446 /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 9EEC449A135749D300615446 /* AppKit.framework */, - 9EEC449B135749D300615446 /* CoreData.framework */, - 9EEC449C135749D300615446 /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 9EEC4492135749D200615446 /* Another */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9EEC44C5135749D300615446 /* Build configuration list for PBXNativeTarget "Another" */; - buildPhases = ( - 9EEC448F135749D200615446 /* Sources */, - 9EEC4490135749D200615446 /* Frameworks */, - 9EEC4491135749D200615446 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Another; - productName = Another; - productReference = 9EEC4493135749D200615446 /* Another.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 9EEC448A135749D200615446 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - ORGANIZATIONNAME = "280 North, Inc."; - }; - buildConfigurationList = 9EEC448D135749D200615446 /* Build configuration list for PBXProject "XCCSampleProj" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 9EEC4488135749D200615446; - productRefGroup = 9EEC4494135749D200615446 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 9EEC4492135749D200615446 /* Another */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 9EEC4491135749D200615446 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9EEC44CC13574A0B00615446 /* CappuccinoResources in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 9EEC448F135749D200615446 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 9EEC44C3135749D300615446 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = DEBUG; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 9EEC44C4135749D300615446 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.6; - SDKROOT = macosx; - }; - name = Release; - }; - 9EEC44C6135749D300615446 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Another/Another-Prefix.pch"; - INFOPLIST_FILE = "Another/Another-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 9EEC44C7135749D300615446 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Another/Another-Prefix.pch"; - INFOPLIST_FILE = "Another/Another-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 9EEC448D135749D200615446 /* Build configuration list for PBXProject "XCCSampleProj" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9EEC44C3135749D300615446 /* Debug */, - 9EEC44C4135749D300615446 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9EEC44C5135749D300615446 /* Build configuration list for PBXNativeTarget "Another" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9EEC44C6135749D300615446 /* Debug */, - 9EEC44C7135749D300615446 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 9EEC448A135749D200615446 /* Project object */; -} diff --git a/Tools/XcodeCapp/xcc/main.m b/Tools/XcodeCapp/xcc/main.m new file mode 100644 index 000000000..451663896 --- /dev/null +++ b/Tools/XcodeCapp/xcc/main.m @@ -0,0 +1,147 @@ +// +// main.m +// xcc +// +// Created by Aparajita on 5/9/13. +// Copyright (c) 2013 Cappuccino Project. All rights reserved. +// + +#import + +#import "XcodeProjectCloser.h" + + +static void usage() +{ + fprintf(stderr, "Usage: xcc [options] [directory]\n" + "\n" + "Options:\n" + " --help Show this help and exit\n" + " --reset Resets Xcode support files before opening\n\n"); +} + +static bool handleOptions(NSMutableArray *options, NSString *path) +{ + NSFileManager *fm = [NSFileManager defaultManager]; + + path = path.stringByStandardizingPath.stringByResolvingSymlinksInPath; + + while (options.count) + { + NSString *option = options.lastObject; + [options removeLastObject]; + + if ([options containsObject:option]) + return false; + + if ([option isEqualToString:@"--reset"]) + { + if (!path) + return false; + + NSString *xcodePath = [path stringByAppendingPathComponent:@".XcodeSupport"]; + [fm removeItemAtPath:xcodePath error:nil]; + + NSString *projectName = [NSString stringWithFormat:@"%@.xcodeproj", path.lastPathComponent]; + xcodePath = [path stringByAppendingPathComponent:projectName]; + + [XcodeProjectCloser closeXcodeProjectForProject:xcodePath]; + + [fm removeItemAtPath:xcodePath error:nil]; + printf("Reset %s\n", path.UTF8String); + } + else + return false; + } + + return true; +} + +static NSString* validatePath(NSString *path) +{ + // Use an NSURL to resolve paths that start with "." + NSURL *url = [NSURL fileURLWithPath:path]; + path = url.path; + + NSFileManager *fm = [NSFileManager defaultManager]; + BOOL isDirectory; + BOOL exists = [fm fileExistsAtPath:path isDirectory:&isDirectory]; + + if (exists && isDirectory) + return path; + else + { + if (!exists) + fprintf(stderr, "The directory %s does not exist.\n", path.UTF8String); + else + fprintf(stderr, "%s is not a directory.\n", path.UTF8String); + + return nil; + } +} + + +int main(int argc, const char * argv[]) +{ + @autoreleasepool + { + NSArray *args = [[NSProcessInfo processInfo] arguments]; + BOOL validArgs = args.count == 1; + NSString *path = nil; + NSMutableArray *options = [NSMutableArray new]; + + for (NSInteger i = 1; i < args.count; ++i) + { + NSString *arg = args[i]; + + // Once we get a directory, no other arguments are valid + if (path) + { + validArgs = NO; + break; + } + + if ([arg hasPrefix:@"-"]) + { + [options addObject:arg]; + } + else if (!path) + { + path = validatePath(arg); + + if (path) + validArgs = YES; + else + return 1; + } + else + { + validArgs = NO; + break; + } + } + + if (validArgs) + { + if (handleOptions(options, path)) + { + NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"-b", @"org.cappuccino.xcodecapp", @"-g", nil]; + + if (path) + [arguments addObject:path]; + + NSTask *task = [[NSTask alloc] init]; + task.launchPath = @"/usr/bin/open"; + task.arguments = arguments; + [task launch]; + } + else + usage(); + } + else + usage(); + } + + return 0; +} + diff --git a/Tools/XcodeCapp/xcc/xcc-Prefix.pch b/Tools/XcodeCapp/xcc/xcc-Prefix.pch new file mode 100644 index 000000000..3ab4e33a8 --- /dev/null +++ b/Tools/XcodeCapp/xcc/xcc-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'xcc' target in the 'xcc' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Tools/XcodeCapp/xcodecapp-cocoa-icon-active.psd b/Tools/XcodeCapp/xcodecapp-cocoa-icon-active.psd deleted file mode 100644 index 2fd63397e..000000000 Binary files a/Tools/XcodeCapp/xcodecapp-cocoa-icon-active.psd and /dev/null differ diff --git a/Tools/XcodeCapp/xcodecapp-icon-active.png b/Tools/XcodeCapp/xcodecapp-icon-active.png deleted file mode 100644 index c48bbe7da..000000000 Binary files a/Tools/XcodeCapp/xcodecapp-icon-active.png and /dev/null differ diff --git a/Tools/XcodeCapp/xcodecapp-icon-inactive.png b/Tools/XcodeCapp/xcodecapp-icon-inactive.png deleted file mode 100644 index 8d62f1c40..000000000 Binary files a/Tools/XcodeCapp/xcodecapp-icon-inactive.png and /dev/null differ diff --git a/Tools/XcodeCapp/xcodecapp-icon-working.png b/Tools/XcodeCapp/xcodecapp-icon-working.png deleted file mode 100644 index e629c2198..000000000 Binary files a/Tools/XcodeCapp/xcodecapp-icon-working.png and /dev/null differ diff --git a/Tools/capp/Resources/Templates/Application/Jakefile b/Tools/capp/Resources/Templates/Application/Jakefile index 81068711d..6207c9b34 100644 --- a/Tools/capp/Resources/Templates/Application/Jakefile +++ b/Tools/capp/Resources/Templates/Application/Jakefile @@ -13,10 +13,16 @@ var ENV = require("system").env, FileList = JAKE.FileList, app = require("cappuccino/jake").app, configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", - OS = require("os"); + OS = require("os"), + projectName = "__project.nameasidentifier__"; -app ("__project.nameasidentifier__", function(task) +app (projectName, function(task) { + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + task.setBuildIntermediatesPath(FILE.join("Build", "__project.nameasidentifier__.build", configuration)); task.setBuildPath(FILE.join("Build", configuration)); @@ -26,7 +32,7 @@ app ("__project.nameasidentifier__", function(task) task.setAuthor("__organization.name__"); task.setEmail("__organization.email__"); task.setSummary("__project.name__"); - task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); task.setResources(new FileList("Resources/**")); task.setIndexFilePath("index.html"); task.setInfoPlistPath("Info.plist"); @@ -37,12 +43,15 @@ app ("__project.nameasidentifier__", function(task) task.setCompilerFlags("-O"); }); -task ("default", ["__project.nameasidentifier__"], function() +task ("default", [projectName], function() { printResults(configuration); }); -task ("build", ["default"]); +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); task ("debug", function() { @@ -58,36 +67,118 @@ task ("release", function() task ("run", ["debug"], function() { - OS.system(["open", FILE.join("Build", "Debug", "__project.nameasidentifier__", "index.html")]); + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); }); task ("run-release", ["release"], function() { - OS.system(["open", FILE.join("Build", "Release", "__project.nameasidentifier__", "index.html")]); + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); }); task ("deploy", ["release"], function() { - FILE.mkdirs(FILE.join("Build", "Deployment", "__project.nameasidentifier__")); - OS.system(["press", "-f", FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Deployment", "__project.nameasidentifier__")]); + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); printResults("Deployment") }); task ("desktop", ["release"], function() { - FILE.mkdirs(FILE.join("Build", "Desktop", "__project.nameasidentifier__")); - require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app")); + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "__project.nameasidentifier__.app")); printResults("Desktop") }); task ("run-desktop", ["desktop"], function() { - OS.system([FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]); + OS.system([FILE.join("Build", "Desktop", projectName, "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]); }); function printResults(configuration) { print("----------------------------"); - print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__")); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); print("----------------------------"); } + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (ENV["CONFIGURATION"] === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tools/capp/Resources/Templates/Application/index-debug.html b/Tools/capp/Resources/Templates/Application/index-debug.html index 746b7ef83..525fedab5 100644 --- a/Tools/capp/Resources/Templates/Application/index-debug.html +++ b/Tools/capp/Resources/Templates/Application/index-debug.html @@ -27,12 +27,36 @@ __project.name__ + + + - + - - - - +
-
- - -