OSStatus CNavOpenDialog::CreateGetFileDialog( NavEventProcPtr eventHandler ) { OSStatus status = paramErr; require( fNavDialogRef == NULL, FAIL ); if( fEventHandler != NULL ) { DisposeNavEventUPP( fEventHandler ); fEventHandler = NULL; } if( eventHandler != NULL ) fEventHandler = NewNavEventUPP( eventHandler ); if( fEventHandler != NULL ) { // assumption: fPreviewer, and fObjectFilter are either NULL or correctly setup // before this function was called. status = NavCreateGetFileDialog( &fNavDialogOptions, NULL /*typeList*/, // the old way to filter files fEventHandler /*event callback*/, fPreviewer/*preview callback*/, fObjectFilter/*filter callback*/, // the OSX way to filter files this/*userData*/, &fNavDialogRef/*dialog ref*/ ); } FAIL: return status; }
// get a CFURLRef for a movie file static OSStatus GetMovieFileURL( CFURLRef *urlRef ) { OSStatus status; NavDialogCreationOptions myDialogOptions; status = NavGetDefaultDialogCreationOptions (&myDialogOptions); NavDialogRef myDialogRef; status = NavCreateGetFileDialog (&myDialogOptions, NULL, NULL, NULL, NULL, NULL, &myDialogRef); status = NavDialogRun (myDialogRef); NavReplyRecord reply; status = NavDialogGetReply(myDialogRef, &reply); if ( reply.validRecord ) // User saved { *urlRef = GetCFURLFromNavReply(&reply); } else // User cancelled { status = userCanceledErr; } return( status ); }
//--------------------------------------------------------------------- // Gets a file to open from the user. Caller must release the CFURLRef. CFURLRef GetOpenFileFromUser(bool bFolder) { NavDialogCreationOptions dialogOptions; NavDialogRef dialog; NavReplyRecord replyRecord; CFURLRef fileAsCFURLRef = NULL; FSRef fileAsFSRef; OSStatus status; // Get the standard set of defaults status = NavGetDefaultDialogCreationOptions(&dialogOptions); require_noerr( status, CantGetNavOptions ); // Make the window app-wide modal dialogOptions.modality = kWindowModalityAppModal; dialogOptions.optionFlags != kNavAllowOpenPackages; // Create the dialog if( bFolder ){ status = NavCreateChooseFolderDialog(&dialogOptions, NULL, NULL, NULL, &dialog); }else{ status = NavCreateGetFileDialog(&dialogOptions, NULL, NULL, NULL, NULL, NULL, &dialog); } require_noerr( status, CantCreateDialog ); // Show it status = NavDialogRun(dialog); require_noerr( status, CantRunDialog ); // Get the reply status = NavDialogGetReply(dialog, &replyRecord); require( ((status == noErr) || (status == userCanceledErr)), CantGetReply ); // If the user clicked "Cancel", just bail if ( status == userCanceledErr ) goto UserCanceled; // Get the file //TODO: for multiple files - 1 specifies index status = AEGetNthPtr(&(replyRecord.selection), 1, typeFSRef, NULL, NULL, &fileAsFSRef, sizeof(FSRef), NULL); require_noerr( status, CantExtractFSRef ); // Convert it to a CFURL fileAsCFURLRef = CFURLCreateFromFSRef(NULL, &fileAsFSRef); // Cleanup CantExtractFSRef: UserCanceled: verify_noerr( NavDisposeReply(&replyRecord) ); CantGetReply: CantRunDialog: NavDialogDispose(dialog); CantCreateDialog: CantGetNavOptions: return fileAsCFURLRef; }
OSStatus OpenFileDialog( OSType applicationSignature, short numTypes, OSType typeList[], NavDialogRef *outDialog ) { OSStatus theErr = noErr; if ( gOpenFileDialog == NULL ) { NavDialogCreationOptions dialogOptions; NavTypeListHandle openList = NULL; NavGetDefaultDialogCreationOptions( &dialogOptions ); dialogOptions.modality = kWindowModalityNone; dialogOptions.clientName = CFStringCreateWithPascalString( NULL, LMGetCurApName(), GetApplicationTextEncoding()); openList = (NavTypeListHandle)NewOpenHandle( applicationSignature, numTypes, typeList ); theErr = NavCreateGetFileDialog( &dialogOptions, openList, GetPrivateEventUPP(), NULL, NULL, NULL, &gOpenFileDialog ); if ( theErr == noErr ) { theErr = NavDialogRun( gOpenFileDialog ); if ( theErr != noErr ) { NavDialogDispose( gOpenFileDialog ); gOpenFileDialog = NULL; } } if (openList != NULL) { DisposeHandle((Handle)openList); } if ( dialogOptions.clientName != NULL ) { CFRelease( dialogOptions.clientName ); } } else { if ( NavDialogGetWindow( gOpenFileDialog ) != NULL ) { SelectWindow( NavDialogGetWindow( gOpenFileDialog )); } } if ( outDialog != NULL ) { *outDialog = gOpenFileDialog; } return NULL; }
OSStatus DoOpenDocument(void) { OSStatus err = noErr; NavDialogCreationOptions dialogOptions; OurDialogData *dialogDataP = NULL; static NavEventUPP gNavEventProc = NULL; // event proc for our Nav Dialogs if(!gNavEventProc){ gNavEventProc = NewNavEventUPP(NavEventProc); if(!gNavEventProc) err = memFullErr; } // while our open dialog is up we'll disable our Open command, else // we might end up with more than one open dialog. Yuk DisableMenuCommand(NULL, kHICommandOpen); dialogDataP = (OurDialogData *)calloc(1, sizeof(OurDialogData)); if(!dialogDataP) err = memFullErr; if (!err && ( err = NavGetDefaultDialogCreationOptions( &dialogOptions )) == noErr ) { dialogOptions.preferenceKey = kOpenPrefKey; dialogOptions.modality = kWindowModalityAppModal; // make it modal if ((err = NavCreateGetFileDialog( &dialogOptions, NULL, //openListH, gNavEventProc, NULL, // no custom previews NULL, // filter proc is NULL dialogDataP, &dialogDataP->dialogRef )) == noErr) { if (( err = NavDialogRun( dialogDataP->dialogRef )) != noErr){ if ( dialogDataP->dialogRef != NULL ){ NavDialogDispose( dialogDataP->dialogRef ); dialogDataP->dialogRef = NULL; free(dialogDataP); } } } if(err == userCanceledErr){ err = noErr; } EnableMenuCommand(NULL, kHICommandOpen); } return err; }
fileData* MacOSXDirScanner::openFileDialog() { OSStatus err; NavDialogRef openDialog; NavDialogCreationOptions dialogAttributes; int n = 0; if ( openfD ) { delete openfD; openfD = NULL; } if( AudicleWindow::our_fullscreen ) { glutReshapeWindow( AudicleWindow::main()->m_w, AudicleWindow::main()->m_h ); glutPostRedisplay(); AudicleWindow::our_fullscreen = FALSE; return NULL; } err = NavGetDefaultDialogCreationOptions( &dialogAttributes ); dialogAttributes.modality = kWindowModalityAppModal; gNavEventHandlerPtr = NewNavEventUPP( dialogFileCallback ); err = NavCreateGetFileDialog( &dialogAttributes, NULL, gNavEventHandlerPtr, NULL, NULL, NULL, &openDialog ); if ( !AudicleGfx::cursor_on ) { ShowCursor(); AudicleGfx::cursor_on = true; } err = NavDialogRun( openDialog ); if ( err != noErr ) { NavDialogDispose( openDialog ); DisposeNavEventUPP( gNavEventHandlerPtr ); return NULL; } return openfD; }
OSFileRequest::OSFileRequest (const int reqType, const char *title, const char *fileType, const char *ext, const char *baseName, const char *path, const char *_baseDirType, int bufLen) : type(reqType), m_data(new Data) { m_data->status = NavGetDefaultDialogCreationOptions(&m_data->dialogOptions); m_data->dialogOptions.modality = kWindowModalityAppModal; m_data->dialogOptions.windowTitle = CFStringCreateWithCString(NULL, title, kCFStringEncodingMacRoman); m_data->dialogOptions.saveFileName = CFStringCreateWithCString(NULL, baseName, kCFStringEncodingMacRoman); if (type == FREQ_LOAD) { m_data->status = NavCreateGetFileDialog(&m_data->dialogOptions, NULL, NULL, NULL, NULL, NULL, &m_data->dialog); } else if (type == FREQ_SAVE) { m_data->status = NavCreatePutFileDialog(&m_data->dialogOptions, kUnknownType, kUnknownType, NULL, NULL, &m_data->dialog); } }
char *Sys_PathFromOpenMenu(void) { /* present an open file dialog and return the file's path */ OSStatus res; NavDialogCreationOptions options; NavDialogRef dialog; NavReplyRecord reply; NavUserAction action; FSRef fileRef; CFURLRef cfUrl; CFStringRef cfString; res = NavGetDefaultDialogCreationOptions(&options); options.modality = kWindowModalityAppModal; res = NavCreateGetFileDialog(&options, NULL, NULL, NULL, NULL, NULL, &dialog); NavDialogRun(dialog); action = NavDialogGetUserAction(dialog); if (action == kNavUserActionNone || action == kNavUserActionCancel) return NULL; res = NavDialogGetReply(dialog, &reply); if (res != noErr) return NULL; res = AEGetNthPtr(&reply.selection, 1, typeFSRef, NULL, NULL, &fileRef, sizeof(FSRef), NULL); cfUrl = CFURLCreateFromFSRef(NULL, &fileRef); cfString = NULL; if (cfUrl) { cfString = CFURLCopyFileSystemPath(cfUrl, kCFURLPOSIXPathStyle); CFRelease(cfUrl); } memset(g_OpenFileName, 0, PATH_MAX); CFStringGetCString(cfString, g_OpenFileName, PATH_MAX, kCFStringEncodingMacRoman); return g_OpenFileName; }
bool nav_open_file(char *filetype,char *path) { NavDialogCreationOptions navoption; NavReplyRecord navreply; NavEventUPP navevent; NavObjectFilterUPP navfilter; AEKeyword keyword; DescType typecode; Size sz; NavDialogRef diagref; FSRef fsref; strcpy(nav_filetype,filetype); NavGetDefaultDialogCreationOptions(&navoption); navoption.optionFlags-=kNavDontAddTranslateItems; navoption.optionFlags-=kNavAllowPreviews; navevent=NewNavEventUPP(nav_event_proc); navfilter=NewNavObjectFilterUPP(nav_file_filter); NavCreateGetFileDialog(&navoption,NULL,navevent,NULL,navfilter,NULL,&diagref); NavDialogRun(diagref); NavDialogGetReply(diagref,&navreply); NavDialogDispose(diagref); DisposeNavEventUPP(navevent); DisposeNavObjectFilterUPP(navfilter); if (!navreply.validRecord) { NavDisposeReply(&navreply); return(FALSE); } AEGetNthPtr(&(navreply.selection),1,typeFSRef,&keyword,&typecode,(void*)&fsref,sizeof(FSRef),&sz); NavDisposeReply(&navreply); FSRefMakePath(&fsref,(unsigned char*)path,1024); return(TRUE); }
QStringList Q3FileDialog::macGetOpenFileNames(const QString &filter, QString *pwd, QWidget *parent, const char* /*name*/, const QString& caption, QString *selectedFilter, bool multi, bool directory) { OSErr err; QStringList retstrl; NavDialogCreationOptions options; NavGetDefaultDialogCreationOptions(&options); options.modality = kWindowModalityAppModal; options.optionFlags |= kNavDontConfirmReplacement | kNavSupportPackages; if (!multi) options.optionFlags &= ~kNavAllowMultipleFiles; if(!caption.isEmpty()) options.windowTitle = CFStringCreateWithCharacters(NULL, (UniChar *)caption.unicode(), caption.length()); static const int w = 450, h = 350; options.location.h = options.location.v = -1; if(parent && parent->isVisible()) { Qt::WindowType wt = parent->window()->windowType(); if (wt != Qt::Desktop && wt != Qt::Sheet && wt != Qt::Drawer) { options.modality = kWindowModalityWindowModal; options.parentWindow = qt_mac_window_for(parent); } else { parent = parent->window(); QString s = parent->windowTitle(); options.clientName = CFStringCreateWithCharacters(NULL, (UniChar *)s.unicode(), s.length()); options.location.h = (parent->x() + (parent->width() / 2)) - (w / 2); options.location.v = (parent->y() + (parent->height() / 2)) - (h / 2); QRect r = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber(parent)); if(options.location.h + w > r.right()) options.location.h -= (options.location.h + w) - r.right() + 10; if(options.location.v + h > r.bottom()) options.location.v -= (options.location.v + h) - r.bottom() + 10; } } else if(QWidget *p = qApp->mainWidget()) { static int last_screen = -1; int scr = QApplication::desktop()->screenNumber(p); if(last_screen != scr) { QRect r = QApplication::desktop()->screenGeometry(scr); options.location.h = (r.x() + (r.width() / 2)) - (w / 2); options.location.v = (r.y() + (r.height() / 2)) - (h / 2); } } QList<qt_mac_filter_name*> filts = makeFiltersList(filter); qt_mac_nav_filter_type t; t.index = 0; t.filts = &filts; if(filts.count() > 1) { int i = 0; CFStringRef *arr = (CFStringRef *)malloc(sizeof(CFStringRef) * filts.count()); for (QList<qt_mac_filter_name*>::Iterator it = filts.begin(); it != filts.end(); ++it) { QString rg = (*it)->description; arr[i++] = CFStringCreateWithCharacters(NULL, (UniChar *)rg.unicode(), rg.length()); } options.popupExtension = CFArrayCreate(NULL, (const void **)arr, filts.count(), NULL); } NavDialogRef dlg; if(directory) { if(NavCreateChooseFolderDialog(&options, make_navProcUPP(), NULL, NULL, &dlg)) { qDebug("Shouldn't happen %s:%d", __FILE__, __LINE__); return retstrl; } } else { if(NavCreateGetFileDialog(&options, NULL, make_navProcUPP(), NULL, make_navFilterUPP(), (void *) (filts.isEmpty() ? NULL : &t), &dlg)) { qDebug("Shouldn't happen %s:%d", __FILE__, __LINE__); return retstrl; } } if(pwd && !pwd->isEmpty()) { FSRef fsref; if(qt_mac_create_fsref(*pwd, &fsref) == noErr) { AEDesc desc; if(AECreateDesc(typeFSRef, &fsref, sizeof(FSRef), &desc) == noErr) NavCustomControl(dlg, kNavCtlSetLocation, (void*)&desc); } } NavDialogRun(dlg); if (selectedFilter) { NavMenuItemSpec navSpec; bzero(&navSpec, sizeof(NavMenuItemSpec)); qt_mac_filter_name *sel_filt_name = makeFiltersList(*selectedFilter).at(0); for (int i = 0; i < filts.count(); ++i) { const qt_mac_filter_name *filter = filts.at(i); if (sel_filt_name->description == filter->description && sel_filt_name->regxp == filter->regxp && sel_filt_name->filter == filter->filter) { navSpec.menuType = i; break; } } NavCustomControl(dlg, kNavCtlSelectCustomType, &navSpec); } if(options.modality == kWindowModalityWindowModal) { //simulate modality QWidget modal_widg(parent, __FILE__ "__modal_dlg", Qt::WType_TopLevel | Qt::WStyle_Customize | Qt::WStyle_DialogBorder); modal_widg.createWinId(); QApplicationPrivate::enterModal(&modal_widg); while(g_nav_blocking) qApp->processEvents(QEventLoop::WaitForMoreEvents); QApplicationPrivate::leaveModal(&modal_widg); } if(!(NavDialogGetUserAction(dlg) & (kNavUserActionOpen | kNavUserActionChoose | kNavUserActionNewFolder))) { NavDialogDispose(dlg); return retstrl; } NavReplyRecord ret; NavDialogGetReply(dlg, &ret); NavDialogDispose(dlg); long count; err = AECountItems(&(ret.selection), &count); if(!ret.validRecord || err != noErr || !count) { NavDisposeReply(&ret); return retstrl; } for(long index = 1; index <= count; index++) { FSRef ref; err = AEGetNthPtr(&(ret.selection), index, typeFSRef, 0, 0, &ref, sizeof(ref), 0); if(err != noErr) break; if(!str_buffer) { qAddPostRoutine(cleanup_str_buffer); str_buffer = (UInt8 *)malloc(1024); } FSRefMakePath(&ref, str_buffer, 1024); retstrl.append(QString::fromUtf8((const char *)str_buffer)); } NavDisposeReply(&ret); if(selectedFilter) *selectedFilter = filts.at(t.index)->filter; while (!filts.isEmpty()) delete filts.takeFirst(); return retstrl; }
CFURLRef GetOpenDialogForUser(kDialogType type, char* title, char* message) { NavDialogCreationOptions dialogOptions; NavDialogRef dialog = NULL; NavReplyRecord replyRecord; CFURLRef fileAsCFURLRef = NULL; FSRef fileAsFSRef; OSStatus status; CFAllocatorRef alloc_default = kCFAllocatorDefault; // = NULL; // Get the standard set of defaults status = NavGetDefaultDialogCreationOptions(&dialogOptions); require_noerr( status, CantGetNavOptions ); dialogOptions.optionFlags = kNavNoTypePopup + kNavSupportPackages + kNavAllowOpenPackages; if (title != NULL) { CFStringRef cftitle = CFStringCreateWithCString(alloc_default,title,kCFStringEncodingMacRoman); dialogOptions.windowTitle = cftitle; } if (message != NULL) { CFStringRef cfmessage = CFStringCreateWithCString(alloc_default,message,kCFStringEncodingMacRoman); dialogOptions.message = cfmessage; } // Make the window app-wide modal dialogOptions.modality = kWindowModalityAppModal; // Create the dialog if (type == kDialogFile) { status = NavCreateGetFileDialog(&dialogOptions, NULL, NULL, NULL, NULL, NULL, &dialog); } else if (type == kDialogFolder) { status = NavCreateChooseFolderDialog(&dialogOptions, NULL, NULL, NULL, &dialog); } require_noerr( status, CantCreateDialog ); // Show it status = NavDialogRun(dialog); require_noerr( status, CantRunDialog ); // Get the reply status = NavDialogGetReply(dialog, &replyRecord); require( ((status == noErr) || (status == userCanceledErr)), CantGetReply ); // If the user clicked "Cancel", just bail if ( status == userCanceledErr ) goto UserCanceled; // Get the file status = AEGetNthPtr(&(replyRecord.selection), 1, typeFSRef, NULL, NULL, &fileAsFSRef, sizeof(FSRef), NULL); require_noerr( status, CantExtractFSRef ); // Convert it to a CFURL fileAsCFURLRef = CFURLCreateFromFSRef(NULL, &fileAsFSRef); // Cleanup CantExtractFSRef: UserCanceled: verify_noerr( NavDisposeReply(&replyRecord) ); CantGetReply: CantRunDialog: NavDialogDispose(dialog); CantCreateDialog: CantGetNavOptions: return fileAsCFURLRef; }
QStringList qt_mac_get_open_file_names(const QFileDialogArgs &args, QString *pwd, QString *selectedFilter) { QWidget *parent = args.parent; OSErr err; QStringList retstrl; NavDialogCreationOptions options; NavGetDefaultDialogCreationOptions(&options); options.modality = kWindowModalityAppModal; options.optionFlags |= kNavSupportPackages; if (args.options & QFileDialog::DontConfirmOverwrite) options.optionFlags |= kNavDontConfirmReplacement; if (args.mode != QFileDialog::ExistingFiles) options.optionFlags &= ~kNavAllowMultipleFiles; if (!args.caption.isEmpty()) options.windowTitle = QCFString::toCFStringRef(args.caption); static const int w = 450, h = 350; options.location.h = options.location.v = -1; if (parent && parent->isVisible()) { WindowClass wclass; GetWindowClass(qt_mac_window_for(parent), &wclass); if (!(args.options & QFileDialog::DontUseSheet) && (wclass == kDocumentWindowClass || wclass == kFloatingWindowClass || wclass == kMovableModalWindowClass)) { options.modality = kWindowModalityWindowModal; options.parentWindow = qt_mac_window_for(parent); } else { parent = parent->window(); QString s = parent->windowTitle(); options.clientName = QCFString::toCFStringRef(s); options.location.h = (parent->x() + (parent->width() / 2)) - (w / 2); options.location.v = (parent->y() + (parent->height() / 2)) - (h / 2); QRect r = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber(parent)); const int border = 10; if (options.location.h + w > r.right()) options.location.h -= (options.location.h + w) - r.right() + border; if (options.location.v + h > r.bottom()) options.location.v -= (options.location.v + h) - r.bottom() + border; if (options.location.h < r.left()) options.location.h = r.left() + border; if (options.location.v < r.top()) options.location.v = r.top() + border; } #if 0 } else if (QWidget *p = qApp->mainWidget()) { static int last_screen = -1; int scr = QApplication::desktop()->screenNumber(p); if (last_screen != scr) { QRect r = QApplication::desktop()->screenGeometry(scr); options.location.h = (r.x() + (r.width() / 2)) - (w / 2); options.location.v = (r.y() + (r.height() / 2)) - (h / 2); } #endif } QList<qt_mac_filter_name*> filts = qt_mac_make_filters_list(args.filter); qt_mac_nav_filter_type t; t.saveDialog = false; t.index = 0; t.filts = &filts; if (filts.count() > 1) { int i = 0; CFStringRef *arr = static_cast<CFStringRef *>(malloc(sizeof(CFStringRef) * filts.count())); for (QList<qt_mac_filter_name*>::const_iterator it = filts.constBegin(); it != filts.constEnd(); ++it) arr[i++] = QCFString::toCFStringRef((*it)->description); options.popupExtension = CFArrayCreate(0, reinterpret_cast<const void **>(arr), filts.count(), 0); } NavDialogRef dlg; if (args.mode == QFileDialog::DirectoryOnly || args.mode == QFileDialog::Directory) { if (NavCreateChooseFolderDialog(&options, make_navProcUPP(), 0, 0, &dlg)) { qDebug("Shouldn't happen %s:%d", __FILE__, __LINE__); return retstrl; } } else { if (NavCreateGetFileDialog(&options, 0, make_navProcUPP(), 0, make_navFilterUPP(), (void *) (filts.isEmpty() ? 0 : &t), &dlg)) { qDebug("Shouldn't happen %s:%d", __FILE__, __LINE__); return retstrl; } } if (pwd && !pwd->isEmpty()) { FSRef fsref; if (qt_mac_create_fsref(*pwd, &fsref) == noErr) { AEDesc desc; if (AECreateDesc(typeFSRef, &fsref, sizeof(FSRef), &desc) == noErr) NavCustomControl(dlg, kNavCtlSetLocation, (void*)&desc); } } NavDialogRun(dlg); if (selectedFilter) { NavMenuItemSpec navSpec; bzero(&navSpec, sizeof(NavMenuItemSpec)); qt_mac_filter_name *sel_filt_name = qt_mac_make_filters_list(*selectedFilter).at(0); for (int i = 0; i < filts.count(); ++i) { const qt_mac_filter_name *filter = filts.at(i); if (sel_filt_name->description == filter->description && sel_filt_name->regxp == filter->regxp && sel_filt_name->filter == filter->filter) { navSpec.menuType = i; break; } } NavCustomControl(dlg, kNavCtlSelectCustomType, &navSpec); } if (options.modality == kWindowModalityWindowModal) { //simulate modality QWidget modal_widg(parent, Qt::Sheet); modal_widg.createWinId(); QApplicationPrivate::enterModal(&modal_widg); while (g_nav_blocking) qApp->processEvents(QEventLoop::WaitForMoreEvents); QApplicationPrivate::leaveModal(&modal_widg); } if (!(NavDialogGetUserAction(dlg) & (kNavUserActionOpen | kNavUserActionChoose | kNavUserActionNewFolder))) { NavDialogDispose(dlg); return retstrl; } NavReplyRecord ret; NavDialogGetReply(dlg, &ret); NavDialogDispose(dlg); long count; err = AECountItems(&(ret.selection), &count); if (!ret.validRecord || err != noErr || !count) { NavDisposeReply(&ret); return retstrl; } for (long index = 1; index <= count; index++) { FSRef ref; err = AEGetNthPtr(&(ret.selection), index, typeFSRef, 0, 0, &ref, sizeof(ref), 0); if (err != noErr) break; if (!str_buffer) { qAddPostRoutine(cleanup_str_buffer); str_buffer = (UInt8 *)malloc(1024); } FSRefMakePath(&ref, str_buffer, 1024); retstrl.append(QString::fromUtf8((const char *)str_buffer)); } NavDisposeReply(&ret); if (selectedFilter) *selectedFilter = filts.at(t.index)->filter; while (!filts.isEmpty()) delete filts.takeFirst(); return retstrl; }
void GetOpenFileFromUser( char *title, char *path, char *okMsg, char *cancelMsg ) { // Allow the user to choose an existing file NavDialogCreationOptions dialogOptions; NavDialogRef dialog; NavReplyRecord replyRecord; CFURLRef fileAsCFURLRef = NULL; FSRef fileAsFSRef; OSStatus status; UInt8 output_dir_name[1024]; ZFileSpec fs( path ); // Get the standard set of defaults status = NavGetDefaultDialogCreationOptions(&dialogOptions); require_noerr( status, CantGetNavOptions ); // Make the window app-wide modal dialogOptions.modality = kWindowModalityAppModal; dialogOptions.windowTitle = CFStringCreateWithCString( NULL, title, 0 ); dialogOptions.saveFileName = CFStringCreateWithCString( NULL, fs.getFile(), 0 ); // Create the dialog status = NavCreateGetFileDialog(&dialogOptions, NULL, NULL, NULL, NULL, NULL, &dialog); require_noerr( status, CantCreateDialog ); // Show it status = NavDialogRun(dialog); require_noerr( status, CantRunDialog ); // Get the reply status = NavDialogGetReply(dialog, &replyRecord); require( ((status == noErr) || (status == userCanceledErr)), CantGetReply ); // If the user clicked "Cancel", just bail if ( status == userCanceledErr ) { if( cancelMsg ) { zMsgQueue( cancelMsg ); NavDialogDispose( dialog ); return; } } // Get the file status = AEGetNthPtr(&(replyRecord.selection), 1, typeFSRef, NULL, NULL, &fileAsFSRef, sizeof(FSRef), NULL); require_noerr( status, CantExtractFSRef ); FSRefMakePath( &fileAsFSRef, output_dir_name, 1024 ); if( okMsg ) { zMsgQueue( "%s osx=1 filespec='%s'", okMsg, escapeQuotes( (char*)output_dir_name ) ); } // Cleanup CantExtractFSRef: UserCanceled: verify_noerr( NavDisposeReply(&replyRecord) ); CantGetReply: CantRunDialog: NavDialogDispose(dialog); CantCreateDialog: CantGetNavOptions: return; }
std::string GetOpenFileFromUser(dialog_type d_type) { #ifdef UNDEFINED NavDialogCreationOptions dialogOptions; NavDialogRef dialog; NavReplyRecord replyRecord; //CFURLRef fileAsCFURLRef = NULL; FSRef fileAsFSRef; OSStatus status; CFIndex sz; CFRange r; std::string res; // Get the standard set of defaults status = NavGetDefaultDialogCreationOptions(&dialogOptions); require_noerr( status, CantGetNavOptions ); // Make the window app-wide modal dialogOptions.modality = kWindowModalityAppModal; dialogOptions.optionFlags |= kNavDontConfirmReplacement; // Create the dialog status = (DO_LOAD == d_type)? NavCreateGetFileDialog(&dialogOptions, NULL, NULL, NULL, NULL, NULL, &dialog): NavCreatePutFileDialog(&dialogOptions, kNavGenericSignature, kNavGenericSignature, NULL, NULL, &dialog); require_noerr( status, CantCreateDialog ); // Show it status = NavDialogRun(dialog); require_noerr( status, CantRunDialog ); // Get the reply status = NavDialogGetReply(dialog, &replyRecord); require( ((status == noErr) || (status == userCanceledErr)), CantGetReply ); // If the user clicked "Cancel", just bail if ( status == userCanceledErr ) goto UserCanceled; // Get the file status = AEGetNthPtr(&(replyRecord.selection), 1, typeFSRef, NULL, NULL, &fileAsFSRef, sizeof(FSRef), NULL); require_noerr( status, CantExtractFSRef ); // Convert it to a CFURL // fileAsCFURLRef = CFURLCreateFromFSRef(NULL, &fileAsFSRef); //success, lets extraxct info: // kdl; unsigned char buf[100]; buf[0]=0; //null terminated FSRefMakePath( &fileAsFSRef, (UInt8 *)buf, 100); res = std::string((char *)buf, strlen((char *)buf)); if(DO_SAVE == d_type){ //then add file name to the path. r.location = 0; r.length = CFStringGetLength(replyRecord.saveFileName); CFStringGetBytes( replyRecord.saveFileName, r, kCFStringEncodingUTF8, 0, //dont want to deal with uncovertable strings false, //internal representation buf, 100, &sz); res += "/"; res += std::string((char *)buf, sz); }; // Cleanup CantExtractFSRef: UserCanceled: verify_noerr( NavDisposeReply(&replyRecord) ); CantGetReply: CantRunDialog: NavDialogDispose(dialog); CantCreateDialog: CantGetNavOptions: return res; #else return ""; #endif //UNDEFINED };
//----------------------------------------------------------------------------- FILE* openFileDialog (const char* fileName, int dialogType, void* dataRef) { //zz-osx debug FILE* filePtr = NULL; NavDialogCreationOptions dialogOptions; NavDialogRef dialog; NavReplyRecord replyRecord; CFURLRef fileAsCFURLRef = NULL; FSRef fileAsFSRef; OSStatus status; bool result = false; unsigned char filePath[1024]; char msg[4096]; // Get the standard set of defaults status = NavGetDefaultDialogCreationOptions (&dialogOptions); require_noerr( status, CantGetNavOptions ); // Make the window app-wide modal dialogOptions.modality = kWindowModalityAppModal; // dialogOptions.location = fileName; // Create the dialog status = NavCreateGetFileDialog (&dialogOptions, NULL, NULL, NULL, NULL, NULL, &dialog); require_noerr( status, CantCreateDialog ); // Show it status = NavDialogRun (dialog); require_noerr( status, CantRunDialog ); // Get the reply status = NavDialogGetReply (dialog, &replyRecord); require( ((status == noErr) || (status == userCanceledErr)), CantGetReply ); // If the user clicked "Cancel", just bail if ( status == userCanceledErr ) goto UserCanceled; // Get the file status = AEGetNthPtr ( &(replyRecord.selection), 1, typeFSRef, NULL, NULL, &fileAsFSRef, sizeof(FSRef), NULL); require_noerr( status, CantExtractFSRef ); // Convert it to a CFURL fileAsCFURLRef = CFURLCreateFromFSRef(NULL, &fileAsFSRef); result = CFURLGetFileSystemRepresentation(fileAsCFURLRef, true, filePath, 1024); if (!result) npPostMsg("err 9824 - cannot convert file dialog path", kNPmsgErr, dataRef); else { // printf ("\nFile Path: %s\n", filePath); sprintf (msg, "%s", filePath); filePtr = fopen (msg, "r"); if (filePtr != NULL) { sprintf (msg, "File Open: %s", filePath); npPostMsg (msg, kNPmsgCtrl, dataRef); } else npPostMsg ("err 2995 - File Pointer is NULL", kNPmsgErr, dataRef); return filePtr; } // Cleanup CantExtractFSRef: UserCanceled: verify_noerr( NavDisposeReply(&replyRecord) ); CantGetReply: CantRunDialog: NavDialogDispose(dialog); CantCreateDialog: CantGetNavOptions: // return fileAsCFURLRef; //part of original sample, does not apply here return NULL; }