home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / EODEV.Z / EOBrowserAssociation.m < prev    next >
Encoding:
Text File  |  1996-08-23  |  6.3 KB  |  235 lines

  1. /*
  2.         Copyright (c) 1996, NeXT Software, Inc.
  3.         All rights reserved.
  4.  
  5.         You may freely copy, distribute and reuse the code in this example.
  6.         NeXT disclaims any warranty of any kind, expressed or implied,
  7.         as to its fitness for any particular use.
  8. */
  9. #import <EOInterface/EOInterface.h>
  10. #import <EOExtensions/EOBrowserAssociation.h>
  11.  
  12. #define NOF_SUPPORTED_LEVELS   8
  13. #define SUPPRESS_AUTOSELECTION YES
  14.  
  15. static NSString *EOName1         = @"key1";
  16. static NSString *EOName2         = @"key2";
  17. static NSString *EOName3         = @"key3";
  18. static NSString *EOName4         = @"key4";
  19. static NSString *EOName5         = @"key5";
  20. static NSString *EOName6         = @"key6";
  21. static NSString *EOName7         = @"key7";
  22. static NSString *EOName8         = @"key8";
  23. static NSString *EOEnabledAspect    = @"enabled";
  24.  
  25. @implementation EOBrowserAssociation
  26.  
  27. + (NSString *)displayName {
  28.     return @"EOBrowserAssoc";
  29. }
  30.  
  31. + (BOOL)isUsableWithObject:(id)object
  32. {
  33.     return [object isKindOfClass:[NSBrowser class]];
  34. }
  35.  
  36. + (NSArray *)aspects
  37. {
  38.     static NSArray *array = nil;
  39.  
  40.     if (!array)
  41.         array = [[NSArray alloc] initWithObjects:EOName1, EOName2, EOName3, EOName4, EOName5, EOName6, EOName7, EOName8, EOEnabledAspect, nil];
  42.  
  43.     return array;
  44. }
  45.  
  46. + (NSArray *)aspectSignatures
  47. {
  48.     static NSArray *array = nil;
  49.     if (!array)
  50.         array = [[NSArray alloc] initWithObjects:@"A", @"A", @"A", @"A", @"A", @"A", @"A", @"A", @"A", nil];
  51.     return array;
  52. }
  53.  
  54. + (NSString *)primaryAspect {
  55.     return EOName1;
  56. }
  57.  
  58. + (NSArray *)objectKeysTaken {
  59.     static NSArray *array = nil;
  60.  
  61.     if (!array)
  62.         array = [[NSArray alloc] initWithObjects:@"target", nil];
  63.  
  64.     return array;
  65. }
  66.  
  67. + (NSArray *)associationClassesSuperseded
  68. {
  69.     return [NSArray arrayWithObject:[EOControlAssociation class]];
  70. }
  71.  
  72. - (NSString *)nameOfAspectForColumn:(int)column
  73. {
  74.     if (column >= NOF_SUPPORTED_LEVELS)
  75.         return nil;
  76.  
  77.     return [NSString stringWithFormat:@"key%d", column+1];
  78. }
  79.  
  80. - (EODisplayGroup *)displayGroupForColumn:(int)column
  81. {
  82.     NSString *aspectName = [self nameOfAspectForColumn:column];
  83.  
  84.     if (column >= NOF_SUPPORTED_LEVELS)
  85.         return nil;
  86.  
  87.     return [self displayGroupForAspect:aspectName];
  88. }
  89.  
  90. - (BOOL)suppressAutoSelection
  91. {
  92.     return flags.suppressAutoSelection;
  93. }
  94.  
  95. - (void)setSuppressAutoSelection:(BOOL)flag
  96. {
  97.     flags.suppressAutoSelection = flag;
  98.  
  99.     if (flag) {
  100.         EODisplayGroup *displayGroup;
  101.         int            column = 0;
  102.  
  103.         while (displayGroup = [self displayGroupForColumn:column]) {
  104.             [displayGroup setSelectsFirstObjectAfterFetch:NO];
  105.             column++;
  106.         }
  107.     }   
  108. }
  109.  
  110. - initWithObject:object            
  111.     // this is the designated initializer 
  112. {
  113.     [super initWithObject:object];
  114.     flags.suppressAutoSelection = SUPPRESS_AUTOSELECTION;
  115.  
  116.     return self;
  117. }
  118.  
  119. - (void)establishConnection
  120. {
  121.     NSBrowser *browser = [self object];
  122.  
  123.     [super establishConnection];
  124.  
  125.     [browser setTarget:self];
  126.     [browser setAction:@selector(controlActed:)];
  127.     [browser setDelegate:self];
  128.     [browser setTitle:@"" ofColumn:0];
  129.     
  130.     // we don't have archiving
  131.     [self setSuppressAutoSelection:[self suppressAutoSelection]];
  132. }
  133.  
  134. - (int)browser:(NSBrowser *)sender numberOfRowsInColumn:(int)column
  135. {
  136.     EODisplayGroup *displayGroup  = [self displayGroupForColumn:column];
  137.  
  138.     if (displayGroup)
  139.         return [[displayGroup displayedObjects] count];
  140.     else
  141.         return 0;
  142. }
  143.  
  144. - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(int)row column:(int)column
  145. {
  146.     NSString         *nameOfAspect = [self nameOfAspectForColumn:column];
  147.     NSString        *detailKey = @"";
  148.     EODetailDataSource  *detailDataSource;
  149.     NSArray             *objectList =  [[self displayGroupForColumn:column] displayedObjects];
  150.  
  151.     if ([[[self displayGroupForColumn:column+1] dataSource] isKindOfClass:[EODetailDataSource class]]) {
  152.         detailDataSource = (EODetailDataSource *)[[self displayGroupForColumn:column+1] dataSource];
  153.         detailKey = [detailDataSource detailKey];
  154.     }
  155.  
  156.     [cell setStringValue:[self valueForAspect:nameOfAspect atIndex:row]];
  157.     if ([detailKey isEqual:@""])
  158.         [cell setLeaf:YES];
  159.     else {
  160.         id valueForDetailKey = [[objectList objectAtIndex:row] valueForKey:detailKey];
  161.  
  162.         if ([valueForDetailKey isKindOfClass:[NSArray class]]) {
  163.             if ([[[objectList objectAtIndex:row] valueForKey:detailKey] count] > 0)
  164.                 [cell setLeaf:NO];
  165.             else
  166.                 [cell setLeaf:YES];
  167.         } else if (valueForDetailKey)
  168.             [cell setLeaf:NO];
  169.     }
  170. }
  171.  
  172. - (NSString *)pathOfDisplayGroupSelection
  173. {
  174.     NSMutableString     *path = [NSMutableString stringWithString:@""];
  175.     EODisplayGroup     *displayGroup;
  176.     int         column = 0;
  177.  
  178.     while (displayGroup = [self displayGroupForColumn:column]) {
  179.         if ([[displayGroup displayedObjects] count]) {
  180.             NSString *part = [self valueForAspect:[self nameOfAspectForColumn:column]];
  181.  
  182.             if ([part length] > 0) {
  183.                 [path appendFormat:@"/%@", part];
  184.             }
  185.         } else {
  186.             column = NOF_SUPPORTED_LEVELS;
  187.         }
  188.         column++;
  189.     }
  190.     if ([path length] == 0) 
  191.         [path appendString:@"/"];
  192.  
  193.     return path;
  194. }
  195.  
  196. - (void)controlActed:(id)sender
  197. {
  198.     EODisplayGroup *affectedDisplayGroup  = [self displayGroupForColumn:[sender selectedColumn]];
  199.     EODisplayGroup *displayGroup;
  200.     NSNumber       *number = [NSNumber numberWithInt:[sender selectedRowInColumn:[sender selectedColumn]]];
  201.     int        column = [sender selectedColumn]+1;
  202.  
  203.     [affectedDisplayGroup setSelectionIndexes:[NSArray arrayWithObject:number]];
  204.     while (displayGroup = [self displayGroupForColumn:column]) {
  205.         [displayGroup clearSelection];
  206.         column++;
  207.     }
  208. }
  209.  
  210. - (void)subjectChanged // change in the displaygroups so update browser
  211. {
  212.     BOOL      enabled = NO;
  213.     NSBrowser *browser = [self object];
  214.     NSString  *path;
  215.     
  216.     if (![browser isKindOfClass:[NSBrowser class]])
  217.         return;
  218.     path = [self pathOfDisplayGroupSelection];
  219.  
  220.     [browser loadColumnZero];
  221.     if ([path length] > 0)
  222.         [browser setPath:path];
  223.     
  224.     // enabling/disabling
  225.     if (![path isEqual:@""]) { // do we have something to show?
  226.         id enabledVal = [self valueForAspect:EOEnabledAspect];
  227.  
  228.         enabled = (!enabledVal || ([enabledVal intValue] != 0));
  229.     }
  230.     if (enabled != [browser isEnabled])
  231.         [browser setEnabled:enabled];
  232. }
  233.  
  234. @end
  235.