|
|
/*
* pmdlgs.c - program manager dialog procedures * * Copyright (c) 1991, Microsoft Corporation * * DESCRIPTION * * This file is for support of program manager under NT Windows. * This file is/was ported from pmdlgs.c (program manager). * * MODIFICATION HISTORY * Initial Version: x/x/90 Author Unknown, since he didn't feel * like lettings us know... * * NT 32b Version: 2/1/91 Jeff Pack * Intitial port to begin. * * */
#include "progman.h"
#include "commdlg.h"
#include "io.h"
#include "stdio.h"
#include <vdmapi.h>
#define CBCUSTFILTER 40 // Max size of custom filter.
BOOL fFirstPass; // For IconDlgProc so we can fill the list
// with stuff from progman if the first
// file given has no icons.
BOOL fNewIcon; // Flags if the icon has been explicitely
// set.
extern BOOL bHandleProgramGroupsEvent;
TCHAR szDotPIF[] = TEXT(".pif"); TCHAR szCommdlg[] = TEXT("comdlg32.dll"); // The name of the common dialog.
typedef BOOL (APIENTRY *OPENFILENAME_PROC)(LPOPENFILENAME); // Commdlgs GetOpenFileName routine.
OPENFILENAME_PROC lpfnGOFN;
#define szGetOpenFileName "GetOpenFileNameW"
/* from pmgseg.c */ DWORD PASCAL SizeofGroup(LPGROUPDEF lpgd); void RemoveBackslashFromKeyName(LPTSTR lpKeyName);
VOID CentreWindow(HWND hwnd); VOID FreeIconList(HANDLE hIconList, int iKeepIcon);
#define CHECK_BINARY_EVENT_NAME TEXT("CheckBinaryEvent")
#define CHECK_BINARY_ID 1
BOOL bCheckBinaryType; HANDLE hCheckBinaryEvent; UINT uiCheckBinaryTimeout; BOOL bCheckBinaryDirtyFlag; void CheckBinaryThread (LPVOID); extern TCHAR szCheckBinaryType[]; extern TCHAR szCheckBinaryTimeout[];
//#ifdef JAPAN
//BOOL CheckPortName(HWND,LPTSTR );
//BOOL PortName(LPTSTR );
//#endif
BOOL APIENTRY InQuotes(LPTSTR sz) { if (*sz == TEXT('"') && *(sz + lstrlen(sz) - 1) == TEXT('"')) { return(TRUE); } return(FALSE); }
//-------------------------------------------------------------------------
// Removes leading and trailing spaces.
VOID APIENTRY RemoveLeadingSpaces(LPTSTR sz) { TCHAR *pChr2; LPTSTR lpTmp;
while(*sz == TEXT(' ')) { // First Char is a space.
// Move them all down one.
for (pChr2 = sz; *pChr2; pChr2++) { *pChr2 = *(pChr2+1); } } if (!*sz) { return; } lpTmp = sz + lstrlen(sz) - 1; while (*lpTmp && *lpTmp == TEXT(' ')) { *lpTmp-- = TEXT('\0'); } }
/*** GroupFull - Check for full group. Returns FALSE if the group isn't full.
* * * BOOL PASCAL GroupFull(PGROUP pGroup) * * ENTRY - PGROUP pGroup * * EXIT - BOOL - returns TRUE if group is full * * SYNOPSIS - * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ BOOL PASCAL GroupFull(PGROUP pGroup) { WORD i=0; PITEM pItem; BOOL ret;
// Count the items in the group.
for (pItem = pGroup->pItems;pItem;pItem = pItem->pNext) i++;
if (i >= CITEMSMAX) { MyMessageBox(hwndProgman, IDS_GROUPFILEERR, IDS_TOOMANYITEMS, NULL, MB_OK | MB_ICONEXCLAMATION|MB_SYSTEMMODAL); ret = TRUE; } else ret = FALSE;
return ret; }
/*** ValidPathDrive
* * * BOOL APIENTRY ValidPathDrive(LPTSTR lpPath) * * ENTRY - LPTSTR lpPath - pointer to path * * EXIT - BOOL - returns TRUE if drive path is valid * * SYNOPSIS - Check the drive letter of the given path (if it has one). * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ BOOL APIENTRY PASCAL ValidPathDrive(LPTSTR lpPath) { int nValid; TCHAR szDriveRoot[4] = TEXT("?:\\");
// Store first letter of path.
*szDriveRoot = *lpPath; lpPath = CharNext(lpPath); if (*lpPath == TEXT(':')) { //
// It's got a drive letter. Test the drive type with the root directory.
//
nValid = GetDriveType(szDriveRoot); if ( nValid == 1 || nValid == 0) { return FALSE; } else { return TRUE; } } return TRUE; }
/*** StripArgs -- strip everything after a space
* * * VOID APIENTRY StripArgs(LPTSTR szCmmdLine) * * ENTRY - LPTSTR szCmmdLine - Pointer to command line * int index * * * EXIT - VOID * * SYNOPSIS - This searches for first space, and places NULL there, stripping * everything after that * * WARNINGS - * EFFECTS - * */ void NEAR PASCAL StripArgs(LPTSTR szCmmdLine) { TCHAR *pch;
//
// first skip leading spaces
//
for (pch = szCmmdLine; *pch && *pch == TEXT(' '); pch = CharNext(pch)) ;
//
// check if we have a quote, if so look for second quote.
//
if (*pch == TEXT('"')) { for (pch++; *pch; pch = CharNext(pch)) { if (*pch == TEXT('"')) { // Found it, limit string at this point.
pch++; *pch = TEXT('\0'); break; } } } else { // Search forward to find the first space in the cmmd line.
for (; *pch; pch = CharNext(pch)) { if (*pch == TEXT(' ')) { // Found it, limit string at this point.
*pch = TEXT('\0'); break; } } } }
/*** GetPathInfo -- tokenizes string to path/name/extension components
* * * VOID APIENTRY GetPathInfo(LPTSTR szPath, LPTSTR *pszLastSlash, LPTSTR *pszExt, DWORD *pich) * * ENTRY - LPTSTR szPath - pointer to path stuff * LPTSTR *pszLastSlash - last slash in path * LPTSTR *pszExt - pointer to extension * WORD *plich - index of last slash * * * EXIT - VOID * * SYNOPSIS - This searches for first space, and places NULL there, stripping * everything after that * * WARNINGS - BUG BUG , NOT LFN aware! * EFFECTS - * */ void PASCAL GetPathInfo(LPTSTR szPath, LPTSTR *pszFileName, LPTSTR *pszExt, WORD *pich, BOOL *pfUnc) { TCHAR *pch; // Temp variable.
WORD ich = 0; // Temp.
BOOL InQuotes;
*pszExt = NULL; // If no extension, return NULL.
*pszFileName = szPath; // If no seperate filename component, return path.
*pich = 0; *pfUnc = FALSE; // Default to not UNC style.
//
// Check if path is in quotes.
//
if (InQuotes = (*szPath == TEXT('"'))) { szPath++; }
// Check for UNC style paths.
if (*szPath == TEXT('\\') && *(szPath+1) == TEXT('\\')) *pfUnc = TRUE;
// Search forward to find the last backslash or colon in the path.
// While we're at it, look for the last dot.
for (pch = szPath; *pch; pch = CharNext(pch)) {
if ((*pch == TEXT(' ')) && (!InQuotes)) { // Found a space - stop here.
break; } if (*pch == TEXT('"')) { // Found a the second quote - stop here.
pch++; break; } if (*pch == TEXT('\\') || *pch == TEXT(':')) { // Found it, record ptr to it and it's index.
*pszFileName = pch+1; *pich = ich + (WORD)1; } if (*pch == TEXT('.')) { // Found a dot.
*pszExt = pch; } ich++; }
/* Check that the last dot is part of the last filename. */ if (*pszExt < *pszFileName) *pszExt = NULL; }
/*** TagExtension
* * * void APIENTRY TagExtension(PSTR pszPath, UINT cbPath) * * ENTRY - PSTR pszPath - * UINT cbPath - length of path in bytes * * EXIT - * * SYNOPSIS - Checks a string to see if it has an extension. * If it doesn't then .exe will be appended. * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ void FAR PASCAL TagExtension(LPTSTR szPath, UINT cbPath) { DWORD dummy; LPTSTR szFileName; LPTSTR pszExt; LPTSTR pch;
GetPathInfo(szPath, &szFileName, &pszExt, (WORD*) &dummy, (BOOL*) &dummy); if (!pszExt && (sizeof(TCHAR) * (lstrlen(szPath) + 5)) < cbPath) { // No extension, tag on a ".exe"
// but first check if the path is in quotes
pch = szPath + lstrlen(szPath); if (InQuotes(szPath)) { *pch = TEXT('\0'); lstrcat(szPath, TEXT(".exe\"")); } else { lstrcat(szPath, TEXT(".exe")); } } }
// PIF stuff added 1/9/92
#define PTITLELEN 30
#define PPATHLEN 63
#define PATHMAX 64
#define COMMAX 64
#define PIFEDITMAXPIFL 1024L
typedef struct tagPIFFILE { TCHAR Reserved1[2]; TCHAR PTITLE[PTITLELEN]; WORD MAXMEMWORD; WORD MINMEMWORD; TCHAR PPATHNAME[PPATHLEN]; TCHAR MSFLAGS; TCHAR Reserved2; TCHAR INITIALDIR[PATHMAX]; TCHAR INITIALCOM[COMMAX]; TCHAR SCREENTYPE; TCHAR SCREENPAGES; TCHAR INTVECLOW; TCHAR INTVECHIGH; TCHAR ROWS; TCHAR COLUMNS; TCHAR ROWOFFS; TCHAR COLOFFS; WORD SYSTEMMEM; TCHAR SHAREDPROG[64]; TCHAR SHAREDDATA[64]; TCHAR BEHAVBYTE; TCHAR SYSTEMFLAGS; } PIFFILE ;
void NEAR PASCAL GetTheString(LPTSTR pDst, LPTSTR pSrc, UINT iLen) { TCHAR cTemp;
/* Ensure there is NULL termination, and then copy the description
*/ cTemp = pSrc[iLen]; pSrc[iLen] = TEXT('\0'); lstrcpy(pDst, pSrc); pSrc[iLen] = cTemp;
/* Strip off trailing spaces
*/ for (pSrc=NULL; *pDst; pDst=CharNext(pDst)) if (*pDst != TEXT(' ')) pSrc = pDst; if (pSrc) *CharNext(pSrc) = TEXT('\0'); }
void NEAR PASCAL GetStuffFromPIF(LPTSTR szPath, LPTSTR szName, LPTSTR szDir) { TCHAR szTemp[MAXITEMPATHLEN+1]; DWORD dummy; LPTSTR pszExt; LPTSTR pszFileName; PIFFILE pfTemp; HANDLE fh; DWORD dwBytesRead ;
/* Do nothing if the user has filled in these fields
*/ if (*szName && *szDir) return;
/* Check for the ".pif" extension
*/ lstrcpy(szTemp, szPath); StripArgs(szTemp); GetPathInfo(szTemp, &pszFileName, &pszExt, (WORD*) &dummy, (BOOL*) &dummy); if (!pszExt || lstrcmpi(pszExt, szDotPIF)) return;
/* There is no real way to verify the PIF format, like the COM format,
* so we are assuming that the extension is our verification */ fh = CreateFile(szTemp, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) ;
if ( fh == INVALID_HANDLE_VALUE) return;
ReadFile(fh,(LPTSTR)&pfTemp,sizeof(pfTemp),&dwBytesRead,NULL) ; if (dwBytesRead == sizeof(pfTemp) && SetFilePointer(fh, 0L, NULL, FILE_END) < PIFEDITMAXPIFL) { if (!*szName) { GetTheString(szName, pfTemp.PTITLE, CharSizeOf(pfTemp.PTITLE)); DoEnvironmentSubst(szName, CharSizeOf(szNameField)); }
if (!*szDir) { GetTheString(szDir, pfTemp.INITIALDIR, CharSizeOf(pfTemp.INITIALDIR)); } } CloseHandle(fh); }
/*** GetDirectoryFromPath
* * * VOID APIENTRY GetDirectoryFromPath (PSTR szFilePath, PSTR szDir) * * ENTRY - PSTR szFilePath - Full path to a file. * PSTR szDir - Directory returned in here, the buffer * is assumed to be as big as szFilePath. * * EXIT - * * SYNOPSIS - Given a full path, returns the directory of the file specified * by the path. If the path is UNC style or the path is just a * filename then the directory returned will be a NULL. * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ VOID FAR PASCAL GetDirectoryFromPath(LPTSTR szFilePath, LPTSTR szDir) { LPTSTR pFileName; LPTSTR pExt; WORD ich; BOOL fUnc;
*szDir = TEXT('\0');
/* Get info about file path. */ GetPathInfo(szFilePath, &pFileName, &pExt, &ich, &fUnc);
/* UNC paths don't (conceptually to Progman) have a directory component. */ if (fUnc) return;
/* Does it have a directory component ? */ if (pFileName != szFilePath) { // Yep.
/* copy path to temp. */ if (*szFilePath == TEXT('"')) { szFilePath++; } lstrcpy(szDir, szFilePath); /* check path style. */
if (ich <= 3 && *(szDir+1) == TEXT(':')){
/*
* The path is "c:\foo.c" or "c:foo.c" style. * Don't remove the last slash/colon, just the filename. */ szDir[pFileName-szFilePath] = TEXT('\0'); } else if (ich == 1) { /*
* something like "\foo.c" * Don't remove the last slash/colon, just the filename. */ szDir[pFileName-szFilePath] = TEXT('\0'); } else { /*
* The filepath is a full normal path. * Could be something like "..\foo.c" or ".\foo.c" though. * Stomp on the last slash to get just the path. */ szDir[pFileName-szFilePath-1] = TEXT('\0'); } }
/* else just a filename with no path. */ }
/*** GetFilenameFromPath
* * * PSTR APIENTRY GetFilenameFromPath (PSTR szPath) * * ENTRY - PSTR szPath - * * EXIT - PSTR - * * SYNOPSIS - Given a full path returns a ptr to the filename bit. * Unless it's a UNC style path in which case it returns the path. * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ VOID FAR PASCAL GetFilenameFromPath(LPTSTR szPath, LPTSTR szFilename) { DWORD dummy; LPTSTR pFileName; LPTSTR pExt; BOOL fUNC;
GetPathInfo(szPath, &pFileName, &pExt, (WORD*) &dummy, &fUNC);
/* If it's a UNC then the 'filename' part is the whole thing. */ if (fUNC || (szPath == pFileName)) lstrcpy(szFilename, szPath); else { if (*szPath == TEXT('"')) { *szFilename++ = TEXT('"'); } lstrcpy(szFilename, pFileName); } }
/*** HandleDosApps
* * * void HandleDosApps (PSTR sz) * * ENTRY - PSTR sz - full path sans arguments * * EXIT - * * SYNOPSIS - Takes a full path to a file and checks if it's a dos app mentioned * in the pif.inf file. * If it isn't in the pif.inf file then the the routine returns without * doing anything. * If it is then it looks for a pif file with the same base name * in the same directory. * If there isn't one then it checks the windows directory. * If that fails it calls setup to create a new one giving the full * path to the app in question. - NOT supported in NTSetup. * The procedure doesn't alter the input string. * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - ported from Windows 3.1 * */ void FAR PASCAL HandleDosApps(LPTSTR sz) { TCHAR szPath[MAXITEMPATHLEN+1]; // Copy of path so we can stomp all over
// it.
LPTSTR pszFileName; // The file filename part.
LPTSTR pszExt; // The extension.
WORD ich; // Index to filename.
TCHAR szPifSection[32]; // Section in file to search,
TCHAR szPifIniFile[16]; // Ini file to check.
TCHAR szSystemDir[MAXITEMPATHLEN+1]; // Path to system dir.
TCHAR szReturnString[2]; // Mini buffer to check return from GPPS.
//OFSTRUCT of; // OF struct.
TCHAR szExecSetup[MAXITEMPATHLEN+1]; // String used to WinExec setup to
// create the pif for this app.
BOOL dummy; // Dummy variable.
DWORD dwResult ; TCHAR szPathFieldTemp[MAXITEMPATHLEN+1] ; LPTSTR FilePart ;
/* Get system dir. */ GetSystemDirectory(szSystemDir, CharSizeOf(szSystemDir));
/* Load ini file info. */ LoadString(hAppInstance, IDS_PIFINIFILE, szPifIniFile, CharSizeOf(szPifIniFile)); LoadString(hAppInstance, IDS_PIFSECTION, szPifSection, CharSizeOf(szPifSection)); LoadString(hAppInstance, IDS_EXECSETUP, szExecSetup, CharSizeOf(szExecSetup));
/* Set up path to inf file. */ if (lstrlen(szSystemDir) > 3) { lstrcat(szSystemDir, TEXT("\\")); } lstrcat(szSystemDir, szPifIniFile);
/* Copy path */ lstrcpy(szPath, sz);
/* Get info about the path. */ GetPathInfo(szPath, &pszFileName, &pszExt, &ich, &dummy);
#ifdef DEBUG
OutputDebugString(TEXT("\n\rLooking in apps.ini for ")); OutputDebugString(pszFileName); OutputDebugString(TEXT("\n\r")); #endif
/* Init the default to null. */ szReturnString[0] = TEXT('\0');
/*
* Check in pif.ini file. * GPPS([section], keyname, szDef, szResultString, cbResString, FileName); */ GetPrivateProfileString(szPifSection, pszFileName, szReturnString, szReturnString, CharSizeOf(szReturnString), szSystemDir); if (szReturnString[0] == TEXT('\0')) { /* It's not there. */ #ifdef DEBUG
OutputDebugString(TEXT("App not in inf file")); OutputDebugString(TEXT("\n\r")); #endif
return; }
#ifdef DEBUG
OutputDebugString(TEXT("App in inf file")); OutputDebugString(TEXT("\n\r")); #endif
/*
* It's in the pif file, there should be a .pif for it somewhere. * Change extension to .pif */ if (pszExt) { // copy .pif\0 over the existing extension.
lstrcpy(pszExt, TEXT(".pif")); } else { // cat .pif\0 onto the end.
lstrcat(szPath,TEXT(".pif")); }
// Check given directory first.
#ifdef DEBUG
OutputDebugString(TEXT("Checking ")); OutputDebugString(szPath); OutputDebugString(TEXT("\n\r")); #endif
//SearchPath!!!
dwResult = SearchPath(NULL,szPath,NULL,MAXITEMPATHLEN+1, szPathFieldTemp,&FilePart) ; if (dwResult == 0 && GetLastError() != 0x20) { //if (OpenFile(szPath, &of, OF_EXIST) == (HFILE)-1 && of.nErrCode != 0x20) {
// It's not there.
#ifdef DEBUG
OutputDebugString(TEXT("Checking ")); OutputDebugString(pszFileName); OutputDebugString(TEXT("\n\r")); #endif
// Check path.
dwResult = SearchPath(NULL,pszFileName,NULL,MAXITEMPATHLEN+1, szPathFieldTemp,&FilePart) ; if (dwResult == 0 && GetLastError() != 0x20) { //if (! (OpenFile(pszFileName, &of, OF_EXIST) == (HFILE)-1 && of.nErrCode !=0x20) ) {
// Found it on path - winoldapp app will find it,
#ifdef DEBUG
OutputDebugString(TEXT("Found it on path. ")); OutputDebugString(szPathFieldTemp); OutputDebugString(TEXT("\n\r")); #endif
} else { #ifdef LATER
//
// NT Setup does not support this.
// sunilp said so 9-9-92
//
// It's not anywhere so get setup to create it.
lstrcat(szExecSetup, sz);
// Exec setup - REVIEW silently ignore any errors from win exec.
WinExec(szExecSetup, SW_SHOWNORMAL); #endif
} } }
/*** FixUpNulls -- replace "#" with NULL
* * * VOID APIENTRY FixUpNulls(PSTR p) * * ENTRY - PSTR p - pointer to string to replaces chars * * * EXIT - VOID * * SYNOPSIS - seraches for any "#" chars, and replaces them with NULL * * * WARNINGS - * EFFECTS - * */ void NEAR PASCAL FixupNulls(LPTSTR p) { while (*p) { if (*p == TEXT('#')) *p = TEXT('\0'); p++; } }
/*** GetFileNameFromBrowser --
* * * BOOL APIENTRY GetFileNameFromBrowse(HWND, PSTR, WORD, PSTR, WORD, PSTR) * * ENTRY - HWND hwnd - Owner for browse dialog. * PSTR szFilePath - Path to file * WORD cbFilePath - Max length of file path buffer, in bytes. * PSTR szWorkingDir - Working directory * WORD wId - Id for filters string. * PSTR szDefExt - Default extension to use if the user doesn't * specify enter one. * EXIT - BOOL * * SYNOPSIS - Use the common browse dialog to get a filename. The working * directory of the common dialog will be set to the directory * part of the file path if it is more than just a filename. * If the filepath consists of just a filename then the working * directory will be used. The full path to the selected file will * be returned in szFilePath. * * WARNINGS - * EFFECTS - * */ BOOL GetFileNameFromBrowse( HWND hwnd, LPTSTR szFilePath, WORD cbFilePath, LPTSTR szWorkingDir, WORD wId, LPTSTR szDefExt) { OPENFILENAME ofn; // Structure used to init dialog.
TCHAR szFilters[200];// Filters string.
TCHAR szTitle[80]; // Title for dialog.
TCHAR szBrowserDir[MAXITEMPATHLEN+1]; // Directory to start browsing from.
BOOL fBrowseOK; // Result from browser.
szBrowserDir[0] = TEXT('\0'); // By default use CWD.
// Try to set the directory in the user's home directory.
SetCurrentDirectory(szOriginalDirectory);
// Load filter for the browser.
LoadString(hAppInstance, wId, szFilters, CharSizeOf(szFilters));
// Convert the hashes in the filter into NULLs for the browser.
FixupNulls(szFilters);
// Load the title for the browser.
LoadString(hAppInstance, IDS_BROWSE, szTitle, CharSizeOf(szTitle));
// Set up info for browser. */
GetDirectoryFromPath(szFilePath, szBrowserDir);
if (*szBrowserDir == TEXT('\0') && szWorkingDir) { lstrcpy(szBrowserDir, szWorkingDir); }
/*
* Stomp on the file path so that the dialog doesn't * try to use it to initialise the dialog. The result is put * in here. */ szFilePath[0] = TEXT('\0');
/* Setup info for comm dialog. */ ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.hInstance = NULL; ofn.lpstrFilter = szFilters; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.nMaxCustFilter = 0; ofn.lpstrFile = szFilePath; ofn.nMaxFile = cbFilePath/sizeof(TCHAR); ofn.lpstrInitialDir = szBrowserDir; ofn.lpstrTitle = szTitle; ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; ofn.lpfnHook = NULL; ofn.lpstrDefExt = szDefExt; ofn.lpstrFileTitle = NULL;
/*
* Get a filename from the dialog... * Load the commdlg dll. */ if (!hCommdlg) { hCommdlg = LoadLibrary(szCommdlg); if (!hCommdlg) { /* Commdlg not available. */ MyMessageBox(hwnd, IDS_APPTITLE, IDS_COMMDLGLOADERR, NULL, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); hCommdlg = NULL; fBrowseOK = FALSE; goto ProcExit; } else { lpfnGOFN = (OPENFILENAME_PROC)GetProcAddress(hCommdlg, (LPSTR)szGetOpenFileName); if (!lpfnGOFN) { MyMessageBox(hwnd, IDS_APPTITLE, IDS_COMMDLGLOADERR, NULL, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); hCommdlg = NULL; fBrowseOK = FALSE; goto ProcExit; } } } /*
* Commdlg is loaded... * Call it. */ fBrowseOK = (*lpfnGOFN)(&ofn);
ProcExit:
// restore the current dir
SetCurrentDirectory(szWindowsDirectory);
return fBrowseOK; }
/*** PMHelp --
* * * VOID APIENTRY PMHelp(HWND hwnd) * * ENTRY - HWND hwnd * * * EXIT - VOID * * SYNOPSIS - * * * WARNINGS - * EFFECTS - * */ void FAR PASCAL PMHelp(HWND hwnd) { SetCurrentDirectory(szOriginalDirectory); if (!WinHelp(hwnd, szProgmanHelp, HELP_CONTEXT, dwContext)) { MyMessageBox(hwnd, IDS_APPTITLE, IDS_WINHELPERR, NULL, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); } SetCurrentDirectory(szWindowsDirectory); }
/*** MyDialogBox --
* * * WORD APIENTRY MyDialogBox(WORD idd, HWND hwndParent, FARPROC lpfnDlgProc) * * ENTRY - WORD idd * HWND hwnd * FARPROC lpfnDlgProc * * EXIT - WORD xxx * * SYNOPSIS - * * * WARNINGS - * EFFECTS - * */ WORD APIENTRY MyDialogBox(WORD idd, HWND hwndParent, DLGPROC lpfnDlgProc) { WORD wRet; DWORD dwSave = dwContext;
dwContext = IDH_DLGFIRST + idd;
wRet = (WORD)DialogBox(hAppInstance, (LPTSTR) MAKEINTRESOURCE(idd), hwndParent, lpfnDlgProc); dwContext = dwSave; return(wRet); }
/*** ChooserDlgProc -- Dialog Procedure for chooser
* * * * ChooserDlgProc(HWND hwnd, UINT uiMsg, DWORD wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */ INT_PTR APIENTRY ChooserDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { register WORD wTempSelection;
switch (uiMsg) { case WM_INITDIALOG: if (!AccessToCommonGroups) { EnableWindow(GetDlgItem(hwnd, IDD_COMMONGROUP), FALSE); } wNewSelection = SelectionType(); if (wNewSelection == TYPE_ITEM) wTempSelection = IDD_ITEM; else { wTempSelection = IDD_PERSGROUP; wNewSelection = TYPE_PERSGROUP; }
/* Grey out illegal items. */ if (!pCurrentGroup || !GroupCheck(pCurrentGroup)) { /* Group is RO - can't create new items. */ EnableWindow(GetDlgItem(hwnd,IDD_ITEM), FALSE); wTempSelection = IDD_PERSGROUP; wNewSelection = TYPE_PERSGROUP; }
if (dwEditLevel == 1) { /* Not allowed to create new groups. */ EnableWindow(GetDlgItem(hwnd,IDD_PERSGROUP), FALSE); wTempSelection = IDD_ITEM; wNewSelection = TYPE_ITEM; }
CheckRadioButton(hwnd, IDD_ITEM, IDD_COMMONGROUP, wTempSelection); break;
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDD_ITEM: if (IsWindowEnabled(GetDlgItem(hwnd,IDD_ITEM))) wNewSelection = TYPE_ITEM; break;
case IDD_PERSGROUP: if (IsWindowEnabled(GetDlgItem(hwnd,IDD_PERSGROUP))) wNewSelection = TYPE_PERSGROUP; break;
case IDD_COMMONGROUP: if (IsWindowEnabled(GetDlgItem(hwnd,IDD_COMMONGROUP))) wNewSelection = TYPE_COMMONGROUP; break;
case IDOK: EndDialog(hwnd, TRUE); break;
case IDCANCEL: EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage) { DoHelp: PMHelp(hwnd);
return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** MoveItemDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY MoveItemDlgProc(HWND hwnd, UINT uiMsg, DWORD wParam, LONG lParam) * * ENTRY - HWND hwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */
INT_PTR APIENTRY MoveItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{ int iSel; HWND hwndCB; register PGROUP pGroup;
hwndCB = GetDlgItem(hwnd, IDD_GROUPS);
switch (uiMsg) { case WM_INITDIALOG: { LPITEMDEF lpid; LPGROUPDEF lpgd; int i=0;
lpgd = LockGroup(pCurrentGroup->hwnd);
if (lpgd == 0L) goto MoveDlgExit;
lpid = ITEM(lpgd,pCurrentGroup->pItems->iItem);
SetDlgItemText(hwnd, IDD_ITEM, (LPTSTR) PTR(lpgd, lpid->pName)); SetDlgItemText(hwnd, IDD_GROUP, (LPTSTR) PTR(lpgd, lpgd->pName));
UnlockGroup(pCurrentGroup->hwnd);
pGroup = pFirstGroup; while (pGroup) { if (IsGroupReadOnly(pGroup->lpKey, pGroup->fCommon)) pGroup->fRO = TRUE; else pGroup->fRO = FALSE; if (!pGroup->fRO) {
if (pGroup != pCurrentGroup) { GetWindowText(pGroup->hwnd, (LPTSTR)szMessage, MAXGROUPNAMELEN + 1); iSel = (int)SendMessage(hwndCB, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMessage); SendMessage(hwndCB, CB_SETITEMDATA, iSel, (LPARAM)(LPTSTR)pGroup); i++; } } pGroup = pGroup->pNext; } SendMessage(hwndCB, CB_SETCURSEL, 0, 0L); if (i==0) { /* No items in list box - Kill the OK button. */ EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); } break; }
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDOK: { int nIndex; PGROUP pGTemp;
/* Get the pointer to the selected group. */ nIndex = (int)SendMessage(hwndCB, CB_GETCURSEL, 0, 0L); pGroup = (PGROUP)SendMessage(hwndCB, CB_GETITEMDATA, nIndex, 0L);
/* Check pointer. */ if (!pGroup) goto ExitCase;
pGTemp = pCurrentGroup;
/*
* Only do this operation if the user actually had a * group selected. CB_GETITEMDATA will return -1 if * an item wasn't selected. This happens if the user * tries to do a move when there's only one group around. */ if (pGroup != (PGROUP)(-1)) { if (DuplicateItem(pGTemp,pGTemp->pItems,pGroup,NULL)) {
// OK to delete the original.
DeleteItem(pGTemp,pGTemp->pItems); // It's messy to change the focus when using the keyboard.
// SendMessage(hwndMDIClient, WM_MDIACTIVATE, (WPARAM)(pGroup->hwnd), 0L);
CalcGroupScrolls(pGroup->hwnd); } }
ExitCase: EndDialog(hwnd, TRUE); break; }
case IDCANCEL: MoveDlgExit: EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage) DoHelp: { DWORD dwSave = dwContext;
dwContext = IDH_MOVEDLG; PMHelp(hwnd); dwContext = dwSave; return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** CopyItemDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY CopyItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */
INT_PTR APIENTRY CopyItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{ int iSel; HWND hwndCB; register PGROUP pGroup; LPITEMDEF lpid; LPGROUPDEF lpgd;
hwndCB = GetDlgItem(hwnd, IDD_GROUPS);
switch (uiMsg) { case WM_INITDIALOG: { int i=0;
LoadString(hAppInstance, IDS_COPYDLGTITLE, (LPTSTR)szTitle, MAXTITLELEN); SetWindowText(hwnd, szTitle); LoadString(hAppInstance, IDS_COPYDLGTITLE1, (LPTSTR)szTitle, MAXTITLELEN); SetDlgItemText(hwnd, IDD_MOVETITLE1, szTitle);
lpgd = LockGroup(pCurrentGroup->hwnd);
if (lpgd == 0L) goto CopyDlgExit;
lpid = ITEM(lpgd,pCurrentGroup->pItems->iItem);
SetDlgItemText(hwnd, IDD_ITEM, (LPTSTR) PTR(lpgd, lpid->pName)); SetDlgItemText(hwnd, IDD_GROUP, (LPTSTR) PTR(lpgd, lpgd->pName));
UnlockGroup(pCurrentGroup->hwnd);
pGroup = pFirstGroup; while (pGroup) { if (IsGroupReadOnly(pGroup->lpKey, pGroup->fCommon)) pGroup->fRO = TRUE; else pGroup->fRO = FALSE;
if (!pGroup->fRO) {
GetWindowText(pGroup->hwnd, (LPTSTR)szMessage, MAXGROUPNAMELEN + 1); iSel = (int)SendMessage(hwndCB, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMessage); SendMessage(hwndCB, CB_SETITEMDATA, iSel, (LPARAM)(LPTSTR)pGroup); i++; } pGroup = pGroup->pNext; } SendMessage(hwndCB, CB_SETCURSEL, 0, 0L); if (i==0) { // No items in list box - Kill the OK button.
EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); } break; }
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDOK: { int nIndex;
/* Get the pointer to the selected group. */ nIndex = (int)SendMessage(hwndCB, CB_GETCURSEL, 0, 0L); pGroup = (PGROUP)SendMessage(hwndCB, CB_GETITEMDATA, nIndex, 0L);
/* Check pointer. */ if (!pGroup) goto ExitCase;
DuplicateItem(pCurrentGroup,pCurrentGroup->pItems, pGroup,NULL); // Don't change focus to destination on a copy, very messy if you have a
// group maximised and you want to copy a whole bunch of stuff to another
// group using the keyboard.
// SendMessage(hwndMDIClient, WM_MDIACTIVATE, (WPARAM)(pGroup->hwnd), 0L);
/* Redo scroll bars for destination. */ CalcGroupScrolls(pGroup->hwnd); /* Redo scroll bars for source. */ CalcGroupScrolls(pCurrentGroup->hwnd);
ExitCase: EndDialog(hwnd, TRUE); break; }
case IDCANCEL: CopyDlgExit: EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage) DoHelp: { DWORD dwSave = dwContext;
dwContext = IDH_COPYDLG; PMHelp(hwnd); dwContext = dwSave; return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** SaveRecentFileList -- Save the list of recently used files
* * void APIENTRY SaveRecentFileList (HWND hwnd, LPTSTR szCurrentFile); * * * * ENTRY - HWND hwnd - handle to dialog box. * LPTSTR szCurrentFile - pointer to selected filename * WORD idControl - control id * * EXIT - * SYNOPSIS - * * WARNINGS - * EFFECTS - * */
void APIENTRY SaveRecentFileList (HWND hwnd, LPTSTR szCurrentFile, WORD idControl) { HKEY hKey; DWORD dwDisp; DWORD dwDataType, dwMaxFiles=INIT_MAX_FILES, dwMaxFilesSize, dwCount; TCHAR szFileEntry[20]; DWORD dwEnd=0; DWORD dwFileNum=0; DWORD dwDup; static TCHAR szRecentFilePath[MAXITEMPATHLEN+1];
//
// Open registry key
//
if ( RegCreateKeyEx (HKEY_CURRENT_USER, FILES_KEY, 0, 0, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS) { return; }
//
// Query the max number of files to save first.
//
dwMaxFilesSize = sizeof (DWORD);
RegQueryValueEx (hKey, MAXFILES_ENTRY, NULL, &dwDataType, (LPBYTE)&dwMaxFiles, &dwMaxFilesSize);
//
// If the user request 0 entries, then exit now.
//
if (dwMaxFiles == 0) { RegCloseKey (hKey); return; }
//
// Find out how many items are in the list box.
//
dwEnd = (DWORD)SendDlgItemMessage (hwnd, idControl, CB_GETCOUNT, 0, 0);
//
// If the max number of items we want to save is less than the
// number of entries, then change the ending point.
//
if (dwMaxFiles < dwEnd) { dwEnd = dwMaxFiles; }
//
// Add the first entry (the current file)
//
wsprintf (szFileEntry, FILE_ENTRY, dwFileNum++); dwMaxFilesSize = MAXITEMPATHLEN+1;
RegSetValueEx (hKey, szFileEntry, 0, REG_SZ, (CONST BYTE *)szCurrentFile, sizeof (TCHAR) * (lstrlen (szCurrentFile)+1));
//
// Check for a duplicate string.
//
dwDup = (DWORD)SendDlgItemMessage (hwnd, idControl, CB_FINDSTRING, (WPARAM) -1, (LPARAM) szCurrentFile);
//
// If we already have dwMaxFiles in the list and we don't have any
// duplicates, then we only want to save dwMaxFiles - 1 entries
// (drop the last entry).
//
//
if ( (dwEnd == dwMaxFiles) && (dwDup == CB_ERR) ) { dwEnd--; }
//
// Now loop through the remaining entries
//
for (dwCount=0; dwCount < dwEnd; dwCount++) {
//
// Check to see if we are at the duplicate entry. If
// so skip on to the next item.
//
if ((dwDup != CB_ERR) && (dwCount == dwDup)) { continue; }
//
// Get an entry out of the listbox.
//
SendDlgItemMessage (hwnd, idControl, CB_GETLBTEXT, (WPARAM) dwCount, (LPARAM) szRecentFilePath);
//
// If we get a NULL string, break out of the loop.
//
if (!(*szRecentFilePath) || !szRecentFilePath) { break; }
//
// Build the entry name
//
wsprintf (szFileEntry, FILE_ENTRY, dwFileNum); dwMaxFilesSize = MAXITEMPATHLEN+1;
//
// Save the entry
//
RegSetValueEx (hKey, szFileEntry, 0, REG_SZ,(CONST BYTE *) szRecentFilePath, sizeof (TCHAR) * (lstrlen (szRecentFilePath)+1));
//
// Increment our current file number
//
dwFileNum++; }
//
// Close the key
//
RegCloseKey (hKey);
}
/*** RunDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY RunDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */
INT_PTR APIENTRY RunDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { WORD ret; TCHAR szFullPath[MAXITEMPATHLEN+1]; HKEY hKey; DWORD dwDisp; DWORD dwDataType, dwMaxFiles=INIT_MAX_FILES, dwMaxFilesSize, dwCount; TCHAR szFileEntry[20]; DWORD dwThreadID; HANDLE hThread; DWORD dwBinaryInfo, cbData; BOOL bDoit;
switch (uiMsg) { case WM_INITDIALOG: SendDlgItemMessage(hwnd, IDD_PATH, EM_LIMITTEXT, CharSizeOf(szPathField)-1, 0L); szPathField[0] =TEXT('\0'); // initialize the path to null
SetDlgItemText(hwnd, IDD_PATH, szPathField); CheckDlgButton(hwnd, IDD_NEWVDM, 1); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), FALSE); EnableWindow(GetDlgItem(hwnd, IDOK), FALSE);
//
// Load the combobox with recently used files from the registry.
//
// Query the max number of files first.
//
if (RegCreateKeyEx (HKEY_CURRENT_USER, FILES_KEY, 0, 0, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisp) == ERROR_SUCCESS) {
if (dwDisp == REG_OPENED_EXISTING_KEY) {
//
// Query the max number of entries
//
dwMaxFilesSize = sizeof (DWORD);
if (RegQueryValueEx (hKey, MAXFILES_ENTRY, NULL, &dwDataType, (LPBYTE)&dwMaxFiles, &dwMaxFilesSize) == ERROR_SUCCESS) {
//
// Now Query each entry and add it to the list box.
//
for (dwCount=0; dwCount < dwMaxFiles; dwCount++) {
wsprintf (szFileEntry, FILE_ENTRY, dwCount); dwMaxFilesSize = MAXITEMPATHLEN+1;
if (RegQueryValueEx (hKey, szFileEntry, NULL, &dwDataType, (LPBYTE) szFullPath, &dwMaxFilesSize) == ERROR_SUCCESS) {
//
// Found an entry. Add it to the combo box.
//
SendDlgItemMessage (hwnd, IDD_PATH, CB_ADDSTRING, 0, (LPARAM)szFullPath);
} else { break; } } } } else { //
// We are working with a new key, so we need to
// set the default number of files.
//
RegSetValueEx (hKey, MAXFILES_ENTRY, 0, REG_DWORD, (CONST BYTE *) &dwMaxFiles, sizeof (DWORD)); }
//
// Close the registry key
//
RegCloseKey (hKey);
}
//
// Set the inital state for the thread which checks the binary
// type.
//
//
// Query if the binary type checking is enabled.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryType, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { bCheckBinaryType = (BOOL) dwBinaryInfo; } else { bCheckBinaryType = BINARY_TYPE_DEFAULT; }
//
// Query the binary type checking timeout value.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryTimeout, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { uiCheckBinaryTimeout = (UINT) dwBinaryInfo; } else { uiCheckBinaryTimeout = BINARY_TIMEOUT_DEFAULT; }
//
// Create the worker thread, and the signal event. If appropriate.
//
if (bCheckBinaryType) { hCheckBinaryEvent = CreateEvent (NULL, FALSE, FALSE, CHECK_BINARY_EVENT_NAME);
hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) CheckBinaryThread, (LPVOID) hwnd, 0, &dwThreadID);
bCheckBinaryDirtyFlag = FALSE; }
if (!hCheckBinaryEvent || !hThread || !bCheckBinaryType) { //
// If this statement is true, either we failed to create
// the event, the thread, or binary type checking is disabled.
// In this case, enable the separate memory checkbox, and let
// the user decide on his own.
//
CheckDlgButton(hwnd, IDD_NEWVDM, 0); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), TRUE);
//
// Clean up either item that succeeded
//
if (hCheckBinaryEvent) { CloseHandle (hCheckBinaryEvent); }
if (hThread) { TerminateThread (hThread, 0); }
//
// Setting this variable to NULL will prevent the second
// thread from trying to check the binary type.
//
hCheckBinaryEvent = NULL; }
break;
case WM_TIMER: if (hCheckBinaryEvent && bCheckBinaryDirtyFlag) { bCheckBinaryDirtyFlag = FALSE; SetEvent (hCheckBinaryEvent); } break;
case MYCBN_SELCHANGE: if (bCheckBinaryType) { bCheckBinaryDirtyFlag = TRUE; SetTimer (hwnd, CHECK_BINARY_ID, uiCheckBinaryTimeout, NULL); } bDoit = (GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1) > 0); EnableWindow(GetDlgItem(hwnd, IDOK), bDoit); break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDD_PATH: if ((GET_WM_COMMAND_CMD(wParam, lParam) != CBN_EDITCHANGE) && (GET_WM_COMMAND_CMD(wParam, lParam) != CBN_SELCHANGE) ) break;
PostMessage (hwnd, MYCBN_SELCHANGE, wParam, lParam); break;
case IDOK: { TCHAR szFilename[MAXITEMPATHLEN+3]; // added chars for ".\"
BOOL bNewVDM;
//
// Run this app in the user's home directory
//
SetCurrentDirectory(szOriginalDirectory);
GetDlgItemText(hwnd, IDD_PATH, szPathField, CharSizeOf(szPathField));
//#ifdef JAPAN
// if (CheckPortName(hwnd,szPathField))
// break;
//#endif
DoEnvironmentSubst(szPathField, CharSizeOf(szPathField));
GetDirectoryFromPath(szPathField, szDirField); if (*szDirField) { // Convert path into a .\foo.exe style thing.
lstrcpy(szFilename, TEXT(".\\")); // Tag the filename and params on to the end of the dot slash.
GetFilenameFromPath(szPathField, szFilename+2); if (*(szFilename+2) == TEXT('"') ) { SheRemoveQuotes(szFilename+2); CheckEscapes(szFilename, CharSizeOf(szFilename)); } } else { GetFilenameFromPath(szPathField, szFilename); }
bNewVDM = ( IsWindowEnabled(GetDlgItem(hwnd,IDD_NEWVDM)) && IsDlgButtonChecked(hwnd, IDD_NEWVDM) );
ret = ExecProgram(szFilename, szDirField, szFilename, IsDlgButtonChecked(hwnd, IDD_LOAD), 0, 0, bNewVDM);
//
// reset Progman's working directory.
//
SetCurrentDirectory(szWindowsDirectory);
if (ret) { MyMessageBox(hwnd, IDS_EXECERRTITLE, ret, szPathField, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL);
} else { GetDlgItemText(hwnd, IDD_PATH, szPathField, CharSizeOf(szPathField)); SaveRecentFileList (hwnd, szPathField, IDD_PATH);
if (bCheckBinaryType) { //
// Setting this variable to false, and signaling the event
// will cause the binary checking thread to terminate.
//
bCheckBinaryType = FALSE; SetEvent (hCheckBinaryEvent); KillTimer (hwnd, CHECK_BINARY_ID); }
EndDialog(hwnd, TRUE); } break; } case IDD_BROWSE: { DWORD dwSave = dwContext; TCHAR szPathField[MAXITEMPATHLEN+1];
dwContext = IDH_RUNBROWSEDLG;
GetDlgItemText(hwnd,IDD_PATH,szPathField,MAXITEMPATHLEN+1); wParam = GetFileNameFromBrowse(hwnd, szPathField, sizeof(szPathField), NULL, IDS_PROPERTIESPROGS, TEXT("exe"));
dwContext = dwSave;
if (wParam) { //
// if filename or directory have spaces, put the path
// between quotes.
//
CheckEscapes(szPathField, MAXITEMPATHLEN+1); SetDlgItemText(hwnd, IDD_PATH, szPathField); PostMessage (hwnd, MYCBN_SELCHANGE, wParam, lParam); // Set default button to OK.
PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDOK), TRUE); } break; }
case IDCANCEL: if (bCheckBinaryType) { //
// Setting this variable to false, and signaling the event
// will cause the binary checking thread to terminate.
//
bCheckBinaryType = FALSE; SetEvent (hCheckBinaryEvent); KillTimer (hwnd, CHECK_BINARY_ID); }
EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage || uiMsg == uiBrowseMessage) DoHelp: { PMHelp(hwnd);
return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** CheckBinaryThread --
* * * * void CheckBinaryThread (HWND, INT) * * ENTRY - HWND hDlg - handle to dialog box. * INT idCheckBox - Checkbox control id * * EXIT - void * * 05-18-94 Eric Flo - created * */
void CheckBinaryThread (LPVOID hwndDlg) { HWND hwnd = (HWND) hwndDlg; TCHAR szFullPath[MAXITEMPATHLEN+1]; LPTSTR FilePart ; DWORD dwBinaryType;
while (bCheckBinaryType) {
WaitForSingleObject (hCheckBinaryEvent, INFINITE);
if (bCheckBinaryType) {
DoEnvironmentSubst(szPathField, CharSizeOf(szPathField)); StripArgs(szPathField); TagExtension(szPathField, sizeof(szPathField)); SheRemoveQuotes(szPathField); if (SearchPath(NULL, szPathField, NULL, MAXITEMPATHLEN+1, szFullPath, &FilePart) && GetBinaryType(szFullPath, &dwBinaryType) && dwBinaryType == SCS_WOW_BINARY) { CheckDlgButton(hwnd, IDD_NEWVDM, 0); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), TRUE);
} else { CheckDlgButton(hwnd, IDD_NEWVDM, 1); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), FALSE); }
}
}
//
// Close our event handle and exit the thread.
//
CloseHandle (hCheckBinaryEvent); ExitThread (0); }
/*** ValidatePath --
* * * * DWORD APIENTRY ValidatePath(HWND, PSTR, PSTR, PSTR) * * ENTRY - HWND hDlg - handle to dialog box. * PSTR szPath - path to item. * PSTR szDir - path to working directory. * PSTR szExePath - path to associated exe. * * EXIT - DWORD - returns PATH_VALID is path is valid. * if path is not valid returns PATH_INVALID_OK * if user hits OK to invalid message box, * otherwise returns PATH_VALID * * SYNOPSIS - * * WARNINGS - * EFFECTS - * * 08-08-91 JohanneC - updated to Windows 3.1 * */
DWORD APIENTRY ValidatePath(HWND hDlg, LPTSTR szPath, LPTSTR szDir, LPTSTR szExePath) { int cDrive; TCHAR szTemp[MAXITEMPATHLEN+1]; int err; BOOL bOriginalDirectory; // using original directory
DWORD dwRet = PATH_VALID; BOOL fOK = TRUE; // If the path or the dir check fail
// then don't bother with the assoc check.
/* Check working directory. */ GetCurrentDirectory(MAXITEMPATHLEN, szTemp); SetCurrentDirectory(szOriginalDirectory);
//CharToOem(szDir, szDir);
/* Allow dir field to be NULL without error. */ if (szDir && *szDir) {
/* Remove leading spaces. */ // RemoveLeadingSpaces(szDir);
SheRemoveQuotes(szDir);
//
// Test if the directory szDir is valid.
//
if (!ValidPathDrive(szDir) || !SetCurrentDirectory(szDir)) { if (MyMessageBox(hDlg, IDS_BADPATHTITLE, IDS_BADPATHMSG3, NULL, MB_OKCANCEL | MB_DEFBUTTON2 | MB_ICONEXCLAMATION) == IDCANCEL) goto ExitFalse; fOK = FALSE; } }
//
// Before searching for the executable, check the validity of the szPath
// drive if there's one specified.
//
if (!ValidPathDrive(szPath)) { if (MyMessageBox(hDlg, IDS_BADPATHTITLE, IDS_BADPATHMSG, szPath, MB_OKCANCEL | MB_DEFBUTTON2 | MB_ICONEXCLAMATION) == IDCANCEL) goto ExitFalse; fOK = FALSE; } else { err = (int)((DWORD_PTR)FindExecutable(szPath, szDir, szExePath)); }
/* Check if the file exists if there is no associated exe. */ if (fOK && !*szExePath) { if (err == SE_ERR_FNF) { /* File doesn't exist. */ if (MyMessageBox(hDlg, IDS_BADPATHTITLE, IDS_BADPATHMSG, szPath, MB_OKCANCEL | MB_DEFBUTTON2 | MB_ICONEXCLAMATION) == IDCANCEL) goto ExitFalse; } else { /* Association is bogus. */ if (MyMessageBox(hDlg, IDS_BADPATHTITLE, IDS_BADPATHMSG2, szPath, MB_OKCANCEL | MB_DEFBUTTON2 | MB_ICONEXCLAMATION) == IDCANCEL) goto ExitFalse; else dwRet = PATH_INVALID_OK; } }
/* Warn people against using removable or remote paths. */
/* HACK: Hard code UNC path format. Yuck. */ if (szPath[0] == TEXT('\\') && szPath[1] == TEXT('\\')) goto VPWarnNet;
if (szPath[1] != TEXT(':') ) { cDrive = (int)((DWORD_PTR)CharUpper((LPTSTR)szTemp[0])); cDrive = cDrive - (INT)TEXT('A'); bOriginalDirectory = TRUE; } else { cDrive = (int)((DWORD_PTR)CharUpper((LPTSTR)szPath[0])); cDrive = cDrive - (INT)TEXT('A'); bOriginalDirectory = FALSE; }
/* Change back to old directory. */ SetCurrentDirectory(szTemp); //OemToChar(szDir, szDir);
if (IsRemovableDrive(cDrive)) { if (MyMessageBox(hDlg, IDS_REMOVEPATHTITLE, IDS_PATHWARNING, NULL, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2) == IDNO) return(PATH_INVALID); else return(dwRet); }
if (IsRemoteDrive(cDrive) && !bOriginalDirectory) { VPWarnNet: if (MyMessageBox(hDlg, IDS_NETPATHTITLE, IDS_PATHWARNING, NULL, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2) == IDNO) return(PATH_INVALID); } return(dwRet);
ExitFalse: // Change back to old directory.
SetCurrentDirectory(szTemp); //OemToChar(szDir, szDir);
return(PATH_INVALID); }
/*--------------------------------------------------------------------------*/ /* */ /* BrowseOK() - */ /* */ /*--------------------------------------------------------------------------*/ BOOL NEAR PASCAL BrowseOK(HWND hWnd) { DWORD dwSave = dwContext; TCHAR szPathField[MAXITEMPATHLEN+1]; BOOL ret;
dwContext = IDH_ICONBROWSEDLG; GetDlgItemText(hWnd, IDD_NAME, szPathField, CharSizeOf(szPathField)); if (GetFileNameFromBrowse(hWnd, szPathField, sizeof(szPathField), NULL, IDS_CHNGICONPROGS, TEXT("ico"))) { //
// if filename or directory have spaces, put the path
// between quotes.
//
CheckEscapes(szPathField, MAXITEMPATHLEN+1); SetDlgItemText(hWnd, IDD_NAME, szPathField); /* Set default button to OK. */ PostMessage(hWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hWnd, IDOK), TRUE); ret = TRUE; } else ret = FALSE;
dwContext = dwSave; return ret; }
/*--------------------------------------------------------------------------*/ /* */ /* IconFileExists() - */ /* */ /* Checks if the file exists, if it doesn't it tries tagging on .exe and */ /* if that fails it reports an error. The given path is environment expanded. */ /* If it needs to put up an error box, it changes the cursor back. */ /* Path s assumed to be MAXITEMPATHLEN long. */ /* The main reason for moving this out of the DlgProc was because we're */ /* running out of stack space on the call to the comm dlg. */ /* */ /*--------------------------------------------------------------------------*/ BOOL NEAR PASCAL IconFileExists(HWND hWnd, HCURSOR hCur, LPTSTR szPath) { TCHAR szExtended[MAXITEMPATHLEN+1]; // Path with .exe if needed.
BOOL ret = TRUE; //OFSTRUCT of;
HCURSOR hCursor; DWORD dwResult ; TCHAR szPathFieldTemp[MAXITEMPATHLEN+1] ; LPTSTR FilePart ;
/* Check Files existance. */ DoEnvironmentSubst(szPath, MAXITEMPATHLEN+1); StripArgs(szPath); if (*szPath == TEXT('"')) { SheRemoveQuotes(szPath); } lstrcpy(szExtended, szPath);
// use SearchPath instead of MOpenFile(OF_EXIST) to see if a file exists
dwResult = SearchPath(NULL,szPath,NULL,MAXITEMPATHLEN+1, szPathFieldTemp,&FilePart) ;
if (dwResult == 0 && GetLastError() != 0x20) {
dwResult = SearchPath(NULL,szExtended,TEXT(".exe"),MAXITEMPATHLEN+1, szPathFieldTemp,&FilePart) ; if (dwResult == 0 && GetLastError() != 0x20) {
ShowCursor(FALSE); hCursor = SetCursor(hCur); /*
* File doesn't exist,tidier if we report the error with the * unextended path only. */ MyMessageBox(hWnd, IDS_NOICONSTITLE, IDS_BADPATHMSG, szPath, MB_OK | MB_ICONEXCLAMATION); ret = FALSE; ShowCursor(TRUE); SetCursor(hCursor); } else { lstrcpy(szPath, FilePart); } } return ret; }
/*--------------------------------------------------------------------------*/ /* */ /* IconDlgProc() - */ /* */ /*--------------------------------------------------------------------------*/
/* NOTE: Returns Icon's path in 'szIconPath' and number in 'iDlgIconId'.
* * INPUT: * 'szIconPath' has the default icon's path. * 'iDlgIconId' is set to the default icon's id. * * 'szMessage' is used as a temporary variable. * 'szPathField' is used as a temporary variable. * * OUTPUT: * 'szIconPath' contains the icon's path. * 'iDlgIconId' contains the icon's resource id. * 'iDlgIconIndex' contains the icon's index. */
INT_PTR APIENTRY IconDlgProc( HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { int i; int iIconSelected = 0; static HANDLE hIconList = NULL; static LPMYICONINFO lpIconList; static INT cIcons;
switch (uiMsg) { case WM_INITDIALOG: { RECT rc; int cy; TCHAR szExpanded[MAXITEMPATHLEN+1];
/*
* All this first pass stuff is so that the first time something * bogus happens (file not found, no icons) we give the user * a list of icons from progman. */ fFirstPass = TRUE;
SetDlgItemText(hwnd, IDD_NAME, (LPTSTR)szIconPath); SendDlgItemMessage(hwnd, IDD_NAME, EM_LIMITTEXT, MAXITEMPATHLEN, 0L);
SendDlgItemMessage(hwnd,IDD_ICON,LB_SETCOLUMNWIDTH, GetSystemMetrics(SM_CXICON) + 12,0L);
wParam = (WPARAM)GetDlgItem(hwnd,IDD_ICON);
/* compute the height of the listbox based on icon dimensions
*/ GetClientRect((HWND) wParam,&rc); cy = GetSystemMetrics(SM_CYICON) + GetSystemMetrics(SM_CYHSCROLL) + GetSystemMetrics(SM_CYBORDER) + 4;
SetWindowPos((HWND)wParam, NULL, 0, 0, rc.right, cy, SWP_NOMOVE | SWP_NOZORDER); cy = rc.bottom - cy;
GetWindowRect(hwnd,&rc); rc.bottom -= rc.top; rc.right -= rc.left;
/* FE FONTS are taller than US Font */ if ( GetSystemMetrics( SM_DBCSENABLED ) ) rc.bottom = rc.bottom - cy;
SetWindowPos(hwnd,NULL,0,0,rc.right,rc.bottom,SWP_NOMOVE);
wParam = (WPARAM)iDlgIconId;
PutIconsInList: if (!GetDlgItemText(hwnd, IDD_NAME, (LPTSTR)szPathField, CharSizeOf(szPathField))) { szPathField[0] = TEXT('\0'); }
wParam = (WPARAM)SetCursor(LoadCursor(NULL, IDC_WAIT)); ShowCursor(TRUE); SendDlgItemMessage(hwnd, IDD_ICON, LB_RESETCONTENT, 0, 0L);
lstrcpy(szExpanded, szPathField); if (!IconFileExists(hwnd, (HCURSOR)wParam, szExpanded)) { if (fFirstPass) { /* Icon File doesn't exist, use progman. */ fFirstPass = FALSE; // Only do this bit once.
GetModuleFileName(hAppInstance, (LPTSTR)szPathField, CharSizeOf(szPathField)); SetDlgItemText(hwnd, IDD_NAME, (LPTSTR)szPathField); lstrcpy(szExpanded, szPathField); } else { ShowCursor(FALSE); SetCursor((HCURSOR)wParam); break; } }
if (hIconList) { FreeIconList(hIconList, -1); hIconList = NULL; } cIcons = (INT)((DWORD_PTR)ExtractIcon(hAppInstance, szExpanded, (UINT)-1));
if (!cIcons) { if (fFirstPass) { TCHAR szFilename[MAXITEMPATHLEN+1];
fFirstPass = FALSE; // Only do this bit once.
ShowCursor(FALSE); SetCursor((HCURSOR)wParam); MyMessageBox(hwnd, IDS_NOICONSTITLE, IDS_NOICONSMSG1, NULL, MB_OK | MB_ICONEXCLAMATION); /*
* No icons here - change the path do somewhere where we * know there are icons. * Get the path to progman. */ GetModuleFileName(hAppInstance, (LPTSTR)szPathField, CharSizeOf(szPathField)); GetFilenameFromPath((LPTSTR)szPathField, szFilename); SetDlgItemText(hwnd, IDD_NAME, szFilename); goto PutIconsInList; }
ShowCursor(FALSE); SetCursor((HCURSOR) wParam); MyMessageBox(hwnd, IDS_NOICONSTITLE, IDS_NOICONSMSG, NULL, MB_OK | MB_ICONEXCLAMATION); break; }
SendDlgItemMessage(hwnd,IDD_ICON,WM_SETREDRAW,FALSE,0L);
// Get shell.dll to return a list of icons.
if (hIconList = InternalExtractIconList(hAppInstance, szExpanded, &cIcons)) { if (lpIconList = (LPMYICONINFO)GlobalLock(hIconList)) { for (i = 0; i < cIcons; i++) { if (!(lpIconList+i)->hIcon) { cIcons = i; break; } SendDlgItemMessage(hwnd,IDD_ICON,LB_ADDSTRING,0, (LPARAM)((lpIconList+i)->hIcon)); if ((lpIconList+i)->iIconId == iDlgIconId) iIconSelected = i; } GlobalUnlock(hIconList); } else { cIcons = 0; } } else { cIcons = 0; }
if (SendDlgItemMessage(hwnd,IDD_ICON,LB_SETCURSEL,(WPARAM)iIconSelected,0L) == LB_ERR) { // select the first.
SendDlgItemMessage(hwnd,IDD_ICON,LB_SETCURSEL,0,0L); }
SendDlgItemMessage(hwnd,IDD_ICON,WM_SETREDRAW,TRUE,0L); InvalidateRect(GetDlgItem(hwnd,IDD_ICON),NULL,TRUE);
ShowCursor(FALSE); SetCursor((HCURSOR)wParam); break; }
case WM_DRAWITEM: #define lpdi ((DRAWITEMSTRUCT FAR *)lParam)
if ((HANDLE)lpdi->itemData == (HANDLE)NULL) break; InflateRect(&lpdi->rcItem,-4,0);
if (lpdi->itemState & ODS_SELECTED) SetBkColor(lpdi->hDC,GetSysColor(COLOR_HIGHLIGHT)); else SetBkColor(lpdi->hDC,GetSysColor(COLOR_WINDOW));
/* repaint the selection state
*/ ExtTextOut(lpdi->hDC,0,0,ETO_OPAQUE,&lpdi->rcItem,NULL,0,NULL);
/* draw the icon
*/ DrawIcon(lpdi->hDC, lpdi->rcItem.left+2, lpdi->rcItem.top+2, (HICON) lpdi->itemData);
/* if it has the focus, draw the focus
*/ #ifdef NOTINUSER
if (lpdi->itemState & ODS_FOCUS) DrawFocusRect(lpdi->hDC,&lpdi->rcItem); #endif
#undef lpdi
break;
case WM_MEASUREITEM: #define lpmi ((MEASUREITEMSTRUCT FAR *)lParam)
lpmi->itemWidth = (WORD)(GetSystemMetrics(SM_CXICON) + 12); lpmi->itemHeight = (WORD)(GetSystemMetrics(SM_CYICON) + 4);
#undef lpmi
break;
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)){ case IDD_HELP: goto DoHelp;
case IDD_BROWSE: if (BrowseOK(hwnd)) goto PutIconsInList; else break;
case IDD_NAME: if (!GetDlgItemText(hwnd, IDD_NAME, (LPTSTR)szMessage, MAXITEMPATHLEN+1)) { szMessage[0] = TEXT('\0'); }
/* Did any thing change since we hit 'Next' last? */ if (lstrcmpi(szMessage, szPathField)) { SendDlgItemMessage(hwnd,IDD_ICON,LB_SETCURSEL,(WPARAM)-1,0L); } break;
case IDD_ICON: GetDlgItemText(hwnd, IDD_NAME, (LPTSTR)szMessage, MAXITEMPATHLEN+1);
/* Did any thing change since we hit 'Next' last? */ if (lstrcmpi(szMessage, szPathField)) { lstrcpy(szPathField, szMessage); wParam = MAKELONG(0, HIWORD(wParam)); goto PutIconsInList; }
if (GET_WM_COMMAND_CMD(wParam, lParam) != LBN_DBLCLK) break; /*** FALL THRU on double click ***/
case IDOK: if(!GetDlgItemText(hwnd, IDD_NAME, szMessage, MAXITEMPATHLEN+1)) goto PutIconsInList;
//#ifdef JAPAN
// if (CheckPortName(hwnd,szMessage))
// break;
//#endif
/* Did any thing change since we hit 'Next' last? */ if (lstrcmpi(szMessage, szPathField)) { lstrcpy(szPathField, szMessage); wParam = MAKELONG(0, HIWORD(wParam)); goto PutIconsInList; } else { iIconSelected = (int)SendDlgItemMessage(hwnd,IDD_ICON, LB_GETCURSEL,0,0L); if (iIconSelected < 0) iIconSelected = 0; }
if (hDlgIcon) hIconGlobal = hDlgIcon; if (cIcons > 0) { /* if there is at least one icon */ hDlgIcon = (lpIconList+iIconSelected)->hIcon; iDlgIconId = (lpIconList+iIconSelected)->iIconId; iDlgIconIndex = iIconSelected; GlobalUnlock(hIconList); FreeIconList(hIconList,iIconSelected); hIconList = NULL; } else { hDlgIcon = NULL; iDlgIconId = 0; iDlgIconIndex = 0; } lstrcpy(szIconPath, szPathField);
EndDialog(hwnd, TRUE); break;
case IDCANCEL: if (hIconList) { FreeIconList(hIconList , -1); hIconList = NULL; } EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage || uiMsg == uiBrowseMessage) { DoHelp: PMHelp(hwnd);
return TRUE; } else return FALSE; } return(TRUE); }
/*** GetRidOfIcon --
* * * * VOID APIENTRY GetRidOfIcon(VOID) * * ENTRY - VOID * * EXIT - VOID * * SYNOPSIS - * * WARNINGS - * EFFECTS - * */
VOID APIENTRY GetRidOfIcon(VOID) {
if (hDlgIcon && (hDlgIcon != hItemIcon) && (hDlgIcon != hProgmanIcon) && (hDlgIcon != hGroupIcon)) DestroyIcon(hDlgIcon); hDlgIcon = NULL; }
/*** GetCurrentIcon --
* * * * HICON APIENTRY GetCurrentIcon(VOID) * * ENTRY - VOID * * EXIT - HICON * * SYNOPSIS - * * WARNINGS - * EFFECTS - * */
HICON APIENTRY GetCurrentIcon(VOID) { TCHAR szExpanded[MAXITEMPATHLEN+1]; HANDLE hModule; HANDLE h; PBYTE p; int cb;
// BUG BUG this was just added and I don't know if it's OK
if (hDlgIcon) { DestroyIcon(hDlgIcon); hDlgIcon = NULL; } lstrcpy(szExpanded, szIconPath); DoEnvironmentSubst(szExpanded, CharSizeOf(szExpanded)); StripArgs(szExpanded); TagExtension(szExpanded, sizeof(szExpanded)); SheRemoveQuotes(szExpanded);
if (hModule = LoadLibrary(szExpanded)) { h = FindResource(hModule, (LPTSTR) MAKEINTRESOURCE(iDlgIconId), (LPTSTR) MAKEINTRESOURCE(RT_ICON)); if (h) { cb = SizeofResource(hModule, h); h = LoadResource(hModule, h); p = LockResource(h); hDlgIcon = CreateIconFromResource(p, cb, TRUE, 0x00030000); UnlockResource(h); FreeResource(h); } FreeLibrary(hModule); if (hDlgIcon) { return(hDlgIcon); } } else { hDlgIcon = ExtractIcon(hAppInstance, szExpanded, (UINT)iDlgIconId); if (hDlgIcon && hDlgIcon != (HANDLE)1) { return(hDlgIcon); } }
iDlgIconId = 0; if (hDlgIcon == NULL) { if (h = FindResource(hAppInstance, (LPTSTR) MAKEINTRESOURCE(ITEMICON), RT_GROUP_ICON)) { h = LoadResource(hAppInstance, h); p = LockResource(h); iDlgIconId = (WORD)LookupIconIdFromDirectory(p, TRUE); iDlgIconIndex = ITEMICONINDEX; UnlockResource(h); FreeResource(h); } } if (hDlgIcon == (HANDLE)1) { if (h = FindResource(hAppInstance, (LPTSTR) MAKEINTRESOURCE(DOSAPPICON), RT_GROUP_ICON)) { h = LoadResource(hAppInstance, h); p = LockResource(h); iDlgIconId = (WORD)LookupIconIdFromDirectory(p, TRUE); iDlgIconIndex = DOSAPPICONINDEX; UnlockResource(h); FreeResource(h); } }
h = FindResource(hAppInstance, (LPTSTR) MAKEINTRESOURCE(iDlgIconId), (LPTSTR) MAKEINTRESOURCE(RT_ICON)); if (h) { cb = (WORD)SizeofResource(hAppInstance, h); h = LoadResource(hAppInstance, h); p = LockResource(h); hDlgIcon = CreateIconFromResource(p, cb, TRUE, 0x00030000); UnlockResource(h); FreeResource(h); }
if (hModule) FreeLibrary(hModule);
return(hDlgIcon); }
/*--------------------------------------------------------------------------*/ /* */ /* CheckHotKeyInUse() - Return of TRUE means no-dup or user says OK anyway.*/ /* fNewItem is TRUE if your about to create a new item, FALSE if your */ /* just editing an old one. */ /* */ /*--------------------------------------------------------------------------*/
BOOL NEAR PASCAL CheckHotKeyInUse(WORD wHotKey, BOOL fNewItem) { PGROUP pGroup; PITEM pItem; LPGROUPDEF lpgd; LPITEMDEF lpid; TCHAR szTemp1[64]; TCHAR szTemp2[MAXMESSAGELEN+1]; int ret;
for (pGroup = pFirstGroup; pGroup; pGroup = pGroup->pNext) { for (pItem = pGroup->pItems; pItem; pItem = pItem->pNext) { /*
* If we're editing an existing item in then ignore the one * we're editing (the first item in the current group). */ if (!fNewItem && pGroup == pCurrentGroup && pItem == pCurrentGroup->pItems) continue;
if (wHotKey && (wHotKey == GroupFlag(pGroup,pItem,(WORD)ID_HOTKEY))) goto Duplicate; } }
return TRUE;
Duplicate: if (!(lpgd = LockGroup(pGroup->hwnd))) return TRUE; // Crash out without error.
lpid = ITEM(lpgd, pItem->iItem);
if (!LoadString(hAppInstance, IDS_ITEMINGROUP, szTemp1, CharSizeOf(szTemp1))) return TRUE;
wsprintf(szTemp2, szTemp1, (LPTSTR) PTR(lpgd, lpid->pName), (LPTSTR) PTR(lpgd, lpgd->pName));
ret = MyMessageBox(hwndProgman, IDS_DUPHOTKEYTTL, IDS_DUPHOTKEYMSG, szTemp2, MB_OKCANCEL|MB_DEFBUTTON2|MB_ICONEXCLAMATION); UnlockGroup(pGroup->hwnd); if (ret == IDOK) return TRUE; else return FALSE; }
/* NOTE:
* 'szIconPath' has the icon's path. * 'iDlgIconId' is set to the icon's id. * 'iDlgIconIndex' is set to the icon's index. * * 'szNameField' is used as a temporary variable. * 'szPathField' is used as a temporary variable. */
/*** NewItemDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY NewItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */ INT_PTR APIENTRY NewItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { static BOOL bIsWOWApp = FALSE; DWORD dwThreadID; HANDLE hThread; HWND hIcon; DWORD dwBinaryInfo, cbData, dwDataType; BOOL bDoit;
switch (uiMsg) { case WM_INITDIALOG: if (GroupFull(pCurrentGroup)) { EndDialog(hwnd, FALSE); break; }
SendDlgItemMessage(hwnd, IDD_NAME, EM_LIMITTEXT, MAXITEMNAMELEN, 0L); SendDlgItemMessage(hwnd, IDD_COMMAND, EM_LIMITTEXT, MAXITEMPATHLEN, 0L); SendDlgItemMessage(hwnd, IDD_DIR, EM_LIMITTEXT, MAXITEMPATHLEN, 0L); szNameField[0] = TEXT('\0'); szPathField[0] = TEXT('\0'); szDirField[0] = TEXT('\0'); szIconPath[0] = TEXT('\0'); iDlgIconId = 0; iDlgIconIndex = 0; if (hDlgIcon) DestroyIcon(hDlgIcon); hDlgIcon = NULL; EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); EnableWindow(GetDlgItem(hwnd, IDD_ICON), FALSE); CheckDlgButton(hwnd, IDD_NEWVDM, 1); EnableWindow(GetDlgItem(hwnd, IDD_NEWVDM), FALSE); fNewIcon = FALSE;
//
// Set the inital state for the thread which checks the binary
// type.
//
//
// Query if the binary type checking is enabled.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryType, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { bCheckBinaryType = (BOOL) dwBinaryInfo; } else { bCheckBinaryType = BINARY_TYPE_DEFAULT; }
//
// Query the binary type checking timeout value.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryTimeout, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { uiCheckBinaryTimeout = (UINT) dwBinaryInfo; } else { uiCheckBinaryTimeout = BINARY_TIMEOUT_DEFAULT; }
//
// Create the worker thread, and the signal event. If appropriate.
//
if (bCheckBinaryType) { hCheckBinaryEvent = CreateEvent (NULL, FALSE, FALSE, CHECK_BINARY_EVENT_NAME);
hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) CheckBinaryThread, (LPVOID) hwnd, 0, &dwThreadID);
bCheckBinaryDirtyFlag = FALSE; }
if (!bCheckBinaryType || !hThread || !hCheckBinaryEvent) { //
// If this statement is true, either binary type checking
// is disabled or we failed to create the event or the thread.
// In this case, enable the separate memory checkbox, and let
// the user decide on his own.
//
CheckDlgButton(hwnd, IDD_NEWVDM, 0); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), TRUE);
//
// Clean up either item that succeeded
//
if (hCheckBinaryEvent) { CloseHandle (hCheckBinaryEvent); }
if (hThread) { TerminateThread (hThread, 0); }
//
// Setting this variable to NULL will prevent the second
// thread from trying to check the binary type.
//
hCheckBinaryEvent = NULL; }
break;
case WM_TIMER: if (hCheckBinaryEvent && bCheckBinaryDirtyFlag) { bCheckBinaryDirtyFlag = FALSE; SetEvent (hCheckBinaryEvent); } break;
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDD_COMMAND: { if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_UPDATE) break;
if (bCheckBinaryType) { bCheckBinaryDirtyFlag = TRUE; SetTimer (hwnd, CHECK_BINARY_ID, uiCheckBinaryTimeout, NULL); } bDoit = (GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1) > 0); EnableWindow(GetDlgItem(hwnd, IDOK), bDoit); if ( (hIcon = GetDlgItem(hwnd, IDD_ICON)) ) { EnableWindow(hIcon, bDoit); }
break; }
case IDD_BROWSE: { DWORD dwSave = dwContext; TCHAR szPathField[MAXITEMPATHLEN+1];
dwContext = IDH_PROPBROWSEDLG; GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1); GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1); /* Get PathField using browser dlg. */ if (GetFileNameFromBrowse(hwnd, szPathField, sizeof(szPathField), szDirField, IDS_PROPERTIESPROGS, TEXT("exe"))) { // OK.
//
// if filename or directory have spaces, put the path
// between quotes.
//
CheckEscapes(szPathField, MAXITEMPATHLEN+1);
SetDlgItemText(hwnd, IDD_COMMAND, szPathField); EnableWindow(GetDlgItem(hwnd, IDOK), TRUE); EnableWindow(GetDlgItem(hwnd, IDD_ICON), TRUE); /* Set default button to OK. */ PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDOK), TRUE); } dwContext = dwSave; break; }
case IDD_ICON: { TCHAR szTempField[MAXITEMPATHLEN+1];
GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1);
//#ifdef JAPAN
// if (CheckPortName(hwnd,szPathField))
// break;
//#endif
GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1);
// Expand env variables.
DoEnvironmentSubst(szPathField, MAXITEMPATHLEN+1) && DoEnvironmentSubst(szDirField, MAXITEMPATHLEN+1);
// Get a full path to the icon.
StripArgs(szPathField); //
// Change to original directory in case the use entered a
// relative path.
//
SetCurrentDirectory(szOriginalDirectory); FindExecutable(szPathField, szDirField, szTempField); SetCurrentDirectory(szWindowsDirectory);
/* Discard the old Icon Path. */ lstrcpy(szIconPath, szTempField); iDlgIconId = 0; iDlgIconIndex = 0;
if (fNewIcon = MyDialogBox(ICONDLG, hwnd, IconDlgProc)) { SendDlgItemMessage(hwnd, IDD_CURICON, STM_SETICON, (WPARAM)hDlgIcon, 0L); if (hIconGlobal) { DestroyIcon(hIconGlobal); hIconGlobal = NULL; } } else { /* Cancel/ESC was selected, reset Icon Path to NULL. */ *szIconPath = TEXT('\0'); iDlgIconId = 0; iDlgIconIndex = 0; }
break; }
case IDOK: { WORD hk; TCHAR szHackField[MAXITEMPATHLEN + 1]; DWORD dwRet; DWORD dwFlags = CI_ACTIVATE | CI_SET_DOS_FULLSCRN;
if(!GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN + 1)) { szPathField[0] = TEXT('\0'); break; }
//RemoveLeadingSpaces(szPathField);
hk = (WORD) SendDlgItemMessage(hwnd,IDD_HOTKEY, WM_GETHOTKEY,0,0L); if (!CheckHotKeyInUse(hk, TRUE)) break;
GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1);
//RemoveLeadingSpaces(szDirField)
/* Expand env variables. */ DoEnvironmentSubst(szPathField, MAXITEMPATHLEN+1); DoEnvironmentSubst(szDirField, MAXITEMPATHLEN+1);
/* Now remove the arguments from the command line. */ StripArgs(szPathField);
dwRet = ValidatePath(hwnd, szPathField, szDirField, szHackField); if (dwRet == PATH_INVALID) { break; } else if (dwRet == PATH_INVALID_OK) { dwFlags |= CI_NO_ASSOCIATION; }
/* Special case DOS apps. */ HandleDosApps(szHackField);
/* If the user hasn't supplied a description then build one. */ if (!GetDlgItemText(hwnd, IDD_NAME, szNameField, MAXITEMNAMELEN+1)) { szNameField[0] = TEXT('\0'); }
/* Get the original command line with arguments. */ GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1);
//#ifdef JAPAN
// if (CheckPortName(hwnd,szPathField))
// break;
//#endif
/* Get original (unexpanded) directory. */ if (!GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1)) { szDirField[0] = TEXT('\0'); } else { LPTSTR lpEnd; TCHAR chT;
// Remove trailing spaces (inside of quote if applicable)
lpEnd = szDirField + lstrlen (szDirField) - 1; chT = *lpEnd;
if ( (chT == TEXT('\"')) || (chT == TEXT(' ')) ) { // MarkTa fix for spaces at the end of a filename
// Remove the spaces by moving the last character forward.
while (*(lpEnd-1) == TEXT(' ')) lpEnd--;
*lpEnd = chT; *(lpEnd+1) = TEXT ('\0');
// In case the character we saved was a space, we can
// NULL terminate it because now we know the next character
// to the left is valid, and the character to the right is
// already NULL.
if (*lpEnd == TEXT(' ')) *lpEnd = TEXT('\0'); } }
GetStuffFromPIF(szPathField, szNameField, szDirField);
if (!*szNameField) { BuildDescription(szNameField, szPathField); }
/* If there's no default directory then add one. */ if (!*szDirField) { GetDirectoryFromPath(szPathField, szDirField); }
if (!InQuotes(szDirField)) {
//
// if szDirField needs quotes and the work dir is too
// long than we need to truncate it.
//
if (lstrlen(szDirField) >= MAXITEMPATHLEN-2) { TCHAR chT;
chT = szDirField[MAXITEMPATHLEN-2]; szDirField[MAXITEMPATHLEN-2] = 0; CheckEscapes(szDirField, MAXITEMPATHLEN+1); if (*szDirField != TEXT('"')) { szDirField[MAXITEMPATHLEN-2] = chT; } } else { CheckEscapes(szDirField, MAXITEMPATHLEN+1); } }
if (IsWindowEnabled(GetDlgItem(hwnd, IDD_NEWVDM)) && IsDlgButtonChecked(hwnd, IDD_NEWVDM)) { dwFlags |= CI_SEPARATE_VDM; }
/* Create new item using UNICODE strings. */ CreateNewItem(pCurrentGroup->hwnd, szNameField, szPathField, szIconPath, szDirField, hk, (BOOL)IsDlgButtonChecked(hwnd, IDD_LOAD), (WORD)iDlgIconId, (WORD)iDlgIconIndex, hDlgIcon, NULL, dwFlags);
}
// Update scroll bars for new item
if ((bAutoArrange) && (!bAutoArranging)) ArrangeItems(pCurrentGroup->hwnd); else if (!bAutoArranging) CalcGroupScrolls(pCurrentGroup->hwnd);
// fall through...
case IDCANCEL:
if (bCheckBinaryType) { //
// Setting this variable to false, and signaling the event
// will cause the binary checking thread to terminate.
//
bCheckBinaryType = FALSE; SetEvent (hCheckBinaryEvent); KillTimer (hwnd, CHECK_BINARY_ID); }
EndDialog(hwnd, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); GetRidOfIcon(); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage || uiMsg == uiBrowseMessage) { DoHelp: PMHelp(hwnd);
return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** NewGroupDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY NewGroupDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * DWORD wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */
INT_PTR APIENTRY NewGroupDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { BOOL bDoit; HWND hwndGroup;
switch (uiMsg) {
case WM_INITDIALOG: if (wNewSelection == TYPE_COMMONGROUP) { TCHAR szCommonGroupTitle[64];
if (LoadString(hAppInstance, IDS_COMMONGROUPPROP, szCommonGroupTitle, CharSizeOf(szCommonGroupTitle))) { SetWindowText(hwnd, szCommonGroupTitle); } } SendDlgItemMessage(hwnd, IDD_NAME, EM_LIMITTEXT, MAXGROUPNAMELEN, 0L); break;
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { HCURSOR hCursor;
case IDD_NAME: case IDD_PATH: /* Allow OK if either of the two fields have anything in them. */ bDoit = (GetDlgItemText(hwnd, IDD_NAME, szPathField, CharSizeOf(szPathField)) > 0); EnableWindow(GetDlgItem(hwnd, IDOK), bDoit); break;
case IDD_HELP: goto DoHelp;
case IDOK: if(!GetDlgItemText(hwnd, IDD_NAME, szNameField, MAXITEMNAMELEN + 1)) { szNameField[0] = TEXT('\0'); break; }
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); ShowCursor(TRUE);
hwndGroup = CreateNewGroup(szNameField, (wNewSelection == TYPE_COMMONGROUP));
ShowCursor(FALSE); SetCursor(hCursor); if (hwndGroup) { EndDialog(hwnd, TRUE); } break;
case IDCANCEL: EndDialog(hwnd, FALSE); break;
default: return FALSE; } break;
default: if (uiMsg == uiHelpMessage) { DoHelp: PMHelp(hwnd);
return TRUE; } else { return FALSE; } }
return TRUE; }
/*--------------------------------------------------------------------------*/ /* */ /* EditBrowseOK() - */ /* */ /*--------------------------------------------------------------------------*/ BOOL NEAR PASCAL EditBrowseOK(HWND hDlg) { DWORD dwSave = dwContext; TCHAR szPathField[MAXITEMPATHLEN+1]; BOOL ret;
dwContext = IDH_PROPBROWSEDLG; GetDlgItemText(hDlg, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1); GetDlgItemText(hDlg, IDD_DIR, szDirField, MAXITEMPATHLEN+1); /* Get PathField using browser dlg. */ if (GetFileNameFromBrowse(hDlg, szPathField,sizeof(szPathField) , szDirField, IDS_PROPERTIESPROGS, TEXT("exe"))) { /* OK. */ //
// if filename or directory have spaces, put the path
// between quotes.
//
CheckEscapes(szPathField, MAXITEMPATHLEN+1);
SetDlgItemText(hDlg, IDD_COMMAND, szPathField); EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); EnableWindow(GetDlgItem(hDlg, IDD_ICON), TRUE); /* Set default button to OK. */ PostMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDOK), TRUE); ret = TRUE; } else ret = FALSE; dwContext = dwSave; return ret; }
/*** EditItemDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY EditItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hhwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */
/* NOTE:
* 'szIconPath' has the icon's path. * 'iDlgIconId' is set to the icon's id. * 'iDlgIconIndex' is set to the icon's index. * * 'szNameField' is used as a temporary variable. * 'szPathField' is used as a temporary variable. */ INT_PTR APIENTRY EditItemDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { LPITEMDEF lpid; LPGROUPDEF lpgd; TCHAR szTempField[MAXITEMPATHLEN + 1]; DWORD dwFlags = CI_ACTIVATE; DWORD dwBinaryType; TCHAR szFullPath[MAXITEMPATHLEN+1] ; LPTSTR FilePart ; static BOOL bIsWOWApp = FALSE; static WORD wHotKey; static TCHAR szDescription[MAXITEMNAMELEN + 1]; DWORD dwThreadID; HANDLE hThread; HWND hIcon; DWORD dwBinaryInfo, cbData, dwDataType; BOOL bDoit;
switch (uiMsg) {
case WM_INITDIALOG: /*
* Get current item information. */ pActiveGroup = pCurrentGroup; lpgd = (LPGROUPDEF)GlobalLock(pActiveGroup->hGroup); lpid = LockItem(pActiveGroup,pActiveGroup->pItems); if (lpid == 0L) goto EditDlgExit; fNewIcon = FALSE;
SendDlgItemMessage(hwnd, IDD_NAME, EM_LIMITTEXT, MAXITEMNAMELEN, 0L); SetDlgItemText(hwnd, IDD_NAME, (LPTSTR) PTR(lpgd, lpid->pName)); lstrcpy(szDescription, (LPTSTR) PTR(lpgd, lpid->pName));
GetItemCommand(pActiveGroup, pActiveGroup->pItems, szPathField, szDirField);
/* Keep a copy of what the old item was refering to.
* A full expanded OEM path to the executable */ DoEnvironmentSubst(szPathField, MAXITEMPATHLEN+1); DoEnvironmentSubst(szDirField, MAXITEMPATHLEN+1); StripArgs(szPathField); // Find exe will toast on ansi strings.
//
// Change to original Directory in case the user entered a relative path
//
//
SetCurrentDirectory(szOriginalDirectory); FindExecutable(szPathField, szDirField, szNameField); SetCurrentDirectory(szWindowsDirectory);
lstrcpy(szIconPath, (LPTSTR) PTR(lpgd, lpid->pIconPath)); if (!*szIconPath) { /* use default icon path */ lstrcpy(szIconPath, szNameField); } iDlgIconId = lpid->iIcon; iDlgIconIndex = lpid->wIconIndex;
TagExtension(szPathField, sizeof(szPathField)); SheRemoveQuotes (szPathField); if (SearchPath(NULL, szPathField, NULL, MAXITEMPATHLEN+1, szFullPath, &FilePart) && GetBinaryType(szFullPath, &dwBinaryType) && dwBinaryType == SCS_WOW_BINARY) { bIsWOWApp = TRUE; if (GroupFlag(pActiveGroup,pActiveGroup->pItems,(WORD)ID_NEWVDM)) { CheckDlgButton(hwnd, IDD_NEWVDM, 1); } } else { CheckDlgButton(hwnd, IDD_NEWVDM, 1); EnableWindow(GetDlgItem(hwnd, IDD_NEWVDM), FALSE); }
/* Re-get the fields so that the dlg is initialized with
* the environment variables intact. */ GetItemCommand(pActiveGroup,pActiveGroup->pItems,szPathField,szDirField);
SendDlgItemMessage(hwnd, IDD_COMMAND, EM_LIMITTEXT, MAXITEMPATHLEN, 0L); SetDlgItemText(hwnd, IDD_COMMAND, szPathField);
SendDlgItemMessage(hwnd, IDD_DIR, EM_LIMITTEXT, MAXITEMPATHLEN, 0L); SetDlgItemText(hwnd, IDD_DIR, szDirField);
if (GroupFlag(pActiveGroup,pActiveGroup->pItems,(WORD)ID_MINIMIZE)) CheckDlgButton(hwnd, IDD_LOAD, TRUE);
SendDlgItemMessage(hwnd,IDD_HOTKEY,WM_SETHOTKEY, (WPARAM)GroupFlag(pActiveGroup,pActiveGroup->pItems,(WORD)ID_HOTKEY), 0L);
GetCurrentIcon(); // use szIconPath from above
GlobalUnlock(pActiveGroup->hGroup);
UnlockGroup(pActiveGroup->hwnd); SendDlgItemMessage(hwnd, IDD_CURICON, STM_SETICON, (WPARAM)hDlgIcon, 0L);
if (pActiveGroup->fRO || dwEditLevel >= 4) { /* if readonly, we can only view... */ EnableWindow(GetDlgItem(hwnd,IDOK), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_ICON), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_HOTKEY), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_NAME), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_DIR), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_LOAD), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_COMMAND), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_BROWSE), FALSE); } else if (dwEditLevel == 3) { EnableWindow(GetDlgItem(hwnd,IDD_COMMAND), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_BROWSE), FALSE); } //
// Set the inital state for the thread which checks the binary
// type.
//
//
// Query if the binary type checking is enabled.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryType, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { bCheckBinaryType = (BOOL) dwBinaryInfo; } else { bCheckBinaryType = BINARY_TYPE_DEFAULT; }
//
// Query the binary type checking timeout value.
//
cbData = sizeof(dwBinaryInfo); if (RegQueryValueEx(hkeyPMSettings, szCheckBinaryTimeout, 0, &dwDataType, (LPBYTE)&dwBinaryInfo, &cbData) == ERROR_SUCCESS) { uiCheckBinaryTimeout = (UINT) dwBinaryInfo; } else { uiCheckBinaryTimeout = BINARY_TIMEOUT_DEFAULT; }
//
// Create the worker thread, and the signal event. If appropriate.
//
if (bCheckBinaryType) { hCheckBinaryEvent = CreateEvent (NULL, FALSE, FALSE, CHECK_BINARY_EVENT_NAME);
hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) CheckBinaryThread, (LPVOID) hwnd, 0, &dwThreadID);
bCheckBinaryDirtyFlag = FALSE; }
if (!hCheckBinaryEvent || !hThread || !bCheckBinaryType) { //
// If this statement is true, either we failed to create
// the event, the thread, or binary type checking is disabled.
// In this case, enable the separate memory checkbox, and let
// the user decide on his own.
//
CheckDlgButton(hwnd, IDD_NEWVDM, 0); EnableWindow(GetDlgItem(hwnd,IDD_NEWVDM), TRUE);
//
// Clean up either item that succeeded
//
if (hCheckBinaryEvent) { CloseHandle (hCheckBinaryEvent); }
if (hThread) { TerminateThread (hThread, 0); }
//
// Setting this variable to NULL will prevent the second
// thread from trying to check the binary type.
//
hCheckBinaryEvent = NULL; }
break;
case WM_TIMER: if (hCheckBinaryEvent && bCheckBinaryDirtyFlag) { bCheckBinaryDirtyFlag = FALSE; SetEvent (hCheckBinaryEvent); } break;
case WM_COMMAND: { switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDD_HELP: goto DoHelp;
case IDD_COMMAND: { if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_UPDATE) break;
if (bCheckBinaryType) { bCheckBinaryDirtyFlag = TRUE; SetTimer (hwnd, CHECK_BINARY_ID, uiCheckBinaryTimeout, NULL); } bDoit = (GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1) > 0); EnableWindow(GetDlgItem(hwnd, IDOK), bDoit); if ( (hIcon = GetDlgItem(hwnd, IDD_ICON)) ) { EnableWindow(hIcon, bDoit); }
break; }
case IDD_BROWSE: EditBrowseOK(hwnd); break;
case IDD_ICON: { LPITEMDEF lpid;
if (!GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1)) break;
//#ifdef JAPAN
// if (CheckPortName(hwnd,szPathField))
// break;
//#endif
GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1);
/* Expand env variables. */ DoEnvironmentSubst(szPathField, MAXITEMPATHLEN+1) && DoEnvironmentSubst(szDirField, MAXITEMPATHLEN+1);
/* Get a full path to the icon. */ StripArgs(szPathField); SetCurrentDirectory(szOriginalDirectory); FindExecutable(szPathField, szDirField, szTempField); SetCurrentDirectory(szWindowsDirectory);
/*
* If the icon path hasn't been explicitly set then * use a default one. */ if (!fNewIcon) { /* Has the items path been changed? */ if (lstrcmpi(szNameField, szTempField)) { /* Yup, it's changed, discard the old Icon Path. */ lstrcpy(szIconPath, szTempField); iDlgIconId = 0; iDlgIconIndex = 0; } else { /* The path hasn't changed so use the old icon path. */ lpid = LockItem(pActiveGroup,pActiveGroup->pItems); // BUG BUG! should have LockItem unlock the group
// before returning. JohanneC 7/5/91
UnlockGroup(pActiveGroup->hwnd); if (lpid == 0L) goto EditDlgExit; lpgd = LockGroup(pActiveGroup->hwnd); lstrcpy(szIconPath, (LPTSTR) PTR(lpgd, lpid->pIconPath)); UnlockGroup(pActiveGroup->hwnd); } }
/* Check if we have a default icon. */ if (!*szIconPath) { /* Invalid path, use the executable's path. */ lstrcpy(szIconPath, szTempField); }
if (fNewIcon = MyDialogBox(ICONDLG, hwnd, IconDlgProc)) { // Set default button to OK.
PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDOK), TRUE); SendDlgItemMessage(hwnd, IDD_CURICON, STM_SETICON, (WPARAM)hDlgIcon, 0L); if (hIconGlobal) { DestroyIcon(hIconGlobal); hIconGlobal = NULL; } } else { /* They hit cancel, get the old path back. */ lpid = LockItem(pActiveGroup,pActiveGroup->pItems); // BUG BUG! should have LockItem unlock the group
// before returning. JohanneC 7/5/91
UnlockGroup(pActiveGroup->hwnd); if (lpid == 0L) goto EditDlgExit; lpgd = LockGroup(pActiveGroup->hwnd); lstrcpy(szIconPath, (LPTSTR) PTR(lpgd, lpid->pIconPath)); UnlockGroup(pActiveGroup->hwnd); } break; }
case IDOK: { RECT rc; WORD hk; BOOL bARTmp; //AutoArrangeFlag
BOOL fNewItem = FALSE; DWORD dwRet;
hk = (WORD) SendDlgItemMessage(hwnd,IDD_HOTKEY, WM_GETHOTKEY,0,0L); if (!CheckHotKeyInUse(hk, FALSE)) break;
/* Get the non-parm part of the new command line. */ GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1);
//#ifdef JAPAN
// if (CheckPortName(hwnd,szPathField))
// break;
//#endif
GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1);
/* Expand env variables. */ DoEnvironmentSubst(szPathField, MAXITEMPATHLEN+1) && DoEnvironmentSubst(szDirField, MAXITEMPATHLEN+1);
/* Remove arguments before validating path. */ StripArgs(szPathField);
dwRet = ValidatePath(hwnd, szPathField, szDirField, szTempField); if (dwRet == PATH_INVALID) { break; } else if (dwRet == PATH_INVALID_OK) { dwFlags |= CI_NO_ASSOCIATION; }
if (bCheckBinaryType) { //
// Setting this variable to false, and signaling the event
// will cause the binary checking thread to terminate.
//
bCheckBinaryType = FALSE; SetEvent (hCheckBinaryEvent); KillTimer (hwnd, CHECK_BINARY_ID); }
EndDialog(hwnd, TRUE);
/*
* If the item refers to a different exe then we need * to update a few things. */ if (lstrcmpi(szNameField, szTempField)) { /* Things have changed. */ if (!fNewIcon) { /*
* The icon hasn't been expicitely set. * So use the new exe path for * the icon. */ // lstrcpy(szIconPath, szPathField);
szIconPath[0] = TEXT('\0'); /* reset icon path */ iDlgIconId = 0; iDlgIconIndex = 0; } fNewItem = TRUE; /* Check if the new thing is a DOS app. */ HandleDosApps(szTempField); } else { /* test if icon has changed. If not, reset iconpath.*/ if (!fNewIcon) { lpgd = LockGroup(pActiveGroup->hwnd); lpid = LockItem(pActiveGroup,pActiveGroup->pItems); lstrcpy(szIconPath, (LPTSTR) PTR(lpgd, lpid->pIconPath)); // LockItem locks the group, must unlock
// after returning. JohanneC
UnlockGroup(pActiveGroup->hwnd); UnlockGroup(pActiveGroup->hwnd); } }
CopyRect(&rc, &pActiveGroup->pItems->rcIcon);
/* Re-get the new command line. */ GetDlgItemText(hwnd, IDD_COMMAND, szPathField, MAXITEMPATHLEN+1);
/* Use unexpanded path for the item info. */ if (!GetDlgItemText(hwnd, IDD_DIR, szDirField, MAXITEMPATHLEN+1)) { szDirField[0] = TEXT('\0'); } else { LPTSTR lpEnd; TCHAR chT;
// Remove trailing spaces (inside of quote if applicable)
lpEnd = szDirField + lstrlen (szDirField) - 1; chT = *lpEnd;
if ( (chT == TEXT('\"')) || (chT == TEXT(' ')) ) { // MarkTa fix for spaces at the end of a filename
// Remove the spaces by moving the last character forward.
while (*(lpEnd-1) == TEXT(' ')) lpEnd--;
*lpEnd = chT; *(lpEnd+1) = TEXT ('\0');
// In case the character we saved was a space, we can
// NULL terminate it because now we know the next character
// to the left is valid, and the character to the right is
// already NULL.
if (*lpEnd == TEXT(' ')) *lpEnd = TEXT('\0'); } }
if (!InQuotes(szDirField)) {
//
// if szDirField needs quotes and the work dir is too
// long than we need to truncate it.
//
if (lstrlen(szDirField) >= MAXITEMPATHLEN-2) { TCHAR chT;
chT = szDirField[MAXITEMPATHLEN-2]; szDirField[MAXITEMPATHLEN-2] = 0; CheckEscapes(szDirField, MAXITEMPATHLEN+1); if (*szDirField != TEXT('"')) { szDirField[MAXITEMPATHLEN-2] = chT; } } else { CheckEscapes(szDirField, MAXITEMPATHLEN+1); } }
/* Check if the Desc line has been filled. */ if (!GetDlgItemText(hwnd, IDD_NAME, szNameField, MAXITEMNAMELEN+1)) { BuildDescription(szNameField, szPathField); SetDlgItemText(hwnd, IDD_NAME, szNameField); }
/*
* Stop ARing for a mo because we're going to do a * delete and the an add and there's no point in doing * the auto arrange stuff twice. */ bARTmp = bAutoArrange; bAutoArrange = FALSE; DeleteItem(pActiveGroup,pActiveGroup->pItems); bAutoArrange = bARTmp; if (fNewItem || lstrcmpi(szDescription, szNameField)) { dwFlags |= CI_SET_DOS_FULLSCRN; } if (IsWindowEnabled(GetDlgItem(hwnd, IDD_NEWVDM)) && IsDlgButtonChecked(hwnd, IDD_NEWVDM)) { dwFlags |= CI_SEPARATE_VDM; }
CreateNewItem(pActiveGroup->hwnd, szNameField, szPathField, szIconPath, szDirField, hk, (BOOL)IsDlgButtonChecked(hwnd, IDD_LOAD), (WORD)iDlgIconId, (WORD)iDlgIconIndex, hDlgIcon, (LPPOINT)&rc.left, dwFlags);
GetRidOfIcon(); pActiveGroup = NULL; break; }
case IDCANCEL: EditDlgExit: if (bCheckBinaryType) { //
// Setting this variable to false, and signaling the event
// will cause the binary checking thread to terminate.
//
bCheckBinaryType = FALSE; SetEvent (hCheckBinaryEvent); KillTimer (hwnd, CHECK_BINARY_ID); }
pActiveGroup = NULL; EndDialog(hwnd, FALSE); GetRidOfIcon(); break;
default: return(FALSE); } break; }
default:
if (uiMsg == uiHelpMessage || uiMsg == uiBrowseMessage) { DoHelp: PMHelp(hwnd); return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/*** EditGroupDlgProc -- Dialog Procedure
* * * * INT_PTR APIENTRY EditGroupDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) * * ENTRY - HWND hwnd - handle to dialog box. * UINT uiMsg - message to be acted upon. * WPARAM wParam - value specific to uiMsg. * LPARAM lParam - value specific to uiMsg. * * EXIT - True if success, False if not. * SYNOPSIS - Dialog box message processing function. * * WARNINGS - * EFFECTS - * */ INT_PTR APIENTRY EditGroupDlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { LPGROUPDEF lpgd; static TCHAR szGroupName[MAXGROUPNAMELEN + 1];
switch (uiMsg) { case WM_INITDIALOG: pActiveGroup = pCurrentGroup;
lpgd = LockGroup(pActiveGroup->hwnd);
if (lpgd == 0L) { EndDialog(hwnd, FALSE); break; }
if (pActiveGroup->fCommon) { TCHAR szCommonGroupTitle[64];
if (LoadString(hAppInstance, IDS_COMMONGROUPPROP, szCommonGroupTitle, CharSizeOf(szCommonGroupTitle))) { SetWindowText(hwnd, szCommonGroupTitle); } }
lstrcpy(szGroupName, (LPTSTR) PTR(lpgd, lpgd->pName)); SetDlgItemText(hwnd, IDD_NAME, (LPTSTR) PTR(lpgd, lpgd->pName)); UnlockGroup(pActiveGroup->hwnd);
SendDlgItemMessage(hwnd, IDD_NAME, EM_LIMITTEXT, MAXGROUPNAMELEN, 0L);
if (pActiveGroup->fRO || dwEditLevel >= 1) { EnableWindow(GetDlgItem(hwnd,IDOK), FALSE); EnableWindow(GetDlgItem(hwnd,IDD_NAME), FALSE); } break;
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP: goto DoHelp;
case IDOK: { INT err = 0; #if 0
HKEY hkey; HKEY hkeyGroups; TCHAR szKeyName[MAXGROUPNAMELEN + 1]; PSECURITY_ATTRIBUTES pSecAttr;
if (!hkeyProgramGroups || !hkeyPMGroups) { err = TRUE; goto Exit; } #endif
GetDlgItemText(hwnd, IDD_NAME, szNameField, MAXITEMNAMELEN+1); /* maybe should strip leading and trailing blanks? */ //
// If all spaces or null string do not change it, but if WIn3.1 does.
//
if (lstrcmp(szGroupName, szNameField)) {
ChangeGroupTitle(pActiveGroup->hwnd, szNameField, pActiveGroup->fCommon); } #if 0
//
// stop handling of Program Groups key changes.
//
bHandleProgramGroupsEvent = FALSE; //
// Determine if we're about to change the name of Personal
// group and a Common group.
//
if (pActiveGroup->fCommon) { hkeyGroups = hkeyCommonGroups; pSecAttr = pAdminSecAttr; } else { hkeyGroups = hkeyProgramGroups; pSecAttr = pSecurityAttributes; }
//
// If the group name contains backslashes (\) remove them
// from the key name. Can not have key names with backslash
// in the registry.
//
lstrcpy(szKeyName, szNameField); RemoveBackslashFromKeyName(szKeyName); /* create a new key, and delete the old key */ if (err = RegCreateKeyEx(hkeyGroups, szKeyName, 0, 0, 0, DELETE | KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_NOTIFY, pSecAttr, &hkey, NULL)) { goto Exit; }
lpgd = (LPGROUPDEF)GlobalLock(pActiveGroup->hGroup); if (err = RegSetValueEx(hkey, NULL, 0, REG_BINARY, (LPTSTR)lpgd, SizeofGroup(lpgd))) { RegCloseKey(hkey); goto Exit; }
RegDeleteKey(hkeyGroups, pActiveGroup->lpKey);
//
// Now that it all worked, do the actually name change:
// Change the group window title and the group key name.
//
ChangeGroupTitle(pActiveGroup->hwnd, szNameField, pActiveGroup->fCommon);
LocalFree((HANDLE)pActiveGroup->lpKey); pActiveGroup->lpKey = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR)*(lstrlen(szKeyName) + 1)); lstrcpy(pActiveGroup->lpKey, szKeyName);
if (bSaveSettings) { RegFlushKey(hkey); } RegCloseKey(hkey);
if (!pActiveGroup->fCommon) { WriteGroupsSection(); } } Exit: //
// reset handling of Program Groups key changes.
//
ResetProgramGroupsEvent(pActiveGroup->fCommon); bHandleProgramGroupsEvent = TRUE; if (err) { MyMessageBox(hwnd,IDS_CANTRENAMETITLE, IDS_CANTRENAMEMSG,NULL, MB_OK|MB_ICONEXCLAMATION); } GlobalUnlock(pActiveGroup->hGroup); #endif
pActiveGroup = NULL;
EndDialog(hwnd, TRUE); break; }
case IDCANCEL: pActiveGroup = NULL; EndDialog(hwnd, FALSE); break;
default: return(FALSE); } break;
default:
if (uiMsg == uiHelpMessage) { DoHelp: PMHelp(hwnd);
return TRUE; } else return FALSE; } UNREFERENCED_PARAMETER(lParam); return(TRUE); }
/******************************************************************************
UpdateGroupsDlgProc
10-18-93 Created by Johannec
******************************************************************************/ INT_PTR APIENTRY UpdateGroupsDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch (message) {
case WM_INITDIALOG: //
// Position ourselves
//
CentreWindow(hDlg);
return(TRUE);
case WM_COMMAND: switch (LOWORD(wParam)) {
case IDOK:
// fall through...
case IDCANCEL: EndDialog(hDlg, LOWORD(wParam) == IDOK); break; case IDD_HELP: goto DoHelp; break; } break;
default:
if (message == uiHelpMessage) DoHelp: { DWORD dwSave = dwContext;
dwContext = IDH_UPDATEGRPDLG;
PMHelp(hDlg);
dwContext = dwSave; return TRUE; } else return FALSE; }
// We didn't process the message
return(FALSE); }
//#ifdef JAPAN
/******************************************************************************
CheckPortName(HWND,LPTSTR)
This function check filename of path is reserveed as device name.
1993/1/18 by yutakas
******************************************************************************/ //BOOL CheckPortName(HWND hDlg, LPTSTR lpszPath)
//{
// LPTSTR lpT;
//
// lpT = lpszPath + lstrlen(lpszPath);
// while (lpT != lpszPath)
// {
// lpT = CharPrev(lpszPath,lpT);
// }
//
// if (PortName(lpT))
// {
// MyMessageBox(hDlg, IDS_BADPORTPATHTITLE, IDS_BADPORTPATHMSG, lpszPath,
// MB_OK | MB_ICONEXCLAMATION);
// return TRUE;
// }
//
// return FALSE;
//
//}
//
//BOOL PortName(LPTSTR lpszFileName)
//{
//#define PORTARRAY 22
// static TCHAR *szPorts[PORTARRAY] = {TEXT("LPT1"), TEXT("LPT2"), TEXT("LPT3"), TEXT("LPT4"), TEXT("LPT5"),
// TEXT("LPT6"), TEXT("LPT7"), TEXT("LPT8"), TEXT("LPT9"),
// TEXT("COM1"), TEXT("COM2"), TEXT("COM3"), TEXT("COM4"), TEXT("COM5"),
// TEXT("COM6"), TEXT("COM7"), TEXT("COM8"), TEXT("COM9"),
// TEXT("NUL"), TEXT("PRN"), TEXT("CON"), TEXT("AUX")};
// short i;
// TCHAR cSave;
//
// cSave = *(lpszFileName + 4);
// if (cSave == TEXT('.'))
// *(lpszFileName + 4) = TEXT('\0');
// for (i = 0; i < PORTARRAY; i++) {
// if (!lstrcmpi(szPorts[i], lpszFileName))
// break;
// }
// *(lpszFileName + 4) = cSave;
// return(i != PORTARRAY);
//}
//#endif
|