/****************************************************************************/ /* */ /* WFDLGS2.C - */ /* */ /* More Windows File System Dialog procedures */ /* */ /****************************************************************************/ #include "winfile.h" #include "lfn.h" #include "wfcopy.h" #include "winnet.h" #include "wnetcaps.h" // WNetGetCaps() #include "commdlg.h" CHAR szShellOpenCommand[] = "\\shell\\open\\command"; VOID CheckAttribsDlgButton(HWND hDlg, INT id, DWORD dwAttribs, DWORD dwAttribs3State, DWORD dwAttribsOn); // Return pointers to various bits of a path. // ie where the dir name starts, where the filename starts and where the // params are. VOID GetPathInfo( LPSTR szTemp, LPSTR *ppDir, LPSTR *ppFile, LPSTR *ppPar ) { /* strip leading spaces */ for (*ppDir = szTemp; **ppDir == ' '; (*ppDir)++) ; /* locate the parameters */ for (*ppPar = *ppDir; **ppPar && **ppPar != ' '; (*ppPar)++) ; /* locate the start of the filename and the extension. */ for (*ppFile = *ppPar; *ppFile > *ppDir; --(*ppFile)) { if (((*ppFile)[-1] == ':') || ((*ppFile)[-1] == '\\')) break; } } VOID ValidateExtension( HWND hDlg ) { CHAR szTemp[10]; INT count; count = GetDlgItemText(hDlg, IDD_EXTENSION, szTemp, sizeof(szTemp)); EnableWindow(GetDlgItem(hDlg, IDD_SEARCHALL), count); EnableWindow(GetDlgItem(hDlg, IDOK), count); SendMessage(hDlg, DM_SETDEFID, count ? IDOK : IDCANCEL, 0L); } // since LoadString() only reads up to a null we have to mark // special characters where we want nulls then convert them // after loading. VOID FixupNulls( LPSTR p ) { LPSTR pT; while (*p) { if (*p == '#') { pT = p; p = AnsiNext(p); *pT = TEXT('\0'); } else p = AnsiNext(p); } } // Find the key associated with the given value. BOOL ValidFileTypeValue( LPSTR szVal, LPSTR szKey, WORD cbMaxKey ) { HKEY hk = NULL; WORD wTmp; LONG lTmp; BOOL retval = FALSE; CHAR szValTmp[128]; if (RegOpenKey(HKEY_CLASSES_ROOT,szNULL,&hk) != ERROR_SUCCESS) return(FALSE); for (wTmp = 0; RegEnumKey(hk, wTmp, szKey, cbMaxKey) == ERROR_SUCCESS; wTmp++) { // Skip things that aren't file type things. if (szKey[0] == '.') continue; lTmp = 128; if (RegQueryValue(hk, szKey, szValTmp, &lTmp) != ERROR_SUCCESS) { continue; } if (!szValTmp[0]) continue; if (!lstrcmp(szValTmp, szVal)) { #ifdef VERBDEBUG OutputDebugString("wf.vftv: Found a match\n\r"); #endif // Found a match. retval = TRUE; goto ProcExit; } } szKey[0] = TEXT('\0'); ProcExit: RegCloseKey(hk); return retval; } // Sets the selection of a listbox to that matching the given string. VOID SetLBSelection( HWND hDlg, INT nDlgItem, LPSTR sz ) { INT iMatch; iMatch = (INT) SendDlgItemMessage(hDlg, nDlgItem, LB_SELECTSTRING, -1, (LPARAM) sz); if (iMatch == LB_ERR) { #ifdef VERBDEBUG OutputDebugString("wf.sdft: Selection missing from list box.\n\r"); #endif return; } return; } // Given an extension (with or without a dot) set the list box or the // programname fields properly. VOID UpdateSelectionOrName( HWND hDlg ) { CHAR szExt[128]; CHAR szTemp[128]; LONG cbTemp; LPSTR p; // Get the current extension (after the dot). GetDlgItemText(hDlg, IDD_EXTENSION, szTemp, sizeof(szTemp)); // Make sure it has a dot. if (szTemp[0] != '.') { // Add one. szExt[0] = '.'; lstrcpy(szExt+1, szTemp); } else { // It's already got one. lstrcpy(szExt, szTemp); } cbTemp = sizeof(szTemp); if (RegQueryValue(HKEY_CLASSES_ROOT,szExt, szMessage,&cbTemp) == ERROR_SUCCESS) { if (*szMessage) { // it's associated with a class #ifdef VERBDEBUG OutputDebugString("wf.uson: "); OutputDebugString(szTemp); OutputDebugString(" associated with class ("); OutputDebugString(szMessage); OutputDebugString(")\n\r"); #endif szTemp[0] = TEXT('\0'); cbTemp = sizeof(szTemp); RegQueryValue(HKEY_CLASSES_ROOT,szMessage,szTemp,&cbTemp); #ifdef VERBDEBUG OutputDebugString("wf.uson: Associated with value ("); OutputDebugString(szTemp); OutputDebugString(")\n\r"); #endif // Set the list box selection to the right type. SetLBSelection(hDlg, IDD_CLASSLIST, szTemp); // Put the type name in the program name field. SetDlgItemText(hDlg, IDD_PROGRAMNAME, szTemp); } else { // it's not associated with a class, see if it has a // shell open command and treat it as a command association lstrcat(szExt,szShellOpenCommand); cbTemp = sizeof(szTemp); if (RegQueryValue(HKEY_CLASSES_ROOT, szExt, szTemp, &cbTemp) == ERROR_SUCCESS && szTemp[0]) { #ifdef VERBDEBUG OutputDebugString("wf.uson: It has a shell open command.\n\r"); #endif goto ProgramAssoc; } else { // Put "none" in the field. #ifdef VERBDEBUG OutputDebugString("wf.uson: Class set to nothing.\n\r"); #endif LoadString(hAppInstance, IDS_ASSOCNONE, szTemp, sizeof(szTemp)); SetDlgItemText(hDlg,IDD_PROGRAMNAME, szTemp); SetLBSelection(hDlg, IDD_CLASSLIST, szTemp); goto NoAssoc; } } } else if (GetProfileString(szExtensions, szExt+1, szNULL, szTemp, sizeof(szTemp))) { ProgramAssoc: /* Remove the "^." bulloney. */ p = szTemp; while ((*p) && (*p != '^') && (*p != '%')) p = AnsiNext(p); *p = TEXT('\0'); p--; if (*p == ' ') *p = 0; SetDlgItemText(hDlg, IDD_PROGRAMNAME, szTemp); // Set clear the selection. SendDlgItemMessage(hDlg, IDD_CLASSLIST, LB_SETCURSEL, -1, 0L); } else { // Nothing. #ifdef VERBDEBUG OutputDebugString("wf.uson: No association.\n\r"); #endif LoadString(hAppInstance, IDS_ASSOCNONE, szTemp, sizeof(szTemp)); SetDlgItemText(hDlg,IDD_PROGRAMNAME, szTemp); SetLBSelection(hDlg, IDD_CLASSLIST, szTemp); } NoAssoc: SendDlgItemMessage(hDlg, IDD_PROGRAMNAME, EM_LIMITTEXT, sizeof(szTemp) - 1, 0L); } // Given a class key returns the shell\open\command string in szValue // and the number of chars copied in cbMaxValue. cbMaxValue should // be initialised to the max siz eof szValue. VOID GetAssociatedExe( LPSTR szKey, LPSTR szValue, LONG *plcbValue ) { CHAR szTemp[128]; LONG i; lstrcpy(szTemp, szKey); lstrcat(szTemp, szShellOpenCommand); #ifdef VERBDEBUG OutputDebugString("wf.gae: Key Query "); OutputDebugString(szTemp); OutputDebugString("\n\r"); #endif RegQueryValue(HKEY_CLASSES_ROOT, szTemp, szValue, plcbValue); // Strip any params. for (i=0; szValue[i] != TEXT('\0'); i++) { if (szValue[i] == ' ') { szValue[i] = TEXT('\0'); break; } }} /*--------------------------------------------------------------------------*/ /* */ /* AssociateDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/ INT_PTR APIENTRY AssociateDlgProc( register HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { CHAR szTemp[128]; CHAR szTemp2[128]; HKEY hk = NULL; switch (wMsg) { case WM_INITDIALOG: { LPSTR p; register LPSTR pSave; INT iItem; CHAR szTemp3[128]; CHAR szTemp4[128]; LONG lcbTemp; SendDlgItemMessage(hDlg,IDD_CLASSLIST,LB_RESETCONTENT,0,0L); if (RegOpenKey(HKEY_CLASSES_ROOT,szNULL,&hk) == ERROR_SUCCESS) { for (wParam = 0; RegEnumKey(hk, (DWORD)wParam, szTemp, sizeof(szTemp)) == ERROR_SUCCESS; wParam++) { // Skip things that aren't file type things. if (szTemp[0] == '.') continue; lParam = 128; if (RegQueryValue(hk, szTemp, szTemp2, (PLONG)&lParam) != ERROR_SUCCESS) { continue; } // Skip things that aren't relevant ot the shell. lParam = 128; lstrcpy(szTemp3, szTemp); lstrcat(szTemp3, "\\shell"); if (RegQueryValue(hk, szTemp3, szTemp4, (PLONG)&lParam) != ERROR_SUCCESS) { continue; } if (!szTemp2[0]) continue; // Add on program info lcbTemp = sizeof(szTemp3); szTemp3[0] = TEXT('\0'); GetAssociatedExe(szTemp, szTemp3, &lcbTemp); if (szTemp3[0] != TEXT('\0')) { lstrcat(szTemp2, " ("); lstrcat(szTemp2, szTemp3); lstrcat(szTemp2, ")"); } iItem = (INT)SendDlgItemMessage(hDlg,IDD_CLASSLIST, LB_ADDSTRING,0,(LPARAM)szTemp2); SendDlgItemMessage(hDlg,IDD_CLASSLIST,LB_SETITEMDATA,iItem, (DWORD)AddAtom(szTemp)); } RegCloseKey(hk); } // Add the (None) entry at the begining. LoadString(hAppInstance, IDS_ASSOCNONE, szTemp, sizeof(szTemp)); SendDlgItemMessage(hDlg,IDD_CLASSLIST, LB_INSERTSTRING,0,(LPARAM)szTemp); lstrcpy(szTitle,"."); /* Make 'p' point to the file's extension. */ pSave = GetSelection(TRUE); if (pSave) { p = GetExtension(pSave); if (!IsProgramFile(pSave)) { lstrcat(szTitle,p); } LocalFree((HANDLE)pSave); } SendDlgItemMessage(hDlg, IDD_EXTENSION, EM_LIMITTEXT, 4, 0L); SetDlgItemText(hDlg, IDD_EXTENSION, szTitle+1); SendDlgItemMessage(hDlg, IDD_EXTENSION, EM_SETMODIFY, 0, 0L); /* this is empty if there is no class association */ szMessage[0]=0; szTemp2[0]=0; UpdateSelectionOrName(hDlg); ValidateExtension(hDlg); break; } case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { HWND hwndT, hwndNext; case IDD_HELP: goto DoHelp; case IDD_EXTENSION: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) { ValidateExtension(hDlg); UpdateSelectionOrName(hDlg); } break; case IDD_SEARCHALL: { OPENFILENAME ofn; DWORD dwSave = dwContext; dwContext = IDH_ASSOC_BROWSE; LoadString(hAppInstance, IDS_PROGRAMS, szTemp2, sizeof(szTemp2)); FixupNulls(szTemp2); LoadString(hAppInstance, IDS_ASSOCIATE, szTitle, sizeof(szTitle)); szTemp[0] = TEXT('\0'); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = NULL; ofn.lpstrFilter = szTemp2; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.lpstrFile = szTemp; ofn.lpstrFileTitle = NULL; ofn.nMaxFile = sizeof(szTemp); ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = szTitle; ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY; ofn.lpfnHook = NULL; ofn.lpstrDefExt = NULL; if (GetOpenFileName(&ofn)) { SetDlgItemText(hDlg, IDD_PROGRAMNAME, szTemp); } dwContext = dwSave; } DosResetDTAAddress(); // undo any bad things COMMDLG did break; case IDD_CLASSLIST: // Handle a selection change. if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_SELCHANGE) { INT iSel; LONG lTemp2; ATOM aClass; // Get selection number. if (SendDlgItemMessage(hDlg,IDD_CLASSLIST,LB_GETCURSEL,0,0L) == 0) { // User selected "none". LoadString(hAppInstance, IDS_ASSOCNONE, szTemp, sizeof(szTemp)); // Copy into PROGRAMNAME field. SetDlgItemText(hDlg, IDD_PROGRAMNAME, (LPSTR) szTemp); } else { // User selected a file type. // Get the atom from the list box. iSel = (WORD) SendDlgItemMessage(hDlg, IDD_CLASSLIST, LB_GETCURSEL,0,0L); aClass = (ATOM) SendDlgItemMessage(hDlg, IDD_CLASSLIST, LB_GETITEMDATA, iSel, 0L); // Use the atom to get the file type key. GetAtomName(aClass, szTemp, sizeof(szTemp)); // Use the file type key to get the file type value. lTemp2 = sizeof(szTemp2); RegQueryValue(HKEY_CLASSES_ROOT, szTemp, szTemp2, &lTemp2); // Splat the file type value into PROGRAMNAME field. SetDlgItemText(hDlg, IDD_PROGRAMNAME, szTemp2); } break; } case IDD_PROGRAMNAME: break; case IDOK: { GetDlgItemText(hDlg, IDD_EXTENSION, szTemp, 5); if (szTemp[0] != '.') { lstrcpy(szTitle,"."); lstrcat(szTitle, szTemp); } else lstrcpy(szTitle, szTemp); if (IsProgramFile(szTitle)) { LoadString(hAppInstance, IDS_NOEXEASSOC, szTemp, sizeof(szTemp)); wsprintf(szMessage, szTemp, (LPSTR)szTitle); GetWindowText(hDlg, szTitle, sizeof(szTitle)); MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP); SetDlgItemText(hDlg, IDD_EXTENSION, szNULL); break; } // Read IDD_PROGRAMNAME bit. GetDlgItemText(hDlg, IDD_PROGRAMNAME, szTemp, sizeof(szTemp)); LoadString(hAppInstance, IDS_ASSOCNONE, szTemp2, sizeof(szTemp2)); // Is it "(None)" ? if (!lstrcmp(szTemp, szTemp2)) { DeleteAssoc: // Yep, They selected none. RegDeleteKey(HKEY_CLASSES_ROOT,szTitle); WriteProfileString(szExtensions, szTitle+1, NULL); } else if (ValidFileTypeValue(szTemp, szTemp2, sizeof(szTemp2))) { LPSTR p1, p2; // The file type key is in szTemp2 (eg wrifile). // The extension key (eg .wri) is in szTitle. // The file type value (eg Write Document) is in // szTemp. #ifdef VERBDEBUG OutputDebugString("wf.adp: Valid file type selected.\n\r"); OutputDebugString("wf.adp: Extension "); OutputDebugString(szTitle); OutputDebugString("\n\r"); OutputDebugString("wf.adp: File type key "); OutputDebugString(szTemp2); OutputDebugString("\n\r"); OutputDebugString("wf.adp: File type value "); OutputDebugString(szTemp); OutputDebugString("\n\r"); #endif /* set the class */ RegSetValue(HKEY_CLASSES_ROOT, szTitle, REG_SZ, szTemp2, 0L); /* get the class's SHELL\OPEN\COMMAND */ lstrcpy(szTemp, szTemp2); lstrcat(szTemp, szShellOpenCommand); lParam = 128; szTemp2[0] = 0; RegQueryValue(HKEY_CLASSES_ROOT, szTemp, szTemp2, (PLONG)&lParam); /* insert ^.ext in for %1 in win.ini! */ for (p1 = szTemp, p2 = szTemp2; *p2; p2 = AnsiNext(p2)) { if (*p2 == '%') { p2++; if (!*p2) break; if (*p2 == '1') { *p1++ = '^'; lstrcpy(p1,szTitle); p1 += lstrlen(p1); } else { *p1++ = *p2; } } else { *p1++=*p2; } } *p1 = 0; // null terminate /* and use it for the extensions section */ WriteProfileString(szExtensions,szTitle+1, szTemp); } else { // It must be a program name. /* if no command line, treat as none */ if (!szTemp[0]) goto DeleteAssoc; // make sure it has an extension if (*GetExtension(szTemp) == 0) lstrcat(szTemp, ".exe"); if (!IsProgramFile(szTemp)) { LoadString(hAppInstance, IDS_ASSOCNOTEXE, szTemp2, sizeof(szTemp2)); wsprintf(szMessage, szTemp2, (LPSTR)szTemp); GetWindowText(hDlg, szTitle, sizeof(szTitle)); MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP); SetDlgItemText(hDlg, IDD_PROGRAMNAME, szNULL); break; } /* unassociate the class from the extension */ RegSetValue(HKEY_CLASSES_ROOT, szTitle, REG_SZ, szNULL, 0L); /* update the [extensions] section */ lstrcpy(szTemp2, szTemp); lstrcat(szTemp2, " ^."); lstrcat(szTemp2, szTitle+1); WriteProfileString(szExtensions, szTitle+1, szTemp2); /* update the reg database */ lstrcat(szTemp," %1"); lstrcat(szTitle, szShellOpenCommand); RegSetValue(HKEY_CLASSES_ROOT, szTitle, REG_SZ, szTemp, 0L); } // rebuild the list of document extensions LocalFree((HANDLE)szDocuments); BuildDocumentString(); /* Update all of the Directory Windows in order to see * the effect of the new extensions. */ hwndT = GetWindow(hwndMDIClient, GW_CHILD); while (hwndT) { hwndNext = GetWindow(hwndT, GW_HWNDNEXT); if (!GetWindow(hwndT, GW_OWNER)) SendMessage(hwndT, WM_FILESYSCHANGE, FSC_REFRESH, 0L); hwndT = hwndNext; } } /*** FALL THRU ***/ case IDCANCEL: { INT iItem; INT cItems; ATOM aClass; cItems = (INT)SendDlgItemMessage(hDlg,IDD_CLASSLIST, LB_GETCOUNT,0,0L); /* clean out them atoms except for "(none)". */ for (iItem = 1; iItem < cItems; iItem++) { aClass = (ATOM)SendDlgItemMessage(hDlg,IDD_CLASSLIST, LB_GETITEMDATA,iItem,0L); if (aClass == LB_ERR) break; DeleteAtom(aClass); } EndDialog(hDlg, TRUE); break; } default: return(FALSE); } break; default: if (wMsg == wHelpMessage || wMsg == wBrowseMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return(TRUE); } // // Strips off the path portion and replaces the first part of an 8-dot-3 // filename with an asterisk. // VOID StarFilename( LPSTR pszPath ) { LPSTR p; /* Remove any leading path information. */ StripPath(pszPath); for (p = pszPath; *p && *p != '.'; p = (LPSTR)AnsiNext(p)); if (*p == '.') { lstrcpy(pszPath+1, p); pszPath[0] = '*'; } else lstrcpy(pszPath, szStarDotStar); } /*--------------------------------------------------------------------------*/ /* */ /* SearchDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/ INT_PTR APIENTRY SearchDlgProc( register HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { LPSTR p; MDICREATESTRUCT MDICS; CHAR szStart[MAXFILENAMELEN]; UNREFERENCED_PARAMETER(lParam); switch (wMsg) { case WM_INITDIALOG: SendDlgItemMessage(hDlg, IDD_DIR, EM_LIMITTEXT, sizeof(szSearch)-(1+MAXFILENAMELEN), 0L); SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szStart)-1, 0L); GetSelectedDirectory(0, szSearch); SetDlgItemText(hDlg, IDD_DIR, szSearch); p = GetSelection(TRUE); if (p) { GetNextFile(p, szStart, sizeof(szStart)); StarFilename(szStart); SetDlgItemText(hDlg, IDD_NAME, szStart); LocalFree((HANDLE)p); } CheckDlgButton(hDlg, IDD_SEARCHALL, bSearchSubs); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp; case IDCANCEL: EndDialog(hDlg, FALSE); break; case IDOK: GetDlgItemText(hDlg, IDD_DIR, szSearch, sizeof(szSearch)); QualifyPath(szSearch); GetDlgItemText(hDlg, IDD_NAME, szStart, sizeof(szStart)); AppendToPath(szSearch, szStart); bSearchSubs = IsDlgButtonChecked(hDlg, IDD_SEARCHALL); EndDialog(hDlg, TRUE); /* Is the search window already up? */ if (hwndSearch) { if (SendMessage(hwndSearch, FS_CHANGEDISPLAY, CD_PATH, (LPARAM)szSearch)) { SendMessage(hwndMDIClient, WM_MDIACTIVATE, GET_WM_MDIACTIVATE_MPS(0, 0, hwndSearch)); if (IsIconic(hwndSearch)) ShowWindow(hwndSearch, SW_SHOWNORMAL); } } else { LoadString(hAppInstance, IDS_SEARCHTITLE, szMessage, 32); lstrcat(szMessage, szSearch); /* Have the MDIClient create the MDI directory window. */ MDICS.szClass = szSearchClass; MDICS.hOwner = hAppInstance; MDICS.szTitle = szMessage; MDICS.style = 0; MDICS.x = CW_USEDEFAULT; MDICS.y = 0; MDICS.cx = CW_USEDEFAULT; MDICS.cy = 0; // it would be nice to pass szSearch through here // as well... { HWND hwnd; hwnd = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); MDICS.lParam = 0; if (hwnd && (GetWindowLong(hwnd, GWL_STYLE) & WS_MAXIMIZE)) MDICS.lParam |= WS_MAXIMIZE; } SendMessage(hwndMDIClient, WM_MDICREATE, 0, (LPARAM)&MDICS); if (hwndSearch && MDICS.lParam) SendMessage(hwndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hwndSearch, 0L); } break; default: return(FALSE); } break; default: if (wMsg == wHelpMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return TRUE; } #define RUN_LENGTH 120 /*--------------------------------------------------------------------------*/ /* */ /* RunDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/ INT_PTR APIENTRY RunDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { LPSTR p,pDir,pFile,pPar; register WORD ret; LPSTR pDir2; CHAR szTemp[MAXPATHLEN]; CHAR szTemp2[MAXPATHLEN]; CHAR sz3[RUN_LENGTH]; UNREFERENCED_PARAMETER(lParam); switch (wMsg) { case WM_INITDIALOG: SetDlgDirectory(hDlg, NULL); SetWindowDirectory(); // and really set the DOS current directory SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szTemp)-1, 0L); p = GetSelection(TRUE); if (p) { SetDlgItemText(hDlg, IDD_NAME, p); LocalFree((HANDLE)p); } break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp; case IDCANCEL: EndDialog(hDlg, FALSE); break; #if 0 case IDD_BROWSE: { OPENFILENAME ofn; DWORD dwSave = dwContext; dwContext = IDH_RUN_BROWSE; LoadString(hAppInstance, IDS_PROGRAMS, szTemp2, sizeof(szTemp2)); FixupNulls(szTemp2); LoadString(hAppInstance, IDS_RUN, szTitle, sizeof(szTitle)); GetSelectedDirectory(0, szDir); szTemp[0] = 0; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = NULL; ofn.lpstrFilter = szTemp2; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.nMaxCustFilter = NULL; ofn.lpstrFile = szTemp; ofn.nMaxFile = sizeof(szTemp); ofn.lpstrInitialDir = szDir; ofn.lpstrTitle = szTitle; ofn.lpstrFileTitle = NULL; ofn.nMaxFile = sizeof(szTemp); ofn.Flags = OFN_SHOWHELP|OFN_HIDEREADONLY; ofn.lpfnHook = NULL; ofn.lpstrDefExt = "EXE"; if (GetOpenFileName(&ofn)) { SetDlgItemText(hDlg, IDD_NAME, szTemp); PostMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDOK), TRUE); } DosResetDTAAddress(); // undo any bad things COMMDLG did dwContext = dwSave; break; } #endif case IDOK: { BOOL bLoadIt; GetDlgItemText(hDlg, IDD_NAME, szTemp, sizeof(szTemp)); GetPathInfo(szTemp, &pDir, &pFile, &pPar); // copy away parameters lstrcpy(sz3,pPar); *pPar = 0; // strip the params from the program // REVIEW HACK Hard code UNC style paths. if (*pDir == '\\' && *(pDir+1) == '\\') { // This is a UNC style filename so NULLify directory. pDir2 = NULL; } else { GetSelectedDirectory(0, szTemp2); pDir2 = szTemp2; } bLoadIt = IsDlgButtonChecked(hDlg, IDD_LOAD); FixAnsiPathForDos(szTemp); if (pDir2) FixAnsiPathForDos(pDir2); ret = ExecProgram(szTemp, sz3, pDir2, bLoadIt); if (ret) MyMessageBox(hDlg, IDS_EXECERRTITLE, ret, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); else EndDialog(hDlg, TRUE); break; } default: return(FALSE); } break; default: if (wMsg == wHelpMessage || wMsg == wBrowseMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return TRUE; } VOID CopyToClipboard( LPSTR pszFrom ) { CHAR szPath[MAXPATHLEN]; UINT wFormat; HANDLE hMem; GetNextFile(pszFrom, szPath, sizeof(szPath)); QualifyPath(szPath); FixAnsiPathForDos(szPath); wFormat = RegisterClipboardFormat("FileName"); if (!wFormat) return; hMem = GlobalAlloc(GPTR|GMEM_DDESHARE, lstrlen(szPath)+1); if (!hMem) return; lstrcpy(GlobalLock(hMem), szPath); GlobalUnlock(hMem); if (OpenClipboard(hwndFrame)) { EmptyClipboard(); SetClipboardData(wFormat, hMem); #if 0 // write, excel and winword will not past the package // if we put text in the clipboard. hMem = GlobalAlloc(GPTR | GMEM_DDESHARE, lstrlen(szPath)+1); if (hMem) { lstrcpy(GlobalLock(hMem), szPath); GlobalUnlock(hMem); SetClipboardData(CF_OEMTEXT, hMem); } #endif CloseClipboard(); } } VOID EnableCopy( HWND hDlg, BOOL bCopy ) { HWND hwnd; // turn these on hwnd = GetDlgItem(hDlg, IDD_COPYTOCLIP); if (hwnd) { EnableWindow(hwnd, bCopy); ShowWindow(hwnd, bCopy ? SW_SHOWNA : SW_HIDE); } hwnd = GetDlgItem(hDlg, IDD_COPYTOFILE); if (hwnd) { EnableWindow(hwnd, bCopy); ShowWindow(hwnd, bCopy ? SW_SHOWNA : SW_HIDE); } // turn these off hwnd = GetDlgItem(hDlg, IDD_STATUS); if (hwnd) { EnableWindow(hwnd, !bCopy); ShowWindow(hwnd, !bCopy ? SW_SHOWNA : SW_HIDE); } hwnd = GetDlgItem(hDlg, IDD_NAME); if (hwnd) { EnableWindow(hwnd, !bCopy); ShowWindow(hwnd, !bCopy ? SW_SHOWNA : SW_HIDE); } } VOID MessWithRenameDirPath( PSTR pszPath ) { CHAR szPath[MAXPATHLEN]; // absolute path? don't tamper with it! if (!lstrcmp(pszPath + 1, ":\\") || (lstrlen(pszPath) > (sizeof(szPath) - 4))) return; // prepend "..\" to this non absolute path lstrcpy(szPath, "..\\"); lstrcat(szPath, pszPath); lstrcpy(pszPath, szPath); } /*--------------------------------------------------------------------------*/ /* */ /* SuperDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/ /* This proc handles the Print, Move, Copy, Delete, and Rename functions. * The calling routine (AppCommandProc()) sets 'wSuperDlgMode' before * calling DialogBox() to indicate which function is being used. */ INT_PTR APIENTRY SuperDlgProc( register HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { WORD len; LPSTR pszFrom; CHAR szTo[MAXPATHLEN]; static BOOL bTreeHasFocus; UNREFERENCED_PARAMETER(lParam); switch (wMsg) { case WM_INITDIALOG: { LPSTR p; HWND hwndActive; SetDlgDirectory(hDlg, NULL); EnableCopy(hDlg, wSuperDlgMode == IDM_COPY); hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); bTreeHasFocus = (GetTreeFocus(hwndActive) == HasTreeWindow(hwndActive)); p = GetSelection(FALSE); switch (wSuperDlgMode) { case IDM_COPY: LoadString(hAppInstance, IDS_COPY, szTitle, sizeof(szTitle)); SetWindowText(hDlg, szTitle); if (bTreeHasFocus) { // selection came from the tree AddBackslash(p); lstrcat(p, szStarDotStar); } break; case IDM_RENAME: LoadString(hAppInstance, IDS_RENAME, szTitle, sizeof(szTitle)); SetWindowText(hDlg, szTitle); // when renaming the current directory we cd up a level // (not really) and apply the appropriate hacks if (bTreeHasFocus) { lstrcpy(szTo, p); StripFilespec(szTo); SetDlgDirectory(hDlg, szTo); // make the user think this! StripPath(p); // name part of dir } break; } SetDlgItemText(hDlg, IDD_FROM, p); LocalFree((HANDLE)p); if ((wSuperDlgMode == IDM_PRINT) || (wSuperDlgMode == IDM_DELETE)) wParam = IDD_FROM; else wParam = IDD_TO; SendDlgItemMessage(hDlg, (int)wParam, EM_LIMITTEXT, sizeof(szTo) - 1, 0L); break; } case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { WORD id = GET_WM_COMMAND_ID(wParam, lParam); case IDD_HELP: goto DoHelp; case IDD_COPYTOFILE: case IDD_COPYTOCLIP: CheckButtons: CheckRadioButton(hDlg, IDD_COPYTOCLIP, IDD_COPYTOFILE, id); break; case IDD_TO: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_SETFOCUS) { id = IDD_COPYTOFILE; goto CheckButtons; } break; case IDCANCEL: /* This is for when this dialog is being used to print. */ bUserAbort = TRUE; SuperDlgExit: EndDialog(hDlg, FALSE); break; case IDOK: len = (WORD)(SendDlgItemMessage(hDlg, IDD_FROM, EM_LINELENGTH, -1, 0L) + 1); // make sure the pszFrom buffer is big enough to // add the "..\" stuff in MessWithRenameDirPath() len += 4; pszFrom = (LPSTR)LocalAlloc(LPTR, len); if (!pszFrom) goto SuperDlgExit; GetDlgItemText(hDlg, IDD_FROM, pszFrom, len); GetDlgItemText(hDlg, IDD_TO, szTo, sizeof(szTo)); if (wSuperDlgMode == IDM_COPY && IsDlgButtonChecked(hDlg, IDD_COPYTOCLIP)) { CopyToClipboard(pszFrom); goto SuperDlgExit; } if (!szTo[0]) { switch (wSuperDlgMode) { case IDM_RENAME: case IDM_MOVE: goto SuperDlgExit; case IDM_COPY: szTo[0] = '.'; szTo[1] = '\0'; break; } } EnableCopy(hDlg, FALSE); hdlgProgress = hDlg; if (wSuperDlgMode == IDM_PRINT) WFPrint(pszFrom); else { if (wSuperDlgMode == IDM_RENAME && bTreeHasFocus) { MessWithRenameDirPath(pszFrom); MessWithRenameDirPath(szTo); } /* HACK: Compute the FUNC_ values from WFCOPY.H */ WFMoveCopyDriver(pszFrom, szTo, (WORD)(wSuperDlgMode-IDM_MOVE+1)); } LocalFree((HANDLE)pszFrom); lFreeSpace = -1L; // force status info refresh EndDialog(hDlg, TRUE); break; default: return(FALSE); } break; default: if (wMsg == wHelpMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return TRUE; } VOID CheckAttribsDlgButton( HWND hDlg, INT id, DWORD dwAttribs, DWORD dwAttribs3State, DWORD dwAttribsOn ) { INT i; if (dwAttribs3State & dwAttribs) i = 2; else if (dwAttribsOn & dwAttribs) i = 1; else i = 0; CheckDlgButton(hDlg, id, i); } INT InitPropertiesDialog( HWND hDlg ) { HWND hwndLB, hwndActive, hwndTree; DWORD_PTR dwTemp; HANDLE hMem; LPMYDTA lpmydta; DWORD dwAttribsOn, dwAttribs3State, dwAttribsLast; HWND hwndDir, hwnd; CHAR szName[MAXPATHLEN]; CHAR szPath[MAXPATHLEN]; CHAR szTemp[MAXPATHLEN + 20]; CHAR szBuf[80]; WCHAR szNum[30]; INT i, iMac, iCount, dyButton; DWORD dwSize; RECT rc, rcT; DWORD dwAttrib; FILETIME Time; DWORD Length; LFNDTA lfndta; PSTR p; HFONT hFont; INT nType = 0; // this is needed for relative findfirst calls below SetWindowDirectory(); hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); hwndDir = HasDirWindow(hwndActive); hwndTree = HasTreeWindow(hwndActive); iCount = 0; dwAttribsOn = 0; // all bits to check dwAttribs3State = 0; // all bits to 3 state dwAttribsLast = 0xFFFF; // previous bits dwSize = 0L; if (hwndTree && hwndTree == GetTreeFocus(hwndActive)) { SendMessage(hwndActive, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath); StripBackslash(szPath); FixAnsiPathForDos(szPath); if (!WFFindFirst(&lfndta, szPath, ATTR_ALL | ATTR_DIR)) { LoadString(hAppInstance, IDS_REASONS+DE_PATHNOTFOUND, szMessage, sizeof(szMessage)); MessageBox(hwndFrame, szMessage, szPath, MB_OK | MB_ICONSTOP); EndDialog(hDlg, FALSE); return 0; } WFFindClose(&lfndta); OemToAnsi(szPath, szPath); dwAttribsOn = lfndta.fd.dwFileAttributes; Time = lfndta.fd.ftLastWriteTime; Length = lfndta.fd.nFileSizeLow; // BUG < 64 bits! goto FULL_PATH_KINDA_THING; } if (hwndDir) { hwndLB = GetDlgItem(hwndDir, IDCW_LISTBOX); hMem = (HANDLE)GetWindowLongPtr(hwndDir, GWLP_HDTA); } else { hwndLB = GetDlgItem(hwndActive, IDCW_LISTBOX); hMem = (HANDLE)GetWindowLongPtr(hwndActive, GWLP_HDTASEARCH); } iMac = (WORD)SendMessage(hwndLB, LB_GETCOUNT, 0, 0L); for (i = 0; i < iMac; i++) { if ((BOOL)SendMessage(hwndLB, LB_GETSEL, i, 0L)) { // get info from either dir or search window if (hwndDir) { SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)&lpmydta); dwAttrib = lpmydta->my_dwAttrs; /* Check that this is not the .. entry */ if (dwAttrib & ATTR_DIR && dwAttrib & ATTR_PARENT) continue; Time = lpmydta->my_ftLastWriteTime; Length = lpmydta->my_nFileSizeLow; lstrcpy(szName, lpmydta->my_cFileName); } else { SendMessage(hwndLB, LB_GETTEXT, i, (LPARAM)szPath); dwTemp = SendMessage(hwndLB, LB_GETITEMDATA, i, 0L); dwAttrib = ((LPDTASEARCH)lpmydta)[dwTemp].sch_dwAttrs; Time = ((LPDTASEARCH)lpmydta)[dwTemp].sch_ftLastWriteTime; Length = ((LPDTASEARCH)lpmydta)[dwTemp].sch_nFileSizeLow; } dwAttribsOn |= dwAttrib; if (dwAttribsLast == 0xFFFF) // save the previous bits for future compares dwAttribsLast = dwAttrib; else // remember all bits that don't compare to last bits dwAttribs3State |= (dwAttrib ^ dwAttribsLast); dwSize += Length; iCount++; } } GetDlgItemText(hDlg, IDD_TEXT, szTemp, sizeof(szTemp)); wsprintf(szBuf, szTemp, iCount, AddCommasW(dwSize, szNum)); SetDlgItemText(hDlg, IDD_TEXT, szBuf); if (iCount == 1) { if (hwndDir) { SendMessage(hwndDir, FS_GETDIRECTORY, sizeof(szPath), (LPARAM)szPath); } else { FULL_PATH_KINDA_THING: lstrcpy(szName, szPath); StripPath(szName); StripFilespec(szPath); } StripBackslash(szPath); GetWindowText(hDlg, szTitle, sizeof(szTitle)); wsprintf(szTemp, szTitle, (LPSTR)szName); SetWindowText(hDlg, szTemp); SetDlgItemText(hDlg, IDD_NAME, szName); SetDlgItemText(hDlg, IDD_DIR, szPath); wsprintf(szTemp, szSBytes, (LPSTR)AddCommasW(Length, szNum)); SetDlgItemText(hDlg, IDD_SIZE, szTemp); PutDate(&Time, szTemp); lstrcat(szTemp, " "); PutTime(&Time, szTemp + lstrlen(szTemp)); SetDlgItemText(hDlg, IDD_DATE, szTemp); } else dwContext = IDH_GROUP_ATTRIBS; // add the network specific property buttons if (WNetGetCaps(WNNC_DIALOG) & WNNC_DLG_PROPERTYDIALOG) { GetWindowRect(GetDlgItem(hDlg,IDOK), &rcT); GetWindowRect(GetDlgItem(hDlg,IDCANCEL), &rc); dyButton = rc.top - rcT.top; GetWindowRect(GetDlgItem(hDlg,IDD_HELP), &rc); ScreenToClient(hDlg,(LPPOINT)&rc.left); ScreenToClient(hDlg,(LPPOINT)&rc.right); p = GetSelection(3); if (p) { for (i = 0; i < 6; i++) { if (iCount > 1) nType = WNPS_MULT; else if (dwAttribsOn & ATTR_DIR) nType = WNPS_DIR; else nType = WNPS_FILE; if (WNetGetPropertyText((WORD)i, (WORD)nType, p, szTemp, 30, WNTYPE_FILE) != WN_SUCCESS) break; if (!szTemp[0]) break; OffsetRect(&rc,0,dyButton); hwnd = CreateWindowEx(0, "button", szTemp, WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_PUSHBUTTON, rc.left, rc.top, rc.right - rc.left, rc.bottom-rc.top, hDlg, (HMENU)IntToPtr(i + IDD_NETWORKFIRST), hAppInstance, NULL); if (hwnd) { hFont = (HFONT)SendDlgItemMessage(hDlg, IDOK, WM_GETFONT, 0, 0L); SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0L); } } LocalFree((HANDLE)p); ClientToScreen(hDlg,(LPPOINT)&rc.left); ClientToScreen(hDlg,(LPPOINT)&rc.right); GetWindowRect(hDlg,&rcT); rc.bottom += dyButton; if (rcT.bottom <= rc.bottom) { SetWindowPos(hDlg,NULL,0,0,rcT.right-rcT.left, rc.bottom - rcT.top, SWP_NOMOVE|SWP_NOZORDER); } } } // change those that don't need to be 3state to regular if (ATTR_READONLY & dwAttribs3State) SetWindowLong(GetDlgItem(hDlg, IDD_READONLY), GWL_STYLE, WS_VISIBLE | WS_GROUP | WS_TABSTOP | BS_AUTO3STATE | WS_CHILD); if (ATTR_HIDDEN & dwAttribs3State) SetWindowLong(GetDlgItem(hDlg, IDD_HIDDEN), GWL_STYLE, WS_VISIBLE | BS_AUTO3STATE | WS_CHILD); if (ATTR_ARCHIVE & dwAttribs3State) SetWindowLong(GetDlgItem(hDlg, IDD_ARCHIVE), GWL_STYLE, WS_VISIBLE | BS_AUTO3STATE | WS_CHILD); if (ATTR_SYSTEM & dwAttribs3State) SetWindowLong(GetDlgItem(hDlg, IDD_SYSTEM), GWL_STYLE, WS_VISIBLE | BS_AUTO3STATE | WS_CHILD); CheckAttribsDlgButton(hDlg, IDD_READONLY, ATTR_READONLY, dwAttribs3State, dwAttribsOn); CheckAttribsDlgButton(hDlg, IDD_HIDDEN, ATTR_HIDDEN, dwAttribs3State, dwAttribsOn); CheckAttribsDlgButton(hDlg, IDD_ARCHIVE, ATTR_ARCHIVE, dwAttribs3State, dwAttribsOn); CheckAttribsDlgButton(hDlg, IDD_SYSTEM, ATTR_SYSTEM, dwAttribs3State, dwAttribsOn); return nType; } /*--------------------------------------------------------------------------*/ /* */ /* AttribsDlgProc() - */ /* */ // assumes the active MDI child has a directory window /*--------------------------------------------------------------------------*/ INT_PTR APIENTRY AttribsDlgProc( register HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { LPSTR p, pSel; BOOL bRet; HCURSOR hCursor; DWORD dwAttribsNew, dwAttribs, dwChangeMask; UINT state; CHAR szName[MAXPATHLEN]; static INT nType; UNREFERENCED_PARAMETER(lParam); switch (wMsg) { case WM_INITDIALOG: nType = InitPropertiesDialog(hDlg); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp; case IDD_NETWORKFIRST+0: case IDD_NETWORKFIRST+1: case IDD_NETWORKFIRST+2: case IDD_NETWORKFIRST+3: case IDD_NETWORKFIRST+4: case IDD_NETWORKFIRST+5: p = GetSelection(3); if (p) { WNetPropertyDialog(hDlg, (WORD)(GET_WM_COMMAND_ID(wParam, lParam)-IDD_NETWORKFIRST), (WORD)nType, p, WNTYPE_FILE); LocalFree((HANDLE)p); } break; case IDCANCEL: EndDialog(hDlg, FALSE); break; case IDOK: bRet = TRUE; dwChangeMask = ATTR_READWRITE; dwAttribsNew = ATTR_READWRITE; if ((state = IsDlgButtonChecked(hDlg, IDD_READONLY)) < 2) { dwChangeMask |= ATTR_READONLY; if (state == 1) dwAttribsNew |= ATTR_READONLY; } if ((state = IsDlgButtonChecked(hDlg, IDD_HIDDEN)) < 2) { dwChangeMask |= ATTR_HIDDEN; if (state == 1) dwAttribsNew |= ATTR_HIDDEN; } if ((state = IsDlgButtonChecked(hDlg, IDD_ARCHIVE)) < 2) { dwChangeMask |= ATTR_ARCHIVE; if (state == 1) dwAttribsNew |= ATTR_ARCHIVE; } if ((state = IsDlgButtonChecked(hDlg, IDD_SYSTEM)) < 2) { dwChangeMask |= ATTR_SYSTEM; if (state == 1) dwAttribsNew |= ATTR_SYSTEM; } EndDialog(hDlg, bRet); pSel = GetSelection(FALSE); if (!pSel) break; hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); ShowCursor(TRUE); DisableFSC(); p = pSel; while (p = GetNextFile(p, szName, sizeof(szName))) { QualifyPath(szName); FixAnsiPathForDos(szName); dwAttribs = GetFileAttributes(szName); if (dwAttribs & 0x8000) // BUG hardcoded! goto AttributeError; else dwAttribs &= ~ATTR_DIR; dwAttribs = (dwChangeMask & dwAttribsNew) | (~dwChangeMask & dwAttribs); if (WFSetAttr(szName, dwAttribs)) { AttributeError: GetWindowText(hDlg, szTitle, sizeof(szTitle)); LoadString(hAppInstance, IDS_ATTRIBERR, szMessage, sizeof(szMessage)); MessageBox(hwndFrame, szMessage, szTitle, MB_OK | MB_ICONSTOP); bRet = FALSE; break; } // clear all the FSC messages from the message queue wfYield(); } EnableFSC(); ShowCursor(FALSE); SetCursor(hCursor); LocalFree((HANDLE)pSel); break; default: return FALSE; } break; default: if (wMsg == wHelpMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return TRUE; } /*--------------------------------------------------------------------------*/ /* */ /* MakeDirDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/ INT_PTR APIENTRY MakeDirDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam ) { CHAR szPath[MAXPATHLEN]; INT ret; UNREFERENCED_PARAMETER(lParam); switch (wMsg) { case WM_INITDIALOG: SetDlgDirectory(hDlg, NULL); SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szPath)-1, 0L); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp; case IDCANCEL: EndDialog(hDlg, FALSE); break; case IDOK: GetDlgItemText(hDlg, IDD_NAME, szPath, sizeof(szPath)); EndDialog(hDlg, TRUE); // parse out any quoted strings GetNextFile(szPath, szPath, sizeof(szPath)); QualifyPath(szPath); hdlgProgress = hDlg; if (NetCheck(szPath,WNDN_MKDIR) == WN_SUCCESS) { FixAnsiPathForDos(szPath); ret = WF_CreateDirectory(hDlg, szPath); if (ret && ret!=DE_OPCANCELLED) { if (WFIsDir(szPath)) ret = IDS_MAKEDIREXISTS; else ret += IDS_REASONS; GetWindowText(hDlg, szTitle, sizeof(szTitle)); LoadString(hAppInstance, ret, szMessage, sizeof(szMessage)); MessageBox(hwndFrame, szMessage, szTitle, MB_OK | MB_ICONSTOP); } } break; default: return FALSE; } break; default: if (wMsg == wHelpMessage) { DoHelp: WFHelp(hDlg); return TRUE; } else return FALSE; } return TRUE; }