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.