This is STDocumentClass.m in view mode; [Download] [Up]
#import "STDocumentClass.h"
#import "STAppController.h"
#import "STMenuCategory.h"
#import "STUtil.h"
#import "STDefines.h"
@implementation STDocumentClass
/* ==== init section ==== */
+ newDocument
{
/* return a newly allocated, autoreleased object */
id newDoc=[[self alloc] init];
return [newDoc autorelease];
}
- (NSString *)nibName
{ return @"Document.nib";
}
- init
{
[super init];
[NXApp loadNibSection:[[self nibName] cString] owner:self withNames:NO
fromZone:(NXZone *)[self zone]];
createTime=(NSCalendarDate *)[[NSCalendarDate date] retain];
lastModifyTime=[createTime copy];
return self;
}
- awakeFromNib
{ return self;
}
/* ==== access to instance variables ==== */
- window
{ return window;
}
- (int)tag
{ return tag;
}
- setTag:(int)aTag
{ tag=aTag;
return self;
}
- (NSString *)documentName
{ return documentName;
}
- (NSString *)documentPath
{ return documentPath;
}
- setDocumentName:(NSString *)aName
{
if(documentName) [documentName autorelease];
documentName=[aName copyWithZone:[self zone]];
return self;
}
- setDocumentPath:(NSString *)aPath
{
if(documentPath) [documentPath autorelease];
documentPath=[aPath copyWithZone:[self zone]];
if(window) [window setTitleAsFilename:[documentPath cString]];
return self;
}
- getInspectorData:(NSString **)nm :(NSString **)pth :(int *)t
:(NSCalendarDate **)ct :(NSCalendarDate **)lt
{
if(nm) *nm=documentName;
if(pth) *pth=documentPath;
if(t) *t=tag;
if(ct) *ct=createTime;
if(lt) *lt=lastModifyTime;
return self;
}
/* ==== file handling ==== */
- (BOOL)openDocumentFile:(NSString *)aPath
{
NXStream *st;
/* initialize all instance variables */
[self setDocumentPath:aPath];
[self setDocumentName:[aPath lastPathComponent]];
st=NXMapFile([aPath cString], NX_READONLY);
if(!st)
{ NXRunAlertPanel("Error","Document %s does not exist!",
NULL,NULL,NULL,aPath);
return NO;
}
[self readAttributes:st];
[window setTitleAsFilename:[documentPath cString]];
return YES;
}
- readAttributes:(NXStream *)st
{
char buf[BUFSIZE]="";
NXRect r;
int scrNum;
NXScanf(st,"Window Frame: %f %f %f %f\n",&r.origin.x,
&r.origin.y,&r.size.width,&r.size.height);
[window placeWindow:&r screen:getScreenOfNumber(scrNum)];
NXScanf(st,"Screen Number: %d\n",&scrNum);
NXScanf(st,"Created: \"");
NXGets(st, buf,BUFSIZE);
createTime=[[NSCalendarDate allocWithZone:
[self zone]] initWithString:[NSString stringWithCString:buf]
calendarFormat:INTLDATEFORMAT];
NXScanf(st,"Modified: \"");
NXGets(st, buf,BUFSIZE);
lastModifyTime=[[NSCalendarDate allocWithZone:
[self zone]] initWithString:[NSString stringWithCString:buf]
calendarFormat:INTLDATEFORMAT];
return self;
}
- saveDocument
{ [self saveDocumentTo:documentPath];
return self;
}
- saveDocumentAs:(NSString *)aPath
{
[self saveDocumentTo:aPath];
[window setTitleAsFilename:[documentPath cString]];
return self;
}
- saveDocumentTo:(NSString *)aPath
{
NXStream *st;
[self documentModified:self];
[self setDocumentPath:aPath];
[self setDocumentName:[aPath lastPathComponent]];
if((st=NXOpenMemory(NULL, 0, NX_WRITEONLY))==NULL)
{ NXRunAlertPanel("Error","Could not open stream for file %s",
NULL,NULL,NULL, aPath);
return self;
}
[self writeAttributes:st];
NXSaveToFile(st, [aPath cString]);
NXCloseMemory(st, NX_FREEBUFFER);
[NXApp perform:@selector(updateWindows) with:nil
afterDelay:1 cancelPrevious:YES];
return self;
}
- writeAttributes:(NXStream *)st
{
NXRect r;
NXScreen *scr;
[window getFrame:&r andScreen:&scr];
NXPrintf(st,"Window Frame: %d. %d. %d. %d.\n",(int)NX_X(&r),
(int)NX_Y(&r),(int)NX_WIDTH(&r),(int)NX_HEIGHT(&r));
NXPrintf(st,"Screen Number: %d\n",scr->screenNumber);
NXPrintf(st,"Created: \"%s\"\n",
[[createTime
descriptionWithCalendarFormat:INTLDATEFORMAT] cString]);
NXPrintf(st,"Modified: \"%s\"\n",
[[lastModifyTime
descriptionWithCalendarFormat:INTLDATEFORMAT] cString]);
return self;
}
- documentModified:sender
{ [lastModifyTime release];
lastModifyTime=(NSCalendarDate *)[[NSCalendarDate date] retain];
return self;
}
/* ==== Window delegate methods ==== */
- windowDidBecomeKey:sender
{
[[NXApp delegate] setCurrentDoc:self];
[NXApp perform:@selector(updateWindows) with:nil
afterDelay:100 cancelPrevious:YES];
return self;
}
- windowWillClose:sender
{
if([window isDocEdited])
{ switch(NXRunAlertPanel("Close",
"Save changes to %s",
"Save", "Do not save", "Cancel",documentName))
{ case NX_ALERTDEFAULT:[self saveDocument]; break;
case NX_ALERTALTERNATE: break;
case NX_ALERTOTHER: return nil;
}
}
[[NXApp delegate] perform:@selector(freeDoc:) with:self
afterDelay:1 cancelPrevious:YES];
return self;
}
- windowDidResize:sender
{ [NXApp perform:@selector(updateWindows) with:nil
afterDelay:1 cancelPrevious:YES];
return self;
}
- windowDidUpdate:sender
{
/* if you have buttons in the window, enable/disable
them here
*/
return self;
}
- (void)dealloc
{
NXZone *z=(NXZone *)[self zone];
if(window) [window free];
if(documentPath) [documentPath autorelease];
if(documentName) [documentName autorelease];
[super dealloc];
/* sanity check */
if(z!=[(Application *)NXApp zone]) NXDestroyZone(z);
return;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.