This is eTNote.m in view mode; [Download] [Up]
/////////////////////////////////////////////////////////////////////////////// // FILENAME: eTNote.m // SUMMARY: Implementation of a rtf note annotation // SUPERCLASS: eTImage // INTERFACE: None // PROTOCOLS: <Tool, Annotation, ASCIISupport,InspectableTarget> // AUTHOR: Rohit Khare // COPYRIGHT: (c) 1994 California Institure of Technology, eText Project /////////////////////////////////////////////////////////////////////////////// // IMPLEMENTATION COMMENTS // Notes hold an RTF representation of some comments. ASCII conversion is // done as in eTDocInfo. Date is a last-modified string. /////////////////////////////////////////////////////////////////////////////// // HISTORY // 10/30/94: Modified to support <InspectableTarget> // 07/27/94: Still trying to tack down imag-loading bug,usd loadFromFile... // 07/07/94: Converted to imageAnnotation by RK and TRZ // 07/03/94: HTMD Support by TRZ. // 05/22/94: Created. First actual implementation. /////////////////////////////////////////////////////////////////////////////// #import "eTNote.h" #define _eTNoteVERSION 10 NXAtom fileHack; @implementation eTNote + toolAwake:theApp { char buf[MAXPATHLEN]; NXBundle *bundle; id icon=nil; bundle = [NXBundle bundleForClass:[eTNote class]]; if ([bundle getPath:buf forResource:"eTNoteIcon" ofType:"tiff"] ) { icon = [[NXImage alloc] initFromFile:buf]; [icon setName:"eTNoteIcon"]; if ([icon lockFocus]) [icon unlockFocus]; } else { NXLogError("Image not found: eTNoteIcon"); } [theApp registerAnnotation: [eTNote class] name: "Note" RTFDirective: "eTNote" menuLabel: "Insert Note..." menuKey: '\0' menuIcon: (NXImage *) icon]; return self; } #define DEFAULTRTF "{\\rtf0\\ansi{\\fonttbl\\f1\\fnil Times-Roman;\\f2\\fswiss Helvetica;}\n\\margl40\n\\margr40\n\\pard\\tx520\\tx1060\\tx1600\\tx2120\\tx2660\\tx3200\\tx3720\\tx4260\\tx4800\\tx5320\\f1\\b0\\ulnone\\fs24\\fc0\\cf0 Rich-Text \n\\b comments\n\\b0 about this document\n}\n" - init { [super init]; [self setUsesButtonStyle:NO]; [self setDraggable:YES]; [self setImageComponent:[eTImageComponent newImageNamed:"etNoteIcon"]]; RTFRep = (char *)malloc((strlen(DEFAULTRTF)+1)*sizeof(char)); strcpy(RTFRep,DEFAULTRTF); return self; } - free { free(RTFRep); return self = [super free]; } - initFromPboard:thePB inDoc:theDoc linked:(BOOL) linked { struct passwd *p; [super initFromPboard:thePB inDoc:theDoc linked:linked]; //[self init]; [imageComponent setDoc:theDoc]; [etDoc registerNotification:self]; p = getpwuid(getuid()); if (p->pw_name) strncpy(writer,p->pw_gecos,128); else strncpy(writer,"Author's Name",128); strncpy(date,[NXApp date],64); return self; } - drag: (Pasteboard *)draggingPboard image: (NXImage **)proxyImage { char filename[MAXPATHLEN]; NXStream *t; // write out .rtf file in /tmp sprintf(filename, "/tmp/eTNote.%d.rtf", [NXApp uniqueID]); [[eTNoteUI new] sync]; t = NXOpenMemory(RTFRep, strlen(RTFRep), NX_READONLY); [theText readRichText:t]; NXClose(t); [theText writeRTFtoPath:filename]; [draggingPboard declareTypes:&NXFilenamePboardType num:1 owner:nil]; [draggingPboard writeType: NXFilenamePboardType data: filename length: strlen(filename)]; //NXLogError("NXImage got %x", [NXImage findImageNamed:NXUniqueString("eTNoteIcon")]); *proxyImage = [NXImage findImageNamed:NXUniqueString("eTNoteIcon")]; //NXLogError("proxyImage got %x", *proxyImage); return self; } - inspect: (NXEvent*)e { [[NXApp inspector] inspect:self]; return self; } - (id <Inspectable>) inspectableDelegate { return [[eTNoteUI new] setNote:self]; } - readRichText:(NXStream *)stream forView:view { int i; NXScanf(stream, "%d ", &i); if (i != _eTNoteVERSION) { // bad version block. NXLogError("eTNote found unparseable version %d at position %d", i, NXTell(stream)); return nil; } NXScanf(stream, "%d", &i); NXGetc(stream); //space-eater if (i) NXRead(stream, writer, i); writer[i] = 0; NXScanf(stream, "%d", &i); NXGetc(stream); //space-eater if (i) NXRead(stream, date,i); date[i] = 0; NXScanf(stream, "%d", &i); NXGetc(stream); //space-eater if (i) { RTFRep = realloc(RTFRep,(i+1)*sizeof(char)); NXRead(stream, RTFRep, i); } RTFRep[i]=0; NXGetc(stream); //trailing space [super readRichText:stream forView:view]; return self; } - writeRichText:(NXStream *)stream forView:view { [[eTNoteUI new] sync]; NXPrintf(stream, "%d %d %s %d %s %d %s ", _eTNoteVERSION,strlen(writer),writer, strlen(date), date, strlen(RTFRep), RTFRep); return [super writeRichText:stream forView:view]; } - writeASCIIRef:(NXStream *)stream forView:view { NXStream *t; id aText = [NXApp sharedText]; [[eTNoteUI new] sync]; t = NXOpenMemory(RTFRep, strlen(RTFRep), NX_READONLY); [aText readRichText:t]; NXClose(t); NXPrintf(stream, "%y made this comment, last modified on %s:\n", writer, date); [aText writeText:stream]; NXPrintf(stream, "\n\t"); [super writeASCIIRef:stream forView:view]; return self; } - writeHTML:(NXStream *)stream forView:view { char temp[MAXPATHLEN]; char noteFile[MAXPATHLEN]; strcpy(temp, [[[view etDoc] docInfo] docPath]); *rindex(temp,'.')=0; sprintf(noteFile,"%s."HTMD_EXT"/eTNote.%x",temp,[NXApp uniqueID]); NXPrintf(stream, "<A HREF=\"%V\">", noteFile); [super writeHTML:stream forView:view]; NXPrintf(stream, "</A>"); fileHack = NXUniqueString(noteFile); return self; } - writeLaTeX:(NXStream*)stream forView:view { char temp[MAXPATHLEN]; char noteFile[MAXPATHLEN]; [super writeLaTeX:stream forView:view]; strcpy(temp, [[[view etDoc] docInfo] docPath]); *rindex(temp,'.')=0; sprintf(noteFile,"%s."HTMD_EXT"/eTNote.%x",temp,[NXApp uniqueID]); NXPrintf(stream, "\footnote{See the file %w for a comment by %w on %w", noteFile,writer,date); fileHack = NXUniqueString(noteFile); return self; } - writeComponentToPath:(char *)thePath inFormat:(int)fmt { char temp[MAXPATHLEN]; char noteFile[MAXPATHLEN]; id aText; NXStream *t; NXRect rect; if(!etDoc) NXLogError("etDoc is nil at %s %u",__FILE__,__LINE__); [super writeComponentToPath:thePath inFormat:fmt]; if(fmt==HTMD_FMT || fmt==TeXD_FMT) { aText = [[eText alloc] init]; rect.origin.x = rect.origin.y = 0; rect.size.height = rect.size.width = MAXFLOAT; [aText initFrame:&rect]; t = NXOpenMemory(RTFRep, strlen(RTFRep), NX_READONLY); [aText readRichText:t]; NXClose(t); [aText setSel:0:0]; sprintf(noteFile, "%s made this comment, last modified on %s:\n", writer, date); [aText replaceSel:noteFile]; t = NXOpenMemory(NULL, 0, NX_READWRITE); if(fmt==HTMD_FMT) [aText writeHTML:t withTags:NULL]; if(fmt==TeXD_FMT) [aText writeLaTeX:t withTags: NULL]; aText = [aText free]; sprintf(temp,"%s/%s",thePath,fileHack); NXSaveToFile(t,temp); NXCloseMemory(t,NX_FREEBUFFER); } return self; } - setRTFRep:(const char *)newRep { RTFRep = realloc(RTFRep,strlen(newRep)); strcpy(RTFRep,newRep); strncpy(date,[NXApp date],64); return self; } - (const char *)RTFRep {return RTFRep;} - (const char *)owner{return writer;} - setOwner:(const char *)newOwner{strncpy(writer,newOwner,128); return self;} - (const char *)date{return date;} @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.