views:

914

answers:

5

Some applications, like Photoshop, allow users to drag a picture from a web browser, or drag a file from the filesystem, onto the application's icon in the dock. Doing this opens the file in that application.

How is this done? I'd like to use Cocoa and Objective-C, but I'm interested in any solutions in any languages.

A: 

This might get you going in the right direction.

Open Contents

Robert Rouse
+8  A: 

This page has instructions on how to accept stuff dragged onto your app's Dock icon.

Andy
That seems pretty comprehensive, couple this with the links from Mr Hosey http://stackoverflow.com/questions/501079/how-do-i-make-an-os-x-application-react-when-a-file-picture-etc-is-dropped-on-i/501416#501416
Jonathan
+2  A: 

If your application is document-based and you filled out the necessary keys in your Info.plist correctly, then it Just Works. When the user drags a file to your application's Dock tile, Dock will highlight your app on the tile if the file is of a type you signed up for, and if the user drops the file there, NSDocumentController will instantiate one of your document classes for the file. If the file is not of a type you signed up for, both will ignore it.

So, is your app document-based? If so, is the file one of a type you signed up for?

For more information:

Peter Hosey
+6  A: 

NSApplication allows you to set a delegate for your application. If the user drags a file onto your dock icon, NSApplication will call the method

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename

of your delegate object, in case it implements any such method. In case the content is not really a file (e.g. if the user just selects text in an application and drags it onto your dock icon), the delegate method

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

is called.

See NSApplication class reference

Basically you can just create any object of any kind (e.g. a simple one that just inherits of NSObject), define the two methods of above within the object and then anywhere in your start up code of the app you do

whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];

And that's it. As soon as a file or some other content is dropped onto the dock icon, the appropriate method is called and must handle that request. BTW the same methods are called if your application associates with a file type (e.g. .myFileType) and the user double clicks a file with that extension in the Finder.

What really happens behind the scenes is that Launch Services sends your application an "open documents" ('odoc') Apple Event. NSApplication by default registers a handle for this event and forwards the request by calling the appropriate delegate method. You can also directly listen to this Apple Event I guess, but why would you? Dealing with Apple Events directly is awkward. When your application is not Cocoa, but Carbon (plain-C), you may have to directly process the Apple Event (I'm not familiar with Carbon), but in Cocoa Apple already catches the most important Apple Events for you and converts them into delegate calls or notifications your application can listen to.

Mecki
+2  A: 

An example project.

rpj
Thanks a lot. Very helpful.
Holli