From d0ecdaea115b42d88366d3fc142161d341a7526f Mon Sep 17 00:00:00 2001 From: gcasa Date: Sun, 9 Jul 2006 14:54:51 +0000 Subject: [PATCH] GSNibContainer version 2 changes. New method declarations for customClasses, visibleWindows and deferredWindows. Changes to init, initWithCoder: and encodeWithCoder: to handle the new data. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@23150 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 12 ++ Headers/Additions/GNUstepGUI/GSNibTemplates.h | 8 +- Source/GSNibTemplates.m | 146 +++++++++++++----- Source/NSView.m | 12 +- 4 files changed, 135 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc641cd45..5be6c4d09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-07-09 10:50 Gregory John Casamento + + * Headers/Additions/GNUstepGUI/GSNibTemplates.h: Declaration for + new methods: visibleWindows, deferredWindows, & customClasses. + * Source/GSNibTemplates.m: Simplification of awakeFromContext: code + due to new gorm format changes. Also, changes to init to initialize + the new ivars, dealloc to release them and modifications to + initWithCoder: and encodeWithCoder: to decode and encode the new + data. Added new methods: visibleWindows, deferredWindows, & + customClasses. + * Source/NSView.m: Minor cleanup. + 2006-07-06 21:35 Gregory John Casamento * Source/NSBrowser.m: diff --git a/Headers/Additions/GNUstepGUI/GSNibTemplates.h b/Headers/Additions/GNUstepGUI/GSNibTemplates.h index 8e68a3687..dc20badc5 100644 --- a/Headers/Additions/GNUstepGUI/GSNibTemplates.h +++ b/Headers/Additions/GNUstepGUI/GSNibTemplates.h @@ -36,7 +36,7 @@ #include "GNUstepGUI/GSNibContainer.h" // version of the nib container and the templates. -#define GNUSTEP_NIB_VERSION 1 +#define GNUSTEP_NIB_VERSION 2 #define GSSWAPPER_VERSION 0 #define GSWINDOWT_VERSION 1 #define GSVIEWT_VERSION 0 @@ -67,9 +67,15 @@ enum { { NSMutableDictionary *nameTable; NSMutableArray *connections; + NSMutableArray *visibleWindows; + NSMutableArray *deferredWindows; NSMutableSet *topLevelObjects; + NSMutableDictionary *customClasses; BOOL isAwake; } +- (NSMutableArray*) visibleWindows; +- (NSMutableArray*) deferredWindows; +- (NSMutableDictionary *) customClasses; @end /* diff --git a/Source/GSNibTemplates.m b/Source/GSNibTemplates.m index 155a0ebf2..855146c66 100644 --- a/Source/GSNibTemplates.m +++ b/Source/GSNibTemplates.m @@ -158,7 +158,6 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN NSEnumerator *enumerator; NSNibConnector *connection; NSString *key; - NSArray *visible; NSMenu *menu; NSMutableArray *topObjects; id obj; @@ -248,12 +247,10 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN if ([context objectForKey: key] == nil || [key isEqualToString: @"NSOwner"]) // we want to send the message to the owner { - if ([key isEqualToString: @"NSWindowsMenu"] == NO && // we don't want to send a message to these menus twice, - [key isEqualToString: @"NSServicesMenu"] == NO && // if they're custom classes. - [key isEqualToString: @"NSVisible"] == NO && // also exclude any other special parts of the nameTable. - [key isEqualToString: @"NSDeferred"] == NO && - [key isEqualToString: @"NSTopLevelObjects"] == NO && - [key isEqualToString: @"GSCustomClassMap"] == NO) + // we don't want to send a message to these menus twice, if they're custom classes. + if ([key isEqualToString: @"NSWindowsMenu"] == NO && + [key isEqualToString: @"NSServicesMenu"] == NO && + [key isEqualToString: @"NSTopLevelObjects"] == NO) { id o = [nameTable objectForKey: key]; @@ -305,15 +302,12 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN * This is the last thing we should do since changes might be made * in the awakeFromNib methods which are called on all of the objects. */ - visible = [nameTable objectForKey: @"NSVisible"]; - if (visible != nil - && [visible isKindOfClass: [NSArray class]] == YES) + if (visibleWindows != nil) { - unsigned pos = [visible count]; - + unsigned pos = [visibleWindows count]; while (pos-- > 0) { - NSWindow *win = [visible objectAtIndex: pos]; + NSWindow *win = [visibleWindows objectAtIndex: pos]; if ([NSApp isActive]) [win orderFront: self]; else @@ -336,26 +330,12 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN RELEASE(nameTable); RELEASE(connections); RELEASE(topLevelObjects); + RELEASE(visibleWindows); + RELEASE(deferredWindows); + RELEASE(customClasses); [super dealloc]; } -- (void) encodeWithCoder: (NSCoder*)aCoder -{ - int version = [GSNibContainer version]; - if (version == GNUSTEP_NIB_VERSION) - { - [aCoder encodeObject: nameTable]; - [aCoder encodeObject: connections]; - [aCoder encodeObject: topLevelObjects]; - } - else - { - // encode it as a version 0 file... - [aCoder encodeObject: nameTable]; - [aCoder encodeObject: connections]; - } -} - - (id) init { if ((self = [super init]) != nil) @@ -363,28 +343,89 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN nameTable = [[NSMutableDictionary alloc] initWithCapacity: 8]; connections = [[NSMutableArray alloc] initWithCapacity: 8]; topLevelObjects = [[NSMutableSet alloc] initWithCapacity: 8]; - - // add special objects... - [nameTable setObject: [NSMutableDictionary dictionary] - forKey: @"GSCustomClassMap"]; - [nameTable setObject: [NSMutableArray array] - forKey: @"NSDeferred"]; - [nameTable setObject: [NSMutableArray array] - forKey: @"NSVisible"]; + customClasses = [[NSMutableDictionary alloc] initWithCapacity: 8]; + deferredWindows = [[NSMutableArray alloc] initWithCapacity: 8]; + visibleWindows = [[NSMutableArray alloc] initWithCapacity: 8]; } return self; } +- (void) encodeWithCoder: (NSCoder*)aCoder +{ + int version = [GSNibContainer version]; + if (version == GNUSTEP_NIB_VERSION) + { + [aCoder encodeObject: topLevelObjects]; + [aCoder encodeObject: visibleWindows]; + [aCoder encodeObject: deferredWindows]; + [aCoder encodeObject: nameTable]; + [aCoder encodeObject: connections]; + [aCoder encodeObject: customClasses]; + } + else if (version == 1) + { + NSMutableDictionary *nt = [NSMutableDictionary dictionaryWithDictionary: nameTable]; + [nt setObject: [NSMutableArray arrayWithArray: visibleWindows] + forKey: @"NSVisible"]; + [nt setObject: [NSMutableArray arrayWithArray: deferredWindows] + forKey: @"NSDeferred"]; + [nt setObject: [NSMutableDictionary dictionaryWithDictionary: customClasses] + forKey: @"GSCustomClassMap"]; + [aCoder encodeObject: nt]; + [aCoder encodeObject: connections]; + [aCoder encodeObject: topLevelObjects]; + } + else if (version == 0) + { + NSMutableDictionary *nt = [NSMutableDictionary dictionaryWithDictionary: nameTable]; + [nt setObject: [NSMutableArray arrayWithArray: visibleWindows] + forKey: @"NSVisible"]; + [nt setObject: [NSMutableArray arrayWithArray: deferredWindows] + forKey: @"NSDeferred"]; + [nt setObject: [NSMutableDictionary dictionaryWithDictionary: customClasses] + forKey: @"GSCustomClassMap"]; + [aCoder encodeObject: nt]; + [aCoder encodeObject: connections]; + } + else + { + [NSException raise: NSInternalInconsistencyException + format: @"Unable to write GSNibContainer version #%d. GSNibContainer version for the installed gui lib is %d.", version, GNUSTEP_NIB_VERSION]; + } +} + - (id) initWithCoder: (NSCoder*)aCoder { int version = [aCoder versionForClassName: @"GSNibContainer"]; // save the version to the ivar, we need it later. if (version == GNUSTEP_NIB_VERSION) + { + [aCoder decodeValueOfObjCType: @encode(id) at: &topLevelObjects]; + [aCoder decodeValueOfObjCType: @encode(id) at: &visibleWindows]; + [aCoder decodeValueOfObjCType: @encode(id) at: &deferredWindows]; + [aCoder decodeValueOfObjCType: @encode(id) at: &nameTable]; + [aCoder decodeValueOfObjCType: @encode(id) at: &connections]; + [aCoder decodeValueOfObjCType: @encode(id) at: &customClasses]; + } + else if (version == 1) { [aCoder decodeValueOfObjCType: @encode(id) at: &nameTable]; [aCoder decodeValueOfObjCType: @encode(id) at: &connections]; [aCoder decodeValueOfObjCType: @encode(id) at: &topLevelObjects]; + + // initialize with special entries... + ASSIGN(visibleWindows, [NSMutableArray arrayWithArray: + [nameTable objectForKey: @"NSVisible"]]); + ASSIGN(deferredWindows, [NSMutableArray arrayWithArray: + [nameTable objectForKey: @"NSDeferred"]]); + ASSIGN(customClasses, [NSMutableDictionary dictionaryWithDictionary: + [nameTable objectForKey: @"GSCustomClassMap"]]); + + // then remove them from the name table. + [nameTable removeObjectForKey: @"NSVisible"]; + [nameTable removeObjectForKey: @"NSDeferred"]; + [nameTable removeObjectForKey: @"GSCustomClassMap"]; } else if (version == 0) { @@ -412,6 +453,20 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN [topLevelObjects addObject: o]; // if it's a top level object, add it. } } + + // initialize with special entries... + ASSIGN(visibleWindows, [NSMutableArray arrayWithArray: + [nameTable objectForKey: @"NSVisible"]]); + ASSIGN(deferredWindows, [NSMutableArray arrayWithArray: + [nameTable objectForKey: @"NSDeferred"]]); + ASSIGN(customClasses, [NSMutableDictionary dictionaryWithDictionary: + [nameTable objectForKey: @"GSCustomClassMap"]]); + + + // then remove them from the name table. + [nameTable removeObjectForKey: @"NSVisible"]; + [nameTable removeObjectForKey: @"NSDeferred"]; + [nameTable removeObjectForKey: @"GSCustomClassMap"]; } else { @@ -436,6 +491,21 @@ static NSString *GSInternalNibItemAddedNotification = @"_GSInternalNibItemAddedN { return connections; } + +- (NSMutableArray*) visibleWindows +{ + return visibleWindows; +} + +- (NSMutableArray*) deferredWindows +{ + return visibleWindows; +} + +- (NSMutableDictionary *) customClasses +{ + return customClasses; +} @end // The first standin objects here are for views and normal objects like controllers diff --git a/Source/NSView.m b/Source/NSView.m index 2f714a3e6..0c6daae7e 100644 --- a/Source/NSView.m +++ b/Source/NSView.m @@ -4017,8 +4017,10 @@ static NSView* findByTag(NSView *view, int aTag, unsigned *level) e = [subs objectEnumerator]; while ((sub = [e nextObject]) != nil) { - NSAssert([sub window] == nil, NSInternalInconsistencyException); - NSAssert([sub superview] == nil, NSInternalInconsistencyException); + NSAssert([sub window] == nil, + NSInternalInconsistencyException); + NSAssert([sub superview] == nil, + NSInternalInconsistencyException); [sub viewWillMoveToWindow: _window]; [sub viewWillMoveToSuperview: self]; [sub setNextResponder: self]; @@ -4096,8 +4098,10 @@ static NSView* findByTag(NSView *view, int aTag, unsigned *level) e = [subs objectEnumerator]; while ((sub = [e nextObject]) != nil) { - NSAssert([sub window] == nil, NSInternalInconsistencyException); - NSAssert([sub superview] == nil, NSInternalInconsistencyException); + NSAssert([sub window] == nil, + NSInternalInconsistencyException); + NSAssert([sub superview] == nil, + NSInternalInconsistencyException); [sub viewWillMoveToWindow: _window]; [sub viewWillMoveToSuperview: self]; [sub setNextResponder: self];