home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / YellowBox / Kits / MiscTableScroll-138.1 / Palettes / MiscTableScroll / Framework / MiscTableBorderIO.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-31  |  14.1 KB  |  443 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. // MiscTableBorderIO.cc
  17. //
  18. //    Read/write routines for the MiscTableBorder class.
  19. //
  20. //-----------------------------------------------------------------------------
  21. //-----------------------------------------------------------------------------
  22. // $Id: MiscTableBorderIO.cc,v 1.4 98/03/22 13:18:47 sunshine Exp $
  23. // $Log:    MiscTableBorderIO.cc,v $
  24. // Revision 1.4  98/03/22  13:18:47  sunshine
  25. // v133.1: Combined sort-dir and sort-type.  Eliminated data-sizing entirely.
  26. // Eliminated constrain-max functionality.  Added min/max uniform size.
  27. // Now passes the version to read().  New storage layout.
  28. // 
  29. // Revision 1.3  97/11/24  04:35:18  sunshine
  30. // v132.1: Ported back to OPENSTEP 4.1 by including MiscTableScrollPrivate.h
  31. // which defines __PRETTY_FUNCTION__ on that release.
  32. //-----------------------------------------------------------------------------
  33. #include "MiscTableBorder.h"
  34. #include "MiscTableScrollPrivate.h"
  35. #include "MiscTableUtil.h"
  36.  
  37.  
  38. //-----------------------------------------------------------------------------
  39. // decode_bool
  40. //-----------------------------------------------------------------------------
  41. static inline bool decode_bool( NSCoder* coder )
  42.     {
  43.     char c;
  44.     [coder decodeValueOfObjCType:@encode(char) at:&c];
  45.     return bool(c);
  46.     }
  47.  
  48.  
  49. //-----------------------------------------------------------------------------
  50. // encode_bool
  51. //-----------------------------------------------------------------------------
  52. static inline void encode_bool( NSCoder* coder, bool b )
  53.     {
  54.     char const c = b;
  55.     [coder encodeValueOfObjCType:@encode(char) at:&c];
  56.     }
  57.  
  58.  
  59. //-----------------------------------------------------------------------------
  60. // decode_string
  61. //-----------------------------------------------------------------------------
  62. static NSString* decode_string( NSCoder* coder, bool isCString )
  63.     {
  64.     NSString* s = @"";
  65.     if (!isCString)
  66.     s = [coder decodeObject];
  67.     else
  68.     {
  69.     char* cstr = 0;
  70.     [coder decodeValueOfObjCType:@encode(char*) at:&cstr];
  71.     if (cstr != 0)
  72.         {
  73.         s = [NSString stringWithCString:cstr];
  74.         NSZoneFree( [coder objectZone], cstr );
  75.         }
  76.     }
  77.     return s;
  78.     }
  79.  
  80.  
  81. //-----------------------------------------------------------------------------
  82. // decode_strings
  83. //-----------------------------------------------------------------------------
  84. static void decode_strings( NSCoder* coder, NSString** strings, int n )
  85.     {
  86.     for (int i = 0; i < n; i++)
  87.     strings[i] = [[coder decodeObject] retain];
  88.     }
  89.  
  90.  
  91. //-----------------------------------------------------------------------------
  92. // decode_c_string_array
  93. //-----------------------------------------------------------------------------
  94. static void decode_c_string_array( NSCoder* coder, NSString** strings, int n )
  95.     {
  96.     NSZone* const z = [coder objectZone];
  97.     char** cstrings = (char**)malloc( sizeof(char*) * n );
  98.     [coder decodeArrayOfObjCType:@encode(char*) count:n at:cstrings];
  99.     for (int i = 0; i < n; i++)
  100.     {
  101.     strings[i] = [[NSString allocWithZone:z] initWithCString:cstrings[i]];
  102.     NSZoneFree( z, cstrings[i] );
  103.     }
  104.     free( cstrings );
  105.     }
  106.  
  107.  
  108. //-----------------------------------------------------------------------------
  109. // MiscTableSlot::encodeWithCoder
  110. //-----------------------------------------------------------------------------
  111. void MiscTableSlot::encodeWithCoder( NSCoder* coder )
  112.     {
  113.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&size];
  114.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&min_size];
  115.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&max_size];
  116.     [coder encodeValueOfObjCType:@encode(MiscTableSizing) at:&sizing];
  117.     }
  118.  
  119.  
  120. //-----------------------------------------------------------------------------
  121. // encodeWithCoder
  122. //-----------------------------------------------------------------------------
  123. void MiscTableBorder::encodeWithCoder( NSCoder* coder )
  124.     {
  125.     int i;
  126.     register unsigned int m = 0;
  127.     m = (m << 1) | (prototypes != 0);
  128.     m = (m << 1) | (titles != 0);
  129.     m = (m << 1) | (styles != 0);
  130.     m = (m << 1) | (tags != 0);
  131.     m = (m << 1) | (sort_info != 0);
  132.     m = (m << 1) | (p2v != 0);
  133.     m = (m << 1) | (slots != 0);
  134.     m = (m << 1) | (modifier_drag != 0);
  135.     m = (m << 1) | (draggable != 0);
  136.     m = (m << 1) | (sizeable != 0);
  137.     m = (m << 1) | (selectable != 0);
  138.     m = (m << 1) | (type != 0);
  139.  
  140.     unsigned int const mbuff = m;
  141.     [coder encodeValueOfObjCType:@encode(unsigned int) at:&mbuff];
  142.     [coder encodeConditionalObject:owner];
  143.     def_slot.encodeWithCoder( coder );
  144.     [coder encodeValueOfObjCType:@encode(MiscTableCellStyle) at:&def_style];
  145.     [coder encodeValueOfObjCType:@encode(int) at:&def_tag];
  146.     [coder encodeValueOfObjCType:@encode(MiscTableTitleMode) at:&title_mode];
  147.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&min_uniform_size];
  148.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&max_uniform_size];
  149.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&uniform_size];
  150.     [coder encodeValueOfObjCType:@encode(MiscPixels) at:&min_total_size];
  151.     [coder encodeValueOfObjCType:@encode(int) at:&num_springy];
  152.     [coder encodeValueOfObjCType:@encode(int) at:&num_slots];
  153.  
  154.     if (slots != 0)
  155.     for (i = 0; i < num_slots; i++)
  156.         slots[i].encodeWithCoder(coder);
  157.  
  158.     if (p2v != 0)
  159.     [coder encodeArrayOfObjCType:@encode(MiscCoord_V)
  160.         count:num_slots at:p2v];
  161.  
  162.     if (sort_info != 0)
  163.     [coder encodeArrayOfObjCType:@encode(int)
  164.         count:num_slots at:sort_info];
  165.  
  166.     if (tags != 0)
  167.     [coder encodeArrayOfObjCType:@encode(int) count:num_slots at:tags];
  168.  
  169.     if (styles != 0)
  170.     [coder encodeArrayOfObjCType:@encode(MiscTableCellStyle)
  171.         count:num_slots at:styles];
  172.  
  173.     if (titles != 0)
  174.     for (i = 0; i < num_slots; i++)
  175.         [coder encodeObject:titles[i]];
  176.  
  177.     if (prototypes != 0)
  178.     for (i = 0; i < num_slots; i++)
  179.         [coder encodeObject:prototypes[i]];
  180.     }
  181.  
  182.  
  183. //-----------------------------------------------------------------------------
  184. // initWithCoder
  185. //-----------------------------------------------------------------------------
  186. void MiscTableBorder::initWithCoder( NSCoder* coder, int ver )
  187.     {
  188.     if (ver < MISC_TS_VERSION_2 || (ver >= MISC_TS_VERSION_1000 &&
  189.     ver < MISC_TS_VERSION_1002))
  190.     initWithCoder_v1( coder, ver );
  191.     else
  192.     initWithCoder_v2( coder, ver );
  193.     }
  194.  
  195.  
  196. //-----------------------------------------------------------------------------
  197. // MiscTableSlot::initWithCoder
  198. //-----------------------------------------------------------------------------
  199. void MiscTableSlot::initWithCoder( NSCoder* coder, int ver )
  200.     {
  201.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&size];
  202.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&min_size];
  203.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&max_size];
  204.     if (ver < MISC_TS_VERSION_2 || (ver >= MISC_TS_VERSION_1000 &&
  205.     ver < MISC_TS_VERSION_1002))
  206.     {
  207.     MiscPixels data_size;
  208.     unsigned int x;
  209.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&data_size];
  210.     [coder decodeValueOfObjCType:@encode(MiscTableSizing) at:&x];
  211.     sizing = MiscTableSizing( (x & 1) | ((x & 4) >> 1) );
  212.     }
  213.     else
  214.     [coder decodeValueOfObjCType:@encode(MiscTableSizing) at:&sizing];
  215.     MISC_ENUM_CHECK( sizing, MISC_MAX_SIZING );
  216.     offset = 0;
  217.     adj_size = size;
  218.     }
  219.  
  220.  
  221. //-----------------------------------------------------------------------------
  222. // initWithCoder_v2
  223. //-----------------------------------------------------------------------------
  224. void MiscTableBorder::initWithCoder_v2( NSCoder* coder, int ver )
  225.     {
  226.     emptyAndFree();
  227.  
  228.     sort_funcs = 0;    // Can't archive function addresses.
  229.  
  230.     unsigned int mbuff;
  231.     [coder decodeValueOfObjCType:@encode(unsigned int) at:&mbuff];
  232.     register unsigned int m = mbuff;
  233.  
  234.     type    = MiscBorderType( m & 1 );
  235.     selectable    = bool((m >>= 1) & 1);
  236.     sizeable    = bool((m >>= 1) & 1);
  237.     draggable    = bool((m >>= 1) & 1);
  238.     modifier_drag = bool((m >>= 1) & 1);
  239.  
  240.     owner = [coder decodeObject];
  241.     def_slot.initWithCoder( coder, ver );
  242.     [coder decodeValueOfObjCType:@encode(MiscTableCellStyle) at:&def_style];
  243.     [coder decodeValueOfObjCType:@encode(int) at:&def_tag];
  244.     [coder decodeValueOfObjCType:@encode(MiscTableTitleMode) at:&title_mode];
  245.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&min_uniform_size];
  246.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&max_uniform_size];
  247.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&uniform_size];
  248.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&min_total_size];
  249.     [coder decodeValueOfObjCType:@encode(int) at:&num_springy];
  250.     [coder decodeValueOfObjCType:@encode(int) at:&num_slots];
  251.     max_slots = num_slots;
  252.  
  253.     if ((m >>= 1) & 1)
  254.     {
  255.     alloc_slots();
  256.     for (int i = 0; i < num_slots; i++)
  257.         slots[i].initWithCoder( coder, ver );
  258.     }
  259.  
  260.     if ((m >>= 1) & 1)
  261.     {
  262.     alloc_vmap();
  263.     [coder decodeArrayOfObjCType:@encode(MiscCoord_V)
  264.         count:num_slots at:p2v];
  265.     for (int i = 0; i < num_slots; i++)
  266.         v2p[ p2v[i] ] = i;
  267.     }
  268.  
  269.     if ((m >>= 1) & 1)
  270.     {
  271.     alloc_sort_info();
  272.     [coder decodeArrayOfObjCType:@encode(int)
  273.         count:num_slots at:sort_info];
  274.     }
  275.  
  276.     if ((m >>= 1) & 1)
  277.     {
  278.     alloc_tags();
  279.     [coder decodeArrayOfObjCType:@encode(int) count:num_slots at:tags];
  280.     }
  281.  
  282.     if ((m >>= 1) & 1)
  283.     {
  284.     alloc_styles();
  285.     [coder decodeArrayOfObjCType:@encode(MiscTableCellStyle)
  286.         count:num_slots at:styles];
  287.     }
  288.  
  289.     if ((m >>= 1) & 1)
  290.     {
  291.     alloc_titles();
  292.     if (ver < MISC_TS_VERSION_1000)
  293.         decode_c_string_array( coder, titles, num_slots );
  294.     else
  295.         decode_strings( coder, titles, num_slots );
  296.     }
  297.  
  298.     if ((m >>= 1) & 1)
  299.     {
  300.     alloc_prototypes();
  301.     for (int i = 0;     i < num_slots;     i++)
  302.         prototypes[i] = [[coder decodeObject] retain];
  303.     }
  304.  
  305.     needs_recalc = true;
  306.     }
  307.  
  308.  
  309. //-----------------------------------------------------------------------------
  310. // initWithCoder_v1
  311. //-----------------------------------------------------------------------------
  312. void MiscTableBorder::initWithCoder_v1( NSCoder* coder, int ver )
  313.     {
  314.     int n;
  315.     emptyAndFree();
  316.  
  317.     [coder decodeValueOfObjCType:@encode(MiscBorderType) at:&type];
  318.     MISC_ENUM_CHECK( type, MISC_MAX_BORDER );
  319.     owner = [coder decodeObject];
  320.     def_slot.initWithCoder( coder, ver );
  321.     [coder decodeValueOfObjCType:@encode(int) at:&num_slots];
  322.     max_slots = num_slots;
  323.  
  324.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  325.     if (n != 0)
  326.     {
  327.     alloc_slots();
  328.     for (int i = 0;     i < num_slots;     i++)
  329.         slots[i].initWithCoder( coder, ver );
  330.     }
  331.  
  332.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  333.     if (n != 0)
  334.     {
  335.     alloc_vmap();
  336.     for (int i = 0;     i < num_slots;     i++)
  337.         [coder decodeValueOfObjCType:@encode(MiscCoord_P) at:&(v2p[i])];
  338.     for (int j = 0;     j < num_slots;     j++)
  339.         [coder decodeValueOfObjCType:@encode(MiscCoord_V) at:&(p2v[j])];
  340.     }
  341.  
  342.     [coder decodeValueOfObjCType:@encode(int) at:&def_tag];
  343.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  344.     if (n != 0)
  345.     {
  346.     alloc_tags();
  347.     for (int i = 0;     i < num_slots;     i++)
  348.         {
  349.         int const j = visualToPhysical(i);
  350.         [coder decodeValueOfObjCType:@encode(int) at:&(tags[j])];
  351.         }
  352.     }
  353.  
  354.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&uniform_size];
  355.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&min_total_size];
  356.     MiscPixels max_total_size;    // obsolete.
  357.     [coder decodeValueOfObjCType:@encode(MiscPixels) at:&max_total_size];
  358.     [coder decodeValueOfObjCType:@encode(int) at:&num_springy];
  359.     [coder decodeValueOfObjCType:@encode(MiscTableTitleMode) at:&title_mode];
  360.     MISC_ENUM_CHECK( title_mode, MISC_MAX_TITLE );
  361.  
  362.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  363.     if (n != 0)
  364.     {
  365.     bool const isCString = (ver < MISC_TS_VERSION_1000);
  366.     alloc_titles();
  367.     for (int i = 0;     i < num_slots;     i++)
  368.         {
  369.         int const j = visualToPhysical(i);
  370.         titles[j] = [decode_string( coder, isCString ) retain];
  371.         }
  372.     }
  373.  
  374.     [coder decodeValueOfObjCType:@encode(MiscTableCellStyle) at:&def_style];
  375.     MISC_ENUM_CHECK( def_style, MISC_TABLE_CELL_MAX );
  376.  
  377.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  378.     if (n != 0)
  379.     {
  380.     alloc_styles();
  381.     for (int i = 0;     i < num_slots;     i++)
  382.         {
  383.         int const j = visualToPhysical(i);
  384.         [coder decodeValueOfObjCType:@encode(MiscTableCellStyle)
  385.         at:&(styles[j])];
  386.         MISC_ENUM_CHECK( styles[i], MISC_TABLE_CELL_MAX );
  387.         }
  388.     }
  389.  
  390.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  391.     if (n != 0)
  392.     {
  393.     alloc_prototypes();
  394.     for (int i = 0;     i < num_slots;     i++)
  395.         {
  396.         int const j = visualToPhysical(i);
  397.         prototypes[j] = [[coder decodeObject] retain];
  398.         }
  399.     }
  400.  
  401.     sort_funcs = 0;    // Can't archive function addresses.
  402.  
  403.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  404.     if (n != 0)
  405.     {
  406.     alloc_sort_info();
  407.     for (int i = 0;     i < num_slots;     i++)
  408.         {
  409.         int const j = visualToPhysical(i);
  410.         MiscSortDirection x;
  411.         [coder decodeValueOfObjCType:@encode(MiscSortDirection) at:&x];
  412.         MISC_ENUM_CHECK( x, MISC_SORT_DIR_MAX );
  413.         int const z = sort_info[j];
  414.         sort_info[j] = ((z & ~1) | (x & 1));
  415.         }
  416.     }
  417.  
  418.     [coder decodeValueOfObjCType:@encode(int) at:&n];
  419.     if (n != 0)
  420.     {
  421.     if (sort_info == 0)
  422.         alloc_sort_info();
  423.     for (int i = 0;     i < num_slots;     i++)
  424.         {
  425.         int const j = visualToPhysical(i);
  426.         MiscSortType x;
  427.         [coder decodeValueOfObjCType:@encode(MiscSortType) at:&x];
  428.         MISC_ENUM_CHECK( x, MISC_SORT_TYPE_MAX );
  429.         int const z = sort_info[j];
  430.         sort_info[j] = ((x << 1) | (z & 1));
  431.         }
  432.     }
  433.  
  434.     selectable      = decode_bool( coder );
  435.     sizeable      = decode_bool( coder );
  436.     draggable      = decode_bool( coder );
  437.     modifier_drag = decode_bool( coder );
  438.  
  439.     min_uniform_size = MISC_MIN_PIXELS_SIZE;
  440.     max_uniform_size = MISC_MAX_PIXELS_SIZE;
  441.     needs_recalc = true;
  442.     }
  443.