This is TextWindow.m in view mode; [Download] [Up]
// // TextWindow.m // Copyright (c) 1990 by Jiro Nakamura // All rights reserved // // Handles a window with a scroll view in it, opens it with a filename, // lets the user modify it, // and if anything changes, lets she or he save it before // closing it. // // by Jiro Nakamura (ac6y@vax5.cit.cornell.edu) // // RCS Information // Revision Number-> $Revision: 2.15 $ // Last Revised-> $Date: 90/12/03 01:56:35 $ // static char rcsid[] = "$Id: TextWindow.m,v 2.15 90/12/03 01:56:35 jiro Exp Locker: jiro $"; #import "TextWindow.h" #import <sys/file.h> #import <appkit/ScrollView.h> #import <appkit/Text.h> #import <appkit/Window.h> #import "cass.h" // for default FONTSIZE and FONTNAME #import <libc.h> /* for open and close */ #import <appkit/Panel.h> /* for NXRunAlertPanel */ @implementation TextWindow /* Note: * This +new routine is never actually called... * I wonder who should be doing the "initMoreStuff". * Garance/Dec 22/95 */ + new { self = [super new]; [self initMoreStuff]; return self; } - initMoreStuff { filename = rcsid; // just to reference this, // and avoid compiler warning... filename = ""; // Default values windowIcon = ""; [self setTitle: "Window"]; return self; } - free { [self performClose : self]; [super free]; return self; } - setFilename: (const char *) file; { filename = file; return self; } - setWindowIcon: (const char *) name; { windowIcon = name; return self; } - (const char *) filename { return filename; } - (const char *) windowIcon { [self setMiniwindowIcon: windowIcon]; return windowIcon; } - openWith: (const char *) file { filename = file; textView = [textScroll docView]; [textView setDelegate : self]; [textView setMonoFont: NO]; [self setMiniwindowIcon: windowIcon]; /* If we are not visible, then we need to do an update after */ /* making ourselves the key window. */ if( ![self isVisible]) { [self makeKeyAndOrderFront : self]; [self update]; } else [self makeKeyAndOrderFront : self]; return self; } - close { #ifdef DEBUG fprintf(stderr,"Window <%s> about to close. Checking save.\n" "IsDocEdited = %s, IsVisible = %s.\n", [self title], [self isDocEdited]?"Yes":"No", [self isVisible]?"Yes":"No"); #endif [self save]; [self setDocEdited: NO]; [textView becomeFirstResponder]; if( [self isVisible] ) [super close]; return self; } - save { int fd; NXStream *output; if( [self isDocEdited] || [self isVisible] ) { // If the text is zero length then let us delete it. if( [textView textLength] == 0) { #ifdef DEBUG fprintf(stderr, "Deleting %s because " "it's empty.\n", filename); #endif unlink(filename); } else { #ifdef DEBUG fprintf(stderr, "Saving %s.\n", filename); #endif // Create and truncate file to zero fd = open(filename, O_TRUNC | O_CREAT, 0600); close(fd); output = NXMapFile(filename, NX_WRITEONLY); [textView writeRichText:output]; NXSaveToFile(output, filename); NXCloseMemory(output, NX_FREEBUFFER); [self setDocEdited: NO]; [textView becomeFirstResponder]; } } return self; } // Re-read the file in and display it on the view (if it is visible, that is) - update { if( [self isVisible]) { NXStream *input; if( (input = NXMapFile( filename, NX_READONLY)) == NULL) { [textView selectAll: self]; [textView setText: ""]; [textView setSel: 0 : 0]; } else { [textView readRichText:input]; NXCloseMemory(input, NX_FREEBUFFER); } [self setDocEdited: NO]; [textView setSel: 0 : 0]; } return self; } - printPSCode: sender { [textView printPSCode: self]; return self; } // This moves the current selection to the end of the text - selectTextEnd: sender { [textView setSel: [textView textLength] : [textView textLength]]; [textView scrollSelToVisible]; return self; } // This is a delegate method. We are our own delegate. // Let's us change the close button's shape if we have // been edited. - textDidChange : object { [self setDocEdited: YES]; [textView becomeFirstResponder]; return self; } - textWillConvert:textObject fromFont:from toFont:to { [self setDocEdited: YES]; [textView becomeFirstResponder]; return to; } - setDocEdited: (BOOL) flag { #ifdef AUTOSAVE hasChanged = flag; return self; #else return( [super setDocEdited: flag]); #endif } - (BOOL) isDocEdited { #ifdef AUTOSAVE return hasChanged; #else return( [super isDocEdited]); #endif } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.