More keyed decoding.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@18541 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
FredKiefer 2004-02-05 00:36:04 +00:00
parent 2e61ea63b4
commit 7f0f23fc00
4 changed files with 139 additions and 66 deletions

View file

@ -1,3 +1,10 @@
2004-02-05 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSMenu.m
* Source/NSMenuItem.m
* Source/NSPopUpButtonCell.m
Added keyed decoding.
2004-02-04 01:24 Alexander Malmberg <alexander@malmberg.org> 2004-02-04 01:24 Alexander Malmberg <alexander@malmberg.org>
* Source/NSView.m: Remove uses of the deprecated "casts as lvalues" * Source/NSView.m: Remove uses of the deprecated "casts as lvalues"

View file

@ -1067,17 +1067,25 @@ static NSNotificationCenter *nc;
[encoder encodeValueOfObjCType: @encode(BOOL) at: &_autoenable]; [encoder encodeValueOfObjCType: @encode(BOOL) at: &_autoenable];
} }
- (id) initWithCoder: (NSCoder*)decoder - (id) initWithCoder: (NSCoder*)aDecoder
{ {
NSString *dTitle; NSString *dTitle;
NSArray *dItems; NSArray *dItems;
BOOL dAuto; BOOL dAuto;
unsigned i; unsigned i;
dTitle = [decoder decodeObject]; if ([aDecoder allowsKeyedCoding])
dItems = [decoder decodeObject]; {
[decoder decodeValueOfObjCType: @encode(BOOL) at: &dAuto]; dAuto = YES;
dTitle = [aDecoder decodeObjectForKey: @"NSTitle"];
dItems = [aDecoder decodeObjectForKey: @"NSMenuItems"];
}
else
{
dTitle = [aDecoder decodeObject];
dItems = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &dAuto];
}
self = [self initWithTitle: dTitle]; self = [self initWithTitle: dTitle];
[self setAutoenablesItems: dAuto]; [self setAutoenablesItems: dAuto];

View file

@ -456,30 +456,44 @@ static Class imageClass;
- (id) initWithCoder: (NSCoder*)aDecoder - (id) initWithCoder: (NSCoder*)aDecoder
{ {
int version = [aDecoder versionForClassName: if ([aDecoder allowsKeyedCoding])
@"NSMenuItem"];
if (version == 2)
{ {
[aDecoder decodeValueOfObjCType: @encode(id) at: &_title]; NSString *title = [aDecoder decodeObjectForKey: @"NSTitle"];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_keyEquivalent]; NSString *action = [aDecoder decodeObjectForKey: @"NSAction"];
[aDecoder decodeValueOfObjCType: "I" at: &_keyEquivalentModifierMask]; NSString *key = [aDecoder decodeObjectForKey: @"NSKeyEquiv"];
[aDecoder decodeValueOfObjCType: "I" at: &_mnemonicLocation]; //NSMenu *menu = [aDecoder decodeObjectForKey: @"NSMenu"];
[aDecoder decodeValueOfObjCType: "i" at: &_state]; NSImage *mixedImage = [aDecoder decodeObjectForKey: @"NSMixedImage"];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_enabled]; NSImage *onImage = [aDecoder decodeObjectForKey: @"NSOnImage"];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_image]; id target = [aDecoder decodeObjectForKey: @"NSTarget"];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_onStateImage];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_offStateImage]; self = [self initWithTitle: title
[aDecoder decodeValueOfObjCType: @encode(id) at: &_mixedStateImage]; action: NSSelectorFromString(action)
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_changesState]; keyEquivalent: key];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action]; [self setTarget: target];
[aDecoder decodeValueOfObjCType: "i" at: &_tag]; [self setMixedStateImage: mixedImage];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_representedObject]; [self setOnStateImage: onImage];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_submenu];
_target = [aDecoder decodeObject]; if ([aDecoder containsValueForKey: @"NSKeyEquivModMask"])
{
//int keyMask = [aDecoder decodeIntForKey: @"NSKeyEquivModMask"];
}
if ([aDecoder containsValueForKey: @"NSMnemonicLoc"])
{
int loc = [aDecoder decodeIntForKey: @"NSMnemonicLoc"];
[self setMnemonicLocation: loc];
}
if ([aDecoder containsValueForKey: @"NSState"])
{
int state = [aDecoder decodeIntForKey: @"NSState"];
[self setState: state];
}
} }
else else
{ {
int version = [aDecoder versionForClassName:
@"NSMenuItem"];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_title]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_title];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_keyEquivalent]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_keyEquivalent];
[aDecoder decodeValueOfObjCType: "I" at: &_keyEquivalentModifierMask]; [aDecoder decodeValueOfObjCType: "I" at: &_keyEquivalentModifierMask];
@ -491,11 +505,18 @@ static Class imageClass;
[aDecoder decodeValueOfObjCType: @encode(id) at: &_offStateImage]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_offStateImage];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_mixedStateImage]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_mixedStateImage];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_changesState]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_changesState];
_target = [aDecoder decodeObject]; if (version == 1)
{
_target = [aDecoder decodeObject];
}
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action]; [aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action];
[aDecoder decodeValueOfObjCType: "i" at: &_tag]; [aDecoder decodeValueOfObjCType: "i" at: &_tag];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_representedObject]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_representedObject];
[aDecoder decodeValueOfObjCType: @encode(id) at: &_submenu]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_submenu];
if (version == 2)
{
_target = [aDecoder decodeObject];
}
} }
return self; return self;
} }

View file

@ -812,55 +812,92 @@ static NSImage *_pbc_image[2];
- (id) initWithCoder: (NSCoder*)aDecoder - (id) initWithCoder: (NSCoder*)aDecoder
{ {
int flag;
id<NSMenuItem> selectedItem; id<NSMenuItem> selectedItem;
NSMenu *menu; NSMenu *menu;
int version = [aDecoder versionForClassName:
@"NSPopUpButtonCell"];
self = [super initWithCoder: aDecoder]; self = [super initWithCoder: aDecoder];
menu = [aDecoder decodeObject];
/*
FIXME: This same ivar already gets set in NSCell initWithCoder,
but there it is used directly not via a method call. So here we first
unset it and than set it again as our setMenu: method tries to optimize
duplicate calls.
*/
[self setMenu: nil];
[self setMenu: menu];
selectedItem = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.pullsDown = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.preferredEdge = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.usesItemFromMenu = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.altersStateOfSelectedItem = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.arrowPosition = flag;
if (version < 2) if ([aDecoder allowsKeyedCoding])
{ {
int i; if ([aDecoder containsValueForKey: @"NSAltersState"])
// Not the stored format did change but the interpretation of it.
// in version 1 most of the ivars were not used, so their values may
// be arbitray. We overwrite them with valid settings.
[self setPullsDown: _pbcFlags.pullsDown];
_pbcFlags.usesItemFromMenu = YES;
for (i = 0; i < [_menu numberOfItems]; i++)
{ {
id <NSMenuItem> anItem = [menu itemAtIndex: i]; BOOL alters = [aDecoder decodeBoolForKey: @"NSAltersState"];
[anItem setOnStateImage: nil]; [self setAltersStateOfSelectedItem: alters];
[anItem setMixedStateImage: nil]; }
if ([aDecoder containsValueForKey: @"NSUsesItemFromMenu"])
{
BOOL usesItem = [aDecoder decodeBoolForKey: @"NSUsesItemFromMenu"];
[self setUsesItemFromMenu: usesItem];
}
if ([aDecoder containsValueForKey: @"NSArrowPosition"])
{
NSPopUpArrowPosition position = [aDecoder decodeIntForKey:
@"NSArrowPosition"];
[self setArrowPosition: position];
}
if ([aDecoder containsValueForKey: @"NSPreferredEdge"])
{
NSRectEdge edge = [aDecoder decodeIntForKey: @"NSPreferredEdge"];
[self setPreferredEdge: edge];
} }
[self setEnabled: YES];
}
[self selectItem: selectedItem]; menu = [aDecoder decodeObjectForKey: @"NSMenu"];
[self setMenu: menu];
selectedItem = [aDecoder decodeObjectForKey: @"NSMenuItem"];
}
else
{
int flag;
int version = [aDecoder versionForClassName:
@"NSPopUpButtonCell"];
menu = [aDecoder decodeObject];
/*
FIXME: This same ivar already gets set in NSCell initWithCoder,
but there it is used directly not via a method call. So here we first
unset it and than set it again as our setMenu: method tries to optimize
duplicate calls.
*/
[self setMenu: nil];
[self setMenu: menu];
selectedItem = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.pullsDown = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.preferredEdge = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.usesItemFromMenu = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.altersStateOfSelectedItem = flag;
[aDecoder decodeValueOfObjCType: @encode(int) at: &flag];
_pbcFlags.arrowPosition = flag;
if (version < 2)
{
int i;
// Not the stored format did change but the interpretation of it.
// in version 1 most of the ivars were not used, so their values may
// be arbitray. We overwrite them with valid settings.
[self setPullsDown: _pbcFlags.pullsDown];
_pbcFlags.usesItemFromMenu = YES;
for (i = 0; i < [_menu numberOfItems]; i++)
{
id <NSMenuItem> anItem = [menu itemAtIndex: i];
[anItem setOnStateImage: nil];
[anItem setMixedStateImage: nil];
}
[self setEnabled: YES];
}
[self selectItem: selectedItem];
}
return self; return self;
} }