This is Controller.m in view mode; [Download] [Up]
#import "Controller.h" #import "DragView.h" #import "String.h" @implementation Controller - focusToTex { [theWindow makeFirstResponder:texView]; return self; } - appDidInit:sender { char path[MAXPATHLEN]; const char *scriptFlag, *appName = [NXApp appName]; static NXDefaultsVector theDefaults = { {"Script", "Original"}, {NULL, NULL} }; NXRegisterDefaults(appName, theDefaults); // Check for tex2eps.bat in the bundlepath if (! [[NXBundle mainBundle] getPath: path forResource: "tex2eps.bat" ofType: ""]) { [self showError: "Can't find tex2eps.bat!"]; [NXApp terminate: self]; return nil; } bundlepath = [[[String alloc] init] setString: path]; // Setup the splitviev and delegation [splitView addSubview: theDragView]; [splitView addSubview: texView]; [splitView display]; [theWindow setDelegate:self]; [[texView docView] setDelegate:self]; // Focus in the texview [self focusToTex]; [[[theWindow setTitle:"Untitled"] display] makeKeyAndOrderFront:self]; // Show introduction eps image and script window text [theDragView setImage:[[NXImage alloc] initFromSection:"tex2eps.eps"]]; // Setup Preferences stuff scriptFlag = NXGetDefaultValue(appName, "Script"); if (scriptFlag) { if (strcasecmp(scriptFlag, "Original") == 0) [scriptRadioButton selectCellWithTag:0]; else [scriptRadioButton selectCellWithTag:1]; } // Setup the userlib, usertmp and save paths userlib = [[[String alloc] init] setString: NXHomeDirectory()]; usertmp = [userlib copy]; [userlib cat: "/Library/Tex2Eps"]; [usertmp cat:"/Tex2Eps_tmp"]; savepath = [userlib copy]; // Create the needed directories system("mkdirs ~/Library/Tex2Eps"); system("mkdirs ~/Tex2Eps_tmp"); [NXApp setAutoupdate: YES]; return self; } - setScript:sender { const char *appName = [NXApp appName]; switch ([[scriptRadioButton selectedCell] tag]) { case 0: NXWriteDefault(appName, "Script", "Original"); break; case 1: NXWriteDefault(appName, "Script", "Customized"); break; } return self; } - (BOOL)whichScript { const char *scriptFlag; const char *appName = [NXApp appName]; // The value in the database may be newer than the value in the // registration table because of the Prefs panel; thus, update // the value in the table to match the value in the database. NXUpdateDefault(appName, "Script"); // Get value from registration table now that it's been updated. scriptFlag = NXGetDefaultValue(appName, "Script"); // Make sure scriptFlag is not NULL before comparing it. if (scriptFlag) { if (strcasecmp(scriptFlag, "Original") == 0) return TRUE; } return FALSE; } - latexCompile:sender { NXStream *stream = NULL; id sfile, ifile, bpath; // Check for latex input, if OK write to file and run formel2eps.bat if ([[texView docView] textLength] == 0) { [self showError:"Fill some latex code in the field above!"]; return self; } sfile = [usertmp copy]; [sfile cat: "/tex2eps.tex"]; if (stream = (NXOpenMemory(NULL, 0, NX_WRITEONLY))) { [[texView docView] writeText: stream]; if (NXSaveToFile(stream, [sfile stringValue]) != 0) { [self showError: "Can't save file"]; NXCloseMemory(stream, NX_FREEBUFFER); } else NXCloseMemory(stream, NX_FREEBUFFER); } else { [self showError: "Can't open stream memory file"]; return nil; } // Setup the bundle path for the formel2eps.bat script and call it if ([self whichScript] == TRUE) system([bundlepath stringValue]); else { bpath = [userlib copy]; [bpath cat: "/tex2eps.bat"]; system([bpath stringValue]); } // Setup the eps image file and show the image. ifile = [usertmp copy]; [ifile cat: "/tex2eps.eps"]; [theDragView setImage:[[NXImage alloc] initFromFile: [ifile stringValue]]]; // Focus again in the texinput [self focusToTex]; return self; } - load:sender { const char *fileName; const char *const types[2] = {"tex", NULL}; id op = [OpenPanel new]; if ([op runModalForTypes:types] && (fileName = [op filename])) [self openFile:fileName]; else [self showError: "No file chosen or could not open file."]; return self; [self focusToTex]; return self; } - openFile:(const char *)fileName { NXStream *stream; if (stream = (NXMapFile(fileName, NX_READONLY))) { [[texView docView] readText: stream]; [theWindow setTitle:fileName]; NXCloseMemory(stream, NX_FREEBUFFER); return self; } else { [self showError: "Can't open file!"]; return nil; } } - save:sender { const char *fileName; const char *const types[2] = {"tex", NULL}; id sp = [SavePanel new]; [sp setRequiredFileType: types[0]]; // Check to see if the current window is titled and the title is not // "Untitled". If so, save the file, else put up a save panel... fileName = [theWindow title]; if (strcmp (fileName, "Untitled")) [self saveFile: fileName]; else [self saveAs: self]; [self focusToTex]; return self; } - saveAs:sender { const char *fileName; const char *const types[2] = {"tex", NULL}; id sp = [SavePanel new]; [sp setRequiredFileType: types[0]]; // Get a file name from the user; use title of the window as default. if (([sp runModalForDirectory: "." file:[theWindow title]]) && (fileName = [sp filename])) [self saveFile: fileName]; [self focusToTex]; return self; } - saveFile: (const char *)name { NXStream *stream; if (stream = (NXOpenMemory(NULL, 0, NX_WRITEONLY))) { [[texView docView] writeText: stream]; if (NXSaveToFile(stream, name) != 0) { [self showError: "Can't save file"]; NXCloseMemory(stream, NX_FREEBUFFER); return nil; } else { [theWindow setTitle:name]; [theWindow setDocEdited:NO]; NXCloseMemory(stream, NX_FREEBUFFER); } } else { [self showError: "Can't open stream memory for file saving..."]; return nil; } return self; } - revertFormatWindow:sender { NXStream *stream; // Remove the tex2eps.bat script in ~/Library/Tex2Eps/ system("rm -f ~/Library/Tex2Eps/tex2eps.bat"); // Setup the bundle path for the main formel2eps.bat script and load it if (stream = (NXMapFile([bundlepath stringValue], NX_READONLY))) { [[formatScript docView] readText: stream]; [formatWindow setTitle:[bundlepath stringValue]]; NXCloseMemory(stream, NX_FREEBUFFER); return self; } else { [self showError: "Can't open file!"]; return nil; } [self focusToTex]; return self; } - customFormatWindow:sender { NXStream *stream; id customfile; customfile = [userlib copy]; [customfile cat: "/tex2eps.bat"]; // Setup the bundle path for the custom formel2eps.bat script and load it if (stream = (NXMapFile([customfile stringValue], NX_READONLY))) { [[formatScript docView] readText: stream]; [formatWindow setTitle:[customfile stringValue]]; NXCloseMemory(stream, NX_FREEBUFFER); return self; } else { [self showError: "Can't open file!"]; return nil; } [self focusToTex]; return self; } - saveFormatWindow:sender { NXStream *stream; id scriptfile; scriptfile = [userlib copy]; [scriptfile cat: "/tex2eps.bat"]; if (stream = (NXOpenMemory(NULL, 0, NX_WRITEONLY))) { [[formatScript docView] writeText: stream]; if (NXSaveToFile(stream, [scriptfile stringValue]) != 0) { [self showError: "Can't save file"]; NXCloseMemory(stream, NX_FREEBUFFER); } else { NXCloseMemory(stream, NX_FREEBUFFER); [formatWindow setTitle:[scriptfile stringValue]]; [formatWindow setDocEdited:NO]; // Do a chmod +x on tex2eps.bat system("chmod +x ~/Library/Tex2Eps/tex2eps.bat"); } } else { [self showError: "Can't open stream memory file"]; return nil; } [self focusToTex]; return self; } - showFormatWindow:sender { if (!formatWindow) { [NXApp loadNibSection:"Format.nib" owner: self withNames: NO]; } [formatWindow setDelegate:self]; [[formatScript docView] setDelegate:self]; [[[formatWindow setTitle:"Script Window"] display] makeKeyAndOrderFront:self]; return self; } - showInfoPanel:sender { if (! infoPanel) [NXApp loadNibSection:"Info.nib" owner: self withNames: NO]; [infoPanel makeKeyAndOrderFront:self]; return self; } - showError: (const char*) errorMessage { NXRunAlertPanel (NULL, errorMessage, "OK", NULL, NULL); return self; } // 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 ([theWindow isMainWindow]) { // if theWindow is not dirty, then set it to dirty if ([theWindow isDocEdited] == NO) [theWindow setDocEdited:YES]; } else { // if formatWindow is not dirty, then set it to dirty if ([formatWindow isDocEdited] == NO) [formatWindow setDocEdited:YES]; } return self; } -(BOOL) appAcceptsAnotherFile:sender { return (YES); } - appOpenFile:(char *)fileName type:(char *)fileType { return [self openFile:fileName]; } - windowWillClose:sender { int result; // display alert panel only if window is marked dirty if ([theWindow isMainWindow]) { if ([theWindow isDocEdited]) { result = NXRunAlertPanel ([NXApp appName], "Unsaved changes. Close Anyway?\n", "Save", "Close anyway", "Cancel"); switch(result) { case NX_ALERTDEFAULT: if ([theWindow isMainWindow]) return [self save: self]; break; case NX_ALERTALTERNATE: return self; case NX_ALERTOTHER: return nil; } } } if ([formatWindow isMainWindow]) { if ([formatWindow isDocEdited]) { result = NXRunAlertPanel ([NXApp appName], "Unsaved changes. Close Anyway?\n", "Save", "Close anyway", "Cancel"); switch(result) { case NX_ALERTDEFAULT: if ([formatWindow isMainWindow]) return [self saveFormatWindow: self]; break; case NX_ALERTALTERNATE: return self; case NX_ALERTOTHER: return nil; } } } return self; } - appWillTerminate:sender { if (([theWindow isDocEdited]) || [formatWindow isDocEdited]) { int q = NXRunAlertPanel("Quit", "There are edited windows.", "Review Unsaved", "Quit Anyway", "Cancel"); if (q==1) { /* Review */ [theWindow performClose:nil]; [formatWindow performClose:nil]; system("rm -f -r ~/Tex2Eps_tmp"); return self; } if (q==-1) { /* cancel */ return nil; } } // Remove the ~/Tex2Eps_tmp directory and its contents system("rm -f -r ~/Tex2Eps_tmp"); return self; /* quit */ } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.