ftp.nice.ch/pub/next/database/apps/Comics.1.0.m.NIS.tar.gz#/Comics.m.NIS/Source/Browser.subproj/BrowserController.m

This is BrowserController.m in view mode; [Download] [Up]

/*
 File:       BrowserController.m

 Contains:   Source code for the Controller of the "Browser" window

 Written by: Eric Simenel

 Created:    May 1997

 Copyright:  (c)1997 by Apple Computer, Inc., all rights reserved.

 Change History (most recent first):

 You may incorporate this sample code into your applications without
 restriction, though the sample code has been provided "AS IS" and the
 responsibility for its operation is 100% yours.  However, what you are
 not permitted to do is to redistribute the source as "DSC Sample Code"
 after having made changes. If you're going to re-distribute the source,
 we require that you make it clear in the source that the code was
 descended from Apple Sample Code, but that you've made changes.
*/

#import "BrowserController.h"
#import "ComicsObj.h"

@implementation BrowserController

- (id)init
{
    if (self = [super init])
      {
        // the browser lies in a subproject, so let's get its nib
        if (![NSBundle loadNibNamed:@"Browser" owner:self])
          {
            NSLog(@"Unable to load Browser.nib");
            [self release];
            return nil;
          }
        // I have a lttle less than 1500 titles currently, hence the following capacity...
        array = [[NSMutableArray alloc] initWithCapacity:1500];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(comicsChanged:) name:ComicsDidChangeNotification object:nil];
      }
    return self;
}
- (void)comicsChanged:(NSNotification *)note
{
    [browser loadColumnZero];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:ComicsDidChangeNotification object:nil];
    [array release];
    [super dealloc];
}

- (void)awakeFromNib
{
#if debug
    NSLog(@"in BrowserController:awakeFromNib");
#endif

    // classic initialization, we load the first column
    [browser loadColumnZero];

    // set up the browser the way I like
    [browser setMinColumnWidth:100];
    [browser setMaxVisibleColumns:5];
    [browser setSeparatesColumns:NO];

    // let's show the window
    [[browser window] makeKeyAndOrderFront:nil];
    
#if debug
    NSLog(@"end of BrowserController:awakeFromNib");
#endif
}

// Unlike numberOfRowsInTableView which is called a zillion times, numberOfRowsInColumn is only being called once
// only when the user clicked on a cell in the previous column and the browser wants to display the content of the
// current column. This means that we can (and should) do the whole preparation of the column and computation of its
// number of rows in this method. In this case, the call to sortArray for the 5th column.

- (int)browser:(NSBrowser *)sender numberOfRowsInColumn:(int)column
{
    short brand, series, state, kind;

    // the first 4 colummns have all only 3 cells
    if (column < 4) return 3;

    // if not, let's see what the user has currently selected in the first colums
    brand = [sender selectedRowInColumn:0];
    series = [sender selectedRowInColumn:1];
    state = [sender selectedRowInColumn:2];
    kind = [sender selectedRowInColumn:3];

#if debug
    NSLog(@"column 4, brand= %d, series= %d, state= %d, kind= %d", brand, series, state, kind);
#endif

    // so that we can retrieve the appropriate titles (we don't care for sorting in this browser
    [comicsBase sortArray:array withBrand:brand withSeries:series withKind:kind withState:state withSort:0];
    return [array count];
}

- (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(int)row column:(int)column
{
    switch(column)
      {
        case 0: switch(row)
          {
            case 0: [cell setStringValue:@"All Brands"]; break;
            case 1: [cell setStringValue:@"Marvel"]; break;
            case 2: [cell setStringValue:@"DC & Others"]; break;
          } break;
        case 1: switch(row)
          {
            case 0: [cell setStringValue:@"All Series"]; break;
            case 1: [cell setStringValue:@"Long"]; break;
            case 2: [cell setStringValue:@"Mini"]; break;
          } break;
        case 2: switch(row)
          {
            case 0: [cell setStringValue:@"All States"]; break;
            case 1: [cell setStringValue:@"Dead"]; break;
            case 2: [cell setStringValue:@"Live"]; break;
          } break;
        case 3: switch(row)
          {
            case 0: [cell setStringValue:@"All Kinds"]; break;
            case 1: [cell setStringValue:@"Main"]; break;
            case 2: [cell setStringValue:@"Dual"]; break;
          } break;
        case 4:
            [cell setStringValue:[[array objectAtIndex:row] title]];
            break;
      }
    
    // the 5th column is the last
    [cell setLeaf:(column == 4)];

    // this means this cell is ready for display
    [cell setLoaded: YES];
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.