This is tdcPasteboard.m in view mode; [Download] [Up]
/* * tdcPasteboard - pasteboard functions for the ToDoController * * You may freely copy, distribute and reuse the code in this example. * This code is provided AS IS without warranty of any kind, expressed * or implied, as to its fitness for any particular use. * * Copyright 1995 Ralph Zazula (zazula@next.com). All Rights Reserved. * */ #import "ToDoController.h" #import "ToDoItem.h" const char *ToDoListPBoardType = "ToDoList v1.0 Item Pasteboard"; extern BOOL IncludesType(const NXAtom *types, NXAtom type); @implementation ToDoController(Pasteboard) - copy:sender { if(![self copyToPasteboard:[Pasteboard new]]) { NXBeep(); return nil; } return self; } - paste:sender { if(![self pasteFromPasteboard:[Pasteboard new]]) { NXBeep(); return nil; } return self; } - cut:sender { if([self copy:self]) { [self delete:self]; } return self; } - delete:sender { [self remove:self]; return self; } /*** utility methods used by cut/copy/paste and services ***/ - copyToPasteboard:(Pasteboard *)pboard { const char *myTypes[3] = {NXAsciiPboardType, ToDoListPBoardType, NULL}; NXStream *stream; BOOL failed = NO; id itemList = [self selectedItems]; ToDoListPBoardType = NXUniqueStringNoCopy(ToDoListPBoardType); if(itemList && [itemList count]) { int i; char *buf; int len; /* declare the two types */ [pboard declareTypes:myTypes num:2 owner:NULL]; /* write the ASCII representation */ NX_DURING stream = NXOpenMemory(NULL, 0, NX_READWRITE); for(i=0; i<[itemList count]; i++) { [[itemList objectAt:i] writeToStream:stream]; NXPrintf(stream, "\n"); } [pboard writeType:NXAsciiPboardType fromStream:stream]; NXCloseMemory(stream, NX_FREEBUFFER); NX_HANDLER failed = YES; NX_ENDHANDLER /* write the internal representation */ buf = NXWriteRootObjectToBuffer(itemList, &len); [pboard writeType:ToDoListPBoardType data:buf length:len]; NXFreeObjectBuffer(buf, len); /* return status */ return failed ? nil : self; } return nil; } - pasteFromPasteboard:(Pasteboard *)pboard { const char * const *types; char *data; int len; id pasteList; ToDoListPBoardType = NXUniqueStringNoCopy(ToDoListPBoardType); types = [pboard types]; if(IncludesType(types, ToDoListPBoardType)) { if([pboard readType:ToDoListPBoardType data:&data length:&len]) { pasteList = NXReadObjectFromBuffer(data, len); [todoList appendList:pasteList]; [pboard deallocatePasteboardData:data length:len]; [self dirty:nil]; [self update]; [self selectItem:[pasteList objectAt:0]]; pasteList = [pasteList free]; } } else { /* check for ASCII or RTF data on pboard */ NXStream *s = NULL; if(IncludesType(types, NXRTFPboardType)) { s = [pboard readTypeToStream:NXRTFPboardType]; } else if(IncludesType(types, NXAsciiPboardType)) { s = [pboard readTypeToStream:NXAsciiPboardType]; } if(s) { id item = [[ToDoItem alloc] init]; [item setSubject:"<Pasteboard>"]; [item setDataFromStream:s]; NXCloseMemory(s, NX_FREEBUFFER); [todoList addObject:item]; [self dirty:nil]; [self update]; [self selectItem:item]; } } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.