This is STAppController.m in view mode; [Download] [Up]
#import "STAppController.h"
#import "STDocumentClass.h"
#import "STMenuCategory.h"
#import "STSwapBoxManager.h"
#import "STDefines.h"
#import "STUtil.h"
#import <foundation/NSAutoreleasePool.h>
#import <foundation/NSException.h>
void MyTopLevelErrorHandler(NXHandler *errorState)
{
char buf[BUFSIZE]="";
if (errorState->code >= NSExceptionBase &&
errorState->code <= NSLastException) {
NSException *exception = (id) errorState->data1;
NSLog(@"%@: %@\n", [exception exceptionName],
[exception exceptionReason]);
sprintf(buf,"%s: %s\n", [[exception exceptionName] cString],
[[exception exceptionReason] cString]);
NXRunAlertPanel("Exception","%s",NULL,NULL,NULL,buf);
}
}
@implementation STAppController
/* ==== init section ==== */
- init
{ [super init];
controllerZone=NXCreateZone(vm_page_size, vm_page_size, YES);
return self;
}
- appWillInit:sender
{
NXSetTopLevelErrorHandler(MyTopLevelErrorHandler);
return self;
}
- appDidInit:sender
{
id w;
docArray=[[NSMutableArray allocWithZone:(NSZone *)controllerZone] init];
docArray=[[NSMutableArray alloc] init];
[self setupMenus:self];
w=[accessoryView window];
[accessoryView removeFromSuperview];
[w free];
if(BoolValueForDefault("NewEmptyDocument"))
[self newDocument:nil];
return self;
}
/* ==== document management section ==== */
- openFile:sender
{
char *filetypes[50];
NSString *str;
NSEnumerator *enm=[[self docExtensions] objectEnumerator];
NSString *name=NULL;
int i;
bzero(filetypes, sizeof filetypes);
for(i=0;((str=[enm nextObject])!=nil) && i<50;i++)
{ filetypes[i]=(char *)[str cString];
}
if(sender)
{ if ([[OpenPanel new] runModalForTypes: filetypes]==NO)
return (self);
else
{ const char *p=[[OpenPanel new] filename];
if(p) name=[NSString stringWithCString:p];
else
{ fprintf(stderr,"Failed to open file");
return self;
}
}
}
if(name) [self openDocument:name];
return self;
}
- documentClass
{ return [STDocumentClass class];
}
- (NSArray *)docExtensions
{ return [NSArray arrayWithObject:@"starter"];
}
- createDocumentObject:sender
{
NSZone *zone;
id doc;
static int documentTag=0;
zone=NSCreateZone(vm_page_size*1024, vm_page_size, YES);
/* allocate a new document object */
doc=[[self documentClass] newDocument];
if(!doc)
{ internalError("Could not allocate document object");
return nil;
}
/* this section opens the document file */
[doc setTag:documentTag++];
[NXApp perform:@selector(updateWindows) with:nil
afterDelay:1 cancelPrevious:YES];
/* this will retain the object */
[docArray addObject:doc];
return doc;
}
- openDocument:(NSString *)aPath
{
id doc;
if(!aPath) return nil;
if((doc=[self findDocWithPath:aPath])!=nil)
{ [[doc window] makeKeyAndOrderFront:nil];
return nil;
}
doc=[self createDocumentObject:self];
if(![doc openDocumentFile:aPath])
{ [[NXApp delegate] perform:@selector(freeDoc:) with:doc
afterDelay:1 cancelPrevious:YES];
return nil;
}
[[doc window] makeKeyAndOrderFront:nil];
return doc;
}
- newDocument:sender
{
NSString *str;
id new;
static int untitledCount=0;
/* if UNTITLED already exist, the new name is UNTITLEDn */
do { str=untitledCount
? [NSString stringWithFormat:@"%s/UNTITLED%d",
NXHomeDirectory(), untitledCount]
: [NSString stringWithFormat:@"%s/UNTITLED",NXHomeDirectory()];
untitledCount++;
} while([self findDocWithPath:str]);
new=[self createDocumentObject:self];
[new setDocumentPath:str];
[new setDocumentName:[str lastPathComponent]];
[[new window] makeKeyAndOrderFront:nil];
[NXApp perform:@selector(updateWindows) with:nil
afterDelay:1 cancelPrevious:YES];
return new;
}
- save:sender;
{
NSString *name=[currentDoc documentName];
NSRange r;
if(!name) return self;
r=[name rangeOfString:@"UNTITLED"];
if(r.location==0)
[self saveAs:sender];
else [currentDoc saveDocument];
return self;
}
- saveAs:sender
{
NSString *str;
id savePanel;
if(!currentDoc) return self;
savePanel=[[[SavePanel new] setDelegate:self] setRequiredFileType:NULL];
[savePanel setAccessoryView:nil];
if ([savePanel runModal])
str=[NSString stringWithCString:[savePanel filename]];
else return self;
if(str)
{ str=insertExt(str, [[[self docExtensions] objectAtIndex:0] cString]);
[currentDoc saveDocumentAs:str];
}
return self;
}
- saveTo:sender;
{
[self saveAs:sender];
return self;
}
- saveAll:sender
{
int i;
id obj;
NSEnumerator *enm=[docArray objectEnumerator];
for(i=0;(obj=[enm nextObject])!=nil;i++)
{ [obj saveDocument];
}
return nil;
}
- revert:sender
{
id doc=currentDoc;
NSString *path=[[doc documentPath] copy];
if(!doc) return self;
if([[doc documentName] isEqual:@"UNTITLED"])
{ NXRunAlertPanel("Revert",
"Document does not have a name, cannot revert...",NULL,NULL,NULL);
return self;
}
[doc retain];
[docArray removeObject:doc];
/* clear the inspector */
currentDoc=nil;
[NXApp updateWindows];
/* this will set the new doc to be the currentdoc */
currentDoc=[self openDocument:path];
[doc release];
return self;
}
- close:sender
{ if(!currentDoc) return self;
return [[currentDoc window] performClose:nil];
}
- freeDoc:aDoc
{
if(!aDoc) return nil;
if(currentDoc==aDoc) currentDoc=nil;
/* this will release the object */
[docArray removeObject:aDoc];
[NXApp perform:@selector(updateWindows) with:nil
afterDelay:100 cancelPrevious:YES];
return self;
}
- findDocWithPath:(NSString *)aPath
{
int i;
id obj;
NSEnumerator *enm=[docArray objectEnumerator];
for(i=0;(obj=[enm nextObject])!=nil;i++)
{ if([aPath isEqual:[obj documentPath]]) return obj;
}
return nil;
}
- findDocWithTag:(int)aTag
{
int i;
id obj;
NSEnumerator *enm=[docArray objectEnumerator];
for(i=0;(obj=[enm nextObject])!=nil;i++)
{ if(aTag==[obj tag]) return obj;
}
return nil;
}
/* ==== panels ==== */
- getPrefsPanel:sender
{
if(!prefManager)
[NXApp loadNibSection:"PrefPanel.nib" owner:self
withNames:NO fromZone:(NXZone *)controllerZone];
[prefManager getPanelWithScreen:0];
return self;
}
- getInspectorPanel:sender
{
/* called from the menu */
[self getInspectorPanelWithScreen:0];
return self;
}
- (BOOL)getInspectorPanelWithScreen:(int)aScreen
{
/* called from the keyboard */
if(aScreen<0 || aScreen>1) return NO;
if(!inspectorManager)
[NXApp loadNibSection:"InspectorPanel.nib" owner:self
withNames:NO fromZone:(NXZone *)controllerZone];
[inspectorManager getPanelWithScreen:aScreen];
return YES;
}
- getInfoPanel:sender
{
if(!infoPanel)
[NXApp loadNibSection:"InfoPanel.nib" owner:self
withNames:NO fromZone:(NXZone *)controllerZone];
[infoPanel makeKeyAndOrderFront:nil];
return self;
}
/* ==== access to instance variables ==== */
- setCurrentDoc:aDoc
{ currentDoc=aDoc;
return self;
}
- currentDoc
{ return currentDoc;
}
/* ==== application delegate methods ==== */
- (BOOL)appAcceptsAnotherFile:sender
{
return YES;
}
- (int)appOpenFile:(const char *)path type:(const char *)type
{
int i;
NSString *str, *typeString=[NSString stringWithCString:type];
NSEnumerator *enm=[[self docExtensions] objectEnumerator];
BOOL found=NO;
for(i=0;(str=[enm nextObject])!=nil;i++)
{ if([str isEqual:typeString]) found=YES;
}
if(!found) return NO;
[self perform:@selector(openDocument:)
with:[[NSString stringWithCString:path] retain] afterDelay:1
cancelPrevious: NO];
return YES;
}
- appWillTerminate:sender
{
BOOL needsWarning=NO;
id doc, obj;
int i;
NSEnumerator *enm=[docArray objectEnumerator];
TRY_AGAIN:
doc=currentDoc;
for(i=0;(obj=[enm nextObject])!=nil;i++)
{ if([[obj window] isDocEdited]) needsWarning=YES;
}
if(needsWarning)
{ switch(NXRunAlertPanel("Quit",
"There are edited documents",
"Review Unsaved","Quit Anyway","Cancel"))
{ case NX_ALERTDEFAULT: // Review Unsaved
for(i=0;(obj=[enm nextObject])!=nil;i++)
{ if([[obj window] isDocEdited])
{ switch(NXRunAlertPanel("Review Unsaved",
"Save changes to %s","Save","Don't save",
"Cancel",[obj documentPath]))
{ case NX_ALERTDEFAULT: //Save
currentDoc=obj;
[[obj window] orderFront:nil];
[self save:self];
currentDoc=doc;
break;
case NX_ALERTALTERNATE: //Don't save
break;
case NX_ALERTOTHER: //Cancel
goto TRY_AGAIN;
}
}
}
case NX_ALERTALTERNATE: //Quit Anyway
break;
case NX_ALERTOTHER: //Cancel
return nil;
}
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.