home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1995 August / NEBULA.bin / SourceCode / Palettes / TTools / TToolsPalette / SwitchView.subproj / SwitchView.m < prev    next >
Encoding:
Text File  |  1993-11-09  |  3.2 KB  |  194 lines

  1. /* SwitchView.m
  2.  * Written By:  Thomas Burkholder
  3.  *
  4.  * You may freely copy, distribute, and reuse the code in this example.
  5.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  6.  * fitness for any particular use.
  7.  */
  8.  
  9.  
  10. #import "SwitchView.h"
  11. #import <apps/InterfaceBuilder.h>
  12.  
  13. @implementation SwitchView
  14.  
  15. - initFrame:(const NXRect *)frameRect
  16. {
  17.     [super initFrame:frameRect];
  18.     [self setTitle:"SwitchView"];
  19.     views = [[List alloc] init];
  20.     valueSelector = (SEL)0;
  21.     initialViewNumber = 0;
  22.     return self;
  23. }
  24.  
  25. - free
  26. {
  27.     [views free];
  28.     return [super free];
  29. }
  30.  
  31. - awakeFromNib
  32. {
  33.     [[self setContentView:[views objectAt:initialViewNumber]] free];
  34.     return self;
  35. }
  36.  
  37. - views
  38. {
  39.     return views;
  40. }
  41.  
  42. - takeViewNumberFrom:sender
  43. {
  44.     int i;
  45.     id v,old;
  46.     SEL vs;
  47.  
  48.     if (!valueSelector && sender)
  49.         vs = [self guessValueSelectorForSwitchSource:sender];
  50.     else
  51.         vs = valueSelector;
  52.  
  53.     i = (int)[sender perform:vs];
  54.     v = [views objectAt:i];
  55.  
  56.     if (!v) return self;
  57.     old = [self setContentView:v];
  58.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  59.         [old free];
  60.     }
  61.     [self display];
  62.     return self;
  63. }
  64.  
  65. - takeTagFrom:sender
  66. {
  67.     int i;
  68.     id old,v;
  69.  
  70.     i = [sender tag];
  71.     v = [views objectAt:i];
  72.  
  73.     if (!v) return self;
  74.     old = [self setContentView:v];
  75.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  76.         [old free];
  77.     }
  78.     [self display];
  79.     return self;
  80. }
  81.  
  82. - takeIntValueFrom:sender
  83. {
  84.     int i;
  85.     id old,v;
  86.  
  87.     i = [sender intValue];
  88.     v = [views objectAt:i];
  89.  
  90.     if (!v) return self;
  91.     old = [self setContentView:v];
  92.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  93.         [old free];
  94.     }
  95.     [self display];
  96.     return self;
  97. }
  98.  
  99. - takeSelectedRowFrom:sender
  100. {
  101.     int i;
  102.     id old,v;
  103.  
  104.     i = [sender selectedRow];
  105.     v = [views objectAt:i];
  106.  
  107.     if (!v) return self;
  108.     old = [self setContentView:v];
  109.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  110.         [old free];
  111.     }
  112.     [self display];
  113.     return self;
  114. }
  115.  
  116. - takeSelectedColFrom:sender
  117. {
  118.     int i;
  119.     id old,v;
  120.  
  121.     i = [sender selectedCol];
  122.     v = [views objectAt:i];
  123.  
  124.     if (!v) return self;
  125.     old = [self setContentView:v];
  126.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  127.         [old free];
  128.     }
  129.     [self display];
  130.     return self;
  131. }
  132.  
  133.  
  134. - setValueSelector:(SEL)aSelector
  135. {
  136.     valueSelector = aSelector;
  137.     return self;
  138. }
  139.  
  140. - (SEL)valueSelector
  141. {
  142.     return valueSelector;
  143. }
  144.  
  145. - setInitialViewNumber:(int)num
  146. {
  147.     initialViewNumber = num;
  148.     return self;
  149. }
  150.  
  151. - (int)initialViewNumber
  152. {
  153.     return initialViewNumber;
  154. }
  155.  
  156. - (SEL)guessValueSelectorForSwitchSource:sender
  157. {
  158.     if ([sender isKindOf:[Matrix class]]) { int r, c;
  159.         [sender getNumRows:&r numCols:&c];
  160.         if (r >= c)
  161.             return @selector(selectedRow);
  162.         else
  163.             return @selector(selectedCol);
  164.     } else if ([sender respondsTo:@selector(isEditable)] &&
  165.             ([sender isEditable]) &&
  166.             ([sender respondsTo:@selector(intValue)])) {
  167.         return @selector(intValue);
  168.     } else if ([sender isKindOf:[Button class]] ||
  169.                         [sender isKindOf:[ButtonCell class]]) {
  170.         return @selector(tag);
  171.     } else if ([sender respondsTo:@selector(intValue)]) {
  172.         return @selector(intValue);
  173.     } else if ([sender respondsTo:@selector(tag)]) {
  174.         return @selector(tag);
  175.     }
  176.     return (SEL)0;
  177. }
  178.  
  179. - read:(NXTypedStream *)stream
  180. {
  181.     [super read:stream];
  182.     NXReadType(stream,":",&valueSelector);
  183.     views = NXReadObject(stream);
  184.     return self;
  185. }
  186.  
  187. - write:(NXTypedStream *)stream
  188. {
  189.     [super write:stream];
  190.     NXWriteType(stream,":",&valueSelector);
  191.     NXWriteObject(stream,views);
  192.     return self;
  193. }
  194.