Differences between Editor and Viewer in NSDocument - cocoa

I have a NSDocument that acts as an editor for one of my document types and as a viewer for another. Does Apple's default code lock the file for a viewer and/or do anything else to help the developer? Or is editor-ness vs. viewer-ness something my type has to define and enforce manually?

Related

Why do I get multiple instances of NSDocument but only one window?

In my Document based application, no less than three documents are opened when I run the app, yet only one window displays. When I save&quit, it saves another document than the one that belongs to the window.
How can this happen? In particular, I do not want multiple instances of NSDocument, how can I avoid this at startup?
I found that this has to do with the way that the app was set up in the Interface Builder. The code did not cause this behavior.
So, if seemingly random documents are opening up when starting a doc-based application, remember to also check you xib settings in IB!

inverse of LSGetApplicationForItem

I am writing a image viewer application, which I need to set as default application for jpeg/gif files. There is an API LSGetApplicationForItem/Info for getting information on what is the default application.
But I am not able to find an API where I can set my application as the default viewer for image files.
Can you please help
You want the LSSetDefaultRoleHandlerForContentType function. Pass kUTTypeGIF for GIF, kUTTypeJPEG for JPEG.
Please only do this when the user explicitly tells you to. Otherwise, they will hate you.
There's not a public API to do that, as far as I know. Instead, you register, using Info.plist (or the Document Types section of the Info editor in Xcode), that you are a provider of viewing and/or editing for whatever file types you are interested in. This will cause the system to choose your app if there's no other app who can open those file types, and will put you in the running if the user chooses Open With from the context menu when selecting a file in the Finder.

File extension icon on Mac

My application uses new proprietary file formats with extensions never been used before. I would like to associate specific icons to display my files in finder with nice iconography. As far as I know LaunchService is responsible to handle all these data, however I'm confused where, when and how shall I create associations.
Which entries I have to add to plist?
Where I need to actually register this extension - during installation? Is there any script for this?
Add a CFBundleDocumentTypes key to your plist, see
Storing Document Types Information in the Application's Property List

How does Windows associate icons to files in explorer shell?

I have both InDesign CS2 and CS3 installed. Both use files with .indd extension. How does Windows know which icon to use? It uses correct icons i.e. CS2 files have cs2 icon and CS3 files have CS3 icon.
How does Windows know how to do this?
And how can I extract or use this version-detection system in my programs?
Edit:
Thank you for your shell-extension-icon-handler answers. Something new to me. But is there any way I could connect to IconHandler that InDesign provides and use it to detect version of the InDesign file?
You need to write an Icon Handler shell extension. See the MSDN documentation for IExtractIcon. The basic mechanism is that you create a shell extension and register the icon handler for the file type you want (look in HKEY_CLASSES_ROOT/.indd) and then the shell loads your handler, passes the file information and requests an icon in return. There's also the IExtractImage method if you want to provide a thumbnail bitmap rather than just an icon.
Note that you need to be especially careful writing shell extension handlers as any memory leaks or crashes can nuke the explorer and any other applications that display a file open/save dialog.
For some files it's HKEY_CLASSES_ROOT\<file extension here>\DefaultIcon registry entry, but most files map to a more friendly name, e.g. .pdf\(Default) -> AcroExch.Document (if Adobe Reader is installed).
In that case you have to go along the registry to AcroExch.Document and see that either
DefaultIcon is right there or
AcroExch.Document\CLSID\(Default) is some GUID. Then, follow HKEY_CLASSES_ROOT\CLSID\<insert that guid here> and you'll notice that this key contains DefaultIcon
... and DefaultIcon is where the icon is loaded from.
Hope that was clear enough ;). I don't know about your special case but there should be a distinction in the registry.
It almost certainly installs a shell icon extension handler. Writing your own and knowing how to detect the version in a file format that isn't documented well or at all is quite tricky.

Drag and Drop simulation?

I have a proprietary application with the only way to pass data externally - drag and drop from other application (like dragging a file from Windows explorer). My question is, is it possible to simulate drag'n'drop from external applicaiton? Pure win32 solution preferred, dependencies like MFC and WTL could be included too.
Help!
I think it is possible, but you will probably need COM for that (I'm not sure though - there is a WM_DROPFILES message, and some related functions, but I couldn't find one for dropping data). See this article on MSDN.

Resources