This is MMText.m in view mode; [Download] [Up]
/* * You may freely copy, distribute and reuse the code * in this example. Scott Anguish disclaims any warranty of * any kind, expressed or implied, as to its fitness * for any particular use. * Please keep this notice intact * Written by: Scott Anguish sanguish@digifix.com */ #import "MMText.h" #import <libc.h> /* MAXPATHLEN */ #import <stdio.h> #import <strings.h> #import <appkit/appkit.h> #import <streams/streams.h> @implementation MMText:Text + initialize { [super initialize]; [Text registerDirective:"NGFolder" forClass: [MMFolderCell class]]; [Text registerDirective:"NGGraphic" forClass: [MMGraphicCell class]]; [Text registerDirective:"NGDocument" forClass: [MMDocumentCell class]]; return self; } - (BOOL)isHeaderVisible:(const char*)header { if ((strncmp(header,"From:",5)==0) && showFrom) return YES; if ((strncmp(header,"Date:",5)==0) && showDate) return YES; if ((strncmp(header,"Newsgroups:",11)==0) && showNewsgroups) return YES; if ((strncmp(header,"Subject:",8)==0) && showSubject) return YES; if ((strncmp(header,"MessageID:",10)==0) && showMessageID) return YES; if ((strncmp(header,"Path:",5)==0) && showPath) return YES; if ((strncmp(header,"Followup-To:",12)==0) && showFollowupTo) return YES; if ((strncmp(header,"Expires:",8)==0) && showExpires) return YES; if ((strncmp(header,"Reply-To:",9)==0) && showReplyTo) return YES; if ((strncmp(header,"Sender:",7)==0) && showSender) return YES; if ((strncmp(header,"Control:",8)==0) && showControl) return YES; if ((strncmp(header,"Keywords:",9)==0) && showKeywords) return YES; if ((strncmp(header,"Summary:",8)==0) && showSummary) return YES; if ((strncmp(header,"Approved:",9)==0) && showApproved) return YES; if ((strncmp(header,"Lines:",6)==0) && showLines) return YES; if ((strncmp(header,"Xref:",5)==0) && showXref) return YES; if ((strncmp(header,"Organization:",13)==0) && showOrganization) return YES; return NO; } - setVisibleHeaders { showFrom=YES; showDate=YES; showNewsgroups=NO; showSubject=YES; showMessageID=NO; showPath=NO; showFollowupTo=NO; showExpires=NO; showReplyTo=NO; showSender=NO; showReferences=NO; showControl=NO; showDistribution=NO; showKeywords=NO; showSummary=NO; showApproved=NO; showLines=NO; showXref=NO; showOrganization=NO; return self; }; - initFrame:(const NXRect *)frameRect { self = [super initFrame:frameRect]; [self notifyAncestorWhenFrameChanged:YES]; [self setMonoFont:NO]; [self setVertResizable:YES]; [self setHorizResizable:NO]; [self setSel:0:0]; [self setOpaque:YES]; { NXSize aSize = {1.0E38,1.0E38}; [self setMinSize:&frameRect->size]; [self setMaxSize:&aSize]; } [self setVisibleHeaders]; return self; } - free { [super free]; return self; } - (int)iconEntered:(int)windowNum at:(double)x :(double)y iconWindow:(int)iconWindowNum iconX:(double)iconX iconY:(double)iconY iconWidth:(double)iconWidth iconHeight:(double)iconHeight pathList:(char *)pathList { if (!iconPathList || strcmp(iconPathList, pathList)) { if (iconPathList) NX_FREE(iconPathList); NX_MALLOC(iconPathList,char, strlen(pathList)+1); //iconPathList = NXCopyStringBufferFromZone(pathList, [self zone]); strcpy(iconPathList, pathList); } return 0; } - (int)iconReleasedAt:(double)x :(double)y ok:(int *)flag { if (![self isEditable]) { *flag = NO; } else { *flag = YES; [self perform:@selector(delayIconReleasedAt:) with:self afterDelay:5 cancelPrevious:YES]; } return 0; } - delayIconReleasedAt:sender { int dummy,*flag; NXPoint p; char *file, *tab, *extension; id newCell; int foundOne ; flag = &dummy; foundOne = NO; [window convertScreenToBase:&p]; [self convertPoint:&p fromView:nil]; file = iconPathList; while (file) { tab = strchr(file, '\t'); if (tab) *tab = '\0'; extension = strrchr(file, '.'); if (extension && ( !strcmp(extension, ".ps") || !strcmp(extension, ".eps") || !strcmp(extension,".tiff") || !strcmp(extension,".tif") )) { newCell =[[MMGraphicCell alloc] imageFromFilename:file]; [self replaceSelWithCell:newCell]; foundOne = YES; } else { newCell = [[MMDocumentCell alloc] imageFromFilename:file]; [self replaceSelWithCell:newCell]; foundOne = YES; } file = tab ? ++tab : NULL; } *flag = foundOne; return 0; } - becomeFirstResponder { [super becomeFirstResponder]; return self; } - appendBoldWord:(char *)aString { int length; char header[BUFSIZ],restofline[BUFSIZ]; sscanf(aString,"%s%[^\n]", header,restofline); strcat(restofline,"\n"); if ([self isHeaderVisible:header]) { length = [self textLength]; [self setSel:length:length]; [self replaceSel:header]; [self setSel:(length):[self textLength]]; [self setSelFont:[Font newFont:"Courier-Bold" size:12.0]]; length = [self textLength]; [self setSel:length:length]; [self replaceSel:restofline]; [self setSel:(length):[self textLength]]; [self setSelFont:[Font newFont:"Courier" size:12.0]]; length = [self textLength]; [self setSel:length:length]; }; return self; }; - appendRichFile:(char *)aFile { NXStream *aStream; int length; length = [self textLength]; [self setSel:length:length]; aStream=NXMapFile(aFile,NX_READONLY); [self replaceSelWithRichText:aStream]; NXClose(aStream); return self; }; - openFileName:(char *)aFile { [self openFileName:aFile ignoreHeader:NO]; return self; } - openFileName:(char *)aFile ignoreHeader:(BOOL)ignoreHeader { FILE *filePtr,*outfile; char theLine[BUFSIZ]; BOOL NGfound; [self setText:""]; NGfound=NO; [[self window] disableFlushWindow]; [self setEditable:NO]; filePtr = fopen(aFile, "r"); if (ignoreHeader) { while (fgets(theLine,BUFSIZ, filePtr) != NULL) { if (strncmp(theLine, "\n",1)==0) { break; }; [self appendBoldWord:theLine]; }; [self replaceSel:"\n\n"]; } while (fgets(theLine,BUFSIZ, filePtr) != NULL) { if (strncmp(theLine, NGHEADER,strlen(NGHEADER))==0) { NGfound=YES; break; }; }; if (NGfound) { if (outfile = popen("rm /tmp/NGtemp; /usr/bin/uudecode ","w")) { fprintf(outfile,"begin 644 /tmp/NGtemp\n"); while (fgets(theLine,BUFSIZ, filePtr) != NULL) {if (strncmp(theLine,"`",1)==0) { fprintf(outfile,"`\n"); break; } else fputs(theLine,outfile); }; fprintf(outfile,"end\n"); if (pclose(outfile)==0) [self appendRichFile:"/tmp/NGtemp"]; else NXRunAlertPanel("NGService","Unable to decode! Check selection.", NULL, NULL, NULL); (void)remove("/tmp/NGtemp"); }; }; if (!NGfound) NXRunAlertPanel("NGService","I could not find any NewsGrazer Data!", NULL, NULL, NULL); fclose(filePtr); [self sizeToFit]; [[[self window] reenableFlushWindow] flushWindow]; [self display]; return self; } - readFromMemory:(char *)data length:(int)theSize { NXStream *aStream; char filename[MAXPATHLEN+1]; [self setText:""]; strcpy(filename,"/tmp/file000000Selection" ); NXGetTempFilename(filename,9); aStream = NXOpenMemory(data, theSize ,NX_READONLY); NXSaveToFile(aStream, filename); NXCloseMemory(aStream,NX_FREEBUFFER); [self openFileName:filename]; (void)remove(filename); return self; } - saveFileName:(char *)aFile { NXStream *aStream; aStream = NXOpenMemory(NULL,0, NX_WRITEONLY); [self writeRichText:aStream]; NXSaveToFile(aStream, aFile); NXCloseMemory(aStream, NX_FREEBUFFER); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.