//************************************************************************************** // 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, CFStringRef inClientName, CFStringRef inMessage) { outRef = NULL; NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose 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; } Boolean CreatePathFromChooseFileDialog(CFURLRef &outRef, CFStringRef inClientName, CFStringRef inMessage) { outRef = NULL; NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreateChooseFileDialog( &dialogOptions, NULL, NULL, NULL, 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; } Boolean CreatePathFromChooseFolderDialog(CFURLRef &outRef, CFStringRef inClientName, CFStringRef inMessage) { outRef = NULL; NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreateChooseFolderDialog( &dialogOptions, NULL, 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; } Boolean CreatePathFromChooseObjectDialog(CFURLRef &outRef, CFStringRef inClientName, CFStringRef inMessage) { outRef = NULL; NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreateChooseObjectDialog( &dialogOptions, NULL, NULL, 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; } #pragma mark ---- FSRef versions ---- Boolean ChooseFolderDialog(FSRef &outFolderRef, CFStringRef inClientName, CFStringRef inMessage, CFStringRef inActionButtLabel) { NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; dialogOptions.actionButtonLabel = inActionButtLabel; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreateChooseFolderDialog( &dialogOptions, NULL, 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) { err = GetFSRefFromNavReply(&reply, outFolderRef); ::NavDisposeReply( &reply ); outOK = (err == noErr); } } } ::NavDialogDispose( dialogRef ); } return outOK; } Boolean ChooseFileDialog(FSRef &outRef, CFStringRef inClientName, CFStringRef inMessage, CFStringRef inActionButtLabel) { NavDialogCreationOptions dialogOptions; OSStatus err = ::NavGetDefaultDialogCreationOptions( &dialogOptions ); if( err != noErr) return false; dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; dialogOptions.modality = kWindowModalityAppModal; dialogOptions.clientName = inClientName; dialogOptions.message = inMessage; dialogOptions.actionButtonLabel = inActionButtLabel; if(inClientName != NULL) dialogOptions.preferenceKey = ::CFHash(inClientName);//more or less unique value - enough for this purpose Boolean outOK = false; NavDialogRef dialogRef = NULL; err = ::NavCreateChooseFileDialog( &dialogOptions, NULL, NULL, NULL, 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) { err = GetFSRefFromNavReply(&reply, outRef); ::NavDisposeReply( &reply ); outOK = (err == noErr); } } } ::NavDialogDispose( dialogRef ); } return outOK; } #pragma mark - 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) { if(navReply->saveFileName != NULL) { CFObjDel parentDel(parentURLRef); return ::CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault, parentURLRef, navReply->saveFileName, false); } else return parentURLRef; } } return NULL; } OSStatus GetFSRefFromNavReply(const NavReplyRecord * navReply, FSRef &outFSRef) { AEKeyword theAEKeyword; DescType typeCode; Size actualSize; return ::AEGetNthPtr( &(navReply->selection), 1, typeFSRef, &theAEKeyword, &typeCode, &outFSRef, sizeof(FSRef), &actualSize); }