This is AppController.m in view mode; [Download] [Up]
#import "AppController.h"
#import "MorphDocument.h"
#import "XMovieDocument.h"
#import "InspectorController.h"
static NSString *curDirectory = nil; /* Directory for open panel */
@implementation AppController
- init
{
self = [super init];
documentClasses = [[NSMutableArray allocWithZone:[self zone]] initWithCapacity:3];
[documentClasses addObject:[MorphDocument class]];
[documentClasses addObject:[XMovieDocument class]];
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
if ([[NSApplication sharedApplication] mainWindow] == nil)
[self newDocument:nil];
}
- (void)dealloc
{
[[NSUserDefaults standardUserDefaults] synchronize];
[documentClasses release];
if ( infoPanel )
[infoPanel release];
if ( preferencesPanel )
[preferencesPanel release];
[super dealloc];
}
- (NSArray *) documentClasses
{
return documentClasses;
}
- (void) registerDocumentClass:(Class) class
{
[documentClasses addObject:documentClasses];
}
- (void)showInfoPanel:sender
{
if (!infoPanel)
[NSBundle loadNibNamed:@"Info.nib" owner:self];
[infoPanel makeKeyAndOrderFront:self];
}
- (void)showInspectorPanel:sender
{
InspectorController *insp = [InspectorController sharedInspectorController];
[[insp panel] orderFront:nil];
[insp revert:nil];
}
- (void)showPreferencesPanel:sender
{
if (!preferencesPanel)
[NSBundle loadNibNamed:@"Preferences.nib" owner:self];
[preferencesPanel makeKeyAndOrderFront:self];
}
- (void) newDocument:sender
{
Document *newDocument = nil;
if ([documentClasses count] > 0)
newDocument = [[[documentClasses objectAtIndex:0] allocWithZone:[self zone]] init];
[newDocument show];
}
- (void)openDocument:sender
{
Document *newDocument;
NSOpenPanel *openPanel;
NSArray *filenames;
int i, count;
int fileNum, classNum;
NSMutableSet *fileTypes;
NSString *fileType;
openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:YES];
[openPanel setAllowsMultipleSelection:YES];
if ( curDirectory != nil )
[openPanel setDirectory:curDirectory];
fileTypes = [NSMutableSet setWithCapacity:10];
for (classNum = 0; classNum < [documentClasses count]; ++classNum)
[fileTypes unionSet:[[documentClasses objectAtIndex:classNum] readableFileTypes]];
i = [openPanel runModalForTypes:[fileTypes allObjects]];
if ( i != NSOKButton )
return;
filenames = [openPanel filenames];
count = [filenames count];
for ( fileNum = 0; fileNum < count; ++fileNum )
{
newDocument = nil;
fileType = [[filenames objectAtIndex:fileNum] pathExtension];
for (classNum = 0; newDocument == nil && classNum < [documentClasses count]; ++classNum)
{
if ([[[documentClasses objectAtIndex:classNum] readableFileTypes] containsObject:fileType])
newDocument = [[[documentClasses objectAtIndex:classNum] alloc] initWithContentsOfFile:[filenames objectAtIndex:fileNum]];
}
[newDocument show];
}
// Keep track of the 'current directory'
[curDirectory autorelease];
curDirectory = [[[filenames objectAtIndex:(count - 1)]
stringByDeletingLastPathComponent] copy];
}
/* NSApplication delegate methods */
- (BOOL)application:(NSApplication *)application
openFile:(NSString *)filename
{
Document *newDocument = nil;
int classNum;
NSString *fileType = [filename pathExtension];
for (classNum = 0; newDocument == nil && classNum < [documentClasses count]; ++classNum)
{
if ([[[documentClasses objectAtIndex:classNum] readableFileTypes] containsObject:fileType])
newDocument = [[[documentClasses objectAtIndex:classNum] alloc] initWithContentsOfFile:filename];
}
if ( newDocument == nil )
{
return NO;
}
[newDocument show];
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.