This is TeXfigApplication.m in view mode; [Download] [Up]
#import <stdio.h>
#import <string.h>
#import "TeXfigApplication.h"
#import "TeXfigImageView.h"
@interface TeXitem: Object
{
char *text;
id image;
BOOL printer;
}
- text:(char*)newText;
- (char*)text;
- image:newImage;
- image;
- init;
- free;
- (BOOL)usePrinter;
- usePrinter:(BOOL)flag;
- write:(NXTypedStream*)typedStream;
- read:(NXTypedStream*)typedStream;
@end
@implementation TeXitem
- write:(NXTypedStream*)typedStream
{
int printerVar,length;
char buf[1];
[super write:typedStream];
printerVar = (printer)?1:0;
if(text==NULL) length=0;
else length = strlen(text);
NXWriteTypes(typedStream,"ii", &printerVar,&length);
if(text==NULL) {
buf[0]='\0';
NXWriteType(typedStream,"*",&buf);
} else NXWriteType(typedStream,"*",&text);
NXWriteRootObject(typedStream,image);
return self;
}
- read:(NXTypedStream*)typedStream
{
int printerVar, length;
[super read:typedStream];
NXReadTypes(typedStream,"ii",&printerVar,&length);
if(printerVar) printer=YES;
else printer=NO;
text = (char*)calloc(length+1,sizeof(char));
NXReadType(typedStream,"*",&text);
text[length]='\0';
image = NXReadObject(typedStream);
return self;
}
- (BOOL)usePrinter
{
return printer;
}
- usePrinter:(BOOL)flag
{
printer = flag;
return self;
}
- init
{
text=NULL;
image=nil;
printer=NO;
return self;
}
- free
{
if(text==NULL) free(text);
[image free];
[super free];
return self;
}
- text:(char*)newText
{
if(text!=NULL) {
free(text);
}
if(newText==NULL) {
text=NULL;
return self;
}
text = (char*)calloc(strlen(newText)+1,sizeof(char));
strcpy(text,newText);
return self;
}
- (char*)text
{
return text;
}
- image: newImage
{
if(image!=nil) [image free];
image = newImage;
return self;
}
- image
{
return image;
}
@end
@implementation TeXfigApplication
- appDidInit:sender
{
if(!strlen(filename)){
imageList = [[List new] init];
currentTeX=nil;
[self insert: self];
printer=NO;
[[imageView window] setTitleAsFilename:"Untitled"];
strcpy(filename,"");
}
return self;
}
- printer:sender
{
printer=YES;
[screenButton setState: NO];
if(![printerButton state]) [printerButton setState:YES];
if(currentTeX!=nil) [currentTeX usePrinter:YES];
return self;
}
- screen:sender
{
printer=NO;
[printerButton setState: NO];
if(![screenButton state]) [screenButton setState:YES];
if(currentTeX!=nil) [currentTeX usePrinter:NO];
return self;
}
- newTeXitem: newItem
{
if(newItem==nil) return self;
currentTeX=newItem;
[inputText selectAll: self];
[inputText setText:[newItem text]];
[imageView newImage:[newItem image]];
// set the buttons to reflect the printer status
if([newItem usePrinter]) [self printer:self];
else [self screen:self];
return self;
}
- doit:sender
{
char buffer[1024], tmpfilename[512];
char TeXfilename[1024];
char epsfilename[1024];
char TeXbuffer[10000];
char scratch[1000];
id newimage;
FILE *fpout;
chdir("/tmp");
// retreive the text from the text object
[inputText getSubstring:(char *)buffer
start:(int)0
length:(int)[inputText textLength]];
buffer[[inputText textLength]]='\0';
if(currentTeX!=nil) [currentTeX text:buffer];
// run it through TeX
sprintf(TeXbuffer,"\\documentstyle[times,fleqn,12pt]{article}\n\
\\nonstopmode\n\
\\parindent=0in\n\
\\mathindent=0in\n\
\\pagestyle{empty}\n\
\\begin{document}\n\
%s\n\
\\end{document}\n",buffer);
tmpnam(tmpfilename);
strcpy(TeXfilename,tmpfilename);
strcat(TeXfilename,".tex");
fpout = fopen(TeXfilename,"w");
fprintf(fpout,"%s",TeXbuffer);
fclose(fpout);
sprintf(scratch,"latex %s",TeXfilename);
system(scratch);
// run it through dvips
strcpy(epsfilename,tmpfilename);
strcat(epsfilename,".eps");
sprintf(scratch,"dvips -x 2000 -E -f -D %d %s.dvi > %s",
(printer)?400:72,tmpfilename,epsfilename);
system(scratch);
// retreive the image and get it displayed
newimage = [[NXImage alloc] init];
[newimage loadFromFile: epsfilename];
//[newimage setEPSUsedOnResolutionMismatch: YES];
[newimage setDataRetained:YES];
[newimage setScalable:YES];
[imageView newImage: newimage];
if(currentTeX!=nil) [currentTeX image: newimage];
return self;
}
- cut: sender
{
return self;
[self copy: sender];
return self;
}
- copy: sender
{
[imageView copy: self];
return self;
}
- delete: sender
{
int i;
return self;
}
- newText:(char*)newText
{
[inputText selectAll: self];
[inputText setText:newText];
//printf("new text is %s\n",newText);
//[inputText update];
return self;
}
- up: sender
{
unsigned int i;
i = [imageList indexOf: currentTeX];
if(i>=([imageList count]-1)) {
return self;
};
i++;
[self newTeXitem: [imageList objectAt: i]];
return self;
}
- down: sender
{
unsigned int i;
i = [imageList indexOf: currentTeX];
if(i==0) {
return self;
}
i--;
[self newTeXitem: [imageList objectAt: i]];
return self;
}
- insert: sender
{
id newTeX;
unsigned int i;
newTeX = [[TeXitem alloc] init];
[[newTeX text: NULL] image: nil];
i = [imageList indexOf: currentTeX];
if(i==NX_NOT_IN_LIST) i=0;
[imageList insertObject: newTeX at: i]; // insert at the spot
[self newTeXitem: newTeX];
return self;
}
- info:sender
{
if(!infoPanel) {
[NXApp loadNibSection: "Info.nib" owner:self];
}
[infoPanel makeKeyAndOrderFront: self];
return self;
}
- open: sender
{
id openPanel=[OpenPanel new];
const char *newfilename;
const char *types[]={"texfig",NULL};
[openPanel allowMultipleFiles: NO];
if([openPanel runModalForTypes: types] && (newfilename = [openPanel filename])) {
if(![self openFile:newfilename])
NXRunAlertPanel("Open Error","Can't open file %s for reading",
"Continue",NULL,NULL,filename);
}
return self;
}
- (BOOL)openFile:(const char*)pathname
{
NXTypedStream *typedStream;
strcpy(filename,pathname);
if(!(typedStream=NXOpenTypedStreamForFile(pathname,NX_READONLY))) {
return NO;
}
if(imageList!=nil) [imageList free];
imageList = NXReadObject(typedStream);
if([imageList count]==0) [self insert: self];
else [self newTeXitem:[imageList objectAt: 0]];
[[imageView window] setTitleAsFilename:pathname];
return YES;
}
- save: sender
{
NXTypedStream *typedStream;
if(!strlen(filename)) [self saveAs:self];
if(!(typedStream = NXOpenTypedStreamForFile(filename,NX_WRITEONLY))) {
NXRunAlertPanel("Save Error","Cannot open file %s for writing",
"Continue",NULL,NULL,filename);
return self;
}
NXWriteObject(typedStream,imageList);
NXCloseTypedStream(typedStream);
return self;
}
- saveAs:sender
{
id savePanel=[SavePanel new];
[savePanel setRequiredFileType: "texfig"];
if([savePanel runModal]) {
strcpy(filename,[savePanel filename]);
[[imageView window] setTitleAsFilename:filename];
[self save:self];
}
return self;
}
- preferences: sender
{
if(!prefPanel) {
[NXApp loadNibSection: "Preferences.nib" owner:self];
}
[prefPanel makeKeyAndOrderFront: self];
return self;
return self;
}
- (int)app:sender openFile:(const char *)newfilename type:(const char *)aType
{
BOOL reply;
reply = [self openFile:newfilename];
return (int)reply;
}
- (BOOL)appAcceptsAnotherFile:sender
{
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.