This is DocWin.m in view mode; [Download] [Up]
/* Copyright 1991 Gustavus Adolphus College. All rights reserved. * * Schematik was developed by Gustavus Adolphus College (GAC) with * support from NeXT Computer, Inc. Permission to copy this software, * to redistribute it, and to use it for any purpose is granted, * subject to the following restrictions and understandings. * * 1. Any copy made of this software must include this copyright * notice in full. * * 2. Users of this software agree to make their best efforts (a) to * return to the GAC Mathematics and Computer Science Department any * improvements or extensions that they make, so that these may be * included in future releases; and (b) to inform GAC of noteworthy * uses of this software. * * 3. All materials developed as a consequence of the use of this * software shall duly acknowledge such use, in accordance with the * usual standards of acknowledging credit in academic research. * * 4. GAC makes no express or implied warranty or representation of * any kind with respect to this software, including any warranty * that the operation of this software will be error-free. ANY * IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR * PURPOSE IS HEREBY DISCLAIMED. GAC is under no obligation to * provide any services, by way of maintenance, update, or otherwise. * * 5. In conjunction with products arising from the use of this * material, there shall be no use of the name of Gustavus Adolphus * College nor of any adaptation thereof in any advertising, * promotional, or sales literature without prior written consent * from GAC in each case. */ #import "DocWin.h" #import "../defines.h" #import DocText_h #import PrefAgent_h #import Main_h #import <appkit/OpenPanel.h> #import <appkit/ScrollView.h> #import <appkit/Text.h> #import <objc/List.h> #import <streams/streams.h> #import <sys/malloc.h> #import <sys/stat.h> #import <mach.h> #import <NXCType.h> #import <string.h> extern char *stlchr(char *,int); #define NIBFILE "Doc.nib" #define MINIWINDOWICON "Doc" #define DOCZONENAME "DocWin" #define MINWINDOWHEIGHT 67 static id findOpenFile(id, id, char *); @implementation DocWin + new { NXZone *zone=NXCreateZone(vm_page_size, vm_page_size, YES); DEBUG_FUNC1(DEBUGLEVEL); DEBUG_ASSERT(zone!=NULL) self = LoadNIB(NIBFILE, self, zone); DEBUG_ASSERT(self!=nil) docZone = zone; NXNameZone(docZone, DOCZONENAME); [self _newAuxiliary]; [self setMiniwindowIcon:MINIWINDOWICON]; DEBUG_ASSERT(([self miniwindowIcon]!=NULL)&&(*[self miniwindowIcon])) [self setTitleAsFilename:filename]; DEBUG_ASSERT(([self title]!=NULL)&&(*[self title])) return self; } + performOpenFromFile:(char *)aString { NXStream *stream; BOOL freeString=NO; DEBUG_FUNC1(DEBUGLEVEL); if (aString==NULL) { id openPanel=[OpenPanel new]; char *types[]={DOCUMENTEXTENSION, DOCUMENTEXTENSION BACKUPEXTENSION, NULL}; char *temp; DEBUG_ASSERT(openPanel!=nil) [openPanel allowMultipleFiles:NO]; {id mainWin = [NXApp mainWindow]; const char *fn; if(mainWin == nil || ![mainWin isKindOf:self]) fn = [[NXApp interactionWindow] filename]; else{ fn = [mainWin filename]; } [openPanel setDirectory:temp=stlchr(NXCopyStringBuffer(fn), PATHSEPARATOR)]; } free(temp); if ([openPanel runModalForTypes:types]&&[openPanel filename]&&*[openPanel filename]) { aString = NXCopyStringBuffer([openPanel filename]); DEBUG_ASSERT((aString!=NULL)&&(*aString)) freeString = YES; } else return nil; } DEBUG_ASSERT((aString!=NULL)&&(*aString)) if (self = findOpenFile(self, NXApp, aString)) { [self makeKeyAndOrderFront:self]; if (freeString) free(aString); return nil; } DEBUG_ASSERT(self==nil) if (stream = NXMapFile(aString, NX_READONLY)) { self = [DocWin new]; [self setFilename:aString]; DEBUG_ASSERT((filename!=NULL)&&(*filename)) [self setTitleAsFilename:filename]; [textView readText:stream]; NXCloseMemory(stream, NX_FREEBUFFER); [textView setSel:0 :0]; named = YES; if (freeString) free(aString); return self; } NXRunAlertPanel(OPENALERTTITLE, FILEOPENERROR, NULL, NULL, NULL); if (freeString) free(aString); return nil; } - makeKeyAndOrderFront:sender { DEBUG_FUNC1(DEBUGLEVEL); [super makeKeyAndOrderFront:sender]; [super makeFirstResponder:textView]; [textView lockFocus]; [textView showCaret]; [textView unlockFocus]; return self; } - free { DEBUG_FUNC1(DEBUGLEVEL); if (filename) NXZoneFree(docZone, filename); return [super free]; } - performFormat:sender { DEBUG_FUNC1(DEBUGLEVEL); [textView formatTextSelectionOnly:NO]; return self; } - performRevert:sender { NXStream *stream; DEBUG_FUNC1(DEBUGLEVEL); if (named&&wFlags2.docEdited&&(NXRunAlertPanel(REVERTALERTTITLE, REVERTALERTQUERY, REVERTALERTDEFAULT, REVERTALERTALTERNATE, NULL, (strrchr(filename,'/')+1))==NX_ALERTDEFAULT)) { if (stream = NXMapFile(filename, NX_READONLY)) { [super disableFlushWindow]; [textView readText:stream]; NXCloseMemory(stream, NX_FREEBUFFER); [[[super display] reenableFlushWindow] flushWindow]; [super setDocEdited:NO]; [textView setSel:0 :0]; return self; } NXRunAlertPanel(REVERTALERTTITLE, FILEOPENERROR, NULL, NULL, NULL); } return self; } - performSave:sender { NXStream *stream; DEBUG_FUNC1(DEBUGLEVEL); if (!named) return [self performSaveAs:self]; if (stream = NXOpenMemory(NULL, 0, NX_WRITEONLY)) { [self _saveAuxiliary:stream filename:filename]; return self; } NXRunAlertPanel(SAVEALERTTITLE, FILESAVEERROR, NULL, NULL, NULL); return self; } - performSaveAs:sender { NXStream *stream; id savePanel = [SavePanel new]; char *temp; DEBUG_FUNC1(DEBUGLEVEL); DEBUG_ASSERT(savePanel!=nil) [savePanel setRequiredFileType:DOCUMENTEXTENSION]; {id mainWin = [NXApp mainWindow]; const char *fn; if(mainWin == nil || ![mainWin isKindOf:self]) fn = [[NXApp interactionWindow] filename]; else{ fn = [mainWin filename]; } if ([savePanel runModalForDirectory:temp=stlchr(NXCopyStringBuffer(fn), PATHSEPARATOR) file:(strrchr(fn, PATHSEPARATOR)+1)]&&[savePanel filename]&&*[savePanel filename]) { if (stream = NXOpenMemory(NULL, 0, NX_WRITEONLY)) { named=NO; [self _saveAuxiliary:stream filename:(char *)[savePanel filename]]; free(temp); return self; } NXRunAlertPanel(SAVEALERTTITLE, FILESAVEERROR, NULL, NULL, NULL); } } free(temp); return self; } - undo:sender { DEBUG_FUNC1(DEBUGLEVEL); return self; } - print:sender { DEBUG_FUNC1(DEBUGLEVEL); return [[self textView] printPSCode:self]; } - (id)scrollView { DEBUG_FUNC1(DEBUGLEVEL); return scrollView; } - (id)textView { DEBUG_FUNC1(DEBUGLEVEL); return textView; } - (const char *)filename { DEBUG_FUNC1(DEBUGLEVEL); return filename; } - setFilename:(const char *)aString { DEBUG_FUNC1(DEBUGLEVEL); if (filename!=NULL) NXZoneFree(docZone, filename); filename = NXCopyStringBufferFromZone(aString, docZone); DEBUG_ASSERT(filename!=NULL) return self; } - (BOOL)named { DEBUG_FUNC1(DEBUGLEVEL); return named; } - setNamed:(BOOL)aBoolean { DEBUG_FUNC1(DEBUGLEVEL); named = aBoolean; return self; } @end @implementation DocWin (Delegate) - textDidGetKeys:sender isEmpty:(BOOL)flag { DEBUG_FUNC1(DEBUGLEVEL); if (!wFlags2.docEdited) [super setDocEdited:YES]; return self; } - windowWillClose:sender { DEBUG_FUNC1(DEBUGLEVEL); if (wFlags2.docEdited&&[[PrefAgent new] confirmOnClose]) { int i = NXRunAlertPanel(SAVEALERTTITLE, SAVEALERTQUERY, SAVEALERTDEFAULT, SAVEALERTALTERNATE, SAVEALERTOTHER, (strrchr(filename,'/')+1)); if (i==NX_ALERTOTHER) return nil; if (i==NX_ALERTDEFAULT) if (!named) return [self performSaveAs:self]; else return [self performSave:self]; } return self; } - windowWillResize:sender toSize:(NXSize *)frameSize { DEBUG_FUNC1(DEBUGLEVEL); if (frameSize->height<MINWINDOWHEIGHT) frameSize->height = MINWINDOWHEIGHT; return self; } @end @implementation DocWin (Private) - (void)_newAuxiliary { NXRect r; DEBUG_FUNC1(DEBUGLEVEL); [self useOptimizedDrawing:YES]; [[scrollView docView] getFrame:&r]; [scrollView setVertScrollerRequired:YES]; [scrollView setHorizScrollerRequired:NO]; [scrollView setDynamicScrolling:YES]; textView = [[DocText allocFromZone:docZone] initFrame:&r]; DEBUG_ASSERT(textView!=nil) [textView moveTo:0.0 :0.0]; [textView notifyAncestorWhenFrameChanged:YES]; [textView setVertResizable:YES]; [textView setSelectable:YES]; [textView setEditable:YES]; if ([[PrefAgent new] reverseVideo]) { [textView setBackgroundGray:NX_BLACK]; [scrollView setBackgroundGray:NX_BLACK]; [textView setTextGray:NX_WHITE]; } [textView setAutosizing:NX_WIDTHSIZABLE]; r.size.height = 0.0; [textView setMinSize:&r.size]; r.size.height = 1.0e30; [textView setMaxSize:&r.size]; [[scrollView setDocView:textView] free]; [scrollView setLineScroll:[textView lineHeight]]; [scrollView setPageScroll:[textView lineHeight]]; [textView setDelegate:self]; filename = NXCopyStringBufferFromZone(DEFAULTFILENAME, docZone); DEBUG_ASSERT(filename!=NULL) named = NO; } - (void)_saveAuxiliary:(NXStream *)stream filename:(char *)file { NXSelPt start,end; char temp[1040],*temp2; DEBUG_FUNC1(DEBUGLEVEL); [textView getSel:&start :&end]; temp2 = NXCopyStringBuffer([super title]); sprintf(temp, SAVINGMESSAGE, file); [super setTitle:temp]; NXPing(); [textView writeText:stream]; if (!hasBackup&&[[PrefAgent new] keepBackupCopy]) { struct stat buf; stat(file,&buf); if (buf.st_nlink>1) { NXStream *bstream; char *tempfile=NXCopyStringBuffer(file); tempfile = (char *)realloc(tempfile,strlen(file)+2); strcat(tempfile,BACKUPEXTENSION); if (bstream = NXMapFile(file,NX_READONLY)) { NXSaveToFile(bstream,tempfile); NXCloseMemory(bstream, NX_FREEBUFFER); } free(tempfile); } else { char *tempfile=NXCopyStringBuffer(file); tempfile = (char *)realloc(tempfile,strlen(file)+2); strcat(tempfile,BACKUPEXTENSION); rename(file,tempfile); free(tempfile); } hasBackup=YES; } if (NXSaveToFile(stream, file)<0) { NXRunAlertPanel(SAVEALERTTITLE, SAVEERRORMESSAGE, OKSTRING, NULL, NULL); [super setTitle:temp2]; } else { [super setDocEdited:NO]; if (!named) [self setFilename:file]; [self setTitleAsFilename:filename]; named = YES; } [textView setSel:start.cp :end.cp]; NXCloseMemory(stream, NX_FREEBUFFER); free(temp2); } @end id findOpenFile(id self, id NXApp, char * aString) { id doc,winList=[NXApp windowList]; int i; DEBUG_ASSERT(winList!=nil) for(i=[winList count]-1, doc=[winList objectAt:i]; i>=0; i--, doc=[winList objectAt:i]) if ([doc isMemberOf:self]&&(!NXOrderStrings((unsigned char *)[doc filename], (unsigned char *)aString, YES, -1, NULL))) return doc; return nil; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.