//---------------------------------------------------------------------------- // Event EV_BN_CLICKED for ID_ADD - Add one or many files from FileOpen Dialog //---------------------------------------------------------------------------- void ProjWin::EvClickAdd(void) { PAPSZ pp; PAPSZ pp1; PSZ s; pp = FileOpen(); pp1 = pp; while(pp && (s = *pp[0]) != NULL) { PrettyPathFile(s); pp++; if(m_Projectfiles->FindString(s,-1) < 0) { int i = m_Projectfiles->GetSelIndex(); if(i < 0) i = m_Projectfiles->GetCount()-1; if(IsDlgButtonChecked(ID_SORTED) ) m_Projectfiles->InsertString(s,-2); else m_Projectfiles->InsertString(s,i); dirty = TRUE; } } if(pp1) { WinFreeFileDlgList(pp1); } }
BOOL GetAttachedFiles(HWND hwndOwner, char *pchSubject, char *pchDefaultDir) { FILEDLG FileDlg; BOOL rc=FALSE; memset(&FileDlg, 0, sizeof(FileDlg)); FileDlg.cbSize = sizeof(FileDlg); FileDlg.fl = FDS_CENTER | FDS_HELPBUTTON | FDS_MULTIPLESEL | FDS_OPEN_DIALOG; FileDlg.pszTitle = calloc(1, 200); LoadString(IDST_TITLE_ATTACHFILES, 200, FileDlg.pszTitle); if (pchDefaultDir[0]) { strcpy(FileDlg.szFullFile, pchDefaultDir); strcat(FileDlg.szFullFile, "\\*"); } if (WinFileDlg(HWND_DESKTOP, hwndOwner, &FileDlg) && FileDlg.lReturn == DID_OK) { if (FileDlg.ulFQFCount && FileDlg.papszFQFilename) { int iFile=0; while (iFile < FileDlg.ulFQFCount) { if (strlen(pchSubject) + strlen(*FileDlg.papszFQFilename[iFile]) + (*pchSubject ? 1:0) <= LEN_SUBJECT) /* noch genug Platz */ { /* Name anhaengen */ if (*pchSubject) strcat(pchSubject, " "); strcat(pchSubject, *FileDlg.papszFQFilename[iFile]); iFile++; } else break; /* kein Platz, sofort beenden */ } WinFreeFileDlgList(FileDlg.papszFQFilename); rc= TRUE; } } free(FileDlg.pszTitle); return rc; }
int GUIGetFileName( gui_window *wnd, open_file_name *ofn ) { #ifdef _M_I86 wnd = wnd; ofn = ofn; #else FILEDLG fdlg; int str_index; int rc; ULONG i; ULONG slen, flen; unsigned drive; unsigned old_drive; unsigned drives; char initial_path[_MAX_PATH]; char old_path[_MAX_PATH]; char fname[_MAX_FNAME + _MAX_EXT]; char *cwd; old_path[0] = '\0'; fname[0] = '\0'; cwd = getcwd( initial_path, _MAX_PATH ); if( cwd ) { _splitpath( cwd, NULL, old_path, NULL, NULL ); } drive = 0; initial_path[0] = '\0'; if( ofn->initial_dir != NULL && ofn->initial_dir[0] != '\0' ) { if( ofn->initial_dir[1] == ':' ) { drive = ofn->initial_dir[0]; } _splitpath( ofn->initial_dir, NULL, initial_path, NULL, NULL ); } memset( &fdlg, 0 , sizeof( fdlg ) ); fdlg.cbSize = sizeof( fdlg ); fdlg.fl = FDS_CENTER | FDS_ENABLEFILELB; if( ofn->flags & OFN_ISSAVE ) { fdlg.fl |= FDS_SAVEAS_DIALOG; fdlg.pszOKButton = (PSZ)LIT( FDlg_Save_Text ); } else { fdlg.fl |= FDS_OPEN_DIALOG; fdlg.pszOKButton = (PSZ)LIT( FDlg_Open_Text ); } if( ofn->flags & OFN_ALLOWMULTISELECT ) { fdlg.fl |= FDS_MULTIPLESEL; } fdlg.pszTitle = ofn->title; if( ofn->file_name ) { strncpy( fdlg.szFullFile, ofn->file_name, CCHMAXPATH ); fdlg.szFullFile[CCHMAXPATH-1] = '\0'; } if( ( !ofn->file_name || !*ofn->file_name ) && ofn->filter_index >= 0 ) { str_index = 0; for( i=0; ;i++ ) { if( ofn->filter_list[i] == '\0' ) { if( ofn->filter_list[i+1] == '\0' ) { break; } str_index++; if( str_index == ofn->filter_index * 2 - 1 ) { i++; break; } } } if( ofn->filter_list[i] != '\0' ) { strncpy( fdlg.szFullFile, ofn->filter_list + i, CCHMAXPATH ); fdlg.szFullFile[CCHMAXPATH-1] = '\0'; } } #if defined( HAVE_DRIVES ) if( drive ) { _dos_getdrive( &old_drive ); _dos_setdrive( tolower( drive ) - 'a' + 1, &drives ); if( *initial_path && *old_path ) { chdir( initial_path ); } } #endif rc = (int)WinFileDlg( HWND_DESKTOP, GUIGetParentFrameHWND( wnd ), &fdlg ); if( fdlg.papszFQFilename ) { ofn->file_name[0] = '\0'; slen = 0; for( i=0; i<fdlg.ulFQFCount; i++ ) { flen = strlen( fdlg.papszFQFilename[0][i] ); if( ( slen + flen + 2 ) > ofn->max_file_name ) { return( OFN_RC_FAILED_TO_INITIALIZE ); } if( slen ) { ofn->file_name[slen++] = ' '; } memcpy( &ofn->file_name[slen], fdlg.papszFQFilename[0][i], flen + 1); slen += flen; } WinFreeFileDlgList( fdlg.papszFQFilename ); if( ofn->base_file_name != NULL ) { ofn->base_file_name[0] = '\0'; } } else { if( strlen( fdlg.szFullFile ) > ( ofn->max_file_name - 1 ) ) { return( OFN_RC_FAILED_TO_INITIALIZE ); } else { strcpy( ofn->file_name, fdlg.szFullFile ); _splitpath( fdlg.szFullFile, NULL, NULL, fname, NULL ); _splitpath( fdlg.szFullFile, NULL, NULL, NULL, fname+strlen(fname) ); } if( ofn->base_file_name != NULL ) { ofn->base_file_name[0] = '\0'; if( strlen( fname ) <= ofn->max_base_file_name ) { strcpy( ofn->base_file_name, fname ); } } } #if defined( HAVE_DRIVES ) if( drive ) { _dos_setdrive( old_drive, &drives ); if( *initial_path && *old_path ) { chdir( old_path ); } } #endif if( fdlg.lReturn == DID_CANCEL ) { return( OFN_RC_NO_FILE_SELECTED ); } if( rc ) { return( OFN_RC_FILE_SELECTED ); } #endif return( OFN_RC_FAILED_TO_INITIALIZE ); } /* GUIGetFileName */
//------------------------------------------------------------------------- // // Show - Display the file dialog // //------------------------------------------------------------------------- NS_IMETHODIMP nsFilePicker::Show(PRInt16 *retval) { NS_ENSURE_ARG_POINTER(retval); PRBool result = PR_FALSE; nsCAutoString fileBuffer; char *converted = ConvertToFileSystemCharset(mDefault); if (nsnull == converted) { LossyCopyUTF16toASCII(mDefault, fileBuffer); } else { fileBuffer.Assign(converted); nsMemory::Free( converted ); } char *title = ConvertToFileSystemCharset(mTitle); if (nsnull == title) title = ToNewCString(mTitle); nsCAutoString initialDir; if (mDisplayDirectory) mDisplayDirectory->GetNativePath(initialDir); // If no display directory, re-use the last one. if(initialDir.IsEmpty()) initialDir = mLastUsedDirectory; mFile.Truncate(); FILEDLG filedlg; memset(&filedlg, 0, sizeof(FILEDLG)); filedlg.cbSize = sizeof(FILEDLG); filedlg.pszTitle = title; if (mMode == modeGetFolder) { PL_strncat(filedlg.szFullFile, initialDir.get(), MAX_PATH); PL_strncat(filedlg.szFullFile, "\\", 1); PL_strncat(filedlg.szFullFile, "^", 1); filedlg.fl = FDS_OPEN_DIALOG | FDS_CENTER; filedlg.pfnDlgProc = DirDialogProc; DosError(FERR_DISABLEHARDERR); WinFileDlg(HWND_DESKTOP, mWnd, &filedlg); DosError(FERR_ENABLEHARDERR); char* tempptr = strstr(filedlg.szFullFile, "^"); if (tempptr) *tempptr = '\0'; if (filedlg.lReturn == DID_OK) { result = PR_TRUE; if (!mDisplayDirectory) mDisplayDirectory = do_CreateInstance("@mozilla.org/file/local;1"); if (mDisplayDirectory) mDisplayDirectory->InitWithNativePath(nsDependentCString(filedlg.szFullFile)); mFile.Assign(filedlg.szFullFile); } } else { PL_strncpy(filedlg.szFullFile, initialDir.get(), MAX_PATH); PL_strncat(filedlg.szFullFile, "\\", 1); PL_strncat(filedlg.szFullFile, fileBuffer.get(), MAX_PATH); filedlg.fl = FDS_CENTER; if (mMode == modeSave) { filedlg.fl |= FDS_SAVEAS_DIALOG | FDS_ENABLEFILELB; } else if (mMode == modeOpenMultiple) { filedlg.fl |= FDS_MULTIPLESEL | FDS_OPEN_DIALOG; } else { filedlg.fl |= FDS_OPEN_DIALOG; } PMYDATA pmydata; pmydata = (PMYDATA)calloc(1, sizeof(MYDATA)); filedlg.ulUser = (ULONG)pmydata; filedlg.pfnDlgProc = FileDialogProc; PRUint32 i; PSZ *apszTypeList; apszTypeList = (PSZ *)malloc(mTitles.Length()*sizeof(PSZ)+1); for (i = 0; i < mTitles.Length(); i++) { const nsString& typeWide = mTitles[i]; nsAutoCharBuffer buffer; PRInt32 bufLength; WideCharToMultiByte(0, typeWide.get(), typeWide.Length(), buffer, bufLength); apszTypeList[i] = ToNewCString(nsDependentCString(buffer.Elements())); } apszTypeList[i] = 0; filedlg.papszITypeList = (PAPSZ)apszTypeList; PSZ *apszFilterList; apszFilterList = (PSZ *)malloc(mFilters.Length()*sizeof(PSZ)+1); for (i = 0; i < mFilters.Length(); i++) { const nsString& filterWide = mFilters[i]; apszFilterList[i] = ToNewCString(filterWide); } apszFilterList[i] = 0; pmydata->papszIFilterList = (PAPSZ)apszFilterList; pmydata->ulCurExt = mSelectedType; PRBool fileExists; do { DosError(FERR_DISABLEHARDERR); WinFileDlg(HWND_DESKTOP, mWnd, &filedlg); DosError(FERR_ENABLEHARDERR); if ((filedlg.lReturn == DID_OK) && (mMode == modeSave)) { PRFileInfo64 fileinfo64; PRStatus status = PR_GetFileInfo64(filedlg.szFullFile, &fileinfo64); if (status == PR_SUCCESS) { fileExists = PR_TRUE; } else { fileExists = PR_FALSE; } if (fileExists) { if (!gpszFDSaveCaption) { HMODULE hmod; char LoadError[CCHMAXPATH]; char loadedString[256]; int length; DosLoadModule(LoadError, CCHMAXPATH, "PMSDMRI", &hmod); length = WinLoadString((HAB)0, hmod, 1110, 256, loadedString); gpszFDSaveCaption = (char*)malloc(length+1); strcpy(gpszFDSaveCaption, loadedString); length = WinLoadString((HAB)0, hmod, 1135, 256, loadedString); gpszFDFileExists = (char*)malloc(length+1); strcpy(gpszFDFileExists, loadedString); length = WinLoadString((HAB)0, hmod, 1136, 256, loadedString); gpszFDFileReadOnly = (char*)malloc(length+1); strcpy(gpszFDFileReadOnly, loadedString); int i; for (i=0;i<256 && gpszFDFileExists[i];i++ ) { if (gpszFDFileExists[i] == '%') { gpszFDFileExists[i+1] = 's'; break; } } for (i=0;i<256 && gpszFDFileReadOnly[i];i++ ) { if (gpszFDFileReadOnly[i] == '%') { gpszFDFileReadOnly[i+1] = 's'; break; } } DosFreeModule(hmod); } char pszFullText[256+CCHMAXPATH]; FILESTATUS3 fsts3; ULONG ulResponse; DosQueryPathInfo( filedlg.szFullFile, FIL_STANDARD, &fsts3, sizeof(FILESTATUS3)); if (fsts3.attrFile & FILE_READONLY) { sprintf(pszFullText, gpszFDFileReadOnly, filedlg.szFullFile); ulResponse = WinMessageBox(HWND_DESKTOP, mWnd, pszFullText, gpszFDSaveCaption, 0, MB_OK | MB_MOVEABLE | MB_WARNING); } else { sprintf(pszFullText, gpszFDFileExists, filedlg.szFullFile); ulResponse = WinMessageBox(HWND_DESKTOP, mWnd, pszFullText, gpszFDSaveCaption, 0, MB_YESNO | MB_MOVEABLE | MB_WARNING); } if (ulResponse == MBID_YES) { fileExists = PR_FALSE; } } } } while (mMode == modeSave && fileExists && filedlg.lReturn == DID_OK); if (filedlg.lReturn == DID_OK) { result = PR_TRUE; if (mMode == modeOpenMultiple) { nsresult rv; if (filedlg.papszFQFilename) { for (ULONG i=0;i<filedlg.ulFQFCount;i++) { nsCOMPtr<nsILocalFile> file = do_CreateInstance("@mozilla.org/file/local;1", &rv); NS_ENSURE_SUCCESS(rv,rv); rv = file->InitWithNativePath(nsDependentCString(*(filedlg.papszFQFilename)[i])); NS_ENSURE_SUCCESS(rv,rv); rv = mFiles.AppendObject(file); NS_ENSURE_SUCCESS(rv,rv); } WinFreeFileDlgList(filedlg.papszFQFilename); } else { nsCOMPtr<nsILocalFile> file = do_CreateInstance("@mozilla.org/file/local;1", &rv); NS_ENSURE_SUCCESS(rv,rv); rv = file->InitWithNativePath(nsDependentCString(filedlg.szFullFile)); NS_ENSURE_SUCCESS(rv,rv); rv = mFiles.AppendObject(file); NS_ENSURE_SUCCESS(rv,rv); } } else { mFile.Assign(filedlg.szFullFile); } mSelectedType = (PRInt16)pmydata->ulCurExt; } for (i = 0; i < mTitles.Length(); i++) { nsMemory::Free(*(filedlg.papszITypeList[i])); } free(filedlg.papszITypeList); for (i = 0; i < mFilters.Length(); i++) { nsMemory::Free(*(pmydata->papszIFilterList[i])); } free(pmydata->papszIFilterList); free(pmydata); } if (title) nsMemory::Free( title ); if (result) { PRInt16 returnOKorReplace = returnOK; nsresult rv; // Remember last used directory. nsCOMPtr<nsILocalFile> file(do_CreateInstance("@mozilla.org/file/local;1", &rv)); NS_ENSURE_SUCCESS(rv, rv); file->InitWithNativePath(mFile); nsCOMPtr<nsIFile> dir; if (NS_SUCCEEDED(file->GetParent(getter_AddRefs(dir)))) { nsCOMPtr<nsILocalFile> localDir(do_QueryInterface(dir)); if (localDir) { nsCAutoString newDir; localDir->GetNativePath(newDir); if(!newDir.IsEmpty()) PL_strncpyz(mLastUsedDirectory, newDir.get(), MAX_PATH+1); // Update mDisplayDirectory with this directory, also. // Some callers rely on this. if (!mDisplayDirectory) mDisplayDirectory = do_CreateInstance("@mozilla.org/file/local;1"); if (mDisplayDirectory) mDisplayDirectory->InitWithNativePath( nsDependentCString(mLastUsedDirectory) ); } } if (mMode == modeSave) { // Windows does not return resultReplace, // we must check if file already exists PRBool exists = PR_FALSE; file->Exists(&exists); if (exists) returnOKorReplace = returnReplace; } *retval = returnOKorReplace; } else { *retval = returnCancel; } return NS_OK; }