This is WoodDoc_PasteBoard.m in view mode; [Download] [Up]
#import "wooddoc.h" #import "ooe_server.h" static NXAtom WoodPboardType; static NXAtom WoodStylePboardType; static NXAtom WoodOOEApplicationInfoPboardType; static NXAtom WoodName; @implementation WoodDoc (PasteBoard) + initializePasteboardTypes { WoodPboardType = NXUniqueString("Wood Pasteboard Type"); WoodStylePboardType = NXUniqueString("Wood Style Pasteboard Type"); WoodOOEApplicationInfoPboardType = NXUniqueString(OOE_APPINFO_PASTEBOARDTYPE); WoodName = NXUniqueString("Wood.app"); return self; } - copyToPasteboard:pboard { NXStream *stream; NXTypedStream *ts; char *dataptr; int length,maxlen; NXAtom typelist[4]; BOOL error = YES; if(!lastSelectedNode) return nil; typelist[0] = WoodPboardType; typelist[1] = NXPostScriptPboardType; typelist[2] = NXAsciiPboardType; typelist[3] = WoodOOEApplicationInfoPboardType; stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); if(stream){ ts = NXOpenTypedStream(stream, NX_WRITEONLY); if(ts){ [lastSelectedNode writeToPBStream:ts]; NXCloseTypedStream(ts); NXGetMemoryBuffer(stream, &dataptr, &length, &maxlen); [pboard declareTypes:typelist num:4 owner:[self class]]; [pboard writeType:WoodPboardType data:dataptr length:length]; error = NO; } NXCloseMemory(stream, NX_FREEBUFFER); } return (error ? nil : self); } - pasteFromPasteboard:pboard { BOOL error = YES; id pasteTree = nil; char *dataptr; int length; NXTypedStream *ts; NXStream *stream; if(includesType([pboard types], WoodPboardType)){ [pboard readType:WoodPboardType data:&dataptr length:&length]; stream = NXOpenMemory(dataptr, length, NX_READONLY); if(stream){ ts = NXOpenTypedStream(stream, NX_READONLY); if(ts){ pasteTree = NXReadObject(ts); [self makeAddTree:pasteTree]; NXCloseTypedStream(ts); } } } return (error ? nil : self); } - copyStyleToPasteboard:pboard { NXStream *stream; NXTypedStream *ts; char *dataptr; int length,maxlen; NXAtom typelist[1]; BOOL error = YES; if(!lastSelectedNode) return nil; typelist[0] = WoodStylePboardType; stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); if(stream){ ts = NXOpenTypedStream(stream, NX_WRITEONLY); if(ts){ [lastSelectedNode writeStyleToPBStream:ts]; NXCloseTypedStream(ts); NXGetMemoryBuffer(stream, &dataptr, &length, &maxlen); [pboard declareTypes:typelist num:1 owner:[self class]]; [pboard writeType:WoodStylePboardType data:dataptr length:length]; error = NO; } NXCloseMemory(stream, NX_FREEBUFFER); } return (error ? nil : self); } - pasteStyleFromPasteboard:pboard { BOOL error = YES; char *dataptr; int length; NXTypedStream *ts; NXStream *stream; if(!lastSelectedNode) return nil; if(includesType([pboard types], WoodStylePboardType)){ [pboard readType:WoodStylePboardType data:&dataptr length:&length]; stream = NXOpenMemory(dataptr, length, NX_READONLY); if(stream){ ts = NXOpenTypedStream(stream, NX_READONLY); if(ts){ [lastSelectedNode readStyleFromPBStream:ts]; [[NXApp inspectorManager] revert:self]; NXCloseTypedStream(ts); } } } return (error ? nil : self); } + convert:(NXTypedStream *)ts to:(const char *)type using:(SEL)writer toPasteboard:(Pasteboard *)pb { Window *w; Tree *pbtree; NXZone *zone; NXStream *stream; TreeView *scrapper; NXRect scrapperFrame = {{0.0, 0.0}, {11.0*72.0, 14.0*72.0}}; if(!ts) return self; zone = NXCreateZone(vm_page_size, vm_page_size, NO); NXNameZone(zone, "Scrapper"); scrapper = [[TreeView allocFromZone:zone] initFrame:&scrapperFrame]; NXSetTypedStreamZone(ts, zone); pbtree = NXReadObject(ts); [scrapper checkResize:NULL for:pbtree]; [scrapper getFrame:&scrapperFrame]; w = [[Window allocFromZone:zone] initContent:&scrapperFrame style:NX_PLAINSTYLE backing:NX_NONRETAINED buttonMask:0 defer:NO]; [w reenableDisplay]; [w setContentView:scrapper]; stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); [scrapper perform:writer with:(id)stream with:pbtree]; NXSeek(stream, 0, NX_FROMSTART); [pb writeType:type fromStream:stream]; NXCloseMemory(stream, NX_FREEBUFFER); [pbtree free]; [w free]; NXDestroyZone(zone); return self; } + convert:(NXTypedStream *)ts toAsciiPasteboard:(Pasteboard *)pb { Tree *pbtree; NXStream *stream; pbtree = NXReadObject(ts); stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); [pbtree writeToMMAPB:stream]; NXSeek(stream, 0, NX_FROMSTART); [pb writeType:NXAsciiPboardType fromStream:stream]; NXCloseMemory(stream, NX_FREEBUFFER); [pbtree free]; return self; } + pasteboard:(Pasteboard *)sender provideData:(const char *)type { id retval = nil; NXStream *stream; NXTypedStream *ts; if((type == NXPostScriptPboardType) || (type == NXAsciiPboardType)){ if(stream = [sender readTypeToStream:WoodPboardType]){ if(ts = NXOpenTypedStream(stream, NX_READONLY)){ retval = self; if(type == NXPostScriptPboardType) [self convert:ts to:type using:@selector(writePSToStream:usingTree:) toPasteboard:sender]; else [self convert:ts toAsciiPasteboard:sender]; NXCloseTypedStream(ts); } NXCloseMemory(stream, NX_FREEBUFFER); } } else if(strcmp(type, WoodOOEApplicationInfoPboardType) == 0){ retval = self; [sender writeType:WoodOOEApplicationInfoPboardType data:WoodName length:strlen(WoodName)]; } return retval; } - retrieveData:sender { id pboard = nil; NXStream *stream = NULL; NXTypedStream *typedStream = NULL; const char *ftype = NULL; pboard = [Pasteboard newName:OOE_PASTEBOARD]; if(pboard == nil){ NXLogError("ERROR: No '%s' pasteboard!", WoodPboardType); return nil; } ftype = [pboard findAvailableTypeFrom:&WoodPboardType num:1]; if(ftype == NULL){ NXLogError("ERROR: No '%s' type in pasteboard '%s'!", WoodPboardType, OOE_PASTEBOARD); return nil; } stream = [pboard readTypeToStream:WoodPboardType]; typedStream = NXOpenTypedStream(stream, NX_READONLY); if(typedStream) [self makeAddOOETree:NXReadObject(typedStream)]; if(typedStream) NXCloseTypedStream(typedStream); if(stream) NXCloseMemory(stream, NX_FREEBUFFER); return self; } - declareOOEPasteboard:pboard { const char *types[2]; int k = 0; types[k++] = NXPostScriptPboardType; types[k++] = WoodPboardType; [pboard declareTypes:types num:k owner:NXApp]; return self; } - writeDataToPasteboard:pboard { NXStream *stream; NXTypedStream *typedStream; stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); typedStream = NXOpenTypedStream(stream, NX_WRITEONLY); [tree writeToPBStream:typedStream]; NXSeek(stream, 0, NX_FROMSTART); [pboard writeType:WoodPboardType fromStream:stream]; if(typedStream) NXCloseTypedStream(typedStream); if(stream) NXCloseMemory(stream, NX_FREEBUFFER); return self; } - writePostScriptToPasteboard:pboard { NXStream *stream = NULL; stream = NXOpenMemory(NULL, 0, NX_READWRITE); [treeView writePSToStream:stream usingTree:tree]; NXSeek(stream, 0, NX_FROMSTART); [pboard writeType:NXPostScriptPboardType fromStream:stream]; if(stream) NXCloseMemory(stream, NX_FREEBUFFER); return self; } - writeOOESourceApplicationToPasteboard:pboard { [pboard writeType:WoodOOEApplicationInfoPboardType data:WoodName length:strlen(WoodName)]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.