home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Misc / Wood.0.72 / Sources / WoodDoc_PasteBoard.m < prev    next >
Encoding:
Text File  |  1995-08-11  |  7.3 KB  |  280 lines

  1. #import "wooddoc.h"
  2. #import "ooe_server.h"
  3.  
  4. static NXAtom WoodPboardType;
  5. static NXAtom WoodStylePboardType;
  6. static NXAtom WoodOOEApplicationInfoPboardType;
  7. static NXAtom WoodName;
  8.  
  9. @implementation WoodDoc (PasteBoard)
  10.  
  11. + initializePasteboardTypes
  12. {
  13.     WoodPboardType = NXUniqueString("Wood Pasteboard Type");
  14.     WoodStylePboardType = NXUniqueString("Wood Style Pasteboard Type");
  15.     WoodOOEApplicationInfoPboardType = NXUniqueString(OOE_APPINFO_PASTEBOARDTYPE);
  16.     WoodName = NXUniqueString("Wood.app");
  17.     return self;
  18. }
  19.  
  20. - copyToPasteboard:pboard
  21. {
  22.     NXStream *stream;
  23.     NXTypedStream *ts;
  24.     char *dataptr;
  25.     int length,maxlen;
  26.     NXAtom typelist[4];
  27.     BOOL error = YES;
  28.  
  29.     if(!lastSelectedNode)
  30.         return nil;
  31.     typelist[0] = WoodPboardType;
  32.     typelist[1] = NXPostScriptPboardType;
  33.     typelist[2] = NXAsciiPboardType;
  34.     typelist[3] = WoodOOEApplicationInfoPboardType;
  35.     stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
  36.     if(stream){
  37.         ts = NXOpenTypedStream(stream, NX_WRITEONLY);
  38.            if(ts){
  39.             [lastSelectedNode writeToPBStream:ts];
  40.             NXCloseTypedStream(ts);
  41.             NXGetMemoryBuffer(stream, &dataptr, &length, &maxlen);
  42.             [pboard declareTypes:typelist  num:4  owner:[self class]];
  43.             [pboard writeType:WoodPboardType  data:dataptr  length:length];
  44.             error = NO;
  45.            }
  46.            NXCloseMemory(stream, NX_FREEBUFFER);
  47.     }
  48.     return (error ? nil : self);
  49. }
  50.  
  51. - pasteFromPasteboard:pboard
  52. {
  53.     BOOL error = YES;
  54.     id pasteTree = nil;
  55.        char *dataptr;
  56.        int length;
  57.        NXTypedStream *ts;
  58.        NXStream *stream;
  59.  
  60.        if(includesType([pboard types], WoodPboardType)){
  61.         [pboard readType:WoodPboardType data:&dataptr length:&length];
  62.         stream = NXOpenMemory(dataptr, length, NX_READONLY);
  63.         if(stream){
  64.             ts = NXOpenTypedStream(stream, NX_READONLY);
  65.             if(ts){
  66.                 pasteTree = NXReadObject(ts);
  67.                 [self makeAddTree:pasteTree];
  68.                 NXCloseTypedStream(ts);
  69.             }
  70.         }
  71.     }
  72.     return (error ? nil : self);
  73. }
  74.  
  75. - copyStyleToPasteboard:pboard
  76. {
  77.     NXStream *stream;
  78.     NXTypedStream *ts;
  79.     char *dataptr;
  80.     int length,maxlen;
  81.     NXAtom typelist[1];
  82.     BOOL error = YES;
  83.     
  84.     if(!lastSelectedNode)
  85.         return nil;
  86.     typelist[0] = WoodStylePboardType;
  87.     stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
  88.     if(stream){
  89.         ts = NXOpenTypedStream(stream, NX_WRITEONLY);
  90.            if(ts){
  91.             [lastSelectedNode writeStyleToPBStream:ts];
  92.             NXCloseTypedStream(ts);
  93.             NXGetMemoryBuffer(stream, &dataptr, &length, &maxlen);
  94.             [pboard declareTypes:typelist  num:1  owner:[self class]];
  95.             [pboard writeType:WoodStylePboardType  data:dataptr  length:length];
  96.             error = NO;
  97.            }
  98.            NXCloseMemory(stream, NX_FREEBUFFER);
  99.     }
  100.     return (error ? nil : self);
  101. }
  102.  
  103. - pasteStyleFromPasteboard:pboard
  104. {
  105.     BOOL error = YES;
  106.        char *dataptr;
  107.        int length;
  108.        NXTypedStream *ts;
  109.        NXStream *stream;
  110.     
  111.     if(!lastSelectedNode)
  112.         return nil;
  113.     if(includesType([pboard types], WoodStylePboardType)){
  114.         [pboard readType:WoodStylePboardType data:&dataptr length:&length];
  115.         stream = NXOpenMemory(dataptr, length, NX_READONLY);
  116.         if(stream){
  117.             ts = NXOpenTypedStream(stream, NX_READONLY);
  118.             if(ts){
  119.                 [lastSelectedNode readStyleFromPBStream:ts];
  120.                 [[NXApp inspectorManager] revert:self];
  121.                 NXCloseTypedStream(ts);
  122.             }
  123.         }
  124.     }
  125.     return (error ? nil : self);
  126. }
  127.  
  128. + convert:(NXTypedStream *)ts to:(const char *)type using:(SEL)writer toPasteboard:(Pasteboard *)pb
  129. {
  130.     Window *w;
  131.     Tree *pbtree;
  132.     NXZone *zone;
  133.     NXStream *stream;
  134.     TreeView *scrapper;
  135.     NXRect scrapperFrame = {{0.0, 0.0}, {11.0*72.0, 14.0*72.0}};
  136.  
  137.     if(!ts) 
  138.         return self;
  139.     zone = NXCreateZone(vm_page_size, vm_page_size, NO);
  140.     NXNameZone(zone, "Scrapper");
  141.     scrapper = [[TreeView allocFromZone:zone] initFrame:&scrapperFrame];
  142.     NXSetTypedStreamZone(ts, zone);
  143.     pbtree = NXReadObject(ts);
  144.     [scrapper checkResize:NULL for:pbtree];
  145.     [scrapper getFrame:&scrapperFrame];
  146.     w = [[Window allocFromZone:zone] initContent:&scrapperFrame
  147.                        style:NX_PLAINSTYLE
  148.                      backing:NX_NONRETAINED
  149.                       buttonMask:0
  150.                        defer:NO];
  151.     [w reenableDisplay];
  152.     [w setContentView:scrapper];
  153.     stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
  154.     [scrapper perform:writer with:(id)stream with:pbtree];
  155.     NXSeek(stream, 0, NX_FROMSTART);
  156.     [pb writeType:type fromStream:stream];
  157.     NXCloseMemory(stream, NX_FREEBUFFER);
  158.     [pbtree free];
  159.     [w free];
  160.     NXDestroyZone(zone);
  161.     return self;
  162. }
  163.  
  164. + convert:(NXTypedStream *)ts toAsciiPasteboard:(Pasteboard *)pb
  165. {
  166.     Tree *pbtree;
  167.     NXStream *stream;
  168.     
  169.     pbtree = NXReadObject(ts);
  170.     stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
  171.     [pbtree writeToMMAPB:stream];
  172.     NXSeek(stream, 0, NX_FROMSTART);
  173.     [pb writeType:NXAsciiPboardType fromStream:stream];
  174.     NXCloseMemory(stream, NX_FREEBUFFER);
  175.     [pbtree free];
  176.     return self;
  177. }
  178.  
  179. + pasteboard:(Pasteboard *)sender provideData:(const char *)type
  180. {
  181.     id retval = nil;
  182.     NXStream *stream;
  183.     NXTypedStream *ts;
  184.  
  185.     if((type == NXPostScriptPboardType) || (type == NXAsciiPboardType)){
  186.         if(stream = [sender readTypeToStream:WoodPboardType]){
  187.             if(ts = NXOpenTypedStream(stream, NX_READONLY)){
  188.                 retval = self;
  189.                 if(type == NXPostScriptPboardType)
  190.                     [self convert:ts to:type using:@selector(writePSToStream:usingTree:) toPasteboard:sender];
  191.                 else 
  192.                     [self convert:ts toAsciiPasteboard:sender];
  193.                 NXCloseTypedStream(ts);
  194.             }
  195.             NXCloseMemory(stream, NX_FREEBUFFER);
  196.         }
  197.     } else if(strcmp(type, WoodOOEApplicationInfoPboardType) == 0){
  198.         retval = self;
  199.         [sender writeType:WoodOOEApplicationInfoPboardType data:WoodName length:strlen(WoodName)];
  200.     }
  201.     return retval;
  202. }
  203.  
  204. - retrieveData:sender
  205. {
  206.     id pboard = nil;
  207.     NXStream *stream = NULL;
  208.     NXTypedStream *typedStream = NULL;
  209.     const char *ftype = NULL;
  210.       
  211.     pboard = [Pasteboard newName:OOE_PASTEBOARD];
  212.     if(pboard == nil){    
  213.         NXLogError("ERROR: No '%s' pasteboard!", WoodPboardType);
  214.         return nil;
  215.     }
  216.     ftype = [pboard findAvailableTypeFrom:&WoodPboardType num:1];
  217.     if(ftype == NULL){
  218.         NXLogError("ERROR: No '%s' type in pasteboard '%s'!", WoodPboardType, OOE_PASTEBOARD);
  219.         return nil;
  220.     }
  221.      stream = [pboard readTypeToStream:WoodPboardType];
  222.     typedStream = NXOpenTypedStream(stream, NX_READONLY);
  223.     if(typedStream)
  224.         [self makeAddOOETree:NXReadObject(typedStream)];
  225.     if(typedStream)
  226.         NXCloseTypedStream(typedStream);
  227.     if(stream)
  228.         NXCloseMemory(stream, NX_FREEBUFFER);
  229.     return self;
  230. }
  231.  
  232. - declareOOEPasteboard:pboard
  233. {
  234.     const char *types[2];
  235.     int k = 0;
  236.     
  237.     types[k++] = NXPostScriptPboardType;
  238.     types[k++] = WoodPboardType;
  239.     [pboard declareTypes:types num:k owner:NXApp];    
  240.     return self;
  241. }
  242.  
  243. - writeDataToPasteboard:pboard
  244. {
  245.     NXStream *stream;
  246.     NXTypedStream *typedStream;
  247.     
  248.        stream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
  249.     typedStream = NXOpenTypedStream(stream, NX_WRITEONLY);
  250.     [tree writeToPBStream:typedStream];
  251.     NXSeek(stream, 0, NX_FROMSTART);
  252.     [pboard writeType:WoodPboardType fromStream:stream];
  253.     if(typedStream)
  254.         NXCloseTypedStream(typedStream);
  255.     if(stream)
  256.         NXCloseMemory(stream, NX_FREEBUFFER);
  257.     return self;
  258. }
  259.  
  260. - writePostScriptToPasteboard:pboard
  261. {
  262.     NXStream *stream = NULL;
  263.     
  264.     stream = NXOpenMemory(NULL, 0, NX_READWRITE);
  265.     [treeView writePSToStream:stream usingTree:tree];
  266.     NXSeek(stream, 0, NX_FROMSTART);
  267.     [pboard writeType:NXPostScriptPboardType fromStream:stream];
  268.     if(stream)
  269.         NXCloseMemory(stream, NX_FREEBUFFER);    
  270.     return self;
  271. }
  272.  
  273. - writeOOESourceApplicationToPasteboard:pboard
  274. {
  275.     [pboard writeType:WoodOOEApplicationInfoPboardType data:WoodName length:strlen(WoodName)];
  276.     return self;
  277. }
  278.  
  279. @end
  280.