From d6b4ebaa30912ee8a3b653012e9b2b786e5a1418 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Wed, 17 Sep 2008 23:56:55 -0700 Subject: [PATCH] Significant improvements to cib support and nib2cib. Reviewed by rossco. --- AppKit/AppKit.steam | 4 +- AppKit/CPControl.j | 4 +- AppKit/CPView.j | 8 +- AppKit/CPWindow.j | 13 +- AppKit/Cib/CPCib.j | 17 +- AppKit/Cib/CPCustomView.j | 21 +- AppKit/Cib/_CPCibConnector.j | 112 ++++++ AppKit/Cib/_CPCibCustomObject.j | 41 ++ AppKit/Cib/_CPCibObjectData.j | 59 ++- AppKit/Cib/_CPCibWindowTemplate.j | 97 +++++ Foundation/CPKeyValueCoding.j | 198 ++++++++-- Foundation/CPKeyValueObserving.j | 39 ++ Foundation/Foundation.j | 1 + Tools/NibApp/AppController.j | 20 +- Tools/NibApp/HelloWorld.nib/classes.nib | 29 ++ Tools/NibApp/HelloWorld.nib/info.nib | 6 +- Tools/NibApp/HelloWorld.nib/keyedobjects.nib | Bin 11532 -> 4015 bytes Tools/NibApp/HelloWorld.xib | 386 ++++++++++++++++--- Tools/NibApp/main.j | 2 + Tools/nib2cib/NSAppKit.j | 14 + Tools/nib2cib/NSButton.j | 3 + Tools/nib2cib/NSCustomObject.j | 40 ++ Tools/nib2cib/NSCustomView.j | 13 +- Tools/nib2cib/NSIBObjectData.j | 8 +- Tools/nib2cib/NSNibConnector.j | 72 ++++ Tools/nib2cib/NSWindowTemplate.j | 59 +++ 26 files changed, 1085 insertions(+), 181 deletions(-) create mode 100644 AppKit/Cib/_CPCibConnector.j create mode 100644 AppKit/Cib/_CPCibCustomObject.j create mode 100644 AppKit/Cib/_CPCibWindowTemplate.j create mode 100644 Foundation/CPKeyValueObserving.j create mode 100644 Tools/nib2cib/NSCustomObject.j create mode 100644 Tools/nib2cib/NSNibConnector.j create mode 100644 Tools/nib2cib/NSWindowTemplate.j diff --git a/AppKit/AppKit.steam b/AppKit/AppKit.steam index f07d2aaf3..69c4cc952 100644 --- a/AppKit/AppKit.steam +++ b/AppKit/AppKit.steam @@ -34,12 +34,12 @@ Name Debug + Flags + -DDEBUG Settings PREPROCESS - FLAGS - -DDEBUG diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 421b89b08..a035f5467 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -253,8 +253,8 @@ var CPControlBlackColor = [CPColor blackColor]; - (void)mouseUp:(CPEvent)anEvent { - if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])) - [self sendAction:_action to:_target]; + if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])){alert([_target description] + " : " + _action); + [self sendAction:_action to:_target];} [super mouseUp:anEvent]; } diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 05aedecc4..1fe0de2e2 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1684,13 +1684,14 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", _DOMElement = DOMElementPrototype.cloneNode(false); #endif + // Also decode these "early". + _frame = [aCoder decodeRectForKey:CPViewFrameKey]; + _bounds = [aCoder decodeRectForKey:CPViewBoundsKey]; + self = [super initWithCoder:aCoder]; if (self) { - _frame = [aCoder decodeRectForKey:CPViewFrameKey]; - _bounds = [aCoder decodeRectForKey:CPViewBoundsKey]; - _window = [aCoder decodeObjectForKey:CPViewWindowKey]; _subviews = [aCoder decodeObjectForKey:CPViewSubviewsKey]; _superview = [aCoder decodeObjectForKey:CPViewSuperviewKey]; @@ -1716,6 +1717,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", for (; index < count; ++index) { CPDOMDisplayServerAppendChild(_DOMElement, _subviews[index]._DOMElement); + //_subviews[index]._superview = self; } #endif _displayHash = [self hash]; diff --git a/AppKit/CPWindow.j b/AppKit/CPWindow.j index 0383b0cd9..fedddb16d 100644 --- a/AppKit/CPWindow.j +++ b/AppKit/CPWindow.j @@ -269,7 +269,9 @@ var CPWindowSaveImage = nil, CPURL _representedURL; // Bridge Support +#if PLATFORM(DOM) DOMElement _DOMElement; +#endif CPDOMWindowBridge _bridge; unsigned _autoresizingMask; @@ -364,7 +366,8 @@ CPTexturedBackgroundWindowMask [self setContentView:[[CPView alloc] initWithFrame:CGRectMakeZero()]]; _firstResponder = self; - + +#if PLATFORM(DOM) _DOMElement = document.createElement("div"); _DOMElement.style.position = "absolute"; @@ -375,7 +378,8 @@ CPTexturedBackgroundWindowMask CPDOMDisplayServerSetStyleSize(_DOMElement, 1, 1); CPDOMDisplayServerAppendChild(_DOMElement, _windowView._DOMElement); - +#endif + [self setBridge:aBridge]; [self setNextResponder:CPApp]; @@ -854,12 +858,15 @@ CPTexturedBackgroundWindowMask [_shadowView setBackgroundColor:_CPWindowShadowColor]; [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; +#if PLATFORM(DOM) CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); +#endif } else { +#if PLATFORM(DOM) CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); - +#endif _shadowView = nil; } } diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index e535eaa78..be630aedb 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -25,8 +25,9 @@ import import import "CPCustomView.j" +import "_CPCibCustomObject.j" import "_CPCibObjectData.j" - +import "_CPCibWindowTemplate.j" CPCibOwner = @"CPCibOwner", CPCibTopLevelObjects = @"CPCibTopLevelObjects"; @@ -56,20 +57,10 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (!objectData || ![objectData isKindOfClass:[_CPCibObjectData class]]) return NO; + [objectData establishConnectionsWithExternalNameTable:anExternalNameTable]; + var owner = [anExternalNameTable objectForKey:CPCibOwner], topLevelObjects = [anExternalNameTable objectForKey:CPCibTopLevelObjects]; - - var objects = unarchiver._objects, - count = [objects count]; - - // The order in which objects receive the awakeFromCib message is not guaranteed. - while (count--) - { - var object = objects[count]; - - if ([object isMemberOfClass:[CPView class]]) - return object; - } /* // [objectData establishConnectionsWithOwner:owner topLevelObjects:topLevelObjects]; // [objectData cibInstantiateWithOwner:owner topLevelObjects:topLevelObjects]; diff --git a/AppKit/Cib/CPCustomView.j b/AppKit/Cib/CPCustomView.j index c873b2783..e1755d2b5 100644 --- a/AppKit/Cib/CPCustomView.j +++ b/AppKit/Cib/CPCustomView.j @@ -1,5 +1,5 @@ /* - * CPCustomView.j + * _CPCibCustomView.j * AppKit * * Created by Francisco Tolmasky. @@ -36,33 +36,35 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", /* @ignore */ -@implementation CPCustomView : CPView +@implementation _CPCibCustomView : CPView { CPString _className; } @end -var CPCustomViewClassNameKey = @"CPCustomViewClassNameKey"; +var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; -@implementation CPCustomView (CPCoding) +@implementation _CPCibCustomView (CPCoding) - (id)initWithCoder:(CPCoder)aCoder { - _className = [aCoder decodeObjectForKey:CPCustomViewClassNameKey]; + _className = [aCoder decodeObjectForKey:_CPCibCustomViewClassNameKey]; var theClass = CPClassFromString(_className); // If we don't have this class, just use CPView. // FIXME: Should we instead throw an exception? if (!theClass) + { + CPLog("Unknown class \"" + _className + "\" in cib file, using CPView instead."); + theClass = [CPView class]; + } var frame = [aCoder decodeRectForKey:CPViewFrameKey]; - // If this is just a "CPView", don't bother with any funny business, just go ahead and create it with initWithCoder: - if (theClass == [CPView class]) - self = [[CPView alloc] initWithFrame:frame]; + self = [[CPView alloc] initWithFrame:frame]; if (self) { @@ -75,9 +77,8 @@ var CPCustomViewClassNameKey = @"CPCustomViewClassNameKey"; for (; index < count; ++index) { - // This is a bogus superview "CPCustomView". + // This is a bogus superview "_CPCibCustomView". subviews[index]._superview = nil; - [self addSubview:subviews[index]]; } diff --git a/AppKit/Cib/_CPCibConnector.j b/AppKit/Cib/_CPCibConnector.j new file mode 100644 index 000000000..21225891e --- /dev/null +++ b/AppKit/Cib/_CPCibConnector.j @@ -0,0 +1,112 @@ + +import +import + + +var _CPCibConnectorSourceKey = @"_CPCibConnectorSourceKey", + _CPCibConnectorDestinationKey = @"_CPCibConnectorDestinationKey", + _CPCibConnectorLabelKey = @"_CPCibConnectorLabelKey"; + +@implementation _CPCibConnector : CPObject +{ + id _source; + id _destination; + CPString _label; +} + +- (void)replaceObject:(id)anObject withObject:(id)anotherObject +{ + if (_source == anObject) + _source = anotherObject; + + else if (_destination == anObject) + _destination = anotherObject; +} + +@end + +@implementation _CPCibConnector (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _source = [aCoder decodeObjectForKey:_CPCibConnectorSourceKey]; + _destination = [aCoder decodeObjectForKey:_CPCibConnectorDestinationKey]; + _label = [aCoder decodeObjectForKey:_CPCibConnectorLabelKey]; + +#if DEBUG + CPLog("Connection from " + [_source description] + " to " + [_destination description] + " and label " + _label + " decoded."); +#endif + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_source forKey:_CPCibConnectorSourceKey]; + [aCoder encodeObject:_destination forKey:_CPCibConnectorDestinationKey]; + [aCoder encodeObject:_label forKey:_CPCibConnectorLabelKey]; +} + +@end + +@implementation _CPCibControlConnector : _CPCibConnector +{ +} + +- (void)establishConnection +{ +#if DEBUG + CPLog('[' + [_source description] + " setTarget: " + [_destination description] + ']'); + CPLog('[' + [_source description] + " setAction: " + _label + ']'); +#endif + + var selectorName = _label; + + if (![selectorName hasSuffix:@":"]) + selectorName += ':'; + + var selector = CPSelectorFromString(selectorName); + + if (!selector) + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] selector " + selectorName + @" does not exist."]; + + if ([_source respondsToSelector:@selector(setAction:)]) + objj_msgSend(_source, @selector(setAction:), selector); + + else + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setAction:"]; + + if ([_source respondsToSelector:@selector(setTarget:)]) + objj_msgSend(_source, @selector(setTarget:), _destination); + + else + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setTarget:"]; +} + +@end + +@implementation _CPCibOutletConnector : _CPCibConnector +{ +} + +- (void)establishConnection +{ +#if DEBUG + CPLog([_source description] + " setValue: " + [_destination description] + " forKey: " + _label); +#endif + + [_source setValue:_destination forKey:_label]; +} + +@end diff --git a/AppKit/Cib/_CPCibCustomObject.j b/AppKit/Cib/_CPCibCustomObject.j new file mode 100644 index 000000000..56b633c9a --- /dev/null +++ b/AppKit/Cib/_CPCibCustomObject.j @@ -0,0 +1,41 @@ + +import + + +var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName"; + +@implementation _CPCibCustomObject : CPObject +{ + CPString _className; +} + +@end + +@implementation _CPCibCustomObject (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + _className = [aCoder decodeObjectForKey:_CPCibCustomObjectClassName]; + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_className forKey:_CPCibCustomObjectClassName]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + var theClass = CPClassFromString(_className); + + if (!theClass) + CPLog("Unknown class \"" + _className + "\" in cib file"); + + return [[theClass alloc] init]; +} + +@end diff --git a/AppKit/Cib/_CPCibObjectData.j b/AppKit/Cib/_CPCibObjectData.j index 53cad72d3..0e43193ab 100644 --- a/AppKit/Cib/_CPCibObjectData.j +++ b/AppKit/Cib/_CPCibObjectData.j @@ -24,36 +24,39 @@ import import import +import "CPCib.j" +import "_CPCibConnector.j" + @implementation _CPCibObjectData : CPObject { - CPArray _namesKeys; - CPArray _namesValues; + CPArray _namesKeys; + CPArray _namesValues; - CPArray _accessibilityConnectors; - CPArray _accessibilityOidsKeys; - CPArray _accessibilityOidsValues; + CPArray _accessibilityConnectors; + CPArray _accessibilityOidsKeys; + CPArray _accessibilityOidsValues; - CPArray _classesKeys; - CPArray _classesValues; + CPArray _classesKeys; + CPArray _classesValues; - CPArray _connections; + CPArray _connections; - id _fontManager; + id _fontManager; - CPString _framework; + CPString _framework; - int _nextOid; + int _nextOid; - CPArray _objectsKeys; - CPArray _objectsValues; + CPArray _objectsKeys; + CPArray _objectsValues; - CPArray _oidKeys; - CPArray _oidValues; + CPArray _oidKeys; + CPArray _oidValues; - CPCustomObject _rootObject; + _CPCibCustomObject _fileOwner; - CPSet _visibleWindows; + CPSet _visibleWindows; } /* - (CPArray)topLevelObjects @@ -103,7 +106,7 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _CPCibObjectDataOidKeysKey = @"_CPCibObjectDataOidKeysKey", _CPCibObjectDataOidValuesKey = @"_CPCibObjectDataOidValuesKey", - _CPCibObjectDataRootObjectKey = @"_CPCibObjectDataRootObjectKey", + _CPCibObjectDataFileOwnerKey = @"_CPCibObjectDataFileOwnerKey", _CPCibObjectDataVisibleWindowsKey = @"_CPCibObjectDataVisibleWindowsKey"; @implementation _CPCibObjectData (CPCoding) @@ -125,7 +128,6 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _classesValues = [aCoder decodeObjectForKey:_CPCibObjectDataClassesValuesKey]; _connections = [aCoder decodeObjectForKey:_CPCibObjectDataConnectionsKey]; - //id _fontManager; _framework = [aCoder decodeObjectForKey:_CPCibObjectDataFrameworkKey]; @@ -138,7 +140,7 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _oidKeys = [aCoder decodeObjectForKey:_CPCibObjectDataOidKeysKey]; _oidValues = [aCoder decodeObjectForKey:_CPCibObjectDataOidValuesKey]; - _rootObject = [aCoder decodeObjectForKey:_CPCibObjectDataRootObjectKey]; + _fileOwner = [aCoder decodeObjectForKey:_CPCibObjectDataFileOwnerKey]; // CPSet _visibleWindows; } @@ -172,10 +174,25 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey [aCoder encodeObject:_oidKeys forKey:_CPCibObjectDataOidKeysKey]; [aCoder encodeObject:_oidValues forKey:_CPCibObjectDataOidValuesKey]; - [aCoder encodeObject:_rootObject forKey:_CPCibObjectDataRootObjectKey]; + [aCoder encodeObject:_fileOwner forKey:_CPCibObjectDataFileOwnerKey]; // CPCustomObject _fileOwner; // CPSet _visibleWindows; } +- (void)establishConnectionsWithExternalNameTable:(CPDictionary)anExternalNameTable +{ + var index = 0, + count = _connections.length, + cibOwner = [anExternalNameTable objectForKey:CPCibOwner]; + + for (; index < count; ++index) + { + var connection = _connections[index]; + + [connection replaceObject:_fileOwner withObject:cibOwner]; + [connection establishConnection]; + } +} + @end diff --git a/AppKit/Cib/_CPCibWindowTemplate.j b/AppKit/Cib/_CPCibWindowTemplate.j new file mode 100644 index 000000000..7147656aa --- /dev/null +++ b/AppKit/Cib/_CPCibWindowTemplate.j @@ -0,0 +1,97 @@ + +import + + +var _CPCibWindowTemplateMinSizeKey = @"_CPCibWindowTemplateMinSizeKey", + _CPCibWindowTemplateMaxSizeKey = @"_CPCibWindowTemplateMaxSizeKey", + + _CPCibWindowTemplateViewClassKey = @"_CPCibWindowTemplateWindowClassKey", + + _CPCibWindowTemplateWindowRectKey = @"_CPCibWindowTemplateWindowRectKey", + _CPCibWindowTemplateWindowStyleMaskKey = @"_CPCibWindowTempatStyleMaskKey", + _CPCibWindowTemplateWindowTitleKey = @"_CPCibWindowTemplateWindowTitleKey", + _CPCibWindowTemplateWindowViewKey = @"_CPCibWindowTemplateWindowViewKey"; + +@implementation _CPCibWindowTemplate : CPObject +{ + CGSize _minSize; + CGSize _maxSize; + //CGSize _screenRect; + + CPString _viewClass; + //unsigned _wtFlags; + CPString _windowClass; + CGRect _windowRect; + unsigned _windowStyleMask; + + CPString _windowTitle; + CPView _windowView; +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _minSize = [aCoder decodeSizeForKey:_CPCibWindowTemplateMinSizeKey]; + _maxSize = [aCoder decodeSizeForKey:_CPCibWindowTemplateMaxSizeKey]; + + _viewClass = [aCoder decodeObjectForKey:_CPCibWindowTemplateViewClassKey]; + + _windowClass = [aCoder decodeObjectForKey:_CPCibWindowTemplateViewClassKey]; + _windowRect = [aCoder decodeRectForKey:_CPCibWindowTemplateWindowRectKey]; + _windowStyleMask = [aCoder decodeIntForKey:_CPCibWindowTemplateWindowStyleMaskKey]; + + _windowTitle = [aCoder decodeObjectForKey:_CPCibWindowTemplateWindowTitleKey]; + _windowView = [aCoder decodeObjectForKey:_CPCibWindowTemplateWindowViewKey]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeSize:_minSize forKey:_CPCibWindowTemplateMinSizeKey]; + [aCoder encodeSize:_maxSize forKey:_CPCibWindowTemplateMaxSizeKey]; + + [aCoder encodeObject:_viewClass forKey:_CPCibWindowTemplateViewClassKey]; + + [aCoder encodeObject:_windowClass forKey:_CPCibWindowTemplateViewClassKey]; + [aCoder encodeRect:_windowRect forKey:_CPCibWindowTemplateWindowRectKey]; + [aCoder encodeInt:_windowStyleMask forKey:_CPCibWindowTemplateWindowStyleMaskKey]; + + [aCoder encodeObject:_windowTitle forKey:_CPCibWindowTemplateWindowTitleKey]; + [aCoder encodeObject:_windowView forKey:_CPCibWindowTemplateWindowViewKey]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + var windowClass = CPClassFromString(_windowClass); + +/* if (!windowClass) + [NSException raise:NSInvalidArgumentException format:@"Unable to locate NSWindow class %@, using NSWindow",_windowClass]; + class=[NSWindow class];*/ + + var theWindow = [[windowClass alloc] initWithContentRect:_windowRect styleMask:CPHUDBackgroundWindowMask | CPClosableWindowMask];//styleMask:_windowStyleMask]; +// alert(CPStringFromRect(_windowRect)); +// alert(CPStringFromSize(_minSize)); +// alert(CPStringFromSize(_maxSize)); + //[theWindow setMinSize:_minSize]; + //[theWindow setMaxSize:_maxSize]; + [theWindow setLevel:CPFloatingWindowLevel]; + + //[result setHidesOnDeactivate:(_wtFlags&0x80000000)?YES:NO]; + [theWindow setTitle:_windowTitle]; + + // FIXME: we can't autoresize yet... + [_windowView setAutoresizesSubviews:NO]; + + [theWindow setContentView:_windowView]; + + [_windowView setAutoresizesSubviews:YES]; + + return theWindow; +} + +@end diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index d0cdbbd13..d825acabd 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -22,7 +22,15 @@ import "CPObject.j" -@implementation CPObject(CPKeyValueCoding) + +var CPObjectAccessorsForClass = nil, + CPObjectModifiersForClass = nil; + +CPUndefinedKeyException = @"CPUndefinedKeyException"; +CPTargetObjectUserInfoKey = @"CPTargetObjectUserInfoKey"; +CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; + +@implementation CPObject (CPKeyValueCoding) + (BOOL)accessInstanceVariablesDirectly { @@ -32,14 +40,42 @@ import "CPObject.j" /* @ignore */ + (SEL)_accessorForKey:(CPString)aKey { - var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1), - selector = CPSelectorFromString("get" + capitalizedKey); + if (!CPObjectAccessorsForClass) + CPObjectAccessorsForClass = [CPDictionary dictionary]; - if ([self instancesRespondToSelector:selector] || + var hash = [isa hash], + selector = nil, + accessors = [CPObjectAccessorsForClass objectForKey:hash]; + + if (accessors) + { + selector = [accessors objectForKey:aKey]; + + if (selector) + return selector == [CPNull null] ? nil : selector; + } + else + { + accessors = [CPDictionary dictionary]; + + [CPObjectAccessorsForClass setObject:accessors forKey:hash]; + } + + var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1); + + if ([self instancesRespondToSelector:selector = CPSelectorFromString("get" + capitalizedKey)] || [self instancesRespondToSelector:selector = CPSelectorFromString(aKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("_"+aKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("is" + capitalizedKey)]) + [self instancesRespondToSelector:selector = CPSelectorFromString("is" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_get" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_" + aKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_is" + capitalizedKey)]) + { + [accessors setObject:selector forKey:aKey]; + return selector; + } + + [accessors setObject:[CPNull null] forKey:aKey]; return nil; } @@ -47,22 +83,68 @@ import "CPObject.j" /* @ignore */ + (SEL)_modifierForKey:(CPString)aKey { - var selector = CPSelectorFromString("set" + aKey.charAt(0).toUpperCase() + aKey.substr(1) + ':'); + if (!CPObjectModifiersForClass) + CPObjectModifiersForClass = [CPDictionary dictionary]; + + var hash = [isa hash], + selector = nil, + modifiers = [CPObjectModifiersForClass objectForKey:hash]; + + if (modifiers) + { + selector = [modifiers objectForKey:aKey]; + + if (selector) + return selector == [CPNull null] ? nil : selector; + } + else + { + modifiers = [CPDictionary dictionary]; + + [CPObjectModifiersForClass setObject:modifiers forKey:hash]; + } + + if (selector) + return selector == [CPNull null] ? nil : selector; - if ([self instancesRespondToSelector:selector]) + var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1) + ':'; + + if ([self instancesRespondToSelector:selector = CPSelectorFromString("set" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_set" + capitalizedKey)]) + { + [modifiers setObject:selector forKey:aKey]; + return selector; - + } + + [modifiers setObject:[CPNull null] forKey:aKey]; + return nil; } /* @ignore */ - (CPString)_ivarForKey:(CPString)aKey { - var ivar, - isKey = "is" + aKey.charAt(0).toUpperCase() + aKey.substr(1); + var ivar = '_' + aKey; + + if (typeof self[ivar] != "undefined") + return ivar; - if (self[ivar = "_" + aKey] != undefined || self[ivar = "_" + isKey] != undefined || - self[ivar = aKey] != undefined || self[ivar = isKey] != undefined) ; + var isKey = "is" + aKey.charAt(0).toUpperCase() + aKey.substr(1); + + ivar = '_' + isKey; + + if (typeof self[ivar] != "undefined") + return ivar; + + ivar = aKey; + + if (typeof self[ivar] != "undefined") + return ivar; + + ivar = isKey; + + if (typeof self[ivar] != "undefined") return ivar; return nil; @@ -70,35 +152,62 @@ import "CPObject.j" - (id)valueForKey:(CPString)aKey { - var ivar, - theClass = [self class], - selector = [theClass _accessorForKey:aKey] + var selector = [isa _accessorForKey:aKey]; if (selector) - return [self performSelector:selector]; - else if([theClass accessInstanceVariablesDirectly] && (ivar = [self _ivarForKey:aKey])) - return self[ivar]; - else - return [self valueForUndefinedKey:aKey]; + return objj_msgSend(self, selector); + + if([isa accessInstanceVariablesDirectly]) + { + var ivar = [self _ivarForKey:aKey]; + + if (ivar) + return self[ivar]; + } + + return [self valueForUndefinedKey:aKey]; } - (id)valueForKeyPath:(CPString)aKeyPath { - var i = 0, - keys = aKeyPath.split("."), + var keys = aKeyPath.split("."), + + index = 0, count = keys.length, + value = self; - for(; i valueForKey()]: this class is not key value coding-compliant for the key "+aKey+".]"); + [[CPException exceptionWithName:CPUndefinedKeyException + reason:[self description] + " is not key value coding-compliant for the key " + aKey + userInfo:[CPDictionary dictionaryWithObjects:[self, aKey] forKeys:[CPTargetObjectUserInfoKey, CPUnknownUserInfoKey]]] raise]; } - (void)setValue:(id)aValue forKeyPath:(CPString)aKeyPath @@ -118,22 +227,35 @@ import "CPObject.j" - (void)setValue:(id)aValue forKey:(CPString)aKey { - var ivar, - theClass = [self class], - selector = [theClass _modifierForKey:aKey]; + var selector = [isa _modifierForKey:aKey]; if (selector) - [self performSelector:selector withObject:aValue]; - else if([theClass accessInstanceVariablesDirectly] && (ivar = [self _ivarForKey:aKey])) - self[ivar] = aValue; - else - [self setValue:aValue forUndefinedKey:aKey]; + return objj_msgSend(self, selector, aValue); + + if([isa accessInstanceVariablesDirectly]) + { + var ivar = [self _ivarForKey:aKey]; + + if (ivar) + { + [self willChangeValueForKey:aKey]; + + self[ivar] = aValue; + + [self didChangeValueForKey:aKey]; + } + + return; + } + + [self setValue:aValue forUndefinedKey:aKey]; } - (void)setValue:(id)aValue forUndefinedKey:(CPString)aKey { - alert("IMPLEMENT EXCEPTIONS, also, setValueForKey died."); -// CPException.raise(CPUndefinedKeyException, "[<"+this.className()+" "+this+"> setValueForKey()]: this class is not key value coding-compliant for the key "+aKey+".]"); + [[CPException exceptionWithName:CPUndefinedKeyException + reason:[self description] + " is not key value coding-compliant for the key " + aKey + userInfo:[CPDictionary dictionaryWithObjects:[self, aKey] forKeys:[CPTargetObjectUserInfoKey, CPUnknownUserInfoKey]]] raise]; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j new file mode 100644 index 000000000..ea1dc2818 --- /dev/null +++ b/Foundation/CPKeyValueObserving.j @@ -0,0 +1,39 @@ +/* + * CPKeyValueCoding.j + * Foundation + * + * Created by Francisco Tolmasky. + * Copyright 2008, 280 North, Inc. + * + * 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" + + +@implementation CPObject (KeyValueObserving) + +- (void)willChangeValueForKey:(CPString)aKey +{ + +} + + +- (void)didChangeValueForKey:(CPString)aKey +{ + +} + +@end \ No newline at end of file diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index d1e8d97c7..928420510 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -33,6 +33,7 @@ import "CPJSONPConnection.j" import "CPKeyedArchiver.j" import "CPKeyedUnarchiver.j" import "CPKeyValueCoding.j" +import "CPKeyValueObserving.j" import "CPLog.j" import "CPNotification.j" import "CPNotificationCenter.j" diff --git a/Tools/NibApp/AppController.j b/Tools/NibApp/AppController.j index 7dc51c4b8..23f49feef 100644 --- a/Tools/NibApp/AppController.j +++ b/Tools/NibApp/AppController.j @@ -5,21 +5,25 @@ import @implementation AppController : CPObject { + CPWindow _window; + CPWindow _secondWindow; + CPView _view; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { var cib = [[CPCib alloc] initWithContentsOfURL:@"MainMenu.cib"], - x = [cib instantiateCibWithExternalNameTable:nil]; - - [x setBackgroundColor:[CPColor blueColor]]; - - var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView]; - - [contentView addSubview:x]; - + + [cib instantiateCibWithExternalNameTable:[CPDictionary dictionaryWithObject:self forKey:CPCibOwner]]; + + [_view setBackgroundColor:[CPColor blueColor]]; + + [contentView addSubview:_view]; [theWindow orderFront:self]; + + [_secondWindow orderFront:self]; } @end \ No newline at end of file diff --git a/Tools/NibApp/HelloWorld.nib/classes.nib b/Tools/NibApp/HelloWorld.nib/classes.nib index c4b887e72..01b9f29b9 100644 --- a/Tools/NibApp/HelloWorld.nib/classes.nib +++ b/Tools/NibApp/HelloWorld.nib/classes.nib @@ -2,6 +2,35 @@ + IBClasses + + + CLASS + NSObject + LANGUAGE + ObjC + OUTLETS + + window + id + + + + CLASS + AppController + LANGUAGE + ObjC + OUTLETS + + secondWindow + id + view + id + window + id + + + IBVersion 1 diff --git a/Tools/NibApp/HelloWorld.nib/info.nib b/Tools/NibApp/HelloWorld.nib/info.nib index 2511941ff..b8f7650f5 100644 --- a/Tools/NibApp/HelloWorld.nib/info.nib +++ b/Tools/NibApp/HelloWorld.nib/info.nib @@ -7,11 +7,9 @@ IBOldestOS 5 IBOpenObjects - - 1 - + IBSystem Version - 9E17 + 9F33 targetFramework IBCocoaFramework diff --git a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib index f3853becd952bf6e4288ba57571d3e032bc00511..3ad8add67f8afcdbeae4c98d4699dbea7bfd30f6 100644 GIT binary patch literal 4015 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 GH~$BCC!-Jm literal 11532 zcmeHNZByem5dI9m!p$(#b_Q_lm;jwzZXh9T=D5HR;HDpqqjK&UD`zX@D8qlRCN=`6eMd`yV`yB(b}E&-<~|}83mz>{dW!Hu-VX%@8F5+KfY_+-3|^;8t=Qi zouB$wz1u&pFSM!WhD5u*JHH(Ew8nw1pG~J8()IprU%S2>j&C(8L)R}x4XyE+km+x_ zKA+DIZT8fmgP+)gp?)3UDGJETB^7o+7aUH=q(Rlh(sSFPqZ8L5-QAte7xdEIvjgX| zOP}cI>|Z(>l7McuI~spLFKBYcr<3t?9e(&5IV9xE>>#k&dM;qkpLt$K=gW3dz4Vbt zv*XzzUrz^QpUS$idASMDUFj#E>0yt1l$+nXUZWhXLaJ$61w*_zg}3e;_ANdqA{dzy?& zPLi51z&`nC`!)^BEK-+`ctuf+MRykv=8w}Qz|Il^9+o+{3&%o|_{ukvxoO6zp4$naWEYcChn zn}q~F6~)14N@hEHCJlJi&)Y85QZ#LN-op;I0fKITibyN=AW#==J)%mSxRgeg z+~*%>#HLX{Ml`81>!8OMOw~V(a`oUScz%PERf%Y6o!^R^<t6a`eKWWdqJ` zNvlMaw^>Zn;Nz!Gf3w0{fc1>Z8$!i^Tz)k{0_dp=66ydH1h8rYez!JS6pYFe3QXZJ z%Wk2rV-rf8VZdicTQi|eX-3zofTor46c=qt@A~mjKi2RrrqSS!#j5ZXQd=7~GI=ffg9 zwv@$eu4f^Q_cdaw5S`mYFjE>Jk43cw6W&@r%PYn^{7+ftQq(dRgm|Ba(i&q0P3kw(0dnR{l3`7svs0 z`$`)UC;&}9Kr^z}CfR5yynXLk(-N)}(8`tE)e^|8x*&n|s|ynP22fCW0w$F!#&b=q zDk*UuxE}gB)UM_}Yc3{hD5*^6tGc(zlQ($gPqZ8QO^g;3673g2#edC7=ny0sOnAE=qZH%(=BJuJ|g?8TY2F27sr3IuCiIBqS#@p9DU zt*zV}G|mC@8{@+VdCU2D-m}@E)I>mOud3<|zz+aqFO}nVNgW@_@6p5a_)^oii4Ch@ zR$0?;$a1qFDC2$ZMW41-eZo?uh4Z*fUL0}+PtyX&qcNHpo+tj8L>p! 1050 - 9E17 + 9F33 629 - 949.33 + 949.34 352.00 YES + YES - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES - NSObject + NSObject FirstResponder @@ -41,7 +42,7 @@ -2080244224 134217728 Round Rect Button - + LucidaGrande 1.200000e+01 16 @@ -88,10 +89,119 @@ NSView + + 15 + 2 + {{196, 240}, {480, 270}} + 603979776 + Window + NSWindow + + + + 256 + + YES + + + 268 + {{145, 113}, {154, 19}} + + + YES + + -2080244224 + 134217728 + yikes! + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{0, 251}, {154, 19}} + + + YES + + -2080244224 + 134217728 + Round Rect Button + + + -2038152961 + 164 + + + 400 + 75 + + + + {480, 270} + + + + {{0, 0}, {1680, 1028}} + + + 15 + 2 + {{196, 240}, {480, 270}} + 603979776 + + + + + + 256 + {480, 270} + + {{0, 0}, {1680, 1028}} + YES + + + view + + + + 20 + + + + window + + + + 21 + + + + orderFront: + + + + 22 + + + + orderOut: + + + + 24 + @@ -160,6 +270,67 @@ + + 12 + + + YES + + + + + + 13 + + + YES + + + + + + + 14 + + + YES + + + + + + 15 + + + + + 16 + + + YES + + + + + + 17 + + + + + 25 + + + YES + + + + + + 26 + + + @@ -174,20 +345,44 @@ 1.editorWindowContentRectSynchronizationRect 10.IBPluginDependency 11.IBPluginDependency + 12.IBPluginDependency + 12.IBWindowTemplateEditedContentRect + 12.NSWindowTemplate.visibleAtLaunch + 12.editorWindowContentRectSynchronizationRect + 13.IBPluginDependency + 14.IBPluginDependency + 14.NSWindowTemplate.visibleAtLaunch + 15.IBPluginDependency + 16.IBPluginDependency + 17.IBPluginDependency + 25.IBPluginDependency + 26.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES - - - - + + + + {628, 654} {{319, 416}, {480, 272}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + {{196, 240}, {480, 270}} + + {{196, 240}, {480, 270}} + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + @@ -211,11 +406,41 @@ - 11 + 26 YES + + + + + YES + + YES + + + YES + + + + YES + + YES + + + + + YES + id + + + + + IBUserSource + + + 0 @@ -223,57 +448,90 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxA/AAsADAAxADUANgA7ADwA -QABEAEcASwBUAGwAbQB1AHYAeQCJAIoAjgCYAAsAmQCfALMAtgC3AL8AwgDHAMgAywALAJ0AzADPANIA -0wDVAN4A6ADyAPMA9AD1APYA9wD4APkA/AD/AQkBEwEUARUBFgCrARcBGAEZARwBHwEiVSRudWxs3xAS -AA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAq -ACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18Q -GU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1l -d29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0 -eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1 -ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKAPoAKgDGA -PYAIgCeABYAwgDKAKIA7gACABoAmgDwQDYAz0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hOU09iamVj -dNIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJQkNvY29h -RnJhbWV3b3Jr0gAOAD0APgA/Wk5TLm9iamVjdHOAB6DSADcAOABBAEKjAEIAQwA1XE5TTXV0YWJsZVNl -dFVOU1NldNIADgA9AEUARoAJoNIANwA4AEgASaMASQBKADVeTlNNdXRhYmxlQXJyYXlXTlNBcnJhedIA -DgA9AEwATYAlpgBOAE8AUABRAFIAU4ALgBCAF4ATgBqAI9wAVQAOAFYAVwBYAFkAWgBbAFwAXQBeAF8A -YABhAGIAYwBkAGIAZgBnAE8AaQBqAGtbTlNDZWxsRmxhZ3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxAS -TlNQZXJpb2RpY0ludGVydmFsXk5TQnV0dG9uRmxhZ3MyXxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVu -dHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdfEA9OU1BlcmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5T -QnV0dG9uRmxhZ3MT/////4QB/gCAEoAREEsQpIARgAyADYAQEQGQEggAAAAT/////4aEQP9fEBFSb3Vu -ZCBSZWN0IEJ1dHRvbtQADgBuAG8AcABxAHIAcwB0Vk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3OADyNAKAAA -AAAAAIAOEBBcTHVjaWRhR3JhbmRl0gA3ADgAdwB4ogB4ADVWTlNGb2502AB6AA4AewB8AH0AfgB/AIAA -UQCCAIMATgCFAIYAhwBRXxAPTlNOZXh0UmVzcG9uZGVyV05TRnJhbWVWTlNDZWxsWE5TdkZsYWdzWU5T -RW5hYmxlZFhOU1dpbmRvd1tOU1N1cGVydmlld4ATgBaAFIALEQEMCYAVgBNQ0gA3ADgAiwCMpACMAI0A -fAA1XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzYAHoADgCPAH0AkAB/ADIAgACHAJIAkwCFAJQAhwCW -AJdaTlNTdWJ2aWV3c1tOU0ZyYW1lU2l6ZYAVgCKAHIAfgBWAIYAgXxAXe3sxNTcsIDExMH0sIHsxNTQs -IDE5fX3SADcAOACaAJulAJsAnACdAJ4ANVhOU0J1dHRvbllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9u -ZGVy3gCgAFUADgChAKIAWgBbAFwAowCkAF4ApQCmAKcAqABgAKkAqgCrAGIArQBSAK8AsACqALEAsACx -V05TVmFsdWVfEBNOU051bWJlck9mVGlja01hcmtzXxASTlNUaWNrTWFya1Bvc2l0aW9uWk5TTWF4VmFs -dWVaTlNNaW5WYWx1ZVpOU1ZlcnRpY2FsXU5TQWx0SW5jVmFsdWVfEBpOU0FsbG93c1RpY2tNYXJrVmFs -dWVzT25seSNASQAAAAAAAIAbEAAQAYARgBiAGiNAWQAAAAAAACMAAAAAAAAAAAgI1AAOAG4AbwBwAHEA -cgC1AHSAD4AZWUhlbHZldGljYdgAegAOAHsAfAB9AH4AfwCAAFEAuQC6AFAAhQCGAIcAUYATgB6AHYAX -CYAVgBPSADcAOADAAMGkAMEAjQB8ADVcTlNTbGlkZXJDZWxs0gAOAD0ARQDEgAmiAE8AUoAQgBpfEBZ7 -ezM1OSwgMTA4fSwgezk2LCAyMX190gA3ADgAyQDKpQDKAJwAnQCeADVYTlNTbGlkZXJaezQ4MCwgMjcy -fdIANwA4AM0AzqQAzgCdAJ4ANVxOU0N1c3RvbVZpZXfSAA4AMgAzANGABIAkXU5TQXBwbGljYXRpb27S -ADcAOADUAEqiAEoANdIADgA9AEwA14AlpgBPAFEAUgAfAFEAH4AQgBOAGoACgBOAAtIADgA9AEwA4IAl -pwBQAB8ATgBPAFEAUgBTgBeAAoALgBCAE4AagCPSAA4APQBMAOqAJacA6wDsAO0A7gDvAPAA8YApgCqA -K4AsgC2ALoAvW1NsaWRlciBDZWxsXEZpbGUncyBPd25lcl8QH0J1dHRvbiBDZWxsIChSb3VuZCBSZWN0 -IEJ1dHRvbilfECVSb3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24pW0N1c3RvbSBWaWV3 -XxARSG9yaXpvbnRhbCBTbGlkZXJbQXBwbGljYXRpb27SAA4APQBMAPuAJaDSAA4APQBMAP6AJaDSAA4A -PQBMAQGAJacAUAAfAE4ATwBRAFIAU4AXgAKAC4AQgBOAGoAj0gAOAD0ATAELgCWnAQwBDQEOAQ8BEAER -ARKANIA1gDaAN4A4gDmAOhALEAwQCRAIEAoT//////////3SAA4APQBFARuACaDSAA4APQBMAR6AJaDS -AA4APQBMASGAJaDSADcAOAEjASSiASQANV5OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBU -AGYA5wDtATgBPwFGAVQBZgGCAZABnAGoAbYBwQHPAesB+QIMAh4COAJCAk8CUQJTAlUCVwJZAlsCXQJf -AmECYwJlAmcCaQJrAm0CbwJxAnMCfAKIAooCjAKVAp4CpwKyArcCxgLZAuIC7QLvAvAC+QMAAw0DEwMc -Ax4DHwMoAy8DPgNGA08DUQNeA2ADYgNkA2YDaANqA5sDpwO9A9ID4QPzA/4ECAQWBCgENQRDBEwETgRQ -BFIEVARWBFgEWgRcBF8EZARtBIEEkgSZBKAEqQSrBLQEtgS4BMUEzgTTBNoE+wUNBRUFHAUlBS8FOAVE -BUYFSAVKBUwFTwVQBVIFVAVVBV4FZwV0BYEFogWtBbkFuwW9Bb8FwQXDBcUFxwXhBeoF9QX+BggGDwYb -BlQGXAZyBocGkgadBqgGtgbTBtwG3gbgBuIG5AbmBugG8Qb6BvsG/AcNBw8HEQcbBzwHPgdAB0IHRAdF -B0cHSQdSB1sHaAdxB3MHeAd6B3wHlQeeB6kHsge9B8YHzwfcB+UH5wfpB/cIAAgFCA4IEAgdCB8IIQgj -CCUIJwgpCDIINAhDCEUIRwhJCEsITQhPCFEIWghcCGsIbQhvCHEIcwh1CHcIeQiFCJIItAjcCOgI/AkI -CREJEwkUCR0JHwkgCSkJKwk6CTwJPglACUIJRAlGCUgJUQlTCWIJZAlmCWgJaglsCW4JcAlyCXQJdgl4 -CXoJgwmMCY4JjwmYCZoJmwmkCaYJpwmwCbUAAAAAAAACAgAAAAAAAAElAAAAAAAAAAAAAAAAAAAJxA +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxB2AAsADAAxADUANgA7ADwA +QgBWAFcAWABZAGEAYgBmAGcAagBWAHIACwB7AIAAjACNAKUApgCuAK8AsgCzALcAuwDDAMQAywDMAGEA +CwBmANAA1ADbAOMA5ADoAO0ACwD1APoBAgEDAMsBCgESARMBJwEqASsBLgExAAsAZAEyATUBNgE7ATwB +PwFEAUUBVgFZAVoBXAFtAX8BkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGjAaYBvAHSAdMB +1AEfAdUB1gHXAdgB2QHaAdsB3ACtAd0B3gBUAd8B4AHhAeIB5QHoAetVJG51bGzfEBIADQAOAA8AEAAR +ABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAv +ADBWTlNSb290ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3Np +YmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xh +c3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9y +c11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNj +ZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoB1gEWAXIB0gCiASoAFgFuA +XYBLgHKAAIAGgEmAcxAcgF7SAA4AMgAzADRbTlNDbGFzc05hbWWABIADWE5TT2JqZWN00gA3ADgAOQA6 +WCRjbGFzc2VzWiRjbGFzc25hbWWiADoANV5OU0N1c3RvbU9iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvS +AA4APQA+AD9aTlMub2JqZWN0c4AnogBAAEGAB4AQ2gBDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8A +UABRAFIAUwBUACtcTlNXaW5kb3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFn +c11OU1dpbmRvd0NsYXNzXE5TV2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5 +bGVNYXNrW05TVmlld0NsYXNzgAuAD4AOgAkSJAAAAIAKgAgQAhAPgABfEBh7ezE5NiwgMjQwfSwgezQ4 +MCwgMjcwfX1WV2luZG93WE5TV2luZG931ABaAA4AWwBcACsAXgBfAGBfEA9OU05leHRSZXNwb25kZXJY +TlN2RmxhZ3NbTlNGcmFtZVNpemWAAIANEQEAgAxaezQ4MCwgMjcwfdIANwA4AGMAZKMAZABlADVWTlNW +aWV3W05TUmVzcG9uZGVyXxAWe3swLCAwfSwgezE2ODAsIDEwMjh9fdIANwA4AGgAaaIAaQA1XxAQTlNX +aW5kb3dUZW1wbGF0ZdoAQwAOAEQARQBGAEcASABJAEoASwBrAE0AbQBPAFAAUQBwAFMAVAArgBKAD4Am +gAmACoARgADXAFoADgBzAFsAXABYAHQAdQBeAHcAXwB4AHUAelpOU1N1YnZpZXdzW05TU3VwZXJ2aWV3 +gBOADYAUgCSAE4Al0gAOAD0AfAB9gCOiAH4Af4AVgB/YAFoADgCBAIIAWwCDAFgAdABrAIUAhgCHAIgA +iQB1AGtXTlNGcmFtZVZOU0NlbGxZTlNFbmFibGVkgBKAHoAWgBcRAQwJgBOAEl8QF3t7MTQ1LCAxMTN9 +LCB7MTU0LCAxOX193ACOAA4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AmwCfAKAAfgCiAKMA +pFtOU0NlbGxGbGFnc18QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNC +dXR0b25GbGFnczJfEA9OU0tleUVxdWl2YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9s +Vmlld18QD05TUGVyaW9kaWNEZWxheVxOU0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxP/////hAH+AIAd +gBwQSxCkgByAGIAZgBURAZASCAAAABP/////hoRA/1Z5aWtlcyHUAA4ApwCoAKkAqgCrAKwArVZOU1Np +emVWTlNOYW1lWE5TZkZsYWdzgBsjQCgAAAAAAACAGhAQXEx1Y2lkYUdyYW5kZdIANwA4ALAAsaIAsQA1 +Vk5TRm9udFDSADcAOAC0ALWkALUAtgCCADVcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbNIANwA4ALgA +uaUAuQC6AGQAZQA1WE5TQnV0dG9uWU5TQ29udHJvbNgAWgAOAIEAggBbAIMAWAB0AGsAhQC+AL8AiACJ +AHUAa4ASgB6AIIAhCYATgBJfEBV7ezAsIDI1MX0sIHsxNTQsIDE5fX3cAI4ADgCPAJAAkQCSAJMAlACV +AJYAlwCYAJkAmgCbAJwAnQCbAMgAoAB/AKIAowCkgB2AHIAcgCKAGYAfXxARUm91bmQgUmVjdCBCdXR0 +b27SADcAOADNAM6jAM4AzwA1Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnSADcAOADRANKjANIA0wA1XE5T +TXV0YWJsZVNldFVOU1NldNIADgA9AHwA1oAjpADXANgA2QDagCmALIBAgEPUAA4A3ADdAN4A3wBBAB8A +4l1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAK4AQgAKAKlZ3aW5kb3fSADcAOADlAOajAOYA +5wA1XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4A3ADdAN4A3wDqAB8A7IAr +gC2AAoA/2ABaAA4AcwBbAFwAWAAyAHQA7gDvAPAAiADxAO4A8wD0gC6APoAvgDuALoA9gDzSAA4APQB8 +APeAI6IA+AD5gDCANNgAWgAOAIEAggBbAIMAWAB0AOoAhQD9AP4AiACJAO4A6oAtgB6AMYAyCYAugC1f +EBd7ezE1NywgMTEwfSwgezE1NCwgMTl9fdwAjgAOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACd +AJsBBwCgAPgAogCjAKSAHYAcgByAM4AZgDDYAFoADgCBAIIAWwCDAFgAdADqAQwBDQEOAIgAiQDuAOqA +LYA6gDWANgmALoAtXxAWe3szNTksIDEwOH0sIHs5NiwgMjF9fd4BFACOAA4BFQEWAJMAlACVARcBGACX +ARkBGgEbARwAmQEdAR4BHwCbASEA+QEjASQBHgElASQBJVdOU1ZhbHVlXxATTlNOdW1iZXJPZlRpY2tN +YXJrc18QEk5TVGlja01hcmtQb3NpdGlvblpOU01heFZhbHVlWk5TTWluVmFsdWVaTlNWZXJ0aWNhbF1O +U0FsdEluY1ZhbHVlXxAaTlNBbGxvd3NUaWNrTWFya1ZhbHVlc09ubHkjQEkAAAAAAACAORAAEAGAHIA3 +gDQjQFkAAAAAAAAjAAAAAAAAAAAICNQADgCnAKgAqQCqAKsBKQCtgBuAOFlIZWx2ZXRpY2HSADcAOAEs +AS2kAS0AtgCCADVcTlNTbGlkZXJDZWxs0gA3ADgBLwEwpQEwALoAZABlADVYTlNTbGlkZXJaezQ4MCwg +MjcyfdIANwA4ATMBNKQBNABkAGUANVxOU0N1c3RvbVZpZXdUdmlld9QADgDcAN0A3gE3AEEAfgE6gEKA +EIAVgEFZb3JkZXJPdXQ60gA3ADgBPQE+owE+AOcANV8QFU5TTmliQ29udHJvbENvbm5lY3RvctQADgDc +AN0A3gE3AEEA+AFDgEKAEIAwgERbb3JkZXJGcm9udDrSAA4APQFGAUeASK4A+QEOAOoAawCHAL8BTgD+ +AH8AfgBAAEEATAD4gDSANoAtgBKAF4AhgEaAMoAfgBWAB4AQgAuAMNIADgAyADMBWIAEgEddTlNBcHBs +aWNhdGlvbtIANwA4AVsAz6IAzwA10gAOAD0BRgFegEiuAOoA+QAfAEEAfgB/AB8A+ABrAGsAHwAfAEAA +6oAtgDSAAoAQgBWAH4ACgDCAEoASgAKAAoAHgC3SAA4APQFGAW+ASK8QDwD5AGsA6gEOAIcAvwFOAP4A +fwBAAEwAQQB+AB8A+IA0gBKALYA2gBeAIYBGgDKAH4AHgAuAEIAVgAKAMNIADgA9AUYBgYBIrxAPAYIB +gwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQgEyATYBOgE+AUIBRgFKAU4BUgFWAVoBXgFiAWYBaXxAR +SG9yaXpvbnRhbCBTbGlkZXJcQ29udGVudCBWaWV3W0N1c3RvbSBWaWV3W1NsaWRlciBDZWxsXxAUQnV0 +dG9uIENlbGwgKHlpa2VzISlfECFCdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pLTFbQXBwbGlj +YXRpb25fEB9CdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pXxAnUm91bmQgUmVjdCBCdXR0b24g +KFJvdW5kIFJlY3QgQnV0dG9uKS0xXxARV2luZG93IChXaW5kb3cpLTFeQ29udGVudCBWaWV3LTFfEA9X +aW5kb3cgKFdpbmRvdylfEBpSb3VuZCBSZWN0IEJ1dHRvbiAoeWlrZXMhKVxGaWxlJ3MgT3duZXJfECVS +b3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24p0gAOAD0BRgGigEig0gAOAD0BRgGlgEig +0gAOAD0BRgGogEivEBMA2AD5AQ4A6gBrAIcAvwFOANkA2gD+AH8AfgBAAEEATADXAB8A+IAsgDSANoAt +gBKAF4AhgEaAQIBDgDKAH4AVgAeAEIALgCmAAoAw0gAOAD0BRgG+gEivEBMBvwHAAcEBwgHDAcQBxQHG +AccByAHJAcoBywHMAc0BzgHPAdAB0YBfgGCAYYBigGOAZIBlgGaAZ4BogGmAaoBrgGyAbYBugG+AcIBx +EBQQChALEA0QERAaE//////////9EBgQFhAJEBkQDhAMEBUQGxAI0gAOAD0AfAHkgCOg0gAOAD0BRgHn +gEig0gAOAD0BRgHqgEig0gA3ADgB7AHtogHtADVeTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBE +AFIAVABmAVUBWwGmAa0BtAHCAdQB8AH+AgoCFgIkAi8CPQJZAmcCegKMAqYCsAK9Ar8CwQLDAsUCxwLJ +AssCzQLPAtEC0wLVAtcC2QLbAt0C3wLhAuoC9gL4AvoDAwMMAxUDIAMlAzQDRwNQA1sDXQNiA2QDZgOP +A5wDqQO3A8EDzwPcA+4EAgQOBBAEEgQUBBYEGwQdBB8EIQQjBCUEQARHBFAEYQRzBHwEiASKBIwEjwSR +BJwEpQSsBLMEvwTYBOEE5gT5BSIFJAUmBSgFKgUsBS4FMAVNBVgFZAVmBWgFagVsBW4FcAV5BXsFgAWC +BYQFpQWtBbQFvgXABcIFxAXGBckFygXMBc4F6AYZBiUGOwZQBl8GcQZ8BoYGlAamBrMGwQbKBswGzgbQ +BtIG1AbWBtgG2gbdBuIG6wbyBwMHCgcRBxoHHAclBycHKQc2Bz8HRAdLB0wHVQdeB2sHeAeBB4wHlQef +B8AHwgfEB8YHyAfJB8sHzQflCBYIGAgaCBwIHgggCCIINgg/CEYIVQhdCGYIbQh6CIAIiQiLCJQIlgiY +CJoInAitCLsIxAjMCM4I0AjSCNQI2wjkCOsJAgkRCSIJJAkmCSgJKglLCU0JTwlRCVMJVQlXCVkJYglk +CWkJawltCY4JkAmSCZQJlgmXCZkJmwm1CeYJ6AnqCewJ7gnwCfIKEwoVChcKGQobChwKHgogCjkKcgp6 +CpAKpQqwCrsKxgrUCvEK+gr8Cv4LAAsCCwQLBgsPCxgLGQsaCysLLQsvCzkLQgtLC1gLYQtsC3ULgAuJ +C5ILnwukC7ULtwu5C7sLvQvHC9AL1wvvDAAMAgwEDAYMCAwUDB0MHww8DD4MQAxCDEQMRgxIDEoMTAxO +DFAMUgxUDFYMWAxhDGMMZQxzDHwMgQyKDIwMqQyrDK0MrwyxDLMMtQy3DLkMuwy9DL8MwQzDDMUMzgzQ +DPEM8wz1DPcM+Qz7DP0M/w0BDQMNBQ0HDQkNCw0NDQ8NGA0aDTsNPQ0/DUENQw1FDUcNSQ1LDU0NTw1R +DVMNVQ1XDVkNbQ16DYYNkg2pDc0N2Q37DiUOOQ5IDloOdw6EDqwOtQ63DrgOwQ7DDsQOzQ7PDvgO+g78 +Dv4PAA8CDwQPBg8IDwoPDA8ODxAPEg8UDxYPGA8aDxwPHg8nDykPUg9UD1YPWA9aD1wPXg9gD2IPZA9m +D2gPag9sD24PcA9yD3QPdg94D3oPfA9+D4APgg+ED40Pjw+RD5MPlQ+XD5kPmw+dD58PqA+qD6sPtA+2 +D7cPwA/CD8MPzA/RAAAAAAAAAgIAAAAAAAAB7gAAAAAAAAAAAAAAAAAAD+A diff --git a/Tools/NibApp/main.j b/Tools/NibApp/main.j index 4bbfb1618..9f3ebc983 100755 --- a/Tools/NibApp/main.j +++ b/Tools/NibApp/main.j @@ -12,6 +12,8 @@ import import "AppController.j" +CPLogRegister(CPLogPopup); + function main(args, namedArgs) { CPApplicationMain(args, namedArgs); diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index f11e4b92d..e307708da 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -23,9 +23,23 @@ import "NSButton.j" import "NSCell.j" import "NSControl.j" +import "NSCustomObject.j" import "NSCustomView.j" import "NSFont.j" import "NSIBObjectData.j" +import "NSNibConnector.j" import "NSResponder.j" import "NSSlider.j" import "NSView.j" +import "NSWindowTemplate.j" + +function CP_NSMapClassName(aClassName) +{ + if (aClassName == @"NSView") + return "CPView"; + + if (aClassName == @"NSWindow") + return @"CPWindow"; + + return aClassName; +} diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index 9b0b40d1d..60e408042 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -45,6 +45,9 @@ import "NSControl.j" [self setBezelStyle:[cell bezelStyle]]; [self setBordered:[cell isBordered]]; + + // FIXME + _sendActionOn = CPLeftMouseUpMask; } return self; diff --git a/Tools/nib2cib/NSCustomObject.j b/Tools/nib2cib/NSCustomObject.j new file mode 100644 index 000000000..62891fdb3 --- /dev/null +++ b/Tools/nib2cib/NSCustomObject.j @@ -0,0 +1,40 @@ + +import + + +@implementation _CPCibCustomObject (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self){ + _className = [aCoder decodeObjectForKey:@"NSClassName"]; + print(":::"+_className); + } + return self; +} + +@end + +@implementation NSCustomObject : _CPCibCustomObject +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{print("i-nit form coder"); + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibCustomObject class]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + print("awaking from coder..."); + return self; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSCustomView.j b/Tools/nib2cib/NSCustomView.j index 9b114bf53..6a1362497 100644 --- a/Tools/nib2cib/NSCustomView.j +++ b/Tools/nib2cib/NSCustomView.j @@ -25,6 +25,8 @@ import import "NSView.j" +var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; + @implementation NSCustomView : CPView { CPString _className; @@ -44,20 +46,13 @@ import "NSView.j" { [super encodeWithCoder:aCoder]; - [aCoder encodeObject:_NSCustomViewMapClassName(_className) forKey:@"CPCustomViewClassNameKey"]; + [aCoder encodeObject:CP_NSMapClassName(_className) forKey:_CPCibCustomViewClassNameKey]; } - (CPString)classForKeyedArchiver { - return [CPCustomView class]; + return [_CPCibCustomView class]; } @end -function _NSCustomViewMapClassName(aClassName) -{ - if (aClassName == @"NSView") - return "CPView"; - - return aClassName; -} diff --git a/Tools/nib2cib/NSIBObjectData.j b/Tools/nib2cib/NSIBObjectData.j index fa7cd2576..594e8ff79 100644 --- a/Tools/nib2cib/NSIBObjectData.j +++ b/Tools/nib2cib/NSIBObjectData.j @@ -73,9 +73,9 @@ import //_accessibilityConnectors = [aCoder decodeObjectForKey:@"NSAccessibilityConnectors"]; //_accessibilityOidsKeys = [aCoder decodeObjectForKey:@"NSAccessibilityOidsKeys"]; //_accessibilityOidsValues = [aCoder decodeObjectForKey:@"NSAccessibilityOidsValues"]; - - _classesKeys = [aCoder decodeObjectForKey:@"NSClassesKeys"]; - _classesValues = [aCoder decodeObjectForKey:@"NSClassesValues"]; + + _classesKeys = [aCoder decodeObjectForKey:@"NSClassesKeys"];print("d"); + _classesValues = [aCoder decodeObjectForKey:@"NSClassesValues"];print("e"); _connections = [aCoder decodeObjectForKey:@"NSConnections"]; @@ -90,7 +90,7 @@ import _oidKeys = [aCoder decodeObjectForKey:@"NSOidsKeys"]; _oidValues = [aCoder decodeObjectForKey:@"NSOidsValues"]; - _rootObject = [aCoder decodeObjectForKey:@"NSRoot"]; + _fileOwner = [aCoder decodeObjectForKey:@"NSRoot"]; _visibleWindows = [aCoder decodeObjectForKey:@"NSVisibleWindows"]; } diff --git a/Tools/nib2cib/NSNibConnector.j b/Tools/nib2cib/NSNibConnector.j new file mode 100644 index 000000000..f3dae5301 --- /dev/null +++ b/Tools/nib2cib/NSNibConnector.j @@ -0,0 +1,72 @@ + +import + + +@implementation _CPCibConnector (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _source = [aCoder decodeObjectForKey:@"NSSource"]; + _destination = [aCoder decodeObjectForKey:@"NSDestination"]; + _label = [aCoder decodeObjectForKey:@"NSLabel"]; +#if DEBUG + CPLog(@"Connection: " + [_source description] + " " + [_destination description] + " " + _label); +#endif + } + + return self; +} + +@end + +@implementation NSNibConnector : _CPCibConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibConnector class]; +} + +@end + +@implementation NSNibControlConnector : _CPCibControlConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibControlConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibControlConnector class]; +} + +@end + +@implementation NSNibOutletConnector : _CPCibOutletConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibOutletConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibOutletConnector class]; +} + +@end diff --git a/Tools/nib2cib/NSWindowTemplate.j b/Tools/nib2cib/NSWindowTemplate.j new file mode 100644 index 000000000..a87338805 --- /dev/null +++ b/Tools/nib2cib/NSWindowTemplate.j @@ -0,0 +1,59 @@ + +import + + +@implementation _CPCibWindowTemplate (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _minSize = [aCoder decodeSizeForKey:@"NSMinSize"]; + _maxSize = [aCoder decodeSizeForKey:@"NSMaxSize"]; + _screenRect = [aCoder decodeRectForKey:@"NSScreenRect"]; // screen created on + _viewClass = [aCoder decodeObjectForKey:@"NSViewClass"]; + _wtFlags = [aCoder decodeIntForKey:@"NSWTFlags"]; + _windowBacking = [aCoder decodeIntForKey:@"NSWindowBacking"]; + + // Convert NSWindows to CPWindows. + _windowClass = CP_NSMapClassName([aCoder decodeObjectForKey:@"NSWindowClass"]); + + _windowRect = [aCoder decodeRectForKey:@"NSWindowRect"]; + _windowStyleMask = [aCoder decodeIntForKey:@"NSWindowStyleMask"]; + _windowTitle = [aCoder decodeObjectForKey:@"NSWindowTitle"]; + _windowView = [aCoder decodeObjectForKey:@"NSWindowView"]; + + /* + _windowRect.origin.y -= _screenRect.size.height - [[NSScreen mainScreen] frame].size.height; + if (![_windowClass isEqualToString:@"NSPanel"]) + _windowRect.origin.y -= [NSMainMenuView menuHeight]; // compensation for the additional menu bar + */ + } + + return self; +} + +@end + +@implementation NSWindowTemplate : _CPCibWindowTemplate +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + return self; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibWindowTemplate class]; +} + +@end