//************************************************************************************** // Filename: NavDialogs.cp // Part of Contextual Menu Workshop by Abracode Inc. // http://free.abracode.com/cmworkshop/ // Copyright © 2002-2003 Abracode, Inc. All rights reserved. // // Description: // //************************************************************************************** #include "NavDialogs.h" #include "CFObjDel.h" //caller responsible for releasing the CFURLRef path Boolean CreatePathFromSaveAsDialog(CFURLRef &outRef) { outRef = NULL; NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreatePutFileDialog(&dialogOptions, '????', '????', NULL, NULL, &dialogRef); if( (err == noErr) && (dialogRef != NULL) ) { err = ::NavDialogRun( dialogRef ); if( err == noErr ) { NavUserAction theAction = ::NavDialogGetUserAction( dialogRef ); if( (theAction != kNavUserActionCancel) && (theAction != kNavUserActionNone) ) { NavReplyRecord reply; err = ::NavDialogGetReply(dialogRef, &reply); if(err == noErr) { outRef = FURLCreateFromNavReply(&reply); ::NavDisposeReply( &reply ); outOK = true; } } } ::NavDialogDispose( dialogRef ); } return outOK; } CFURLRef FURLCreateFromNavReply(const NavReplyRecord * navReply) { FSRef parentFSRef; AEKeyword theAEKeyword; DescType typeCode; Size actualSize; OSErr theErr = ::AEGetNthPtr( &(navReply->selection), 1, typeFSRef, &theAEKeyword, &typeCode, &parentFSRef, sizeof(FSRef), &actualSize); if(theErr == noErr) { CFURLRef parentURLRef = ::CFURLCreateFromFSRef(kCFAllocatorDefault, &parentFSRef); if(parentURLRef != NULL) { CFObjDel parentDel(parentURLRef); return ::CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault, parentURLRef, navReply->saveFileName, false); } } return NULL; }