Hi,

Here is a patch to fix NSSearchFieldCell archiving and keyed archiving.
Non-keyed archiving was crashing because _max_recents ivar was declared as
an unsigned char and encoded/decoded as an unsigned int. Keyed archiving was
not crashing because keyed decoding was not implemented.  The patch adds
keyed encoding to -encodeWithCoder:.

In a nib (a xib precisely), NSMaximumRecents is encoded as an int, so I
switched to int as the encoded type (rather than unsigned int).
I also changed the ivar from unsigned char to int to keep the
encoding/decoding as simple as possible. I doubt any application has more
than 4 or 5 search fields in use at the same time so it doesn't seem worth
to save some memory.

Cheers,
Quentin.
Index: Headers/AppKit/NSSearchFieldCell.h
===================================================================
--- Headers/AppKit/NSSearchFieldCell.h	(revision 28600)
+++ Headers/AppKit/NSSearchFieldCell.h	(working copy)
@@ -52,7 +52,7 @@
     NSMenu *_menu_template;
     BOOL _sends_whole_search_string;
     BOOL _sends_search_string_immediatly;
-    unsigned char _max_recents;
+    int _max_recents;
 }
 
 // Managing button cells
Index: Source/NSSearchFieldCell.m
===================================================================
--- Source/NSSearchFieldCell.m	(revision 28600)
+++ Source/NSSearchFieldCell.m	(working copy)
@@ -443,35 +443,56 @@
 			       [self searchButtonRectForBounds: [_control_view bounds]] 
 			   inView: _control_view];
 }
+
 //
 // NSCoding protocol
 //
+
+
+static NSString *NSSearchButtonCell = @"NSSearchButtonCell";
+static NSString *NSCancelButtonCell = @"NSCancelButtonCell";
+static NSString *NSRecentsAutosaveName = @"NSRecentsAutosaveName";
+static NSString *NSSendsWholeSearchString = @"NSSendsWholeSearchString";
+static NSString *NSMaximumRecents = @"NSMaximumRecents";
+
+
 - (void) encodeWithCoder: (NSCoder*)aCoder
 {
   [super encodeWithCoder: aCoder];
 
-  [aCoder encodeObject: _search_button_cell];
-  [aCoder encodeObject: _cancel_button_cell];
-  [aCoder encodeObject: _recents_autosave_name];
-  [aCoder encodeValueOfObjCType: @encode(BOOL)
-			     at: &_sends_whole_search_string];
-  [aCoder encodeValueOfObjCType: @encode(unsigned int)
-			     at: &_max_recents];
+  if ([aCoder allowsKeyedCoding])
+    {
+      [aCoder encodeObject: _search_button_cell forKey: NSSearchButtonCell];
+      [aCoder encodeObject: _cancel_button_cell forKey: NSCancelButtonCell];
+      [aCoder encodeObject: _recents_autosave_name forKey: NSRecentsAutosaveName];
+      [aCoder encodeBool: _sends_whole_search_string forKey: NSSendsWholeSearchString];
+      [aCoder encodeInt: _max_recents forKey: NSMaximumRecents];
+    }
+  else
+    {
+      [aCoder encodeObject: _search_button_cell];
+      [aCoder encodeObject: _cancel_button_cell];
+      [aCoder encodeObject: _recents_autosave_name];
+      [aCoder encodeValueOfObjCType: @encode(BOOL)
+                                 at: &_sends_whole_search_string];
+      [aCoder encodeValueOfObjCType: @encode(int)
+                                 at: &_max_recents];
+    }
 }
 
 - (id) initWithCoder: (NSCoder*)aDecoder
 {
   self = [super initWithCoder: aDecoder];
 
-  if(self != nil)
+  if (self != nil)
     {
       if ([aDecoder allowsKeyedCoding])
 	{
-	  [self setSearchButtonCell: [aDecoder decodeObjectForKey: @"NSSearchButtonCell"]];
-	  [self setCancelButtonCell: [aDecoder decodeObjectForKey: @"NSCancelButtonCell"]];
-	  [self setRecentsAutosaveName: [aDecoder decodeObjectForKey: @"NSRecentsAutosaveName"]];
-	  [self setSendsWholeSearchString: [aDecoder decodeBoolForKey: @"NSSendsWholeSearchString"]];
-	  [self setMaximumRecents: [aDecoder decodeIntForKey: @"NSMaximumRecents"]];
+	  [self setSearchButtonCell: [aDecoder decodeObjectForKey: NSSearchButtonCell]];
+	  [self setCancelButtonCell: [aDecoder decodeObjectForKey: NSCancelButtonCell]];
+	  [self setRecentsAutosaveName: [aDecoder decodeObjectForKey: NSRecentsAutosaveName]];
+	  [self setSendsWholeSearchString: [aDecoder decodeBoolForKey: NSSendsWholeSearchString]];
+	  [self setMaximumRecents: [aDecoder decodeIntForKey: NSMaximumRecents]];
 	}
       else
 	{
@@ -479,7 +500,7 @@
 	  [self setCancelButtonCell: [aDecoder decodeObject]];
 	  [self setRecentsAutosaveName: [aDecoder decodeObject]];
 	  [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_sends_whole_search_string];
-	  [aDecoder decodeValueOfObjCType: @encode(unsigned int) at: &_max_recents];
+	  [aDecoder decodeValueOfObjCType: @encode(int) at: &_max_recents];
 	}
       
       [self resetCancelButtonCell];
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
http://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to