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;}
@endThese are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.