Add NSEnabled decoding. it is encoded in NSControl, but is NOT used when it is decoded, so we have to retrieve the value here in NSSwitch.

This commit is contained in:
Gregory John Casamento 2020-04-26 04:47:25 -04:00
parent 0c1ab6c756
commit 54983cef50
2 changed files with 49 additions and 30 deletions

View file

@ -382,7 +382,8 @@ static NSArray *XmlBoolDefaultYes = nil;
@"decodeDividerStyleForElement:", @"NSDividerStyle",
@"decodeToolbarIdentifiedItemsForElement:", @"NSToolbarIBIdentifiedItems",
@"decodeToolbarImageForElement:", @"NSToolbarItemImage",
nil];
@"decodeControlContentsForElement:",@"NSControlContents",
nil];
RETAIN(XmlKeyToDecoderSelectorMap);
// boolean fields that should be treated as YES when missing.
@ -391,6 +392,7 @@ static NSArray *XmlBoolDefaultYes = nil;
@"bordered",
@"prefersToBeShown",
@"editable",
@"enabled",
nil];
}
}
@ -2726,6 +2728,19 @@ didStartElement: (NSString*)elementName
return [self findResourceWithName: name];
}
- (id) decodeControlContentsForElement: (GSXibElement *)element
{
NSNumber *num = [NSNumber numberWithInteger: 0];
id obj = [element attributeForKey: @"state"];
if ([obj isEqualToString: @"on"])
{
num = [NSNumber numberWithInteger: 1];
}
return num;
}
- (id) objectForXib: (GSXibElement*)element
{
id object = [super objectForXib: element];
@ -2789,32 +2804,6 @@ didStartElement: (NSString*)elementName
else if ([object respondsToSelector: @selector(setHeaderToolTip:)])
[object setHeaderToolTip: [element attributeForKey: @"toolTip"]];
}
// Handle state for NSSwitch
if ([element attributeForKey: @"state"])
{
if ([object respondsToSelector: @selector(setState:)] && [object isKindOfClass: [NSSwitch class]])
{
[(NSSwitch *)object setState: [[element attributeForKey: @"state"] isEqualToString: @"on"] ?
NSControlStateValueOn : NSControlStateValueOff];
}
}
if ([element attributeForKey: @"enabled"])
{
if ([object respondsToSelector: @selector(setEnabled:)] && [object isKindOfClass: [NSSwitch class]])
{
[(NSSwitch *)object setEnabled: [[element attributeForKey: @"enabled"] isEqualToString: @"YES"] ?
YES : NO];
}
}
else
{
if ([object respondsToSelector: @selector(setEnabled:)] && [object isKindOfClass: [NSSwitch class]])
{
[(NSSwitch *)object setEnabled: YES];
}
}
// Process IB runtime attributes for element...
// Ensure we don't process the placeholders...
@ -2996,6 +2985,29 @@ didStartElement: (NSString*)elementName
return object;
}
- (NSInteger) decodeIntegerForKey: (NSString *)key
{
NSInteger i = 0;
if ([self containsValueForKey: key])
{
i = [super decodeIntegerForKey: key];
}
else if ([XmlKeyToDecoderSelectorMap objectForKey: key])
{
SEL selector = NSSelectorFromString([XmlKeyToDecoderSelectorMap objectForKey: key]);
i = [[self performSelector: selector withObject: currentElement] integerValue];
}
#if DEBUG_XIB5
else
{
NSWarnMLog(@"no integer for key: %@", key);
}
#endif
return i;
}
- (BOOL) decodeBoolForKey: (NSString *)key
{
BOOL flag = NO;
@ -3180,6 +3192,10 @@ didStartElement: (NSString*)elementName
hasValue = [currentElement attributeForKey: @"title"] != nil;
hasValue |= [currentElement attributeForKey: @"image"] != nil;
}
else if ([@"NSControlContents" isEqualToString: key])
{
hasValue = [currentElement attributeForKey: @"state"] != nil;
}
else if ([@"NSAlternateContents" isEqualToString: key])
{
hasValue = [currentElement attributeForKey: @"alternateTitle"] != nil;

View file

@ -245,10 +245,13 @@
id t = [coder decodeObjectForKey: @"NSControlTarget"];
[self setTarget: t];
}
if ([coder containsValueForKey: @"NSEnabled"])
if ([coder containsValueForKey: @"NSEnabled"])
{
BOOL f = [coder decodeBoolForKey: @"NSEnabled"];
[self setEnabled: f];
BOOL e = [coder decodeBoolForKey: @"NSEnabled"];
// NSControl decodes this, but does not use the value which
// is decoded. See comment in NSControl.m initWithCoder:.
[self setEnabled: e];
}
}
else