diff --git a/Headers/Additions/GNUstepGUI/GSXib5KeyedUnarchiver.h b/Headers/Additions/GNUstepGUI/GSXib5KeyedUnarchiver.h index 26975a05f..1e6e870cf 100644 --- a/Headers/Additions/GNUstepGUI/GSXib5KeyedUnarchiver.h +++ b/Headers/Additions/GNUstepGUI/GSXib5KeyedUnarchiver.h @@ -49,14 +49,3 @@ - (NSRange) decodeRangeForKey: (NSString*)key; @end -@interface IBActionConnection5 : IBActionConnection -{ - NSString *trigger; -} -@end - -@interface IBOutletConnection5 : IBOutletConnection -@end - -@interface IBUserDefinedRuntimeAttribute5 : IBUserDefinedRuntimeAttribute -@end diff --git a/Headers/Additions/GNUstepGUI/GSXibLoading.h b/Headers/Additions/GNUstepGUI/GSXibLoading.h index a6d9661aa..75aa964d8 100644 --- a/Headers/Additions/GNUstepGUI/GSXibLoading.h +++ b/Headers/Additions/GNUstepGUI/GSXibLoading.h @@ -86,6 +86,7 @@ @interface IBActionConnection: IBConnection { + NSString *trigger; } @end diff --git a/Source/GSXib5KeyedUnarchiver.m b/Source/GSXib5KeyedUnarchiver.m index 53e4ce6a1..1cb5f5141 100644 --- a/Source/GSXib5KeyedUnarchiver.m +++ b/Source/GSXib5KeyedUnarchiver.m @@ -60,147 +60,6 @@ #define DEBUG_XIB5 0 -@implementation IBActionConnection5 - -- (instancetype) initWithCoder: (NSCoder *)coder -{ - self = [super initWithCoder: coder]; - if (self) - { - trigger = nil; - - if ([coder allowsKeyedCoding]) - { - // label and source string tags have changed for XIB5... - ASSIGN(label, [coder decodeObjectForKey: @"selector"]); - ASSIGN(source, [coder decodeObjectForKey: @"target"]); - // destination string tag is still the same (so far) and loaded - // by base class... - //ASSIGN(destination, [coder decodeObjectForKey: @"destination"]); - - // Looks like the 'trigger' attribute should be used to override the - // target/action setup method... - if ([coder containsValueForKey: @"trigger"]) - ASSIGN(trigger, [coder decodeObjectForKey: @"trigger"]); - } - else - { - [NSException raise: NSInvalidArgumentException - format: @"Can't decode %@ with %@.",NSStringFromClass([self class]), - NSStringFromClass([coder class])]; - } - } - return self; -} - -- (NSString*) trigger -{ - return trigger; -} - -- (void) establishConnection -{ - if (trigger && [trigger length]) - { - SEL sel = NSSelectorFromString(label); - NSString *selName = [NSString stringWithFormat: @"set%@%@:", - [[trigger substringToIndex: 1] uppercaseString], - [trigger substringFromIndex: 1]]; - SEL trigsel = NSSelectorFromString(selName); - - if (sel && trigsel && [destination respondsToSelector: trigsel]) - { - NSWarnMLog(@"setting trigger %@ to selector %@", selName, label); - //[destination setTarget: source]; // Not needed??? - [destination performSelector: trigsel withObject: (id)sel]; - } - else if (!sel) - { - NSWarnMLog(@"label %@ does not correspond to any selector", label); - } - else if (!trigsel) - { - NSWarnMLog(@"trigger %@ does not correspond to any selector", trigger); - } - else - { - NSWarnMLog(@"destination class (%@) does not respond to trigger selector %@", - NSStringFromClass([destination class]), selName); - } - - // PREMATURE RETURN... - return; - } - - // Otherwise invoke the super class' method... - [super establishConnection]; -} - -@end - -@implementation IBOutletConnection5 - -- (instancetype) initWithCoder: (NSCoder *)coder -{ - self = [super initWithCoder: coder]; - if (self) - { - if ([coder allowsKeyedCoding]) - { - // label string tag has changed for XIB5... - ASSIGN(label, [coder decodeObjectForKey: @"property"]); - // destination and source string tags are still the same (so far) and loaded - // by base class... - } - else - { - [NSException raise: NSInvalidArgumentException - format: @"Can't decode %@ with %@.",NSStringFromClass([self class]), - NSStringFromClass([coder class])]; - } - } - return self; -} - -@end - -@implementation IBUserDefinedRuntimeAttribute5 - -- (id) initWithCoder: (NSCoder *)coder -{ - self = [super initWithCoder: coder]; - - if (self) - { - if ([coder allowsKeyedCoding]) - { - [self setTypeIdentifier: [coder decodeObjectForKey: @"type"]]; - - // Decode value properly... - if ([@"boolean" isEqualToString: typeIdentifier]) - [self setValue: [NSNumber numberWithBool: ([@"YES" isEqualToString: value] ? YES : NO)]]; - else if ([@"image" isEqualToString: typeIdentifier]) - [self setValue: [NSImage imageNamed: value]]; - else if ([@"number" isEqualToString: typeIdentifier]) - [self setValue: [coder decodeObjectForKey: @"value"]]; - else if ([@"point" isEqualToString: typeIdentifier]) - [self setValue: [coder decodeObjectForKey: @"value"]]; - else if ([@"size" isEqualToString: typeIdentifier]) - [self setValue: [coder decodeObjectForKey: @"size"]]; - else if ([@"rect" isEqualToString: typeIdentifier]) - [self setValue: [coder decodeObjectForKey: @"value"]]; - else if ([@"nil" isEqualToString: typeIdentifier]) - [self setValue: nil]; - else - NSWarnMLog(@"type: %@ value: %@ (%@)", typeIdentifier, value, [value class]); - } - } - - return self; -} - -@end - @implementation GSXib5KeyedUnarchiver diff --git a/Source/GSXibLoading.m b/Source/GSXibLoading.m index ad750b23e..ed9a5c24b 100644 --- a/Source/GSXibLoading.m +++ b/Source/GSXibLoading.m @@ -33,9 +33,11 @@ #import #import #import +// #import #import "AppKit/NSControl.h" #import "AppKit/NSNibLoading.h" #import "AppKit/NSWindow.h" +#import "AppKit/NSImage.h" #import "GNUstepGUI/GSNibLoading.h" #import "GNUstepGUI/GSXibLoading.h" @@ -62,12 +64,40 @@ - (id) initWithCoder: (NSCoder *)coder { - if([coder allowsKeyedCoding]) + self = [super init]; + if (self) { - [self setTypeIdentifier: [coder decodeObjectForKey: @"typeIdentifier"]]; - [self setKeyPath: [coder decodeObjectForKey: @"keyPath"]]; - [self setValue: [coder decodeObjectForKey: @"value"]]; + if ([coder allowsKeyedCoding]) + { + [self setTypeIdentifier: [coder decodeObjectForKey: @"typeIdentifier"]]; + [self setKeyPath: [coder decodeObjectForKey: @"keyPath"]]; + [self setValue: [coder decodeObjectForKey: @"value"]]; + + if ([coder containsValueForKey: @"type"]) + { + [self setTypeIdentifier: [coder decodeObjectForKey: @"type"]]; + + // Decode value properly... + if ([@"boolean" isEqualToString: typeIdentifier]) + [self setValue: [NSNumber numberWithBool: ([@"YES" isEqualToString: value] ? YES : NO)]]; + else if ([@"image" isEqualToString: typeIdentifier]) + [self setValue: [NSImage imageNamed: value]]; + else if ([@"number" isEqualToString: typeIdentifier]) + [self setValue: [coder decodeObjectForKey: @"value"]]; + else if ([@"point" isEqualToString: typeIdentifier]) + [self setValue: [coder decodeObjectForKey: @"value"]]; + else if ([@"size" isEqualToString: typeIdentifier]) + [self setValue: [coder decodeObjectForKey: @"size"]]; + else if ([@"rect" isEqualToString: typeIdentifier]) + [self setValue: [coder decodeObjectForKey: @"value"]]; + else if ([@"nil" isEqualToString: typeIdentifier]) + [self setValue: nil]; + else + NSWarnMLog(@"type: %@ value: %@ (%@)", typeIdentifier, value, [value class]); + } + } } + return self; } @@ -420,19 +450,118 @@ @end @implementation IBActionConnection +- (instancetype) initWithCoder: (NSCoder *)coder +{ + self = [super initWithCoder: coder]; + if (self) + { + trigger = nil; + + if ([coder allowsKeyedCoding]) + { + // label and source string tags have changed for XIB5... + if ([coder containsValueForKey: @"selector"]) + { + ASSIGN(label, [coder decodeObjectForKey: @"selector"]); + } + + if ([coder containsValueForKey: @"target"]) + { + ASSIGN(source, [coder decodeObjectForKey: @"target"]); + } + // destination string tag is still the same (so far) and loaded + // by base class... + //ASSIGN(destination, [coder decodeObjectForKey: @"destination"]); + + // Looks like the 'trigger' attribute should be used to override the + // target/action setup method... + if ([coder containsValueForKey: @"trigger"]) + { + ASSIGN(trigger, [coder decodeObjectForKey: @"trigger"]); + } + } + else + { + [NSException raise: NSInvalidArgumentException + format: @"Can't decode %@ with %@.",NSStringFromClass([self class]), + NSStringFromClass([coder class])]; + } + } + return self; +} + +- (NSString*) trigger +{ + return trigger; +} - (void) establishConnection { SEL sel = NSSelectorFromString(label); + if (trigger && [trigger length]) + { + NSString *selName = [NSString stringWithFormat: @"set%@%@:", + [[trigger substringToIndex: 1] uppercaseString], + [trigger substringFromIndex: 1]]; + SEL trigsel = NSSelectorFromString(selName); + if (sel && trigsel && [destination respondsToSelector: trigsel]) + { + NSWarnMLog(@"setting trigger %@ to selector %@", selName, label); + //[destination setTarget: source]; // Not needed??? + [destination performSelector: trigsel withObject: (id)sel]; + } + else if (!sel) + { + NSWarnMLog(@"label %@ does not correspond to any selector", label); + } + else if (!trigsel) + { + NSWarnMLog(@"trigger %@ does not correspond to any selector", trigger); + } + else + { + NSWarnMLog(@"destination class (%@) does not respond to trigger selector %@", + NSStringFromClass([destination class]), selName); + } + + // PREMATURE RETURN... + return; + } + + // Otherwise do the following.... [destination setTarget: source]; [destination setAction: sel]; } - @end @implementation IBOutletConnection +- (instancetype) initWithCoder: (NSCoder *)coder +{ + self = [super initWithCoder: coder]; + if (self) + { + if ([coder allowsKeyedCoding]) + { + // label string tag has changed for XIB5... + if ([coder containsValueForKey: @"property"]) + { + ASSIGN(label, [coder decodeObjectForKey: @"property"]); + // destination and source string tags are still the same (so far) and loaded + // by base class... + } + } + else + { + [NSException raise: NSInvalidArgumentException + format: @"Can't decode %@ with %@.",NSStringFromClass([self class]), + NSStringFromClass([coder class])]; + } + } + return self; +} + - (void) establishConnection { NS_DURING