From 7f0f23fc00ece9f2dd7eaa906cdd88a7a781708e Mon Sep 17 00:00:00 2001 From: FredKiefer Date: Thu, 5 Feb 2004 00:36:04 +0000 Subject: [PATCH] More keyed decoding. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@18541 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 7 +++ Source/NSMenu.m | 18 ++++-- Source/NSMenuItem.m | 63 +++++++++++++------- Source/NSPopUpButtonCell.m | 117 ++++++++++++++++++++++++------------- 4 files changed, 139 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index ddf652939..1378bbd6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-02-05 Fred Kiefer + + * Source/NSMenu.m + * Source/NSMenuItem.m + * Source/NSPopUpButtonCell.m + Added keyed decoding. + 2004-02-04 01:24 Alexander Malmberg * Source/NSView.m: Remove uses of the deprecated "casts as lvalues" diff --git a/Source/NSMenu.m b/Source/NSMenu.m index 9b554a0b8..1c8a4fcd1 100644 --- a/Source/NSMenu.m +++ b/Source/NSMenu.m @@ -1067,17 +1067,25 @@ static NSNotificationCenter *nc; [encoder encodeValueOfObjCType: @encode(BOOL) at: &_autoenable]; } -- (id) initWithCoder: (NSCoder*)decoder +- (id) initWithCoder: (NSCoder*)aDecoder { NSString *dTitle; NSArray *dItems; BOOL dAuto; unsigned i; - dTitle = [decoder decodeObject]; - dItems = [decoder decodeObject]; - [decoder decodeValueOfObjCType: @encode(BOOL) at: &dAuto]; - + if ([aDecoder allowsKeyedCoding]) + { + 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 setAutoenablesItems: dAuto]; diff --git a/Source/NSMenuItem.m b/Source/NSMenuItem.m index 7eef39402..062650c3b 100644 --- a/Source/NSMenuItem.m +++ b/Source/NSMenuItem.m @@ -456,30 +456,44 @@ static Class imageClass; - (id) initWithCoder: (NSCoder*)aDecoder { - int version = [aDecoder versionForClassName: - @"NSMenuItem"]; - - if (version == 2) + if ([aDecoder allowsKeyedCoding]) { - [aDecoder decodeValueOfObjCType: @encode(id) at: &_title]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_keyEquivalent]; - [aDecoder decodeValueOfObjCType: "I" at: &_keyEquivalentModifierMask]; - [aDecoder decodeValueOfObjCType: "I" at: &_mnemonicLocation]; - [aDecoder decodeValueOfObjCType: "i" at: &_state]; - [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_enabled]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_image]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_onStateImage]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_offStateImage]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_mixedStateImage]; - [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_changesState]; - [aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action]; - [aDecoder decodeValueOfObjCType: "i" at: &_tag]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_representedObject]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_submenu]; - _target = [aDecoder decodeObject]; + NSString *title = [aDecoder decodeObjectForKey: @"NSTitle"]; + NSString *action = [aDecoder decodeObjectForKey: @"NSAction"]; + NSString *key = [aDecoder decodeObjectForKey: @"NSKeyEquiv"]; + //NSMenu *menu = [aDecoder decodeObjectForKey: @"NSMenu"]; + NSImage *mixedImage = [aDecoder decodeObjectForKey: @"NSMixedImage"]; + NSImage *onImage = [aDecoder decodeObjectForKey: @"NSOnImage"]; + id target = [aDecoder decodeObjectForKey: @"NSTarget"]; + + self = [self initWithTitle: title + action: NSSelectorFromString(action) + keyEquivalent: key]; + [self setTarget: target]; + [self setMixedStateImage: mixedImage]; + [self setOnStateImage: onImage]; + + 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 { + int version = [aDecoder versionForClassName: + @"NSMenuItem"]; + [aDecoder decodeValueOfObjCType: @encode(id) at: &_title]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_keyEquivalent]; [aDecoder decodeValueOfObjCType: "I" at: &_keyEquivalentModifierMask]; @@ -491,11 +505,18 @@ static Class imageClass; [aDecoder decodeValueOfObjCType: @encode(id) at: &_offStateImage]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_mixedStateImage]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_changesState]; - _target = [aDecoder decodeObject]; + if (version == 1) + { + _target = [aDecoder decodeObject]; + } [aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action]; [aDecoder decodeValueOfObjCType: "i" at: &_tag]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_representedObject]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_submenu]; + if (version == 2) + { + _target = [aDecoder decodeObject]; + } } return self; } diff --git a/Source/NSPopUpButtonCell.m b/Source/NSPopUpButtonCell.m index 0125ce7a2..fc24ab724 100644 --- a/Source/NSPopUpButtonCell.m +++ b/Source/NSPopUpButtonCell.m @@ -812,55 +812,92 @@ static NSImage *_pbc_image[2]; - (id) initWithCoder: (NSCoder*)aDecoder { - int flag; id selectedItem; NSMenu *menu; - int version = [aDecoder versionForClassName: - @"NSPopUpButtonCell"]; 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; - - // 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++) + if ([aDecoder containsValueForKey: @"NSAltersState"]) { - id anItem = [menu itemAtIndex: i]; - - [anItem setOnStateImage: nil]; - [anItem setMixedStateImage: nil]; + BOOL alters = [aDecoder decodeBoolForKey: @"NSAltersState"]; + + [self setAltersStateOfSelectedItem: alters]; + } + 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 anItem = [menu itemAtIndex: i]; + + [anItem setOnStateImage: nil]; + [anItem setMixedStateImage: nil]; + } + [self setEnabled: YES]; + } + + [self selectItem: selectedItem]; + } return self; }