From d6cfd60462b526e08a8596314c6dbf81e0c3fe14 Mon Sep 17 00:00:00 2001 From: fredkiefer Date: Sat, 14 Dec 2019 17:46:29 +0100 Subject: [PATCH] Add handling for resources. Currently only works for images. --- Source/GSXib5KeyedUnarchiver.h | 1 + Source/GSXib5KeyedUnarchiver.m | 43 +++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Source/GSXib5KeyedUnarchiver.h b/Source/GSXib5KeyedUnarchiver.h index 307a6600b..3b982dbee 100644 --- a/Source/GSXib5KeyedUnarchiver.h +++ b/Source/GSXib5KeyedUnarchiver.h @@ -40,6 +40,7 @@ GSXibElement *_flattenedProperties; GSXibElement *_runtimeAttributes; NSMutableDictionary *_orderedObjectsDict; + NSArray *_resources; } - (NSRange) decodeRangeForKey: (NSString*)key; diff --git a/Source/GSXib5KeyedUnarchiver.m b/Source/GSXib5KeyedUnarchiver.m index bf084b8fe..a5bc4e585 100644 --- a/Source/GSXib5KeyedUnarchiver.m +++ b/Source/GSXib5KeyedUnarchiver.m @@ -373,6 +373,7 @@ static NSArray *XmlBoolDefaultYes = nil; @"NSNibBindingConnector", @"binding", @"NSWindowTemplate5", @"window", @"NSView", @"tableCellView", + @"NSImage", @"image", nil]; RETAIN(XmltagToObjectClassCrossReference); @@ -453,7 +454,6 @@ static NSArray *XmlBoolDefaultYes = nil; @"prefersToBeShown", @"NSToolbarPrefersToBeShown", @"label", @"NSToolbarItemLabel", @"paletteLabel", @"NSToolbarItemPaletteLabel", - //@"image", @"NSToolbarItemImage", @"tag", @"NSToolbarItemTag", @"implicitItemIdentifier", @"NSToolbarItemIdentifier", @"bordered", @"NSIsBordered", @@ -569,7 +569,8 @@ static NSArray *XmlBoolDefaultYes = nil; @"decodeSegmentItemImageForElement:", @"NSSegmentItemImage", @"decodeBackgroundColorsForElement:", @"NSBackgroundColors", @"decodeDividerStyleForElement:", @"NSDividerStyle", - @"decodeToolsbarIdentifiedItemsForElement:", @"NSToolbarIBIdentifiedItems", + @"decodeToolbarIdentifiedItemsForElement:", @"NSToolbarIBIdentifiedItems", + @"decodeToolbarImageForElement:", @"NSToolbarItemImage", nil]; RETAIN(XmlKeyToDecoderSelectorMap); @@ -830,6 +831,9 @@ static NSArray *XmlBoolDefaultYes = nil; NS_ENDHANDLER DESTROY(theParser); + + // Decode optional resources + _resources = RETAIN([self decodeObjectForKey: @"resources"]); } } } @@ -900,6 +904,7 @@ static NSArray *XmlBoolDefaultYes = nil; RELEASE(_runtimeAttributes); RELEASE(_orderedObjects); RELEASE(_orderedObjectsDict); + RELEASE(_resources); [super dealloc]; } @@ -1039,6 +1044,22 @@ didStartElement: (NSString*)elementName } } +- (id) findResourceWithName: (NSString*)name +{ + NSEnumerator *iter = [_resources objectEnumerator]; + id resource = nil; + + while ((resource = [iter nextObject])) + { + if ([[resource name] isEqual: name]) + { + return resource; + } + } + + return nil; +} + // All this code should eventually move into their respective initWithCoder class // methods - however note - there are a couple that may be duplicated... @@ -2880,7 +2901,7 @@ didStartElement: (NSString*)elementName return [NSNumber numberWithBool: value]; } -- (id) decodeToolsbarIdentifiedItemsForElement: (GSXibElement*)element +- (id) decodeToolbarIdentifiedItemsForElement: (GSXibElement*)element { NSArray *allowedItems = [self decodeObjectForKey: @"allowedToolbarItems"]; NSMutableDictionary *map = [NSMutableDictionary dictionary]; @@ -2895,6 +2916,13 @@ didStartElement: (NSString*)elementName return map; } +- (id) decodeToolbarImageForElement: (GSXibElement*)element +{ + NSString *name = [self decodeObjectForKey: @"image"]; + + return [self findResourceWithName: name]; +} + - (id) objectForXib: (GSXibElement*)element { id object = [super objectForXib: element]; @@ -3204,6 +3232,11 @@ didStartElement: (NSString*)elementName { size = [self decodeSizeForKey: [XmlKeyMapTable objectForKey: key]]; } + else if ([key isEqual: @"NSSize"]) + { + size.width = [[currentElement attributeForKey: @"width"] doubleValue]; + size.height = [[currentElement attributeForKey: @"height"] doubleValue]; + } else if ([key hasPrefix: @"NS"]) { NSString *newKey = [self alternateName: key]; @@ -3307,6 +3340,10 @@ didStartElement: (NSString*)elementName { hasValue = [currentElement attributeForKey: @"autoenablesItems"] != nil; } + else if ([@"NSToolbarItemImage" isEqualToString: key]) + { + hasValue = [currentElement attributeForKey: @"image"] != nil; + } else if ([XmlKeysDefined containsObject: key]) { // These are arbitrarily defined through hard-coding...