home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / YellowBox / Kits / MiscTableScroll-138.1 / Palettes / MiscTableScroll / Framework / MiscTableScrollIO.M < prev    next >
Encoding:
Text File  |  1998-03-31  |  11.6 KB  |  338 lines

  1. //=============================================================================
  2. //
  3. //    Copyright (C) 1995-1998 by Paul S. McCarthy and Eric Sunshine.
  4. //        Written by Paul S. McCarthy and Eric Sunshine.
  5. //                All Rights Reserved.
  6. //
  7. //    This notice may not be removed from this source code.
  8. //
  9. //    This object is included in the MiscKit by permission from the authors
  10. //    and its use is governed by the MiscKit license, found in the file
  11. //    "License.rtf" in the MiscKit distribution.  Please refer to that file
  12. //    for a list of all applicable permissions and restrictions.
  13. //
  14. //=============================================================================
  15. //-----------------------------------------------------------------------------
  16. // MiscTableScrollIO.M
  17. //
  18. //    Input and Output (IO) methods for MiscTableScroll.
  19. //
  20. //-----------------------------------------------------------------------------
  21. //-----------------------------------------------------------------------------
  22. // $Id: MiscTableScrollIO.M,v 1.2 98/03/29 23:56:48 sunshine Exp $
  23. // $Log:    MiscTableScrollIO.M,v $
  24. // Revision 1.2  98/03/29  23:56:48  sunshine
  25. // v138.1: #import was missing "MiscTableScroll/" for public header.
  26. // Worked around OPENSTEP 4.2 for NT bug where compiler crashes when
  27. // sending a message to 'super' from within a category.
  28. // 
  29. // Revision 1.1  98/03/22  13:33:49  sunshine
  30. // v133.1: Broke off from MiscTableScroll.M.
  31. //-----------------------------------------------------------------------------
  32. #import <MiscTableScroll/MiscTableScroll.h>
  33. #import <MiscTableScroll/MiscTableCell.h>
  34. #import "MiscCornerView.h"
  35. #import "MiscDelegateFlags.h"
  36. #import "MiscTableBorder.h"
  37. #import "MiscTableScrollPrivate.h"
  38. #import "MiscTableView.h"
  39. #import <new.h>
  40. extern "Objective-C" {
  41. #import <AppKit/NSClipView.h>
  42. }
  43.  
  44. @implementation MiscTableScroll(IO)
  45.  
  46. //-----------------------------------------------------------------------------
  47. // - awakeFromNib
  48. //-----------------------------------------------------------------------------
  49. - (void)awakeFromNib
  50.     {
  51.     delegateFlags->setDelegate( [self delegate] );
  52.     dataDelegateFlags->setDelegate( [self dataDelegate] );
  53.     }
  54.  
  55.  
  56. //-----------------------------------------------------------------------------
  57. // - readString:isCString:
  58. //-----------------------------------------------------------------------------
  59. - (NSString*)readString:(NSCoder*)decoder isCString:(BOOL)isCString
  60.     {
  61.     NSString* s = @"";
  62.     if (!isCString)
  63.     s = [decoder decodeObject];
  64.     else
  65.     {
  66.     char* cstr = 0;
  67.     [decoder decodeValueOfObjCType:@encode(char*) at:&cstr];
  68.     if (cstr != 0)
  69.         {
  70.         s = [NSString stringWithCString:cstr];
  71.         NSZoneFree( [decoder objectZone], cstr );
  72.         }
  73.     }
  74.     return s;
  75.     }
  76.  
  77.  
  78. //-----------------------------------------------------------------------------
  79. // - read:selector:
  80. //-----------------------------------------------------------------------------
  81. - (SEL)read:(int)ver selector:(NSCoder*)decoder
  82.     {
  83.     SEL cmd = 0;
  84.     BOOL const isCString = (ver < MISC_TS_VERSION_1000);
  85.     NSString* s = [self readString:decoder isCString:isCString];
  86.     if (![s isEqualToString:@""])
  87.     cmd = NSSelectorFromString(s);
  88.     return cmd;
  89.     }
  90.  
  91.  
  92. //-----------------------------------------------------------------------------
  93. // - read:cornerTitle:globalInfo:
  94. //    NOTE: Cannot archive sort_entry_func and sort_slot_func because they 
  95. //        are function addresses.  
  96. //-----------------------------------------------------------------------------
  97. - (NSString*)read:(int)ver cornerTitleAndGlobalInfo:(NSCoder*)decoder
  98.     {
  99.     [decoder decodeValueOfObjCType:@encode(int) at:&tag];
  100.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&enabled];
  101.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&lazy];
  102.     if (ver < MISC_TS_VERSION_2 || (ver >= MISC_TS_VERSION_1000 &&
  103.     ver < MISC_TS_VERSION_1002))
  104.     drawClippedText = NO;
  105.     else
  106.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&drawClippedText];
  107.     [decoder decodeValueOfObjCType:@encode(MiscSelectionMode) at:&mode];
  108.     font = [[decoder decodeObject] retain];
  109.  
  110.     if (ver < MISC_TS_VERSION_1000)
  111.     {
  112.     textColor        = [[decoder decodeNXColor] retain];
  113.     backgroundColor        = [[decoder decodeNXColor] retain];
  114.     selectedTextColor    = [[decoder decodeNXColor] retain];
  115.     selectedBackgroundColor    = [[decoder decodeNXColor] retain];
  116.     id nextText        = [decoder decodeObject];
  117.     id previousText        = [decoder decodeObject];
  118.     [self setNextKeyView:nextText];
  119.     [previousText setNextKeyView:self];
  120.     }
  121.     else
  122.     {
  123.     textColor        = [[decoder decodeObject] retain];
  124.     backgroundColor        = [[decoder decodeObject] retain];
  125.     selectedTextColor    = [[decoder decodeObject] retain];
  126.     selectedBackgroundColor    = [[decoder decodeObject] retain];
  127.     }
  128.  
  129.     delegate    = [decoder decodeObject];
  130.     dataDelegate= [decoder decodeObject];
  131.     target    = [decoder decodeObject];
  132.     doubleTarget= [decoder decodeObject];
  133.     action    = [self read:ver selector:decoder];
  134.     doubleAction= [self read:ver selector:decoder];
  135.  
  136.     NSString* s = @"";
  137.     if ((ver >= MISC_TS_VERSION_2 && ver < MISC_TS_VERSION_1000) ||
  138.     ver >= MISC_TS_VERSION_1002)
  139.     s = [self readString:decoder isCString:(ver < MISC_TS_VERSION_1000)];
  140.     return s;
  141.     }
  142.  
  143.  
  144. //-----------------------------------------------------------------------------
  145. // - read:border:decoder:
  146. //-----------------------------------------------------------------------------
  147. - (void)read:(int)ver border:(MiscBorderInfo*)p decoder:(NSCoder*)decoder
  148.     {
  149.     if (p->sort_vector != 0)
  150.     {
  151.     [p->sort_vector release];
  152.     p->sort_vector = 0;
  153.     }
  154.  
  155.     if (ver >= MISC_TS_VERSION_1001)
  156.     {
  157.     p->sort_vector = [[decoder decodeObject] retain];
  158.     }
  159.     else
  160.     {
  161.     int n;
  162.     [decoder decodeValueOfObjCType:@encode(int) at:&n];
  163.     if (n > 0)
  164.         {
  165.         NSMutableArray* a =
  166.             [[NSMutableArray allocWithZone:[self zone]] init];
  167.         for (int i = 0; i < n; i++)
  168.         {
  169.         int j;
  170.         [decoder decodeValueOfObjCType:@encode(int) at:&j];
  171.         [a addObject:[NSNumber numberWithInt:j]];
  172.         }
  173.         p->sort_vector = a;
  174.         }
  175.     }
  176.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&(p->isOn)];
  177.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&(p->autoSort)];
  178.     if (ver < MISC_TS_VERSION_2 || (ver >= MISC_TS_VERSION_1000 &&
  179.     ver < MISC_TS_VERSION_1002))
  180.     {
  181.     BOOL b;
  182.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&b];    // obsolete.
  183.     [decoder decodeValueOfObjCType:@encode(BOOL) at:&b];
  184.     }
  185.  
  186.     if (p->border == 0)
  187.     p->border = new( NSZoneMalloc( [self zone], sizeof(*(p->border)) ) )
  188.             MiscTableBorder( MISC_ROW_BORDER );
  189.     p->border->initWithCoder( decoder, ver );
  190.     }
  191.  
  192.  
  193. //-----------------------------------------------------------------------------
  194. // - read:cells:
  195. // FIXME: What happens when a non-empty non-lazy TableScroll reads the data
  196. // from a lazy, empty one.  Does the memory get freed?
  197. //-----------------------------------------------------------------------------
  198. - (void)read:(int)ver cells:(NSCoder*)decoder
  199.     {
  200.     [decoder decodeValueOfObjCType:@encode(int) at:&num_cols];
  201.     [decoder decodeValueOfObjCType:@encode(int) at:&num_rows];
  202.     if (lazy)
  203.     {
  204.     max_rows = 0;        // No rows have been allocated.
  205.     max_cells = 0;
  206.     cells = 0;
  207.     }
  208.     else // (!lazy)
  209.     {
  210.     max_rows = num_rows;
  211.     max_cells = max_rows * num_cols;
  212.     if (max_cells == 0)
  213.         cells = 0;
  214.     else
  215.         {
  216.         int const nbytes = max_cells * sizeof(*cells);
  217.         cells = (id*) NSZoneMalloc( [self zone], nbytes );
  218.         id* p = cells;
  219.         for (int r = 0; r < num_rows; r++)
  220.         for (int c = 0; c < num_cols; c++)
  221.             *p++ = [[decoder decodeObject] retain];
  222.         }
  223.     }
  224.     }
  225.  
  226.  
  227. //-----------------------------------------------------------------------------
  228. // - initWithCoder:
  229. //-----------------------------------------------------------------------------
  230. - (id)initWithCoder:(NSCoder*)decoder
  231.     {
  232.     [self superInitWithCoder:decoder];
  233.     NSString* class_name = [[MiscTableScroll class] description];
  234.     int const ver = [decoder versionForClassName:class_name];
  235.     if (((unsigned int)ver) > ((unsigned int)MISC_TS_VERSION))
  236.     [NSException raise:NSGenericException format:
  237.     @"%@: old library (version %d), can't -read: new object (version %d)",
  238.     class_name, MISC_TS_VERSION, ver ];
  239.     NSString* s = [self read:ver cornerTitleAndGlobalInfo:decoder];
  240.     [self read:ver border:&colInfo decoder:decoder];
  241.     [self read:ver border:&rowInfo decoder:decoder];
  242.     [self read:ver cells:decoder];
  243.     [self doInit:ver cornerTitle:s];
  244.     return self;
  245.     }
  246.  
  247.  
  248. //-----------------------------------------------------------------------------
  249. // - writeSelector:encoder:
  250. //-----------------------------------------------------------------------------
  251. - (void)writeSelector:(SEL)cmd encoder:(NSCoder*)encoder
  252.     {
  253.     NSString* str = @"";
  254.     if (cmd != 0)
  255.     str = NSStringFromSelector( cmd );
  256.     [encoder encodeObject:str];
  257.     }
  258.  
  259.  
  260. //-----------------------------------------------------------------------------
  261. // - writeGlobalInfo:
  262. //    NOTE: Cannot archive sort_entry_func and sort_slot_func because they 
  263. //    are function addresses.  
  264. //-----------------------------------------------------------------------------
  265. - (void)writeGlobalInfo:(NSCoder*)encoder
  266.     {
  267.     [encoder encodeValueOfObjCType:@encode(int) at:&tag];
  268.     [encoder encodeValueOfObjCType:@encode(BOOL) at:&enabled];
  269.     [encoder encodeValueOfObjCType:@encode(BOOL) at:&lazy];
  270.     [encoder encodeValueOfObjCType:@encode(BOOL) at:&drawClippedText];
  271.     [encoder encodeValueOfObjCType:@encode(MiscSelectionMode) at:&mode];
  272.     [encoder encodeObject:font];
  273.     [encoder encodeObject:textColor];
  274.     [encoder encodeObject:backgroundColor];
  275.     [encoder encodeObject:selectedTextColor];
  276.     [encoder encodeObject:selectedBackgroundColor];
  277.     [encoder encodeConditionalObject:delegate];
  278.     [encoder encodeConditionalObject:dataDelegate];
  279.     [encoder encodeConditionalObject:target];
  280.     [encoder encodeConditionalObject:doubleTarget];
  281.     [self writeSelector:action encoder:encoder];
  282.     [self writeSelector:doubleAction encoder:encoder];
  283.     [encoder encodeObject:[self cornerTitle]];
  284.     }
  285.  
  286.  
  287. //-----------------------------------------------------------------------------
  288. // - writeBorder:encoder:
  289. //-----------------------------------------------------------------------------
  290. - (void)writeBorder:(MiscBorderInfo*)p encoder:(NSCoder*)encoder
  291.     {
  292.     [encoder encodeObject:p->sort_vector];
  293.     [encoder encodeValueOfObjCType:@encode(BOOL) at:&(p->isOn)];
  294.     [encoder encodeValueOfObjCType:@encode(BOOL) at:&(p->autoSort)];
  295.     p->border->encodeWithCoder( encoder );
  296.     }
  297.  
  298.  
  299. //-----------------------------------------------------------------------------
  300. // - writeCells:
  301. //-----------------------------------------------------------------------------
  302. - (void)writeCells:(NSCoder*)encoder
  303.     {
  304.     [encoder encodeValueOfObjCType:@encode(int) at:&num_cols];
  305.     [encoder encodeValueOfObjCType:@encode(int) at:&num_rows];
  306.     if (!lazy)
  307.     for (int r = 0;     r < num_rows;    r++)
  308.         for (int c = 0;  c < num_cols;  c++)
  309.         [encoder encodeObject:[self cellAtRow:r column:c]];
  310.     }
  311.  
  312.  
  313. //-----------------------------------------------------------------------------
  314. // - encodeWithCoder:
  315. //-----------------------------------------------------------------------------
  316. - (void)encodeWithCoder:(NSCoder*)encoder
  317.     {
  318.     // Ensure that subviews are NOT archived.
  319.     if (colInfo.isOn)    [colInfo.clip removeFromSuperview];
  320.     if (rowInfo.isOn)    [rowInfo.clip removeFromSuperview];
  321.     if (rowInfo.isOn && colInfo.isOn) [cornerView removeFromSuperview];
  322.     [tableView removeFromSuperview];
  323.  
  324.     [self superEncodeWithCoder:encoder];
  325.     [self writeGlobalInfo:encoder];
  326.     [self writeBorder:&colInfo encoder:encoder];
  327.     [self writeBorder:&rowInfo encoder:encoder];
  328.     [self writeCells:encoder];
  329.  
  330.     // Restore state.
  331.     [self setDocumentView:tableView];
  332.     if (colInfo.isOn)    [self addSubview:colInfo.clip];
  333.     if (rowInfo.isOn)    [self addSubview:rowInfo.clip];
  334.     if (rowInfo.isOn && colInfo.isOn) [self addSubview:cornerView];
  335.     }
  336.  
  337. @end
  338.