bool WDL_ChooseFileForSave(HWND parent, const char *text, const char *initialdir, const char *initialfile, const char *extlist, const char *defext, bool preservecwd, char *fn, int fnsize, const char *dlgid, void *dlgProc, #ifdef _WIN32 HINSTANCE hInstance #else struct SWELL_DialogResourceIndex *reshead #endif ) { char cwd[2048]; GetCurrentDirectory(sizeof(cwd),cwd); #ifdef _WIN32 char temp[4096]; memset(temp,0,sizeof(temp)); if (initialfile) lstrcpyn(temp,initialfile,sizeof(temp)); WDL_fixfnforopenfn(temp); #ifdef WDL_FILEBROWSE_WIN7VISTAMODE { Win7FileDialog fd(text, 1); if(fd.inited()) { //vista+ file open dialog char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); fd.setFilterList(extlist); if (defext) { fd.setDefaultExtension(defext); int i = 0; const char *p = extlist; while(*p) { if(*p) p+=strlen(p)+1; if(!*p) break; if(stristr(p, defext)) { fd.setFileTypeIndex(i+1); break; } i++; p+=strlen(p)+1; } } fd.setFolder(initialdir?initialdir:olddir, 0); if(initialfile) { //check for folder name char *p = temp+strlen(temp); while(p>temp && *p!='/' && *p!='\\') p--; if(*p=='/'||*p=='\\') { //folder found *p=0; fd.setFolder(temp, 0); fd.setFilename(p+1); } else fd.setFilename(temp); } fd.setTemplate(hInstance, dlgid, (LPOFNHOOKPROC)dlgProc); if(fd.show(parent)) { //ifilesavedialog saves the last folder automatically fd.getResult(fn, fnsize); if (preservecwd) SetCurrentDirectory(olddir); return true; } if (preservecwd) SetCurrentDirectory(olddir); return NULL; } } #endif OPENFILENAME l={sizeof(l),parent, hInstance, extlist, NULL,0, 0, temp, sizeof(temp)-1, NULL, 0, initialdir&&initialdir[0] ? initialdir : cwd, text, OFN_HIDEREADONLY|OFN_EXPLORER|OFN_OVERWRITEPROMPT,0,0,defext, 0, (LPOFNHOOKPROC)dlgProc, dlgid}; if (hInstance&&dlgProc&&dlgid) l.Flags |= OFN_ENABLEHOOK|OFN_ENABLETEMPLATE|OFN_ENABLESIZING; if (preservecwd) l.Flags |= OFN_NOCHANGEDIR; if (!GetSaveFileName(&l)||!temp[0]) { if (preservecwd) SetCurrentDirectory(cwd); return false; } if (preservecwd) SetCurrentDirectory(cwd); lstrcpyn(fn,temp,fnsize); return true; #else BrowseFile_SetTemplate(dlgid,(DLGPROC)dlgProc,reshead); char if_temp[4096]; if (initialfile) { lstrcpyn(if_temp,initialfile,sizeof(if_temp)); WDL_fixfnforopenfn(if_temp); initialfile = if_temp; } bool r = BrowseForSaveFile(text,initialdir,initialfile,extlist,fn,fnsize); if (preservecwd) SetCurrentDirectory(cwd); return r; #endif }
char *WDL_ChooseFileForOpen(HWND parent, const char *text, const char *initialdir, const char *initialfile, const char *extlist, const char *defext, bool preservecwd, bool allowmul, const char *dlgid, void *dlgProc, #ifdef _WIN32 HINSTANCE hInstance #else struct SWELL_DialogResourceIndex *reshead #endif ) { char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); #ifdef _WIN32 #ifdef WDL_FILEBROWSE_WIN7VISTAMODE if (!allowmul) // todo : check impl of multiple select, too? { Win7FileDialog fd(text); if(fd.inited()) { //vista+ file open dialog fd.addOptions(FOS_FILEMUSTEXIST); fd.setFilterList(extlist); if (defext) { fd.setDefaultExtension(defext); int i = 0; const char *p = extlist; while(*p) { if(*p) p+=strlen(p)+1; if(!*p) break; if(stristr(p, defext)) { fd.setFileTypeIndex(i+1); break; } i++; p+=strlen(p)+1; } } fd.setFolder(initialdir?initialdir:olddir, 0); fd.setTemplate(hInstance, dlgid, (LPOFNHOOKPROC)dlgProc); if(initialfile) { char temp[4096]; lstrcpyn(temp,initialfile,sizeof(temp)); //check for folder name char *p = temp+strlen(temp); while(p>temp && *p!='/' && *p!='\\') p--; if(*p=='/'||*p=='\\') { //folder found *p=0; fd.setFolder(temp, 0); fd.setFilename(p+1); } else fd.setFilename(temp); } if(fd.show(parent)) { char temp[4096]; temp[0]=0; //ifileopendialog saves the last folder automatically fd.getResult(temp, sizeof(temp)-1); if (preservecwd) SetCurrentDirectory(olddir); return temp[0] ? strdup(temp) : NULL; } if (preservecwd) SetCurrentDirectory(olddir); return NULL; } } #endif int temp_size = allowmul ? 256*1024-1 : 4096-1; char *temp = (char *)calloc(temp_size+1,1); OPENFILENAME l={sizeof(l), parent, hInstance, extlist, NULL, 0, 0, temp, temp_size, NULL, 0, initialdir, text, OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST,0,0, (char *)(defext ? defext : ""), 0, (LPOFNHOOKPROC)dlgProc, dlgid}; if (hInstance&&dlgProc&&dlgid) l.Flags |= OFN_ENABLEHOOK|OFN_ENABLETEMPLATE|OFN_ENABLESIZING; if (allowmul) l.Flags|=OFN_ALLOWMULTISELECT; if (preservecwd) l.Flags|=OFN_NOCHANGEDIR; if (initialfile) lstrcpyn(temp,initialfile,temp_size); WDL_fixfnforopenfn(temp); if (!l.lpstrInitialDir||!l.lpstrInitialDir[0]) l.lpstrInitialDir=olddir; int r = GetOpenFileName(&l); if (preservecwd) SetCurrentDirectory(olddir); if (!r) free(temp); return r?temp:NULL; #else char if_temp[4096]; if (initialfile) { lstrcpyn(if_temp,initialfile,sizeof(if_temp)); WDL_fixfnforopenfn(if_temp); initialfile = if_temp; } // defext support? BrowseFile_SetTemplate(dlgid,(DLGPROC)dlgProc,reshead); char *ret = BrowseForFiles(text,initialdir,initialfile,allowmul,extlist); if (preservecwd) SetCurrentDirectory(olddir); return ret; #endif }
char *WDL_ChooseFileForOpen2(HWND parent, const char *text, const char *initialdir, const char *initialfile, const char *extlist, const char *defext, bool preservecwd, int allowmul, const char *dlgid, void *dlgProc, #ifdef _WIN32 HINSTANCE hInstance #else struct SWELL_DialogResourceIndex *reshead #endif ) { char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); #ifdef _WIN32 #ifdef WDL_FILEBROWSE_WIN7VISTAMODE if (allowmul!=1) { Win7FileDialog fd(text); if(fd.inited()) { //vista+ file open dialog fd.addOptions(FOS_FILEMUSTEXIST|(allowmul?FOS_ALLOWMULTISELECT:0)); fd.setFilterList(extlist); if (defext) { fd.setDefaultExtension(defext); int i = 0; const char *p = extlist; while(*p) { if(*p) p+=strlen(p)+1; if(!*p) break; if(stristr(p, defext)) { fd.setFileTypeIndex(i+1); break; } i++; p+=strlen(p)+1; } } fd.setFolder(initialdir?initialdir:olddir, 0); fd.setTemplate(hInstance, dlgid, (LPOFNHOOKPROC)dlgProc); if(initialfile) { char temp[4096]; lstrcpyn_safe(temp,initialfile,sizeof(temp)); //check for folder name if (WDL_remove_filepart(temp)) { //folder found fd.setFolder(temp, 0); fd.setFilename(temp + strlen(temp) + 1); } else fd.setFilename(temp); } if(fd.show(parent)) { char *ret=NULL; char temp[4096]; temp[0]=0; //ifileopendialog saves the last folder automatically if (!allowmul) { fd.getResult(temp, sizeof(temp)-1); ret= temp[0] ? strdup(temp) : NULL; } else { char* p=NULL; int totallen=0, cnt=fd.getResultCount(); if (cnt>1) { // sets an empty path as 1st returned string for multipath support // (when selecting files among search results for ex.) ret = strdup(""); totallen=1; } int i; for (i=0; i<cnt; i++) { int len = fd.getResult(i, temp, sizeof(temp)-1); p = len ? (char*)realloc(ret, totallen + len + ((i==cnt-1)?1:0)) : NULL; if (p) { ret=p; memcpy(ret+totallen, temp, len); totallen+=len; } else { free(ret); ret=NULL; break; } } if (ret) p[totallen]=0; } if (preservecwd) SetCurrentDirectory(olddir); return ret; } if (preservecwd) SetCurrentDirectory(olddir); return NULL; } } #endif int temp_size = allowmul ? 256*1024-1 : 4096-1; char *temp = (char *)calloc(temp_size+1,1); OPENFILENAME l={sizeof(l), parent, hInstance, extlist, NULL, 0, 0, temp, temp_size, NULL, 0, initialdir, text, OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST,0,0, (char *)(defext ? defext : ""), 0, (LPOFNHOOKPROC)dlgProc, dlgid}; if (hInstance&&dlgProc&&dlgid) l.Flags |= OFN_ENABLEHOOK|OFN_ENABLETEMPLATE|OFN_ENABLESIZING; if (allowmul) l.Flags|=OFN_ALLOWMULTISELECT; if (preservecwd) l.Flags|=OFN_NOCHANGEDIR; if (initialfile) lstrcpyn_safe(temp,initialfile,temp_size); WDL_fixfnforopenfn(temp); if (!l.lpstrInitialDir||!l.lpstrInitialDir[0]) l.lpstrInitialDir=olddir; int r = GetOpenFileName(&l); if (preservecwd) SetCurrentDirectory(olddir); if (!r) free(temp); return r?temp:NULL; #else char if_temp[4096]; if (initialfile) { lstrcpyn_safe(if_temp,initialfile,sizeof(if_temp)); WDL_fixfnforopenfn(if_temp); initialfile = if_temp; } // defext support? BrowseFile_SetTemplate(dlgid,(DLGPROC)dlgProc,reshead); char *ret = BrowseForFiles(text,initialdir,initialfile,allowmul,extlist); if (preservecwd) SetCurrentDirectory(olddir); return ret; #endif }