This is NewWindow.m in view mode; [Download] [Up]
#import "NewWindow.h" @implementation NewWindow - setUp { spanel = [SavePanel new]; [newwindow setDelegate:self]; [contentText setDelegate:self]; [outputTitleText setDelegate:self]; return self; } - setOutputTitleField:anObject { outputTitleField = anObject; [outputTitleText setDelegate: self]; [outputTitleField setDrawRotation:(NXCoord)90.0]; [[outputTitleField setVertScrollerRequired:NO] display]; return self; } - setContentField:anObject { contentField = anObject; [contentText setDelegate: self]; [[contentField setVertScrollerRequired:NO] display]; return self; } - setFilename:(const char *) aFilename { if (filename) free(filename); filename = malloc(strlen(aFilename)+1); strcpy(filename, aFilename); [newwindow setTitleAsFilename:aFilename]; return self; } - contentfield { return contentField; } - outputtitlefield { return outputTitleField; } - group { return group; } - window { return newwindow; } - loadFile:(const char *)fileName { NXStream *theStream = NXMapFile(fileName,NX_READONLY); if (theStream) { id ret = self; [newwindow setTitle:"Loading..."]; NX_DURING [contentText readRichText: theStream]; [outputTitleText readRichText: theStream]; [self setFilename:fileName]; // Exception handler is skipped if no exception is raised. NX_HANDLER switch(NXLocalHandler.code){ case NX_illegalWrite: NXRunAlertPanel(0,"Illegal write on stream", 0,0,0); ret = nil; break; case NX_illegalRead: NXRunAlertPanel(0,"Illegal read on stream", 0,0,0); ret = nil; break; case NX_illegalSeek: NXRunAlertPanel(0,"Illegal seek on stream", 0,0,0); ret = nil; break; case NX_illegalStream: NXRunAlertPanel(0,"invalid stream",0,0,0); ret = nil; break; case NX_streamVMError: NXRunAlertPanel(0,"VM error on stream", 0,0,0, fileName); ret = nil; break; } NX_ENDHANDLER // end of handler NXCloseMemory(theStream, NX_FREEBUFFER); return ret; } return nil; } // save: saves the current window under its default name (found in // the title bar). Note that if the title bar is empty or the default title // is "Untitled" then save: will put up a save panel, giving the user // a chance to specify a real title. - save:sender { int fd; NXStream *theStream; if (filename == 0) return [self saveAs: sender]; [newwindow setTitle: "Saving..."]; fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC,0666); if (fd<0) { NXRunAlertPanel(0, "Cannot save file: %s", 0, 0, 0, strerror(errno)); return self; } theStream = NXOpenFile(fd, NX_WRITEONLY); [contentText writeRichText: theStream]; [outputTitleText writeRichText: theStream]; NXClose(theStream); close(fd); [newwindow setTitleAsFilename: filename]; [newwindow setDocEdited:NO]; return self; } // saveAs: gives the user a chance to save the current window under a new name. - saveAs:sender { id panel; const char *dir; char *file; const char *const types[2] = {[stringSet valueForStringKey:"extension"], NULL}; // prompt user for file name and save to that file if (filename == 0) { // no filename; set up defaults dir = NXHomeDirectory(); file = (char *)[newwindow title]; } else { file = rindex(filename, '/'); if (file) { dir = filename; *file = 0; file++; } else { dir = filename; file = (char *)[newwindow title]; } } panel = [SavePanel new]; [panel setRequiredFileType: types[0]]; if ([panel runModalForDirectory: dir file: file]) { [self setFilename: [panel filename] ]; return [self save: sender]; } return nil; // didn't save } // textDidGetKeys: is called every time a key is pressed // if the window is marked dirty, we don't do anything // -- if it's not dirty, we set it to dirty - textDidGetKeys:sender isEmpty:(BOOL)flag { // if window is not dirty, then set it to dirty if ([newwindow isDocEdited] == NO) [newwindow setDocEdited:YES]; return self; } - windowWillClose:sender { if ([sender isDocEdited]) { const char *fname; int q; fname = filename ? filename : [sender title]; if (rindex(fname,'/')) fname = rindex(fname,'/') + 1; q = NXRunAlertPanel ("Save", "Save changes to %s?\n", "Save", "Don't Save", "Cancel", fname); if (q==1) { if (![self save:nil]) { return nil; } } if (q==-1) { return nil; } } [sender setDelegate:nil]; // The freeing of the window has been setup in InterfaceBuilder // as "Free when closed [x]"! -- If not, uncomment the following... // [self free]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.