This is eTURLink.m in view mode; [Download] [Up]
/////////////////////////////////////////////////////////////////////////////// // FILENAME: eTURLink.h // SUMMARY: Implementation of a URL Annotation // SUPERCLASS: eTImage // INTERFACE: None // PROTOCOLS: <Annotation,HTMDSupport,ASCIISupport,LaTeXSupport,Tool, // InspectableTarget> // AUTHOR: Rohit Khare // COPYRIGHT: (c) 1994 California Institure of Technology, eText Project /////////////////////////////////////////////////////////////////////////////// // IMPLEMENTATION COMMENTS // Holds an URLrep and tries to NXPerformService("Open URL"). // Tries to lookup an icon based on the scheme of the URL if possible /////////////////////////////////////////////////////////////////////////////// // HISTORY // 02/04/95: Added support to create .uri files; draggability // 02/04/95: Modified to support new services (SpiderWoman, Omni .9) // 10/30/94: Modified to support <InspectableTarget> // 07/20/94: Minimal Creation /////////////////////////////////////////////////////////////////////////////// #import "eTURLink.h" #define _eTURLinkVERSION 10 @implementation eTURLink // char *URLRep; - setURL: (const char *) newURL { URLRep = realloc(URLRep,(strlen(newURL)+1)*sizeof(char)); strcpy(URLRep, newURL); [etDoc touch]; return self; } - (char *) URL {return URLRep;} + toolAwake:theApp { char buf[MAXPATHLEN]; NXBundle *bundle; id icon=nil; bundle = [NXBundle bundleForClass:[eTURLink class]]; // we should register a whole bunch of images here: "Gopher", "News",etc if ([bundle getPath:buf forResource:"eTURLinkIcon" ofType:"tiff"] ) { icon=[[NXImage alloc] initFromFile:buf]; [icon setName:"eTURLinkIcon"]; } else { NXLogError("Image not found: eTURLinkIcon"); } [theApp registerAnnotation: [eTURLink class] name: "eTURLink" RTFDirective: "eTURLink" menuLabel: "HTML/Insert eTURLink" menuKey: '\0' menuIcon: (NXImage *) icon]; [theApp registerType:NXCreateFileContentsPboardType(".uri") for:[eTURLink class]]; [theApp registerType:URIPboardType for:[eTURLink class]]; [theApp registerType:OWPboardType for:[eTURLink class]]; return self; } - init { #define DEFAULT "http://www.etext.caltech.edu/" [super init]; [self setUsesButtonStyle:NO]; [self setDraggable:YES]; [self setImageComponent:[eTImageComponent newImageNamed:"eTURLinkIcon"]]; URLRep = (char *)malloc((strlen(DEFAULT)+1)*sizeof(char)); strcpy(URLRep, DEFAULT); return self; } - initFromPboard:thePboard inDoc:theDoc linked:(BOOL) linked { NXAtom foundType; NXAtom supportedTypes[4] = {URIPboardType, OWPboardType, NXFilenamePboardType, NXFileContentsPboardType}; [super initFromPboard:thePboard inDoc:theDoc linked:linked]; [imageComponent setDoc:etDoc]; [self setDescription:"here"]; // first, we want to check for OW url drag types. foundType = [thePboard findAvailableTypeFrom:supportedTypes num:4]; if (foundType == NXFilenamePboardType) { // can we derive a .uri file name? if not, puke char *path; int len; [thePboard readType:NXFilenamePboardType data:&path length:&len]; // we only process _ONE_ filename; this defeats the tab-separation if (index(path, '\t')) *index(path, '\t')=0; if (rindex(path, '.') && !strcmp(rindex(path, '.'), "."URI_EXT)) { NXStream *s; // OK, we have a .uri path: bring the contents in, and path as title. s = NXMapFile(path, NX_READONLY); if (s) { char *data, *url; int len, maxlen; NXGetMemoryBuffer(s, &data, &len, &maxlen); if (!strncmp(data, "URL:",4)) url = data+4; else if (!strncmp(data, "<URL:",5)) url = data+5; else url = data; [self setURL:url]; NXCloseMemory(s, NX_FREEBUFFER); } *rindex(path, '.') = '\0'; [self setDescription:path]; [self setCaptionMode]; } [thePboard deallocatePasteboardData:path length:len]; } else if (foundType == NXFileContentsPboardType) { NXLogError("Eeek! Unimplemented: FileContentsPboard for eTURLink."); } else if (foundType == URIPboardType) { // Note that we can't yet handle multiple URLs char *data, *url; int len, maxlen; NXStream *s; s = [thePboard readTypeToStream:URIPboardType]; if (s) { NXGetMemoryBuffer(s, &data, &len, &maxlen); if (!strncmp(data, "URL:",4)) url = data+4; else if (!strncmp(data, "<URL:",5)) url = data+5; else url = data; [self setURL:url]; NXCloseMemory(s, NX_FREEBUFFER); } s = [thePboard readTypeToStream:URITitlePboardType]; if (s) { NXGetMemoryBuffer(s, &data, &len, &maxlen); [self setDescription:data]; [self setCaptionMode]; NXCloseMemory(s, NX_FREEBUFFER); } } else if (foundType == OWPboardType) { // OmniWeb combatibility hemorrage... char *data; int len; [thePboard readType:OWPboardType data:&data length:&len]; [self setURL:data]; [self setDescription:data]; [self setCaptionMode]; [thePboard deallocatePasteboardData:data length:len]; } else { NXSelPt begin, end; [theText getSel:&begin :&end]; // we know the sel exists because // etApp checks acceptsAnnotation: if (begin.cp != end.cp) { char *buf = calloc((end.cp - begin.cp + 1) , sizeof(char)); [theText getSubstring:buf start:begin.cp length:(end.cp - begin.cp)]; [self setURL:buf]; free(buf); } } return self; } - readRichText:(NXStream *)stream forView:view { int i; char buf[MAXPATHLEN]; NXScanf(stream, "%d ", &i); if (i != _eTURLinkVERSION) { // bad version block. NXLogError("eTURLink found unparseable version %d at position %d", i, NXTell(stream)); return nil; } NXScanf(stream, "%d", &i); NXGetc(stream); //space-eater if(i) NXRead(stream,buf,i); buf[i]=0; [self setURL:buf]; NXGetc(stream); // trailing space [super readRichText:stream forView:view]; return self; } - writeRichText:(NXStream *)stream forView:view { NXPrintf(stream, "%d %d %s ", _eTURLinkVERSION, strlen(URLRep), URLRep); [super writeRichText:stream forView:view]; return self; } - writeASCIIRef:(NXStream *)stream forView:view { NXPrintf(stream, "See %V.\n\t",URLRep); [super writeASCIIRef:stream forView:view]; return self; } - writeHTML:(NXStream *)stream forView: view { // always generates an icon -- we _ought_ to provide for an alternate // associated label. NXPrintf(stream,"<A HREF=\"%s\">", URLRep); [super writeHTML:stream forView:view]; NXPrintf(stream,"</A>"); return self; } - writeLaTeX:(NXStream *)stream forView: view { [super writeLaTeX:stream forView:view]; NXPrintf(stream,"\n\\footnote{See {\\tt %w}}\n",URLRep); return self; } - click:(NXEvent*)e { return self;} - doubleClick:(NXEvent *)e { id thePB; thePB = [Pasteboard newUnique]; [thePB declareTypes:&NXAsciiPboardType num:1 owner:nil]; [thePB writeType:NXAsciiPboardType data:URLRep length:strlen(URLRep)]; if (!NXPerformService("Open URL", thePB) && !NXPerformService("OmniWeb/Open URL", thePB) && !NXPerformService("SpiderWoman/Open URL", thePB)) NXRunAlertPanel("eTURLink","Could not open a "URI_EXT" file (using services): %s.", "OK", NULL, NULL, URLRep); return self; } - inspect:(NXEvent*)e { [[NXApp inspector] inspect:self];return self;} - (id <Inspectable>) inspectableDelegate { return [[eTURLinkUI new] setAnnotation:self]; } - setImageComponent:newImageComponent { const char *name; name = [[newImageComponent theImage] name]; if (name && !strcmp(name,"eTURLinkIcon")) usesButtonStyle = NO; else usesButtonStyle = YES; return [super setImageComponent:newImageComponent]; } - drag: (Pasteboard *)draggingPboard image: (NXImage **)proxyImage { char filename[MAXPATHLEN], filteredTitle[MAXPATHLEN], *title; NXAtom types[3] = {URIPboardType, NXAsciiPboardType, NXFilenamePboardType}; NXStream *b; int i; // write out .uri file in /tmp title = [self description]; if (title && *title) sprintf(filteredTitle, "%s."URI_EXT, title); else sprintf(filteredTitle, "%s."URI_EXT, URLRep); // filter out /es for (i=0; filteredTitle[i]; i++) if (filteredTitle[i] == '/') filteredTitle[i] = '_'; sprintf(filename, "/tmp/%s", filteredTitle); [draggingPboard declareTypes:types num:3 owner:nil]; [draggingPboard writeType: NXFilenamePboardType data: filename length: strlen(filename)]; b = NXOpenMemory(NULL, 0, NX_READWRITE); NXPrintf(b, "%V", URLRep); NXSeek(b, 0, NX_FROMSTART); [draggingPboard writeType: NXAsciiPboardType fromStream:b]; NXSeek(b, 0, NX_FROMSTART); if (strncmp(URLRep, "URL:",4)) NXPrintf(b, "URL:%V", URLRep); else NXPrintf(b, "%V", URLRep);; NXSeek(b, 0, NX_FROMSTART); [draggingPboard writeType: URIPboardType fromStream:b]; NXSeek(b, 0, NX_FROMSTART); NXSaveToFile(b, filename); NXCloseMemory(b, NX_FREEBUFFER); *proxyImage = [NXImage findImageNamed:NXUniqueString("eTURLinkIcon")]; return self; } - addToPboard: pboard { char buf[MAXPATHLEN]; NXStream *b; b = NXOpenMemory(buf, MAXPATHLEN, NX_READWRITE); if (strncmp(URLRep, "URL:",4)) NXPrintf(b, "URL:%V", URLRep); else NXPrintf(b, "%V", URLRep);; NXSeek(b, 0, NX_FROMSTART); [pboard addTypes:&URIPboardType num:1 owner:nil]; [pboard writeType:URIPboardType fromStream:b]; NXClose(b); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.