windows-nt/Source/XPSP1/NT/base/mvdm/wow16/regedit/regedit.c
2020-09-26 16:20:57 +08:00

524 lines
13 KiB
C

#define WIN31
#include <windows.h>
#include "RegEdit.h"
HWND hWndNames, hWndIds;
WORD fMode;
extern char cUsesDDE[];
extern HANDLE *pLocalVals;
WORD NEAR PASCAL StoreValue(HWND hWndEdit, HANDLE *pValue)
{
HANDLE hTemp = NULL;
if(!SendMessage(hWndEdit, EM_GETMODIFY, 0, 0L))
return(0);
SendMessage(hWndEdit, EM_SETMODIFY, 0, 0L);
if(SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0L))
if(!(hTemp=GetEditString(hWndEdit)))
return(IDS_OUTOFMEMORY);
if(*pValue)
LocalFree(*pValue);
*pValue = hTemp;
return(NULL);
}
VOID NEAR PASCAL SetValue(HWND hDlg, int i, HWND hWndEdit, HANDLE hValue,
BOOL bEnable)
{
if(bEnable) {
if(i >= ID_FIRSTDDEEDIT)
EnableWindow(GetWindow(hWndEdit, GW_HWNDPREV), TRUE);
EnableWindow(hWndEdit, TRUE);
if(hValue) {
SendMessage(hWndEdit, WM_SETTEXT, 0, (LONG)(LPSTR)LocalLock(hValue));
LocalUnlock(hValue);
} else
goto ClearEdit;
} else {
if(GetFocus() == hWndEdit)
SendMessage(hDlg, WM_NEXTDLGCTL, GetDlgItem(hDlg, ID_CLASSID), 1L);
EnableWindow(GetWindow(hWndEdit, GW_HWNDPREV), FALSE);
EnableWindow(hWndEdit, FALSE);
ClearEdit:
SendMessage(hWndEdit, WM_SETTEXT, 0, (LONG)(LPSTR)"");
}
}
int FAR PASCAL EditDlg(HWND hDlg, WORD message, WORD wParam, DWORD lParam)
{
static HANDLE hCustExes = NULL;
switch(message) {
case WM_ACTIVATE:
if(wParam)
hWndHelp = hDlg;
return(FALSE);
case WM_DESTROY:
GetLocalCopies(GetDlgItem(hDlg, ID_CLASSNAME), NULL);
break;
case WM_COMMAND:
switch(wParam) {
case ID_SAVEACTION:
wParam = IsDlgButtonChecked(hDlg, ID_OPENRADIO)
? ID_OPENRADIO : ID_PRINTRADIO;
/* We fall through here */
case ID_OPENRADIO:
case ID_PRINTRADIO:
{
WORD wOld, wNew, wTemp, wErrMsg = NULL;
BOOL bCheck;
HWND hWndEdit;
int i;
wOld = (ID_LASTEDIT-ID_FIRSTACTIONEDIT+1) *
(IsDlgButtonChecked(hDlg, ID_OPENRADIO) ? 0 : 1);
wNew = wParam==ID_OPENRADIO ? 0 : 1;
bCheck = cUsesDDE[wNew];
wNew *= ID_LASTEDIT-ID_FIRSTACTIONEDIT+1;
for(i=ID_FIRSTACTIONEDIT; i<=ID_LASTEDIT; ++i, ++wOld, ++wNew) {
if(wTemp=StoreValue(hWndEdit=GetDlgItem(hDlg, i), pLocalVals+wOld))
wErrMsg = wTemp;
SetValue(hDlg, i, hWndEdit, pLocalVals[wNew], i<ID_FIRSTDDEEDIT ||
(bCheck && (i!=(ID_FIRSTDDEEDIT+1) || SendDlgItemMessage(hDlg,
ID_FIRSTDDEEDIT, WM_GETTEXTLENGTH, 0, 0L))));
}
CheckDlgButton(hDlg, ID_USESDDE, bCheck);
EnableWindow(GetDlgItem(hDlg, ID_GROUPDDE), bCheck);
CheckRadioButton(hDlg, ID_OPENRADIO, ID_PRINTRADIO, wParam);
if(wErrMsg)
MyMessageBox(hDlg, wErrMsg, MB_OK, 0);
break;
}
case ID_USESDDE:
{
WORD wOld;
wOld = IsDlgButtonChecked(hDlg, ID_OPENRADIO) ? 0 : 1;
cUsesDDE[wOld] = (char)(!IsDlgButtonChecked(hDlg, ID_USESDDE));
SendMessage(hDlg, WM_COMMAND, ID_SAVEACTION, 0L);
break;
}
case ID_FIRSTDDEEDIT:
if(HIWORD(lParam) == EN_CHANGE) {
BOOL bCheck, bEnabled;
HWND hWndEdit;
WORD wNew;
hWndEdit = GetDlgItem(hDlg, ID_FIRSTDDEEDIT+1);
bEnabled = IsWindowEnabled(hWndEdit);
bCheck = (BOOL)SendMessage(LOWORD(lParam), WM_GETTEXTLENGTH, 0, 0L);
if((bCheck && bEnabled) || (!bCheck && !bEnabled))
break;
wNew = ID_FIRSTDDEEDIT+1-ID_FIRSTACTIONEDIT;
if(!IsDlgButtonChecked(hDlg, ID_OPENRADIO))
wNew += ID_LASTEDIT-ID_FIRSTACTIONEDIT+1;
if(StoreValue(hWndEdit, pLocalVals+wNew))
break;
SetValue(hDlg, ID_FIRSTDDEEDIT+1, hWndEdit, pLocalVals[wNew],
bCheck);
}
break;
case IDOK:
{
HANDLE hId;
HWND hWndName;
WORD wErrMsg = IDS_INVALIDNAME;
WORD wErrCtl = ID_CLASSNAME;
if(!SendMessage(hWndName=GetDlgItem(hDlg, ID_CLASSNAME),
WM_GETTEXTLENGTH, 0, 0L))
goto Error1_1;
wErrMsg = IDS_OUTOFMEMORY;
wErrCtl = NULL;
/* Update our memory handles for the current action */
SendMessage(hDlg, WM_COMMAND, ID_SAVEACTION, 0L);
/* Get the current class id */
if(!(hId=GetEditString(GetDlgItem(hDlg, ID_CLASSID))))
goto Error1_1;
if((fMode&(FLAG_NEW|FLAG_COPY)) && (wErrMsg=CreateId(hId))) {
PSTR pId;
MyMessageBox(hDlg, wErrMsg, MB_OK, lstrlen(pId=LocalLock(hId)),
(LPSTR)pId);
SetFocus(GetDlgItem(hDlg, ID_CLASSID));
LocalUnlock(hId);
LocalFree(hId);
break;
}
/* Merge the data with the given class */
if(wErrMsg=MergeData(hWndName, hId))
goto Error1_2;
EndDialog(hDlg, hId);
break;
Error1_2:
LocalFree(hId);
Error1_1:
MyMessageBox(hDlg, wErrMsg, MB_OK, 0);
if(wErrCtl)
SetFocus(GetDlgItem(hDlg, wErrCtl));
break;
}
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case ID_BROWSE:
{
HANDLE hPath, hLocPath;
LPSTR lpPath;
HWND hWndEdit, hWndApp;
wHelpId = IDW_OPENEXE;
if(!DoFileOpenDlg(hDlg, IDS_BROWSETITLE, IDS_EXES, IDS_CUSTEXES,
&hCustExes, &hPath, TRUE))
break;
lpPath = GlobalLock(hPath);
hWndApp = GetDlgItem(hDlg, ID_FIRSTDDEEDIT+2);
if(IsDlgButtonChecked(hDlg, ID_USESDDE) &&
!SendMessage(hWndApp, WM_GETTEXTLENGTH, 0, 0L) &&
(hLocPath=StringToLocalHandle(lpPath, LMEM_MOVEABLE))) {
SendMessage(hWndApp, WM_SETTEXT, 0,
(DWORD)((LPSTR)GetAppName(hLocPath)));
SendMessage(hWndApp, EM_SETMODIFY, 1, 0L);
LocalFree(hLocPath);
}
hWndEdit = GetDlgItem(hDlg, ID_COMMAND);
SendMessage(hWndEdit, WM_SETTEXT, 0, (DWORD)lpPath);
SendMessage(hWndEdit, EM_SETMODIFY, 1, 0L);
GlobalUnlock(hPath);
GlobalFree(hPath);
break;
}
case ID_HELP:
if(GetParent(LOWORD(lParam)) != hDlg)
break;
case ID_HELPBUTTON:
MyHelp(hDlg, HELP_CONTEXT, IDW_MODIFY+fMode);
break;
default:
break;
}
return(FALSE);
break;
case WM_INITDIALOG:
{
HANDLE hId, hTitle;
HWND hWndId, hWndName;
WORD wErrMsg;
hId = GetListboxString(hWndIds,
(WORD)SendMessage(hWndNames, LB_GETCURSEL, 0, 0L));
hWndName = GetDlgItem(hDlg, ID_CLASSNAME);
if(fMode&FLAG_NEW) {
if(wErrMsg=GetLocalCopies(hWndName, NULL))
goto Error2_1;
cUsesDDE[0] = cUsesDDE[1] = 1;
} else {
wErrMsg = IDS_OUTOFMEMORY;
if(!hId || (wErrMsg=GetLocalCopies(hWndName, hId)))
goto Error2_1;
}
hWndId = GetDlgItem(hDlg, ID_CLASSID);
SendMessage(hWndId, EM_LIMITTEXT, MAX_KEY_LENGTH-1, 0L);
if(fMode&(FLAG_NEW|FLAG_COPY)) {
DestroyWindow(GetDlgItem(hDlg, ID_STATCLASSID));
wErrMsg = IDS_OUTOFMEMORY;
if(!(hTitle=MyLoadString(fMode&FLAG_NEW ? IDS_ADD : IDS_COPY, NULL,
LMEM_MOVEABLE)))
goto Error2_1;
SendMessage(hDlg, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hTitle)));
LocalUnlock(hTitle);
LocalFree(hTitle);
SetFocus(hWndId);
} else {
DestroyWindow(hWndId);
hWndId = GetDlgItem(hDlg, ID_STATCLASSID);
SetWindowWord(hWndId, GWW_ID, ID_CLASSID);
SendMessage(hWndId, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hId)));
LocalUnlock(hId);
SetFocus(GetDlgItem(hDlg, ID_CLASSNAME));
}
CheckRadioButton(hDlg, ID_OPENRADIO, ID_PRINTRADIO, ID_OPENRADIO);
SendMessage(hDlg, WM_COMMAND, ID_OPENRADIO, 0L);
if(hId)
LocalFree(hId);
return(FALSE);
Error2_1:
MyMessageBox(hDlg, wErrMsg, MB_OK, 0);
PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
if(hId)
LocalFree(hId);
break;
}
default:
return(FALSE);
}
return(TRUE);
}
int FAR PASCAL MainWndDlg(HWND hDlg, WORD message, WORD wParam, DWORD lParam)
{
static int nTop;
switch(message) {
case WM_COMMAND:
switch(wParam) {
case ID_NAMELIST:
if(HIWORD(lParam) == LBN_DBLCLK)
SendMessage(hWndMain, WM_COMMAND, ID_MODIFY, 0L);
break;
default:
break;
}
return(FALSE);
break;
case WM_SIZE:
{
RECT rcList, rcWnd;
int hgtWnd, hgt;
hgtWnd = HIWORD(lParam) + 1;
hgt = hgtWnd - nTop;
SetWindowPos(hWndNames, NULL, -1, nTop, LOWORD(lParam)+2, hgt,
SWP_NOZORDER);
GetWindowRect(hWndNames, &rcList);
ScreenToClient(hDlg, (POINT *)(&rcList) + 1);
if(rcList.bottom != hgtWnd) {
GetWindowRect(hDlg, &rcWnd);
SetWindowPos(hDlg, NULL, 0, 0, rcWnd.right-rcWnd.left,
rcWnd.bottom-rcWnd.top-hgtWnd+rcList.bottom,
SWP_NOMOVE | SWP_NOZORDER);
}
break;
}
case WM_INITDIALOG:
{
RECT rcTemp;
GetWindowRect(GetDlgItem(hDlg, ID_NAMELIST), &rcTemp);
ScreenToClient(hDlg, (POINT *)&rcTemp);
nTop = rcTemp.top;
break;
}
default:
return(FALSE);
}
return(TRUE);
}
long FAR PASCAL MainWnd(HWND hWnd, WORD iMessage, WORD wParam, LONG lParam)
{
HCURSOR oldCursor;
switch(iMessage) {
case WM_ACTIVATE:
if(wParam)
break;
goto DoDefault;
case WM_CREATE:
{
WORD wErrMsg = IDS_OUTOFMEMORY;
if(!(lpMainWndDlg=MakeProcInstance(MainWndDlg, hInstance)))
goto Error1_1;
if(!(hWndDlg=CreateDialog(hInstance, MAKEINTRESOURCE(MAINWND), hWnd,
lpMainWndDlg)))
goto Error1_1;
hWndNames = GetDlgItem(hWndDlg, ID_NAMELIST);
hWndIds = GetDlgItem(hWndDlg, ID_IDLIST);
if(wErrMsg=ResetClassList(hWndIds, hWndNames))
goto Error1_1;
ShowWindow(hWndDlg, SW_SHOW);
goto DoDefault;
Error1_1:
MyMessageBox(hWnd, wErrMsg, MB_OK, 0);
DestroyWindow(hWnd);
break;
}
/* Return 1 to say it's OK to close
*/
case WM_CLOSE:
case WM_QUERYENDSESSION:
return(1L);
case WM_COMMAND:
oldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
switch(wParam) {
case ID_FINISHMERGE:
{
WORD wErrMsg;
if(wErrMsg=ResetClassList(hWndIds, hWndNames))
MyMessageBox(GetLastActivePopup(hWnd), wErrMsg, MB_OK, 0);
break;
}
case ID_ADD:
fMode = FLAG_NEW;
goto DoDlg;
case ID_COPY:
fMode = FLAG_COPY;
goto DoDlg;
case ID_MODIFY:
fMode = 0;
DoDlg:
{
HANDLE hId, hName;
PSTR pId, pName;
WORD wErrMsg = IDS_OUTOFMEMORY;
int nNewId;
if(!(hId=DoDialogBox(MAKEINTRESOURCE(EDITDLG), hWnd, EditDlg)))
break;
if(hId == 0xffff)
goto Error2_1;
if(wErrMsg=MyGetClassName(hId, &hName))
goto Error2_2;
if(wParam == ID_MODIFY) {
int nClassId;
nClassId = (WORD)SendMessage(hWndNames, LB_GETCURSEL, 0, 0L);
SendMessage(hWndNames, WM_SETREDRAW, 0, 0L);
SendMessage(hWndNames, LB_DELETESTRING, nClassId, 0L);
SendMessage(hWndIds, LB_DELETESTRING, nClassId, 0L);
SendMessage(hWndNames, WM_SETREDRAW, 1, 0L);
}
pName = LocalLock(hName);
pId = LocalLock(hId);
wErrMsg = IDS_OUTOFMEMORY;
if((nNewId=(int)SendMessage(hWndNames, LB_ADDSTRING, 0,
(DWORD)((LPSTR)pName)))!=LB_ERR
&& SendMessage(hWndIds, LB_INSERTSTRING, nNewId,
(DWORD)((LPSTR)pId))!=LB_ERR)
wErrMsg = NULL;
SendMessage(hWndNames, LB_SETCURSEL, nNewId, 0L);
LocalUnlock(hId);
LocalUnlock(hName);
LocalFree(hName);
Error2_2:
LocalFree(hId);
Error2_1:
if(wErrMsg)
MyMessageBox(hWnd, wErrMsg, MB_OK, 0);
break;
}
case ID_DELETE:
{
HANDLE hId, hName;
WORD wErrMsg = IDS_OUTOFMEMORY;
PSTR pName;
int nClassId;
if((nClassId=(int)SendMessage(hWndNames, LB_GETCURSEL, 0, 0L))
== LB_ERR)
break;
if(!(hId=GetListboxString(hWndIds, nClassId)))
goto Error4_1;
if(!(hName=GetListboxString(hWndNames, nClassId)))
goto Error4_2;
pName = LocalLock(hName);
wErrMsg = NULL;
if(MyMessageBox(hWnd, IDS_SUREDELETE, MB_ICONEXCLAMATION | MB_YESNO,
lstrlen(pName), (LPSTR)pName) != IDYES)
goto Error4_3;
if(wErrMsg=DeleteClassId(hId))
goto Error4_3;
SendMessage(hWndIds, LB_DELETESTRING, nClassId, 0L);
SendMessage(hWndNames, LB_DELETESTRING, nClassId, 0L);
if(SendMessage(hWndNames, LB_SETCURSEL, nClassId, 0L) == LB_ERR)
SendMessage(hWndNames, LB_SETCURSEL, --nClassId, 0L);
Error4_3:
LocalUnlock(hName);
LocalFree(hName);
Error4_2:
LocalFree(hId);
Error4_1:
if(wErrMsg)
MyMessageBox(hWnd, wErrMsg, MB_OK, 0);
break;
}
default:
break;
}
SetCursor(oldCursor);
break;
default:
DoDefault:
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
break;
}
return 0L;
}