views:

176

answers:

3

In the Nav Services world one could specify kNavDontConfirmReplacement as an option to create a NavDialogRef that would not ask the user to confirm the replacement of a file when saving with a file name that already exists. How do I specify an equivalent behavior with the Cocoa NSSavePanel?

A: 

No, there is no easy way to do this with NSSavePanel. In theory you could extend NSSavePanel with a category and override certain private methods. I took a quick look though and there is nothing simple about it.

Ken Aspeslagh
Some discussion of doing that using overrides here:http://www.cocoadev.com/index.pl?DisableAlertBoxInNSSavePanel
Ken Aspeslagh
A: 

Your customers is going to expect the exact confirmation alert when faced with a NSSavePanel, so don't customize it.

I'm not sure what kind of customized confirm-overwrite dialog you are planning, but might I suggest you use a NSOpenPanel instead, and customize this dialog box with a "Create New File" button? (I believe you can do this via setAccessoryView API.)

For example, if you are asking your customer to choose a file to append new data to, the NSOpenPanel will work quite well; and if the customer want to save the new data to a new file (instead of appending to an existing file), the "Create New File" button is just an additional click.

Heng-Cheong Leong
+1  A: 

Here's how it can be done:

  1. Add a delegate to handle NSSavePanel callbacks
  2. Override - (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag in your delegate
  3. In the delegate:
    1. If okFlag is false, return filename
    2. Otherwise, retain filename as an NSString* in your delegate
    3. Return some unique string that is highly unlikely to be the name of an actual file
  4. When NSSavePanel returns to your code, pull the value of filename from your delegate method, and discard whatever filename NSSavePanel told you (which should be your unique string).

Since userEnteredFilename: is called by the OS before the confirm-replace check is made it gives you a chance to get what the user specified without letting the OS in on the secret. The unique string will assure that the confirm-replace dialog is not popped accidentally.

Gross but efficacious.

fbrereto