views:

368

answers:

3

I need to get the URLs of all files dragged/dropped into my application from Finder.

I have a Cocoa app running on 10.6 which does this by using the new 10.6 NSPasteboard APIs which handle multiple items on the pasteboard. I'm trying to backport this app to 10.5. How do I handle this on 10.5?

If I do something like below, I only get the first URL:

    NSArray *pasteTypes = [NSArray arrayWithObjects: NSURLPboardType, nil];
    NSString *bestType = [pboard availableTypeFromArray:pasteTypes]; 
    if (bestType != nil) {
        NSURL *url = [NSURL URLFromPasteboard:pboard];
    }        
+1  A: 

Getting multiple filenames is easy: (While getting multiple URLs is not with 10.5)

  1. Register your view for NSFilenamesPboardType
  2. In performDragOperation: do the following to get an array of file paths:

NSPasteboard* pboard = [sender draggingPasteboard];
NSArray* urls = [pboard propertyListForType:NSFilenamesPboardType];
weichsel
A: 

How do I handle [multiple items on a pasteboard] on 10.5?

Try the Pasteboard Manager.

The tricky part is that you're handling a drop, which means you're receiving an NSPasteboard already created for you, and there's no way to convert between NSPasteboard objects and PasteboardRefs. You'll have to ask the NSPasteboard for its name, then pass the same name to PasteboardCreate, and that may not work.

Peter Hosey
+1  A: 

The IKImageKit programming topics outline a way to do this like so (paraphrased):

   NSData *data = [pasteboard dataForType:NSFilenamesPboardType];
   NSArray *filenames = [NSPropertyListSerialization
        propertyListFromData:data
            mutabilityOption:kCFPropertyListImmutable
                      format:nil
            errorDescription:&errorDescription];

See here: Image Kit Programming Guide: Supporting Drag and Drop

ctshryock