diff --git a/AppKit/CPColorPanel.j b/AppKit/CPColorPanel.j index 7d847a30f..d00baa311 100644 --- a/AppKit/CPColorPanel.j +++ b/AppKit/CPColorPanel.j @@ -71,7 +71,6 @@ var SharedColorPanel = nil, */ @implementation CPColorPanel : CPPanel { - _CPColorPanelToolbar _toolbar; _CPColorPanelSwatches _swatchView; _CPColorPanelPreview _previewView; diff --git a/AppKit/CPMenu/_CPMenuBarWindow.j b/AppKit/CPMenu/_CPMenuBarWindow.j index db9077b06..693cafaea 100644 --- a/AppKit/CPMenu/_CPMenuBarWindow.j +++ b/AppKit/CPMenu/_CPMenuBarWindow.j @@ -32,7 +32,6 @@ @implementation _CPMenuBarWindow : CPPanel { - CPMenu _menu; CPView _highlightView; CPArray _menuItemViews; diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j index 2cec0efae..329ee3899 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j @@ -29,7 +29,6 @@ CGRect _animationTargetRect @accessors(property=_animationTargetRect); BOOL _selected @accessors(getter=_isSelected, setter=_setSelected:); BOOL _lastSelected @accessors(getter=_isLastSelected, setter=_setLastSelected:); - CPColor _backgroundColor @accessors(property=backgroundColor); BOOL _editable @accessors(getter=isEditable, setter=setEditable:); } diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index aef8453a9..90a8c9b2a 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -33,6 +33,15 @@ #define SHOULD_SHOW_CORNER_VIEW() (_scrollerStyle === CPScrollerStyleLegacy && _verticalScroller && ![_verticalScroller isHidden]) +@protocol CPScrollViewDelegate + +@optional +- (void)scrollViewWillScroll:(CPScrollView)aScrollView; +- (void)scrollViewDidScroll:(CPScrollView)aScrollView; + +@end + + /*! @ignore */ var _isBrowserUsingOverlayScrollers = function() { @@ -98,35 +107,35 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay, @implementation CPScrollView : CPView { - CPClipView _contentView; - CPClipView _headerClipView; - CPView _cornerView; - CPView _bottomCornerView; + CPClipView _contentView; + CPClipView _headerClipView; + CPView _cornerView; + CPView _bottomCornerView; - id _delegate; - CPTimer _scrollTimer; + id _delegate; + CPTimer _scrollTimer; - BOOL _hasVerticalScroller; - BOOL _hasHorizontalScroller; - BOOL _autohidesScrollers; + BOOL _hasVerticalScroller; + BOOL _hasHorizontalScroller; + BOOL _autohidesScrollers; - CPScroller _verticalScroller; - CPScroller _horizontalScroller; + CPScroller _verticalScroller; + CPScroller _horizontalScroller; - CPInteger _recursionCount; - CPInteger _implementedDelegateMethods; + CPInteger _recursionCount; + CPInteger _implementedDelegateMethods; - float _verticalLineScroll; - float _verticalPageScroll; - float _horizontalLineScroll; - float _horizontalPageScroll; + float _verticalLineScroll; + float _verticalPageScroll; + float _horizontalLineScroll; + float _horizontalPageScroll; - CPBorderType _borderType; + CPBorderType _borderType; - CPTimer _timerScrollersHide; + CPTimer _timerScrollersHide; - int _scrollerStyle; - int _scrollerKnobStyle; + int _scrollerStyle; + int _scrollerKnobStyle; } @@ -296,7 +305,7 @@ Notifies the delegate when the scroll view has finished scrolling. @endcode */ -- (void)setDelegate:(id)aDelegate +- (void)setDelegate:(id )aDelegate { if (aDelegate === _delegate) return; diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 08de6d80c..d83abc5a3 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -601,7 +601,7 @@ CPTableColumnUserResizingMask = 1 << 1; } /*! - Binds the receiver to an object. + Binds the receiver to an object. Note that unlike Cocoa, this works only *after* the receiver has been added to a \c CPTableView. @param CPString aBinding - The binding you wish to make. Typically CPValueBinding. @param id anObject - The object to bind the receiver to. diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 809830f66..bb1db492a 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -4458,6 +4458,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad var row = [self rowAtPoint:aPoint]; + _clickedRow = row; + _clickedColumn = [self columnAtPoint:aPoint]; + // If the user clicks outside a row then deselect everything. if (row < 0 && _allowsEmptySelection) { @@ -4520,6 +4523,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad } else [CPApp sendEvent:anEvent]; + + if ([anEvent type] == CPLeftMouseUp) + { + _clickedRow = CPNotFound; + _clickedColumn = CPNotFound; + } } /* @@ -4529,6 +4538,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad { var row = [self rowAtPoint:aPoint]; + _clickedRow = row; + _clickedColumn = [self columnAtPoint:aPoint]; + // 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 && [self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard]) @@ -4617,9 +4629,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad rowIndex, shouldEdit = YES; + _clickedRow = [self rowAtPoint:aPoint]; + _clickedColumn = [self columnAtPoint:aPoint]; + if ([self _dataSourceRespondsToWriteRowsWithIndexesToPasteboard]) { - rowIndex = [self rowAtPoint:aPoint]; + rowIndex = _clickedRow; if (rowIndex !== -1) { @@ -4641,7 +4656,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad && ([self _dataSourceRespondsToSetObjectValueForTableColumnRow] || [self infoForBinding:@"content"])) { - columnIndex = [self columnAtPoint:lastPoint]; + columnIndex = _clickedColumn; if (columnIndex !== -1) { @@ -4666,11 +4681,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad //double click actions if ([[CPApp currentEvent] clickCount] === 2 && _doubleAction) - { - _clickedRow = [self rowAtPoint:aPoint]; - _clickedColumn = [self columnAtPoint:lastPoint]; [self sendAction:_doubleAction to:_target]; - } } /* diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 3113ac8a8..ae0aa7ba6 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -315,13 +315,6 @@ var CPViewHighDPIDrawingEnabled = YES; _viewClassFlags = CPViewFlags[classUID]; } -- (void)_setupToolTipHandlers -{ - _toolTipInstalled = NO; - _toolTipFunctionIn = function(e) { [_CPToolTip scheduleToolTipForView:self]; } - _toolTipFunctionOut = function(e) { [_CPToolTip invalidateCurrentToolTipIfNeeded]; }; -} - + (CPSet)keyPathsForValuesAffectingFrame { return [CPSet setWithObjects:@"frameOrigin", @"frameSize"]; @@ -391,9 +384,8 @@ var CPViewHighDPIDrawingEnabled = YES; #endif _animator = nil; - _animationsDictionary = [CPDictionary dictionary]; + _animationsDictionary = @{}; - [self _setupToolTipHandlers]; [self _setupViewFlags]; [self _loadThemeAttributes]; @@ -418,12 +410,16 @@ var CPViewHighDPIDrawingEnabled = YES; _toolTip = aToolTip; - if (_toolTip) + [self _manageToolTipInstallation]; +} + +- (void)_manageToolTipInstallation +{ + if ([self window] && _toolTip) [self _installToolTipEventHandlers]; else [self _uninstallToolTipEventHandlers]; } - /*! @ignore Install the handlers for the tooltip @@ -433,6 +429,12 @@ var CPViewHighDPIDrawingEnabled = YES; if (_toolTipInstalled) return; + if (!_toolTipFunctionIn) + _toolTipFunctionIn = function(e) { [_CPToolTip scheduleToolTipForView:self]; } + + if (!_toolTipFunctionOut) + _toolTipFunctionOut = function(e) { [_CPToolTip invalidateCurrentToolTipIfNeeded]; }; + #if PLATFORM(DOM) if (_DOMElement.addEventListener) { @@ -475,6 +477,9 @@ var CPViewHighDPIDrawingEnabled = YES; } #endif + _toolTipFunctionIn = nil; + _toolTipFunctionOut = nil; + _toolTipInstalled = NO; } @@ -813,6 +818,8 @@ var CPViewHighDPIDrawingEnabled = YES; [self viewDidMoveToWindow]; + [self _manageToolTipInstallation]; + [[self window] _dirtyKeyViewLoop]; } @@ -840,6 +847,7 @@ var CPViewHighDPIDrawingEnabled = YES; { // if (_graphicsContext) [self setNeedsDisplay:YES]; + } /*! @@ -3561,7 +3569,6 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", _hitTests = ![aCoder containsValueForKey:CPViewHitTestsKey] || [aCoder decodeBoolForKey:CPViewHitTestsKey]; - [self _setupToolTipHandlers]; _toolTip = [aCoder decodeObjectForKey:CPViewToolTipKey]; if (_toolTip) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 160a03ee4..eaf0ecee5 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -575,6 +575,9 @@ CPTexturedBackgroundWindowMask var fullPlatformWindowViewClass = [[self class] _windowViewClassForFullPlatformWindowStyleMask:_styleMask], windowView = [[fullPlatformWindowViewClass alloc] initWithFrame:CGRectMakeZero() styleMask:_styleMask]; + if (_platformWindow != [CPPlatformWindow primaryPlatformWindow] && [_platformWindow _hasInitializeInstanceWithWindow]) + [_platformWindow setContentRect:[self frame]]; + [self _setWindowView:windowView]; [self setLevel:CPBackgroundWindowLevel]; @@ -759,6 +762,9 @@ CPTexturedBackgroundWindowMask if (originMoved) [self _moveChildWindows:delta]; } + + if ([_platformWindow _canUpdateContentRect] && _isFullPlatformWindow && _platformWindow != [CPPlatformWindow primaryPlatformWindow]) + [_platformWindow setContentRect:aFrame]; } /* @@ -909,6 +915,10 @@ CPTexturedBackgroundWindowMask { #if PLATFORM(DOM) + + if (!_isVisible) + [_platformWindow _setShouldUpdateContentRect:NO]; + // -dw- if a sheet is clicked, the parent window should come up too if (_isSheet) [_parentView orderFront:self]; @@ -932,6 +942,8 @@ CPTexturedBackgroundWindowMask if (!CPApp._mainWindow) [self makeMainWindow]; + + [_platformWindow _setShouldUpdateContentRect:YES]; } /* @@ -947,6 +959,11 @@ CPTexturedBackgroundWindowMask */ - (void)_windowWillBeAddedToTheDOM { + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(_didReceivePlatformWindowWillCloseNotification:) + name:_CPPlatformWindowWillCloseNotification + object:_platformWindow]; + [[self contentView] _addObservers]; } @@ -955,6 +972,8 @@ CPTexturedBackgroundWindowMask */ - (void)_windowWillBeRemovedFromTheDOM { + [[CPNotificationCenter defaultCenter] removeObserver:self name:_CPPlatformWindowWillCloseNotification object:nil]; + [[self contentView] _removeObservers]; } @@ -1002,6 +1021,9 @@ CPTexturedBackgroundWindowMask if ([self _sharesChromeWithPlatformWindow]) [_platformWindow orderOut:self]; + if (_isFullPlatformWindow && _platformWindow != [CPPlatformWindow primaryPlatformWindow]) + [_platformWindow orderOut:self]; + [_platformWindow order:CPWindowOut window:self relativeTo:nil]; #endif @@ -3353,6 +3375,14 @@ CPTexturedBackgroundWindowMask [super setValue:aValue forKey:aKey]; } +- (void)_didReceivePlatformWindowWillCloseNotification:(CPNotification)aNotification +{ + if ([aNotification object] != _platformWindow) + return; + + [self close]; +} + @end var keyViewComparator = function(lhs, rhs, context) diff --git a/AppKit/CPWindow/_CPHUDWindowView.j b/AppKit/CPWindow/_CPHUDWindowView.j index 829f78eee..9103eb562 100644 --- a/AppKit/CPWindow/_CPHUDWindowView.j +++ b/AppKit/CPWindow/_CPHUDWindowView.j @@ -27,7 +27,6 @@ @implementation _CPHUDWindowView : _CPTitleableWindowView { - CPView _toolbarView; CPButton _closeButton; } diff --git a/AppKit/CPWindow/_CPStandardWindowView.j b/AppKit/CPWindow/_CPStandardWindowView.j index d8ea56ceb..dea5937be 100644 --- a/AppKit/CPWindow/_CPStandardWindowView.j +++ b/AppKit/CPWindow/_CPStandardWindowView.j @@ -94,7 +94,6 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; _CPTexturedWindowHeadView _headView; CPView _dividerView; CPView _bodyView; - CPView _toolbarView; CPButton _closeButton; CPButton _minimizeButton; diff --git a/AppKit/Cib/CPCibHelpConnector.j b/AppKit/Cib/CPCibHelpConnector.j index 925b3393f..3748e757e 100644 --- a/AppKit/Cib/CPCibHelpConnector.j +++ b/AppKit/Cib/CPCibHelpConnector.j @@ -24,7 +24,6 @@ @implementation CPCibHelpConnector : CPCibConnector { - id _destination; id _file; id _marker; } diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index 3e2ff2817..cd17fa4a6 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -43,6 +43,8 @@ var PrimaryPlatformWindow = NULL; BOOL _hasShadow; unsigned _shadowStyle; CPString _title; + BOOL _shouldUpdateContentRect; + BOOL _hasInitializeInstanceWithWindow; #if PLATFORM(DOM) DOMWindow _DOMWindow; @@ -119,6 +121,17 @@ var PrimaryPlatformWindow = NULL; return self; } +- (id)initWithWindow:(CPWindow)aWindow +{ + self = [self initWithContentRect:CGRectMakeCopy([aWindow frame])]; + + _hasInitializeInstanceWithWindow = YES; + [aWindow setPlatformWindow:self]; + [aWindow setFullPlatformWindow:YES]; + + return self; +} + - (id)init { return [self initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 500.0)]; @@ -284,6 +297,22 @@ var PrimaryPlatformWindow = NULL; return _title; } +- (BOOL)_canUpdateContentRect +{ + // We onyl update the contentRect with the frame of the bridgeless window if we have initialized the platform with the method initWithWindow: + return _shouldUpdateContentRect && _hasInitializeInstanceWithWindow; +} + +- (BOOL)_hasInitializeInstanceWithWindow +{ + return _hasInitializeInstanceWithWindow; +} + +- (void)_setShouldUpdateContentRect:(BOOL)aBoolean +{ + _shouldUpdateContentRect = aBoolean; +} + @end #if PLATFORM(BROWSER) diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 80a04feae..3cab0b5b9 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -203,6 +203,9 @@ var ModifierKeyCodes = [ var resizeTimer = nil; var PreventScroll = true; +_CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotification"; + + // When scrolling with an old-style scroll wheel with discete steps ('clicks'), the scroll amount can indicate how many "lines" to // scroll. #define SCROLLWHEEL_LINE_PIXELS 6.0 @@ -429,6 +432,9 @@ var PreventScroll = true; _DOMWindow.addEventListener("unload", function() { + _DOMWindow.removeEventListener("unload", arguments.callee, NO); + + [self _notifyPlatformWindowWillClose]; [self updateFromNativeContentRect]; [self _removeLayers]; @@ -452,8 +458,6 @@ var PreventScroll = true; _DOMWindow.removeEventListener("wheel", scrollEventCallback, NO); _DOMWindow.removeEventListener("mousewheel", scrollEventCallback, NO); - //_DOMWindow.removeEventListener("beforeunload", this, NO); - [PlatformWindows removeObject:self]; [_platformPasteboard setDOMWindow:nil]; @@ -483,6 +487,9 @@ var PreventScroll = true; _DOMWindow.attachEvent("onunload", function() { + _DOMWindow.detachEvent("unload", arguments.callee); + + [self _notifyPlatformWindowWillClose]; [self updateFromNativeContentRect]; [self _removeLayers]; @@ -504,8 +511,6 @@ var PreventScroll = true; _DOMBodyElement.ondrag = NULL; _DOMBodyElement.onselectstart = NULL; - //_DOMWindow.removeEvent("beforeunload", this); - [PlatformWindows removeObject:self]; [_platformPasteboard setDOMWindow:nil]; @@ -988,6 +993,7 @@ var PreventScroll = true; - (void)_actualResizeEvent { + _shouldUpdateContentRect = NO; resizeTimer = nil; // FIXME: This is not the right way to do this. @@ -1021,6 +1027,8 @@ var PreventScroll = true; //window.liveResize = NO; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + _shouldUpdateContentRect = YES; } - (void)touchEvent:(DOMEvent)aDOMEvent @@ -1629,6 +1637,13 @@ var PreventScroll = true; KeyCodesToPrevent = {}; } +- (void)_notifyPlatformWindowWillClose +{ + [[CPNotificationCenter defaultCenter] postNotificationName:_CPPlatformWindowWillCloseNotification + object:self + userInfo:nil]; +} + @end #endif diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index e836fea73..7a1f5edcc 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -63,7 +63,6 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, BOOL _browserAnimates; BOOL _isObservingFrame; BOOL _shouldPerformAnimation; - CPInteger _implementedDelegateMethods; CGRect _targetRect; CPWindow _targetWindow; JSObject _orderOutTransitionFunction; diff --git a/Foundation/CPCache.j b/Foundation/CPCache.j new file mode 100644 index 000000000..c8efe2e2d --- /dev/null +++ b/Foundation/CPCache.j @@ -0,0 +1,371 @@ +/* + * CPCache.j + * Foundation + * + * Created by William Mura. + * Copyright 2015, William Mura. + * + * 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 "CPDictionary.j" +@import "CPString.j" + +@class _CPCacheItem; + + +/* + * Delegate CPCacheDelegate + * + * - cache:willEvictObject: is called when a object is going to be removed + * When the total cost or the count exceeds the total cost limit or the count limit + * And also when removeObjectForKey or removeAllObjects are called + */ +@protocol CPCacheDelegate + +@optional +- (void)cache:(CPCache)cache willEvictObject:(id)obj; + +@end + +var CPCacheDelegate_cache_willEvictObject_ = 1 << 1; + + +/*! + @class CPCache + @ingroup foundation + @brief A collection-like container with discardable objects + + https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSCache_Class/index.html#//apple_ref/occ/instp/NSCache/delegate + + A CPCache object is a collection-like container, or cache, that stores key-value pairs, + similar to the CPDictionary class. Developers often incorporate caches to temporarily + store objects with transient data that are expensive to create. + + Reusing these objects can provide performance benefits, because their values do not have to be recalculated. + However, the objects are not critical to the application and can be discarded if memory is tight. + If discarded, their values will have to be recomputed again when needed. + */ +@implementation CPCache : CPObject +{ + CPDictionary _items; + int _currentPosition; + BOOL _totalCostCache; + unsigned _implementedDelegateMethods; + + CPString _name @accessors(property=name); + int _countLimit @accessors(property=countLimit); + int _totalCostLimit @accessors(property=totalCostLimit); + id _delegate @accessors(property=delegate); +} + + +#pragma mark - +#pragma mark Initialization + +/*! + Initializes the cache with default values + @return the initialized cache +*/ +- (id)init +{ + if (self = [super init]) + { + _items = [[CPDictionary alloc] init]; + _currentPosition = 0; + _totalCostCache = -1; + _implementedDelegateMethods = 0; + + _name = @""; + _countLimit = 0; + _totalCostLimit = 0; + _delegate = nil; + } + + return self; +} + + +#pragma mark - +#pragma mark Managing cache + +/*! + Returns the object which correspond to the given key + @param aKey the key for the object's entry + @return the object for the entry +*/ +- (id)objectForKey:(id)aKey +{ + return [[_items objectForKey:aKey] object]; +} + +/*! + Adds an object with default cost into the cache. + @param anObject the object to add in the cache + @param aKey the object's key +*/ +- (void)setObject:(id)anObject forKey:(id)aKey +{ + [self setObject:anObject forKey:aKey cost:0]; +} + +/*! + Adds an object with a cost into the cache. + @param anObject the object to add in the cache + @param aKey the object's key + @param aCost the object's cost +*/ +- (void)setObject:(id)anObject forKey:(id)aKey cost:(int)aCost +{ + // Check if the key already exist + if ([_items objectForKey:aKey]) + [self removeObjectForKey:aKey]; + + // Add object + [_items setObject:[_CPCacheItem cacheItemWithObject:anObject cost:aCost position:++_currentPosition] forKey:aKey]; + + // Invalid cost cache + _totalCostCache = -1; + + // Clean cache to satisfy condition (< totalCostLimit & < countLimit) if necessary + [self _cleanCache]; +} + +/*! + Removes the object from the cache for the given key. + @param aKey the key of the object to be removed +*/ +- (void)removeObjectForKey:(id)aKey +{ + // Call delegate method to warn that the object is going to be removed + [self _sendDelegateWillEvictObjectForKey:aKey]; + + // Remove object + [_items removeObjectForKey:aKey]; + + // Invalid cost cache + _totalCostCache = -1; +} + +/*! + Removes all the objects from the cache. +*/ +- (void)removeAllObjects +{ + // Call delegate method to warn that the objects are going to be removed + var enumerator = [_items keyEnumerator], + key; + + while (key = [enumerator nextObject]) + [self _sendDelegateWillEvictObjectForKey:key] + + // Remove all objects + [_items removeAllObjects]; + + // Invalid cost cache and reset position counter + _totalCostCache = -1; + _currentPosition = 0; +} + + +#pragma mark - +#pragma mark Setters + +/*! + Sets the count limit of the cache. + Remove objects if not enough place to keep all of them + @param aCountLimit the new count limit +*/ +- (void)setCountLimit:(int)aCountLimit +{ + _countLimit = aCountLimit; + [self _cleanCache]; +} + +/*! + Sets the total cost limit of the cache. + Remove objects if not enough place to keep all of them + @param aTotalCostLimit the new total cost limit +*/ +- (void)setTotalCostLimit:(int)aTotalCostLimit +{ + _totalCostLimit = aTotalCostLimit; + [self _cleanCache]; +} + +/*! + Sets the cache's delegate. + @param aDelegate the new delegate +*/ +- (void)setDelegate:(id)aDelegate +{ + if (_delegate === aDelegate) + return; + + _delegate = aDelegate; + _implementedDelegateMethods = 0; + + if ([_delegate respondsToSelector:@selector(cache:willEvictObject:)]) + _implementedDelegateMethods |= CPCacheDelegate_cache_willEvictObject_ +} + + +#pragma mark - +#pragma mark Privates + +/* + * This method return the number of objects in the cache + */ +- (int)_count +{ + return [_items count]; +} + +/* + * This method return the total cost (addition of all object's cost in the cache) + */ +- (int)_totalCost +{ + if (_totalCostCache >= 0) + return _totalCostCache; + + var enumerator = [_items objectEnumerator], + value; + + _totalCostCache = 0; + + while (value = [enumerator nextObject]) + _totalCostCache += [value cost]; + + return _totalCostCache; +} + +/* + * This method resequence the position of objects + * Otherwise the position value could rise until to cause problem + */ +- (void)_resequencePosition +{ + _currentPosition = 1; + + // Sort keys by position + var sortedKeys = [[_items allKeys] sortedArrayUsingFunction: + function(k1, k2) { + return [[[_items objectForKey:k1] position] compare:[[_items objectForKey:k2] position]]; }]; + + // Affect new positions + for (var i = 0; i < sortedKeys.length; ++i) + [[_items objectForKey:sortedKeys[i]] setPosition:_currentPosition++]; +} + +/* + * Check if the totalCostLimit is exceeded + */ +- (BOOL)_isTotalCostLimitExceeded +{ + return ([self _totalCost] > _totalCostLimit && _totalCostLimit > 0); +} + +/* + * Check if the countLimit is exceeded + */ +- (BOOL)_isCountLimitExceeded +{ + return ([self _count] > _countLimit && _countLimit > 0); +} + +/* + * This method clean the cache if the totalCost or the count exceeds the totalCostLimit or the countLimit + * until to satisfy condition (totalCost < totalCostLimit and count < countLimit) + */ +- (void)_cleanCache +{ + // Check if the condition is satisfied + if (![self _isTotalCostLimitExceeded] && ![self _isCountLimitExceeded]) + return; + + // Sort keys by position + var sortedKeys = [[_items allKeys] sortedArrayUsingFunction: + function(k1, k2) { + return [[[_items objectForKey:k1] position] compare:[[_items objectForKey:k2] position]]; }]; + + // Remove oldest objects until to satisfy the break condition + for (var i = 0; i < sortedKeys.length; ++i) + { + if (![self _isTotalCostLimitExceeded] && ![self _isCountLimitExceeded]) + break; + + // Call delegate method to warn that the object is going to be removed + [self _sendDelegateWillEvictObjectForKey:sortedKeys[i]]; + + // Remove object + [_items removeObjectForKey: sortedKeys[i]]; + + // Invalid cost cache + _totalCostCache = -1; + } + + // Resequence position of all objects + [self _resequencePosition]; +} + +@end + + +@implementation CPCache (CPCacheDelegate) + +- (void)_sendDelegateWillEvictObjectForKey:(id)aKey +{ + if (_implementedDelegateMethods & CPCacheDelegate_cache_willEvictObject_) + [_delegate cache:self willEvictObject:[[_items objectForKey:aKey] object]]; +} + +@end + + +/* + * Class _CPCacheItem + * Represent an item of CPCache + * This class allow to associate a cost and a position to an object + * + * Attributes: + * - object: the stored object + * - cost: represent the cost (of memory) of the object + * - position: represent the insertion order to determine the oldest object + */ +@implementation _CPCacheItem : CPObject +{ + CPObject _object @accessors(property=object); + int _cost @accessors(property=cost); + int _position @accessors(property=position); +} + ++ (id)cacheItemWithObject:(CPObject)anObject cost:(int)aCost position:(int)aPosition +{ + var cacheItem = [[self alloc] init]; + + if (cacheItem) + { + [cacheItem setObject:anObject]; + [cacheItem setCost:aCost]; + [cacheItem setPosition:aPosition]; + } + + return cacheItem; +} + +@end \ No newline at end of file diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index 3fa485412..3fcf5481f 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -24,6 +24,7 @@ @import "CPArray.j" @import "CPBundle.j" @import "CPByteCountFormatter.j" +@import "CPCache.j" @import "CPCharacterSet.j" @import "CPCoder.j" @import "CPComparisonPredicate.j" diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 0e9d16f98..d5561fb47 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -1754,8 +1754,15 @@ ClassDeclarationStatement: function(node, st, c) { 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); + var checkIfIvarIsAlreadyDeclaredAndInSuperClass = function(aClassDef, recursiveFunction) { + if (aClassDef.ivars[ivarName]) + throw compiler.error_message("Instance variable '" + ivarName + "' is already declared for class " + className + (aClassDef.name !== className ? " in superclass " + aClassDef.name : ""), ivarDecl.id); + if (aClassDef.superClass) + recursiveFunction(aClassDef.superClass, recursiveFunction); + } + + // Check if ivar is already declared in this class or its super classes. + checkIfIvarIsAlreadyDeclaredAndInSuperClass(classDef, checkIfIvarIsAlreadyDeclaredAndInSuperClass); var isTypeDefined = !ivarTypeIsClass || typeof global[ivarType] !== "undefined" || typeof window[ivarType] !== "undefined" || compiler.getClassDef(ivarType) || compiler.getTypeDef(ivarType) || ivarType == classDef.name; diff --git a/Tests/AppKit/CPViewTest.j b/Tests/AppKit/CPViewTest.j index e6eb4d091..549773b26 100644 --- a/Tests/AppKit/CPViewTest.j +++ b/Tests/AppKit/CPViewTest.j @@ -699,6 +699,78 @@ var methodCalled; [self assert:expectedRestult equals:methodCalled]; } +- (void)testToolTipInitialEmpty +{ + [self assert:nil equals:view._toolTip]; + [self assert:nil equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; +} + +- (void)testToolTipWithToolTipAndNoWindow +{ + [view setToolTip:@"tooltip"]; + + [self assert:@"tooltip" equals:view._toolTip]; + [self assert:nil equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; +} + +- (void)testToolTipWithToolTipAndWindow +{ + [view setToolTip:@"tooltip"]; + + [[window contentView] addSubview:view] + + [self assert:@"tooltip" equals:view._toolTip]; + [self assertTrue:view._toolTipInstalled]; + [self assertTrue:!!view._toolTipFunctionIn]; + [self assertTrue:!!view._toolTipFunctionOut]; +} + +- (void)testToolTipWithToolTipAndWindowThenNoWindow +{ + [view setToolTip:@"tooltip"]; + + [[window contentView] addSubview:view] + [view removeFromSuperview]; + + [self assert:@"tooltip" equals:view._toolTip]; + [self assert:NO equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; +} + +- (void)testToolTipWithNoToolTipAndWindowThenNoWindowThenToolTip +{ + [self assert:nil equals:view._toolTip]; + [self assert:nil equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; + + [[window contentView] addSubview:view]; + + [self assert:nil equals:view._toolTip]; + [self assert:nil equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; + + [view setToolTip:@"tooltip"]; + + [self assert:@"tooltip" equals:view._toolTip]; + [self assertTrue:view._toolTipInstalled]; + [self assertTrue:!!view._toolTipFunctionIn]; + [self assertTrue:!!view._toolTipFunctionOut]; + + [view removeFromSuperview]; + + [self assert:@"tooltip" equals:view._toolTip]; + [self assert:NO equals:view._toolTipInstalled]; + [self assert:nil equals:view._toolTipFunctionIn]; + [self assert:nil equals:view._toolTipFunctionOut]; +} + @end @implementation CPLayoutView : CPView @@ -747,4 +819,4 @@ var methodCalled; return YES; } -@end \ No newline at end of file +@end diff --git a/Tests/Foundation/CPCacheItemTest.j b/Tests/Foundation/CPCacheItemTest.j new file mode 100644 index 000000000..89a982d10 --- /dev/null +++ b/Tests/Foundation/CPCacheItemTest.j @@ -0,0 +1,14 @@ +@import + + +@implementation CPCacheItemTest : OJTestCase + +- (void)testCacheItemWithObjectCostPosition +{ + var cacheItem = [_CPCacheItem cacheItemWithObject:"Hello Cappuccino!" cost:50 position:1]; + [self assert:[cacheItem object] equals:"Hello Cappuccino!"]; + [self assert:[cacheItem cost] equals:50]; + [self assert:[cacheItem position] equals:1]; +} + +@end diff --git a/Tests/Foundation/CPCacheTest.j b/Tests/Foundation/CPCacheTest.j new file mode 100644 index 000000000..ac50a0fc6 --- /dev/null +++ b/Tests/Foundation/CPCacheTest.j @@ -0,0 +1,411 @@ +@import + + +/* + * CPCacheTest tests all methods from CPCache + */ +@implementation CPCacheTest : OJTestCase +{ + // Parameters to check delegate + int _countDelegateExecuted; + CPArray _caches; + CPArray _objects; +} + +- (void)setUp +{ + // Initialize data to check delegate + _countDelegateExecuted = 0; + _caches = [[CPArray alloc] init]; + _objects = [[CPArray alloc] init]; +} + + +/* + * Delegate method, called when an object is evicted + */ +- (void)cache:(CPCache)cache willEvictObject:(id)obj +{ + _countDelegateExecuted++; + [_caches addObject:cache]; + [_objects addObject:obj]; +} + + +/* + * Tests methods of CPCache + */ +- (void)testInit +{ + var cache = [[CPCache alloc] init]; + + // Private attributes + [self assert:CPCache equals:[cache class]]; + [self assert:CPDictionary equals:[cache._items class]]; + [self assert:0 equals:cache._currentPosition]; + [self assert:-1 equals:cache._totalCostCache]; + [self assert:0 equals:cache._implementedDelegateMethods]; + + // Public attributes + [self assert:@"" equals:[cache name]]; + [self assert:0 equals:[cache countLimit]]; + [self assert:0 equals:[cache totalCostLimit]]; + [self assert:nil equals:[cache delegate]]; +} + +- (void)testObjectForKey +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1"]; + + // With valid key + [self assert:@"Object1" equals:[cache objectForKey:@"key1"]]; + + // With invalid key + [self assert:nil equals:[cache objectForKey:@"key666"]]; + + // With nil key + [self assert:nil equals:[cache objectForKey:nil]]; +} + +- (void)testSetObjectForKeyDefault +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + + // Check result when add key in empty cache + [cache setObject:@"Object1" forKey:@"key1"] + [self assert:@"Object1" equals:[cache objectForKey:@"key1"]]; + + // Check delegate + [self assert:0 equals:_countDelegateExecuted]; + [self assert:0 equals:[_caches count]]; + [self assert:0 equals:[_objects count]]; +} + +- (void)testSetObjectForKeyWithExistingKey +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1"]; + [cache setObject:@"Object2" forKey:@"key2"]; + + // Check result when add object with existing key in cache + [cache setObject:@"Object3" forKey:@"key1"]; + [self assert:@"Object3" equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + +- (void)testSetObjectForKeyDiscardByCost +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setTotalCostLimit:100]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:50]; + + // Check result when add key in cache with total cost limit + [cache setObject:@"Object3" forKey:@"key3" cost:1]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + [self assert:@"Object3" equals:[cache objectForKey:@"key3"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + +- (void)testSetObjectForKeyDiscardByCount +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setCountLimit:2]; + [cache setObject:@"Object1" forKey:@"key1"]; + [cache setObject:@"Object2" forKey:@"key2"]; + + // Check result when add key in cache with count limit + [cache setObject:@"Object3" forKey:@"key3"]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + [self assert:@"Object3" equals:[cache objectForKey:@"key3"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + +- (void)testRemoveObjectForKey +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1"]; + + // Remove object + [cache removeObjectForKey:@"key1"]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + +- (void)testRemoveAllObjects +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1"]; + [cache setObject:@"Object2" forKey:@"key2"]; + + // Remove all objects + [cache removeAllObjects]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:nil equals:[cache objectForKey:@"key2"]]; + + // Check delegate + [self assert:2 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; + [self assert:cache equals:[_caches objectAtIndex:1]]; + [self assert:@"Object2" equals:[_objects objectAtIndex:1]]; +} + + +/* + * Accessors and mutators + */ + +- (void)testSetCountLimit +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1"]; + [cache setObject:@"Object2" forKey:@"key2"]; + [cache setObject:@"Object3" forKey:@"key3"]; + + // Set count limit + [cache setCountLimit:2]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + [self assert:@"Object3" equals:[cache objectForKey:@"key3"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; + + // Check new count limit + [self assert:2 equals:[cache countLimit]]; +} + +- (void)testSetTotalCostLimit +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:10]; + [cache setObject:@"Object3" forKey:@"key3" cost:70]; + + // Set total cost limit + [cache setTotalCostLimit:100]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + [self assert:@"Object3" equals:[cache objectForKey:@"key3"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; + + // Check total cost limit + [self assert:100 equals:[cache totalCostLimit]]; +} + +- (void)testSetDelegate +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setDelegate:self]; + + [self assert:self equals:[cache delegate]]; + [self assert:(1 << 1) equals:cache._implementedDelegateMethods] +} + +/* + * Test private methods + */ + +- (void)testCount +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:10]; + [cache setObject:@"Object3" forKey:@"key3" cost:70]; + + [self assert:3 equals:[cache _count]]; +} + +- (void)testTotalCost +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:10]; + [cache setObject:@"Object3" forKey:@"key3" cost:70]; + + [self assert:130 equals:[cache _totalCost]]; + + // Hack totalCost then invalidate it to be sure that it is recomputed + cache._totalCostCache = 650; + [self assert:650 equals:[cache _totalCost]]; + + cache._totalCostCache = -1; + [self assert:130 equals:[cache _totalCost]]; +} + +- (void)testResequencePosition +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; // 1 - 1 + [cache setObject:@"Object2" forKey:@"key2" cost:10]; + [cache setObject:@"Object3" forKey:@"key3" cost:70]; // 3 - 2 + [cache removeObjectForKey:@"key2"] + [cache setObject:@"Object4" forKey:@"key4" cost:70]; // 4 - 3 + + // Before resequence + [self assert:1 equals:[[cache._items objectForKey:@"key1"] position]]; + [self assert:3 equals:[[cache._items objectForKey:@"key3"] position]]; + [self assert:4 equals:[[cache._items objectForKey:@"key4"] position]]; + + [cache _resequencePosition]; + + // After resequence + [self assert:1 equals:[[cache._items objectForKey:@"key1"] position]]; + [self assert:2 equals:[[cache._items objectForKey:@"key3"] position]]; + [self assert:3 equals:[[cache._items objectForKey:@"key4"] position]]; +} + +- (void)testIsTotalCostLimitExceeded +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + + // Not exceed (because of not limit) + [self assert:NO equals:[cache _isTotalCostLimitExceeded]]; + + // Not exceed (with limit) + [cache setTotalCostLimit:100]; + [self assert:NO equals:[cache _isTotalCostLimitExceeded]]; + + // Exceed (by hacking the cost of object) + [[cache._items objectForKey:@"key1"] setCost: 150]; + cache._totalCostCache = -1; + [self assert:YES equals:[cache _isTotalCostLimitExceeded]]; +} + +- (void)testIsCountLimitExceeded +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setObject:@"Object1" forKey:@"key1"]; + + // Not exceed (because of not limit) + [self assert:NO equals:[cache _isCountLimitExceeded]]; + + // Not exceed (with limit) + [cache setCountLimit:1]; + [self assert:NO equals:[cache _isCountLimitExceeded]]; + + // Exceed (by hacking the items) + [cache._items setObject:[_CPCacheItem cacheItemWithObject:@"Object2" cost:0 position:3] forKey:@"key2"]; + [self assert:YES equals:[cache _isCountLimitExceeded]]; +} + +- (void)testCleanCacheWithoutDiscarding +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setTotalCostLimit: 100]; + [cache setCountLimit: 2]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:40]; + + // Set total cost limit + [cache _cleanCache]; + [self assert:@"Object1" equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + + // Check delegate + [self assert:0 equals:_countDelegateExecuted]; +} + +- (void)testCleanCacheWithCostDiscarding +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setTotalCostLimit: 100]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1" cost:50]; + [cache setObject:@"Object2" forKey:@"key2" cost:40]; + + // Hack cost of object + [[cache._items objectForKey:@"key2"] setCost:80]; + cache._totalCostCache = -1; + + // Set total cost limit + [cache _cleanCache]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + +- (void)testCleanCacheWithCountDiscarding +{ + // Setup cache + var cache = [[CPCache alloc] init]; + [cache setCountLimit:2]; + [cache setDelegate:self]; + [cache setObject:@"Object1" forKey:@"key1"]; + [cache setObject:@"Object2" forKey:@"key2"]; + + // Hack items + [cache._items setObject:[_CPCacheItem cacheItemWithObject:@"Object3" cost:0 position:3] forKey:@"key3"]; + + // Set total cost limit + [cache _cleanCache]; + [self assert:nil equals:[cache objectForKey:@"key1"]]; + [self assert:@"Object2" equals:[cache objectForKey:@"key2"]]; + [self assert:@"Object3" equals:[cache objectForKey:@"key3"]]; + + // Check delegate + [self assert:1 equals:_countDelegateExecuted]; + [self assert:cache equals:[_caches objectAtIndex:0]]; + [self assert:@"Object1" equals:[_objects objectAtIndex:0]]; +} + + +@end diff --git a/Tests/Manual/CPPlatformWindow/AppController.j b/Tests/Manual/CPPlatformWindow/AppController.j new file mode 100644 index 000000000..8b5dad152 --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/AppController.j @@ -0,0 +1,104 @@ +/* + * AppController.j + * CPPlatformWindow + * + * Created by You on October 30, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPWindow externalWindow; + + CPPlatformWindow platformWindow; + +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. + [[CPPlatformWindow alloc] initWithWindow:externalWindow]; + [externalWindow setDelegate:self]; +} + +- (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)showWindow:(id)sender +{ + [externalWindow orderFront:sender]; +} + +- (IBAction)closeWindow:(id)sender +{ + [externalWindow orderOut:sender]; +} + +- (IBAction)changeFrame:(id)sender +{ + [externalWindow setFrame:CGRectMake(250, 250, 200, 200)]; +} + +- (IBAction)showAlert:(id)sender +{ + var alert = [CPAlert alertWithMessageText:@"rer" defaultButton:"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:"Multiple login failures may result in blocked access to the system."]; + [alert beginSheetModalForWindow:externalWindow]; +} + + +#pragma mark - +#pragma mark Delegate + +- (void)windowDidBecomeKey:(CPNotification)aNotification +{ + CPLog.debug("windowDidBecomeKey:"); +} + +- (void)windowDidBecomeMain:(CPNotification)aNotification +{ + CPLog.debug("windowDidBecomeMain:"); +} + +- (void)windowDidEndSheet:(CPNotification)aNotification +{ + CPLog.debug("windowDidEndSheet:"); +} + +- (void)windowDidMove:(CPNotification)aNotification +{ + CPLog.debug("windowDidMove:"); +} + +- (void)windowDidResignKey:(CPNotification)aNotification +{ + CPLog.debug("windowDidResignKey:"); +} + +- (void)windowDidResignMain:(CPNotification)aNotification +{ + CPLog.debug("windowDidResignMain:"); +} + +- (void)windowDidResize:(CPNotification)aNotification +{ + CPLog.debug("windowDidResize:"); +} + +- (void)windowWillClose:(CPWindow)aWindow +{ + CPLog.debug("windowWillClose:"); +} + +@end diff --git a/Tests/Manual/CPPlatformWindow/Info.plist b/Tests/Manual/CPPlatformWindow/Info.plist new file mode 100644 index 000000000..459b3e9a0 --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPPlatformWindow + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2014, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPPlatformWindow/Jakefile b/Tests/Manual/CPPlatformWindow/Jakefile new file mode 100644 index 000000000..57c0bad39 --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPPlatformWindow + * + * Created by You on October 30, 2014. + * Copyright 2014, 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 = "CPPlatformWindow"; + +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", "CPPlatformWindow.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPPlatformWindow"); + task.setIdentifier("com.yourcompany.CPPlatformWindow"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPPlatformWindow"); + 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, "CPPlatformWindow.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPPlatformWindow.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/CPPlatformWindow/Resources/MainMenu.cib b/Tests/Manual/CPPlatformWindow/Resources/MainMenu.cib new file mode 100644 index 000000000..ece00cd2c --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/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;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;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;58E;D;K;6;CP$UIDd;2;60E;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;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;130E;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;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;1;0E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;140E;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;60E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;68E;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;69E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;60E;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;2;79E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;60E;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;117E;D;K;6;CP$UIDd;3;118E;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;60E;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;2;11E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;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;137E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;140E;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;141E;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;142E;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;143E;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;136E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;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;128E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;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;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;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;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;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;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;18E;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;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;18E;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;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;71E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;58E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;18E;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;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;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;18E;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;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;175E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;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;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;134E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;139E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;135E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;182E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;141E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;183E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;184E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;185E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;186E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;63E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;63E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;186E;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;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;63E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;63E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;63E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;63E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;198E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;199E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;200E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;206E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;76E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;76E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;206E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;207E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;76E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;209E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;210E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;79E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;79E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;210E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;211E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;214E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;215E;K;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;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;218E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;220E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;224E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;226E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;227E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;232E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;234E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;97E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;242E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;243E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;246E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;248E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;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;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;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;61E;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;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;107E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;107E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;254E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;229E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;107E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;230E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;112E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;259E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;260E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;262E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;264E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;266E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;268E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;118E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;118E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;269E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;270E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;271E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;118E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;273E;K;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;274E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;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;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;112E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;124E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;187E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;124E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;276E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;3;124E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;279E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;280E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;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;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;124E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;188E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;282E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;283E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;284E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;285E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;286E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;234E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;186E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;130E;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;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;288E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;288E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;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;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;130E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;292E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;293E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;130E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;300E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;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;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;130E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;302E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;303E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;130E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;304E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;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;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;130E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;305E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;293E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;130E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;306E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;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;307E;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;282E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;283E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;308E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;309E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;286E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;310E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;311E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;312E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;312E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;313E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;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;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;314E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;303E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;304E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;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;131E;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;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;315E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;293E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;306E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;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;131E;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;287E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;316E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;317E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;294E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;296E;K;11;$aalignmentD;K;6;CP$UIDd;3;237E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;287E;K;6;$afontD;K;6;CP$UIDd;3;298E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;287E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;299E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;287E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;318E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;192E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;193E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;301E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;287E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;191E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;237E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;287E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;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;3;128E;E;E;S;8;delegateS;14;externalWindowS;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;11;showWindow:S;12;closeWindow:S;12;changeFrame:S;10;showAlert:S;9;AMainMenuS;11;_CPMainMenuD;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;3;111E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;75E;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;67E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;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;70E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;71E;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;77E;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;82E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;102E;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;95E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;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;100E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;3;101E;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;105E;D;K;6;CP$UIDd;3;104E;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;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;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;116E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;122E;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;119E;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;125E;D;K;6;CP$UIDd;3;126E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 150}, {480, 360}}S;21;{{0, 0}, {1440, 900}}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;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;E;E;S;6;normalS;6;{1, 1}S;21;{{31, 51}, {119, 25}}S;19;{{0, 0}, {119, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;297E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;319E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;320E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;d;1;4S;13;Show Platformd;2;14S;21;{{31, 84}, {120, 25}}S;19;{{0, 0}, {120, 25}}S;14;Close PlatformS;22;{{31, 117}, {119, 25}}S;12;Change FrameS;13;AppControllerd;10;1685586944S;24;{{131, 472}, {562, 270}}d;2;15S;18;My platform WindowS;20;{{0, 0}, {562, 270}}D;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;139E;D;K;6;CP$UIDd;3;140E;E;E;S;21;{{96, 43}, {120, 25}}S;22;{{228, 43}, {119, 25}}S;21;{{359, 43}, {95, 25}}S;18;{{0, 0}, {95, 25}}S;10;Show AlertS;29;.Helvetica Neue DeskInterfaced;2;13E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPPlatformWindow/Resources/MainMenu.xib b/Tests/Manual/CPPlatformWindow/Resources/MainMenu.xib new file mode 100644 index 000000000..802b837e8 --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/Resources/MainMenu.xib @@ -0,0 +1,1932 @@ + + + + 1050 + 14D87h + 6751 + 1347.23 + 758.40 + + com.apple.InterfaceBuilder.CocoaPlugin + 6751 + + + NSButton + NSButtonCell + NSCustomObject + NSMenu + NSMenuItem + NSView + NSWindowTemplate + + + 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 + + + + + + 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 + + + + + + + + + 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 + + + + + + + + + + + + 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 + + + 7 + 2 + {{335, 390}, {480, 360}} + 1946157056 + Window + NSWindow + + + + + 256 + + + + 268 + {{25, 281}, {131, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Show Platform + + YES + 13 + 1044 + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{25, 248}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Close Platform + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{25, 215}, {131, 32}} + + + _NS:9 + YES + + 67108864 + 134217728 + Change Frame + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {480, 360} + + + + + {{0, 0}, {1440, 900}} + {10000000000000, 10000000000000} + YES + + + AppController + + + 15 + 2 + {{131, 158}, {562, 270}} + 1685586944 + My platform Window + NSWindow + + + + + 256 + + + + 268 + {{90, 199}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Close Platform + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{222, 199}, {131, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Change Frame + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{353, 199}, {107, 32}} + + + _NS:9 + YES + + 67108864 + 134217728 + Show Alert + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {562, 270} + + + _NS:20 + + {{0, 0}, {1440, 900}} + {10000000000000, 10000000000000} + 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 + + + + changeFrame: + + + + 466 + + + + closeWindow: + + + + 467 + + + + showWindow: + + + + 468 + + + + closeWindow: + + + + 477 + + + + changeFrame: + + + + 478 + + + + showAlert: + + + + 484 + + + + externalWindow + + + + 486 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + MainMenu + + + 19 + + + + + + + + 56 + + + + + + + + 103 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 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 + + + + + + + + 111 + + + + + 57 + + + + + + + + + + + + 58 + + + + + 136 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + + + + + + 450 + + + + + 460 + + + + + + + + 461 + + + + + 462 + + + + + + + + 463 + + + + + 464 + + + + + + + + 465 + + + + + 469 + + + + + + + + 470 + + + + + + + + + + 472 + + + + + + + + 473 + + + + + + + + 474 + + + + + 475 + + + + + 481 + + + + + + + + 482 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + 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 + {263, 796} + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 486 + + + + + AppController + NSObject + + id + id + id + id + + + + changeFrame: + id + + + closeWindow: + id + + + showAlert: + id + + + showWindow: + id + + + + NSWindow + NSWindow + + + + externalWindow + NSWindow + + + theWindow + NSWindow + + + + IBProjectSource + ../.XcodeSupport/AppController.h + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/Tests/Manual/CPPlatformWindow/index-debug.html b/Tests/Manual/CPPlatformWindow/index-debug.html new file mode 100644 index 000000000..a908e47c7 --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPPlatformWindow + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPPlatformWindow/index.html b/Tests/Manual/CPPlatformWindow/index.html new file mode 100644 index 000000000..32157686e --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPPlatformWindow + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPPlatformWindow/main.j b/Tests/Manual/CPPlatformWindow/main.j new file mode 100644 index 000000000..883eae5ce --- /dev/null +++ b/Tests/Manual/CPPlatformWindow/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPPlatformWindow + * + * Created by You on October 30, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tests/Manual/CompilationTests/TestCases/11.j b/Tests/Manual/CompilationTests/TestCases/11.j new file mode 100644 index 000000000..c7900c4d9 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/11.j @@ -0,0 +1,28 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10778 of file [unknown] +SyntaxError: +int myIvar; + ^ +ERROR line 12 in file:[__PATH__]: Instance variable 'myIvar' is already declared for class MySubclass in superclass MySuperclass +END_EXPECTED +*/ + +@import + +@implementation MySuperclass : CPObject +{ + int myIvar; +} + +@end + +@implementation MySubclass : MySuperclass +{ + int myIvar; +} + +@end \ No newline at end of file diff --git a/Tests/Manual/CompilationTests/TestCases/7.j b/Tests/Manual/CompilationTests/TestCases/7.j index cdff5aeda..a2202e387 100644 --- a/Tests/Manual/CompilationTests/TestCases/7.j +++ b/Tests/Manual/CompilationTests/TestCases/7.j @@ -7,7 +7,7 @@ Error on line 10001 of file [unknown] SyntaxError: @implementation MyType : CPObject ^ -ERROR line 5 in file:[__PATH__]: MyType is already declared as type +ERROR line 5 in file:[__PATH__]: MyType is already declared as a type END_EXPECTED */ diff --git a/Tests/Manual/CompilationTests/run.py b/Tests/Manual/CompilationTests/run.py index e21eebaa3..b827faa8b 100755 --- a/Tests/Manual/CompilationTests/run.py +++ b/Tests/Manual/CompilationTests/run.py @@ -55,6 +55,7 @@ def cleanup_output(output): output = output.replace(" ", "") output = output.replace("\n", "") output = output.replace("[0m", "") + output = re.sub('\d*offile\[unknown\]', '', output) return re.sub('[^\s!-~]', '', output) diff --git a/Tools/capp/Resources/Templates/ThemeDescriptor/ThemeDescriptors.j b/Tools/capp/Resources/Templates/ThemeDescriptor/ThemeDescriptors.j index a1b7aa4d9..80113a936 100644 --- a/Tools/capp/Resources/Templates/ThemeDescriptor/ThemeDescriptors.j +++ b/Tools/capp/Resources/Templates/ThemeDescriptor/ThemeDescriptors.j @@ -20,11 +20,16 @@ { var button = [[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 20.0)]; - [button setValue:[CPColor blueColor] forThemeAttribute:@"bezel-color"]; - [button setValue:[CPColor greenColor] forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted]; + var themedButtonValues = + [ + [@"text-color", [CPColor redColor]], + [@"text-color", [CPColor yellowColor], CPThemeStateHighlighted], - [button setValue:[CPColor redColor] forThemeAttribute:@"text-color"]; - [button setValue:[CPColor yellowColor] forThemeAttribute:@"text-color" inState:CPThemeStateHighlighted]; + [@"bezel-color", [CPColor blueColor]], + [@"bezel-color", [CPColor greenColor], CPThemeStateHighlighted], + ]; + + [self registerThemeValues:themedButtonValues forView:button]; [button setTitle:@"Yikes!"]; diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index 4517263fa..2a5aa1d08 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -409,7 +409,6 @@ var NSButtonIsBorderedMask = 0x00800000, @implementation NSButtonCell : NSActionCell { - BOOL _isBordered @accessors(readonly, getter=isBordered); int _bezelStyle @accessors(readonly, getter=bezelStyle); CPString _title @accessors(readonly, getter=title); diff --git a/Tools/nib2cib/NSDatePicker.j b/Tools/nib2cib/NSDatePicker.j index a90983ec5..c14ab8c55 100644 --- a/Tools/nib2cib/NSDatePicker.j +++ b/Tools/nib2cib/NSDatePicker.j @@ -177,7 +177,6 @@ var NSDatePickerDefaultSize = 22, BOOL _drawsBackground @accessors(getter=drawsBackground); CPDate _minDate @accessors(getter=minDate); CPDate _maxDate @accessors(getter=maxDate); - CPDateFormatter _formatter @accessors(getter=formatter); CPInteger _datePickerMode @accessors(getter=datePickerMode); CPInteger _datePickerElements @accessors(getter=datePickerElements); CPInteger _datePickerType @accessors(getter=datePickerType);