This is Doc.m in view mode; [Download] [Up]
// Doc.m
//
// Free software created 1 Feb 1992
// by Paul Burchard <burchard@math.utah.edu>.
#import "Doc.h"
#import "DocControl.h"
#import <objc/HashTable.h>
#import <appkit/appkit.h>
#import <stdlib.h>
#import <string.h>
@implementation Doc
static id convertFileNameToDoc;
+ (const char *)fileType
{
return "";
}
+ (const char *)nibName
{
return "Doc.nib";
}
+ (const char *)miniIconName
{
return NULL;
}
+ (BOOL)backupOnSave
{
return NO;
}
+ (const char *)defaultFolder
{
return NXHomeDirectory();
}
+ initialize
{
if(self != [Doc class]) return self;
convertFileNameToDoc = [[HashTable alloc] initKeyDesc:"%" valueDesc:"@"];
return self;
}
- init
{
static count = 0;
NXRect theFrame;
NXSize theScreen;
NXScreen *ignore;
const char *iname;
[super init];
[NXApp loadNibSection:[[self class] nibName] owner:self];
// Displace successive new windows down and right until edge of screen.
[window getFrame:&theFrame andScreen:&ignore];
[NXApp getScreenSize:&theScreen];
if((NX_MAXX(&theFrame) + 20.0*count) > theScreen.width
|| (NX_Y(&theFrame) - 25.0*count) < 0)
count = 0;
NX_X(&theFrame) += 20.0*count;
NX_Y(&theFrame) -= 25.0*count;
count++;
[window moveTo:NX_X(&theFrame) :NX_Y(&theFrame)];
// Make window represent this Doc type.
[window setDelegate:self];
//!!![window setFreeWhenClosed:YES];
if(iname = [[self class] miniIconName]) [window setMiniwindowIcon:iname];
fileName = 0;
[window makeKeyAndOrderFront:nil];
return self;
}
- free
{
[window free];
if(fileName) [convertFileNameToDoc removeKey:fileName];
return [super free];
}
- setFileName:(const char *)aName
{
const char *aType;
//!!!
if(!aName && fileName) { [convertFileNameToDoc removeKey:fileName]; fileName = 0; }
// Check if extension matches file type.
if(!aName) return nil;
if(!(aType = strrchr(aName, '/'))) aType = aName;
if(aType = strrchr(aType, '.'))
{ if(strcmp(aType+1, [[self class] fileType]) != 0) return nil; }
else
{ if(strcmp("", [[self class] fileType]) != 0) return nil; }
// Re-index doc in filename table (don't overwrite existing Doc).
if([[self class] docForFileName:aName]) return nil;
if(fileName) [convertFileNameToDoc removeKey:fileName];
fileName = NXUniqueString(aName);//!!! wasteful but avoid HashTable woes
[convertFileNameToDoc insertKey:(void *)fileName value:(void *)self];
// Re-title window.
[window setTitleAsFilename:fileName];
return self;
}
- (const char *)fileName
{
return fileName;
}
+ docForFileName:(const char *)aName
{
return (id)[convertFileNameToDoc valueForKey:(void *)aName];
}
- dump:sender
{
// Implemented in subclass.
if(!fileName) return nil;
return self;
}
- load:sender
{
// Implemented in subclass.
if(!fileName) return nil;
return self;
}
- textDidChange:sender
{
[window setDocEdited:YES];
return self;
}
- windowWillClose:sender
{
// Check with delegate first.
if(delegate && [delegate respondsTo:@selector(windowWillClose:)]
&& ![delegate windowWillClose:sender])
return nil;
// Give user chance to save or rethink if edited, else free doc.
if(![[NXApp delegate] closeDoc:self andFree:NO]) return nil;//!!!
return sender;
}
- window
{
return window;
}
- setDelegate:anObject
{
delegate = anObject;
return self;
}
- delegate
{
return delegate;
}
- forward:(SEL)aSelector :(marg_list)argFrame
{
if([delegate respondsTo:aSelector])
return [delegate performv:aSelector :argFrame];
else return nil;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.