#define WIN31 #include #include "SDKRegEd.h" #define RONSPACE 3 #define misParam ((MEASUREITEMSTRUCT FAR *)lParam) #define disParam ((DRAWITEMSTRUCT FAR *)lParam) extern char szNull[]; extern char szSDKRegEd[]; static char szEquals[] = " = "; static WORD wKey=0; static HANDLE hSearchString = NULL; static BOOL bDoUpdate = TRUE; static HWND hStat1, hEdit1, hEdit2; extern BOOL bChangesMade; extern HWND hWndIds; extern HANDLE hAcc; extern BOOL fOpenError; #pragma warning(4:4146) // unary minus operator applied to unsigned type, result still unsigned VOID NEAR PASCAL MySetSel(HWND hWndList, int index) { if (!bDoUpdate) return; if(index == -2) index = (int)SendMessage(hWndList, LB_GETCURSEL, 0, 0L); else SendMessage(hWndList, LB_SETCURSEL, index, 0L); SendMessage(GetParent(hWndList), WM_COMMAND, GetWindowWord(hWndList, GWW_ID), MAKELONG(hWndList, LBN_SELCHANGE)); } int FAR PASCAL SDKMainWndDlg(HWND hDlg, WORD message, WORD wParam, DWORD lParam) { static int xSpace; static int nTop, nLeft, nValHgt, nPthHgt; switch(message) { case WM_COMMAND: switch(wParam) { case IDCANCEL: SendDlgItemMessage(hDlg, ID_VALUE, EM_SETMODIFY, 0, 0L); goto NewSelection; case ID_VALUE: if (HIWORD(lParam) == EN_KILLFOCUS) { hAcc = LoadAccelerators(hInstance, szSDKRegEd); goto NewSelection; } else if (HIWORD(lParam) == EN_SETFOCUS) hAcc = LoadAccelerators(hInstance, "SDKRegEdVal"); break; case ID_IDLIST: if(HIWORD(lParam) == LBN_SELCHANGE) { HANDLE hTmp; HWND hWndTmp; WORD wErrMsg, wNewKey; NewSelection: wNewKey = (WORD)SendMessage(hWndIds, LB_GETCURSEL, 0, 0L); hWndTmp = GetDlgItem(hDlg, ID_VALUE); if (SendMessage(hWndTmp, EM_GETMODIFY, 0, 0L)) { SendMessage(hWndTmp, EM_SETMODIFY, 0, 0L); bDoUpdate = FALSE; wErrMsg = IDS_OUTOFMEMORY; if(hEdit1 = GetEditString(hWndTmp)) { wErrMsg = GetErrMsg((WORD)SDKSetValue(-wKey, szNull, LocalLock(hEdit1))); LocalUnlock(hEdit1); } if(wErrMsg) { MyMessageBox(hWndMain, wErrMsg, MB_OK, 0); break; } bDoUpdate = TRUE; InvalidateRect(hWndIds, NULL, TRUE); } if((wKey=wNewKey)!=(WORD)SendMessage(hWndIds, LB_GETCURSEL, 0, 0L)) SendMessage(hWndIds, LB_SETCURSEL, wKey, 0L); if(!MyGetValue(wKey, &hTmp)) { SendMessage(hWndTmp, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hTmp))); LocalUnlock(hTmp); LocalFree(hTmp); } else SendMessage(hWndTmp, WM_SETTEXT, 0, (DWORD)((LPSTR)szNull)); hWndTmp = GetDlgItem(hDlg, ID_FULLPATH); if(hTmp=MyGetPath(wKey)) { SendMessage(hWndTmp, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hTmp))); LocalUnlock(hTmp); LocalFree(hTmp); } else SendMessage(hWndTmp, WM_SETTEXT, 0, (DWORD)((LPSTR)szNull)); } break; default: break; } return(FALSE); break; case WM_SIZE: { HWND hWndTmp; RECT rcList, rcWnd; int hgtWnd, hgt; hgtWnd = HIWORD(lParam) + 1; hgt = hgtWnd - nTop; SetWindowPos(hWndIds, NULL, -1, nTop, LOWORD(lParam)+2, hgt, SWP_NOZORDER); GetWindowRect(hWndIds, &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); } hWndTmp = GetDlgItem(hDlg, ID_VALUE); SetWindowPos(hWndTmp, NULL, 0, 0, LOWORD(lParam)-nLeft, nValHgt, SWP_NOMOVE | SWP_NOZORDER); InvalidateRect(hWndTmp, NULL, TRUE); hWndTmp = GetDlgItem(hDlg, ID_FULLPATH); SetWindowPos(hWndTmp, NULL, 0, 0, LOWORD(lParam)-nLeft, nPthHgt, SWP_NOMOVE | SWP_NOZORDER); InvalidateRect(hWndTmp, NULL, TRUE); break; } case WM_INITDIALOG: { RECT rcTemp; WORD wErrMsg; hWndIds = GetDlgItem(hDlg, ID_IDLIST); SendMessage(hWndIds, WM_SETREDRAW, 0, 0L); if(wErrMsg=MyResetIdList(hDlg)) { MyMessageBox(hWndMain, wErrMsg, MB_OK, 0); fOpenError = TRUE; } SendMessage(hWndIds, WM_SETREDRAW, 1, 0L); InvalidateRect(hWndIds, NULL, TRUE); GetWindowRect(hWndIds, &rcTemp); ScreenToClient(hDlg, (POINT FAR *)&rcTemp); nTop = rcTemp.top; GetWindowRect(GetDlgItem(hDlg, ID_VALUE), &rcTemp); nValHgt = rcTemp.bottom - rcTemp.top; GetWindowRect(GetDlgItem(hDlg, ID_FULLPATH), &rcTemp); nPthHgt = rcTemp.bottom - rcTemp.top; ScreenToClient(hDlg, (POINT FAR *)&rcTemp); nLeft = rcTemp.left; break; } case WM_MEASUREITEM: { HDC hDC; hDC = GetDC(hWndIds); misParam->itemHeight = HIWORD(GetTextExtent(hDC, "Ag", 2)); xSpace = LOWORD(GetTextExtent(hDC, " ", 1)); ReleaseDC(hWndIds, hDC); break; } case WM_DRAWITEM: { HDC hDC; HANDLE hKeyName, hValue; PSTR pKeyName; WORD wSize; int theLevel; RECT rcTextExt; DWORD dwMarkers, thisMarker; DWORD dwRGBBkGnd, dwRGBText; hDC = disParam->hDC; if(!(hKeyName=GetListboxString(disParam->hwndItem, disParam->itemID))) break; pKeyName = LocalLock(hKeyName); wSize = lstrlen(pKeyName); if(!MyGetValue(disParam->itemID, &hValue)) { PSTR pValue; HANDLE hTemp; WORD wTemp; if(*(pValue = LocalLock(hValue))) { LocalUnlock(hKeyName); wTemp = wSize + sizeof(szEquals) - 1 + lstrlen(pValue); if(hTemp=LocalReAlloc(hKeyName, wTemp+1, LMEM_MOVEABLE)) { hKeyName = hTemp; pKeyName = LocalLock(hKeyName); lstrcat(pKeyName, szEquals); lstrcat(pKeyName, pValue); wSize = wTemp; } else { pKeyName = LocalLock(hKeyName); } } LocalUnlock(hValue); LocalFree(hValue); } theLevel = GetLevel(disParam->itemID); rcTextExt.left = disParam->rcItem.left + RONSPACE*theLevel*xSpace; rcTextExt.top = disParam->rcItem.top; rcTextExt.right = rcTextExt.left + LOWORD(GetTextExtent(hDC, pKeyName, wSize)) + 2*xSpace; rcTextExt.bottom = disParam->rcItem.bottom; if(disParam->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) { if(disParam->itemID>0 && (disParam->itemAction&ODA_DRAWENTIRE)) { HPEN hPen, hOldPen; int theLeft, theMiddle; if(theLevel <= 32) dwMarkers = GetTreeMarkers(disParam->itemID); else dwMarkers = 0; --theLevel; theLeft = disParam->rcItem.left + RONSPACE*theLevel*xSpace + xSpace; theMiddle = (rcTextExt.top+rcTextExt.bottom)/2; thisMarker = 1L << (LONG)theLevel; if(hPen=CreatePen(PS_SOLID, 1, GetTextColor(hDC))) hOldPen = SelectObject(hDC, hPen); MoveTo(hDC, theLeft, theMiddle); LineTo(hDC, theLeft+(RONSPACE-1)*xSpace, theMiddle); MoveTo(hDC, theLeft, rcTextExt.top); LineTo(hDC, theLeft, (dwMarkers&thisMarker) ? rcTextExt.bottom : theMiddle); goto NextLevel; for( ; theLevel>=0; --theLevel, thisMarker>>=1, theLeft-=RONSPACE*xSpace) { if(dwMarkers&thisMarker) { MoveTo(hDC, theLeft, rcTextExt.top); LineTo(hDC, theLeft, rcTextExt.bottom); } NextLevel: ; } if(hPen) { if(hOldPen) SelectObject(hDC, hOldPen); DeleteObject(hPen); } } if(disParam->itemState & ODS_SELECTED) { dwRGBBkGnd = SetBkColor(hDC, GetSysColor(COLOR_HIGHLIGHT)); dwRGBText = SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); } ExtTextOut(hDC, rcTextExt.left+xSpace, rcTextExt.top+1, ETO_CLIPPED | ETO_OPAQUE, &rcTextExt, pKeyName, wSize, 0L); if(disParam->itemState & ODS_SELECTED) { SetBkColor(hDC, dwRGBBkGnd); SetTextColor(hDC, dwRGBText); } if(disParam->itemState & ODS_FOCUS) disParam->itemAction |= ODA_FOCUS; } if(disParam->itemAction & ODA_FOCUS) DrawFocusRect(disParam->hDC, &rcTextExt); LocalUnlock(hKeyName); LocalFree(hKeyName); break; } default: return(FALSE); } return(TRUE); } VOID NEAR _fastcall FillDlgItem(HWND hDlg, WORD wId, HANDLE hTemp) { if(hTemp) { SendDlgItemMessage(hDlg, wId, WM_SETTEXT, 0, (DWORD)((LPSTR)LocalLock(hTemp))); LocalUnlock(hTemp); LocalFree(hTemp); } } int FAR PASCAL GetKeyProc(HWND hDlg, WORD message, WORD wParam, DWORD lParam) { switch(message) { case WM_ACTIVATE: if(wParam) hWndHelp = hDlg; return(FALSE); case WM_COMMAND: switch(wParam) { case IDOK: { HWND hWndEdit2; if(!(hEdit1=GetEditString(GetDlgItem(hDlg, ID_EDIT1)))) goto Error1; if((hWndEdit2=GetDlgItem(hDlg, ID_EDIT2)) && !(hEdit2 = GetEditString(hWndEdit2))) goto Error2; } case IDCANCEL: EndDialog(hDlg, wParam); break; Error2: LocalFree(hEdit1); Error1: MyMessageBox(hDlg, IDS_OUTOFMEMORY, MB_OK, 0); break; case ID_HELP: if(GetParent(LOWORD(lParam)) != hDlg) break; case ID_HELPBUTTON: MyHelp(hDlg, HELP_CONTEXT, wHelpId); break; } break; case WM_INITDIALOG: FillDlgItem(hDlg, ID_STAT1, hStat1); FillDlgItem(hDlg, ID_EDIT1, hEdit1); FillDlgItem(hDlg, ID_EDIT2, hEdit2); return(TRUE); default: return(FALSE); } return(TRUE); } long FAR PASCAL SDKMainWnd(HWND hWnd, WORD message, WORD wParam, LONG lParam) { HCURSOR oldCursor; switch(message) { case WM_ACTIVATE: if(wParam) break; goto DoDefault; case WM_CREATE: { hWndMain = hWnd; if(!(lpMainWndDlg=MakeProcInstance(SDKMainWndDlg, hInstance))) goto Error1_1; if(!(hWndDlg=CreateDialog(hInstance, MAKEINTRESOURCE(SDKMAINWND), hWnd, lpMainWndDlg))) goto Error1_1; ShowWindow(hWndDlg, SW_SHOW); goto DoDefault; } Error1_1: /* BUG: There should be a MessageBox here */ DestroyWindow(hWnd); break; /* We need to return 1 if it is OK to close, 0 otherwise */ case WM_CLOSE: case WM_QUERYENDSESSION: { MySetSel(hWndIds, -2); if(bChangesMade) { int nReturn; nReturn = MyMessageBox(hWnd, IDS_SAVECHANGES, MB_YESNOCANCEL, 0); if(nReturn == IDYES) { if(!SendMessage(hWnd, WM_COMMAND, ID_SAVE, 0L)) break; } else if(nReturn == IDCANCEL) break; } return(1L); } case WM_DROPFILES: goto DoMergeFile; case WM_COMMAND: oldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); switch(wParam) { case ID_MODIFY: SetFocus(GetDlgItem(hWndDlg, ID_IDLIST)); break; case ID_EDITVAL: SetFocus(GetDlgItem(hWndDlg, ID_VALUE)); break; case ID_SAVE: { WORD wErrMsg; MySetSel(hWndIds, -2); if(wErrMsg=MySaveChanges()) { MyMessageBox(hWnd, wErrMsg, MB_OK, 0); break; } /* Now we reset our local version of the database to make sure * we are all talking about the same thing */ PostMessage(hWnd, WM_COMMAND, ID_DORESTORE, 0L); return(1L); } case ID_RESTORE: if(MyMessageBox(hWnd, IDS_SURERESTORE, MB_OKCANCEL, 0) != IDOK) break; /* Fall through */ case ID_DORESTORE: { WORD wErrMsg; SendMessage(hWnd, WM_ACTIVATEAPP, 0, 0L); SendMessage(hWndIds, WM_SETREDRAW, 0, 0L); if(wErrMsg=MyResetIdList(hWndDlg)) { MyMessageBox(hWnd, wErrMsg, MB_OK, 0); PostMessage(hWnd, WM_COMMAND, ID_EXIT, 0L); fOpenError = TRUE; } SendMessage(hWndIds, WM_SETREDRAW, 1, 0L); InvalidateRect(hWndIds, NULL, TRUE); SendMessage(hWnd, WM_ACTIVATEAPP, 1, 0L); break; } case ID_MERGEFILE: DoMergeFile: MySetSel(hWndIds, -2); SendMessage(hWndIds, WM_SETREDRAW, 0, 0L); break; case ID_FINISHMERGE: SendMessage(hWndIds, WM_SETREDRAW, 1, 0L); InvalidateRect(hWndIds, NULL, TRUE); break; case ID_WRITEFILE: { WORD wErrMsg; MySetSel(hWndIds, -2); if(!LOWORD(lParam)) break; if(wErrMsg=DoWriteFile(wKey, LOWORD(lParam))) MyMessageBox(hWnd, wErrMsg, MB_OK, 0); GlobalUnlock(LOWORD(lParam)); GlobalFree(LOWORD(lParam)); break; } case ID_ADD: { int nResult; WORD wErrMsg; MySetSel(hWndIds, -2); if(!(hStat1=MyGetPath(wKey))) goto Error6_1; hEdit1 = hEdit2 = NULL; wHelpId = IDW_ADDKEY; if((nResult=DoDialogBox(MAKEINTRESOURCE(AddKey), hWnd, GetKeyProc)) < 0) goto Error6_2; else if(nResult == IDCANCEL) break; SendMessage(hWndIds, WM_SETREDRAW, 0, 0L); if (wErrMsg=GetErrMsg((WORD)SDKSetValue(-wKey, LocalLock(hEdit1), LocalLock(hEdit2)))) MyMessageBox(hWnd, wErrMsg, MB_OK, 0); SendMessage(hWndIds, WM_SETREDRAW, 1, 0L); InvalidateRect(hWndIds, NULL, TRUE); LocalUnlock(hEdit2); LocalFree(hEdit2); LocalUnlock(hEdit1); LocalFree(hEdit1); break; Error6_2: LocalFree(hStat1); Error6_1: MyMessageBox(hWnd, IDS_OUTOFMEMORY, MB_OK, 0); break; } case ID_DELETE: /* Fall through */ case ID_COPY: { int nNewKey, nOldKey, nResult; PSTR pEdit1, pEdit2; MySetSel(hWndIds, -2); /* Get the key name to copy to */ if(!(hEdit1=MyGetPath(wKey))) goto Error5_1; hStat1 = hEdit2 = NULL; wHelpId = wParam==ID_COPY ? IDW_COPYKEY : IDW_DELETE; if((nResult=DoDialogBox(wParam==ID_COPY ? MAKEINTRESOURCE(CopyKey) : MAKEINTRESOURCE(DeleteKey), hWnd, GetKeyProc)) < 0) goto Error5_2; else if(nResult == IDCANCEL) break; /* Do the operation and clean up */ pEdit1 = LocalLock(hEdit1); if((nOldKey=FindKey(pEdit1)) < 0) { MyMessageBox(hWnd, IDS_SOURCENOTEXIST, MB_OK, lstrlen(pEdit1), (LPSTR)pEdit1); goto Error5_3; } SendMessage(hWndIds, WM_SETREDRAW, 0, 0L); if(wParam == ID_COPY) { /* hEdit2 is only set in the copy dialog; not the delete */ pEdit2 = LocalLock(hEdit2); if((nNewKey=DoCopyKey(nOldKey, pEdit2)) < 0) MyMessageBox(hWnd, -nNewKey, MB_OK, 0); LocalUnlock(hEdit2); LocalFree(hEdit2); } else { nNewKey = IDS_NODELROOT; if(!nOldKey || (nNewKey=MyDeleteKey(nOldKey))) MyMessageBox(hWnd, nNewKey, MB_OK, 0); if(nOldKey >= (int)SendMessage(hWndIds, LB_GETCOUNT, 0, 0L)) --nOldKey; MySetSel(hWndIds, nOldKey); } SendMessage(hWndIds, WM_SETREDRAW, 1, 0L); InvalidateRect(hWndIds, NULL, TRUE); Error5_3: LocalUnlock(hEdit1); LocalFree(hEdit1); break; /* WARNING: ID_FIND also uses these error labels */ Error5_2: LocalFree(hEdit1); Error5_1: MyMessageBox(hWnd, IDS_OUTOFMEMORY, MB_OK, 0); break; } case ID_FINDKEY: { int nResult; if(!(hEdit1=StringToLocalHandle(LocalLock(hSearchString), LMEM_MOVEABLE))) goto Error5_1; LocalUnlock(hSearchString); hStat1 = hEdit2 = NULL; wHelpId = IDW_FINDKEY; if((nResult=DoDialogBox(MAKEINTRESOURCE(FindKeyDlg), hWnd, GetKeyProc)) < 0) goto Error5_2; else if(nResult == IDCANCEL) break; if(hSearchString) LocalFree(hSearchString); hSearchString = hEdit1; } /* Fall through */ case ID_FINDNEXT: { int index = LB_ERR; PSTR pSearchString; if(!hSearchString) goto Error2_1; pSearchString = LocalLock(hSearchString); if(*pSearchString == '\\') { if((index=FindKey(pSearchString)) == -1) goto Error2_2; } else { if((index=(int)SendMessage(hWndIds, LB_FINDSTRING, wKey, (DWORD)((LPSTR)pSearchString)))==LB_ERR) goto Error2_2; } MySetSel(hWndIds, index); Error2_2: LocalUnlock(hSearchString); Error2_1: if(index < 0) MessageBeep(0); break; } default: break; } SetCursor(oldCursor); break; default: DoDefault: return(DefWindowProc(hWnd, message, wParam, lParam)); break; } return(0L); }