Regedit fix and enhancement 1. Fixed a bug in suggestions if the selected key cycles 2. Implemented "Copy Key Name" Modified: trunk/reactos/subsys/system/regedit/En.rc Modified: trunk/reactos/subsys/system/regedit/childwnd.c Modified: trunk/reactos/subsys/system/regedit/framewnd.c Modified: trunk/reactos/subsys/system/regedit/main.h _____
Modified: trunk/reactos/subsys/system/regedit/En.rc --- trunk/reactos/subsys/system/regedit/En.rc 2005-10-24 23:44:07 UTC (rev 18765) +++ trunk/reactos/subsys/system/regedit/En.rc 2005-10-24 23:46:55 UTC (rev 18766) @@ -138,7 +138,7 @@
MENUITEM "&Delete", ID_TREE_DELETE MENUITEM "&Rename", ID_TREE_RENAME MENUITEM SEPARATOR - MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME, GRAYED + MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME END END
_____
Modified: trunk/reactos/subsys/system/regedit/childwnd.c --- trunk/reactos/subsys/system/regedit/childwnd.c 2005-10-24 23:44:07 UTC (rev 18765) +++ trunk/reactos/subsys/system/regedit/childwnd.c 2005-10-24 23:46:55 UTC (rev 18766) @@ -143,6 +143,11 @@
TreeView_DeleteItem(pChildWnd->hTreeWnd, hSelection); } break; + case ID_EDIT_COPYKEYNAME: + hSelection = TreeView_GetSelection(pChildWnd->hTreeWnd); + keyPath = GetItemPath(pChildWnd->hTreeWnd, hSelection, &hRootKey); + CopyKeyName(hWnd, hRootKey, keyPath); + break; case ID_EDIT_NEW_KEY: CreateNewKey(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd)); break; @@ -178,6 +183,8 @@ * Key suggestion */
+#define MIN(a,b) ((a < b) ? (a) : (b)) + static void SuggestKeys(HKEY hRootKey, LPCTSTR pszKeyPath, LPTSTR pszSuggestions, size_t iSuggestionsLength) { @@ -201,7 +208,9 @@ if (RegQueryStringValue(hRootKey, pszKeyPath, NULL, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS) { - if (szBuffer[0] != '\0') + /* Sanity check this key; it cannot be empty, nor can it be a + * loop back */ + if ((szBuffer[0] != '\0') && _tcsicmp(szBuffer, pszKeyPath)) { if (RegOpenKey(hRootKey, szBuffer, &hOtherKey) == ERROR_SUCCESS) { @@ -211,7 +220,7 @@ iSuggestionsLength -= i;
lstrcpyn(pszSuggestions, szBuffer, iSuggestionsLength); - i = _tcslen(pszSuggestions) + 1; + i = MIN(_tcslen(pszSuggestions) + 1, iSuggestionsLength); pszSuggestions += i; iSuggestionsLength -= i; RegCloseKey(hOtherKey); @@ -223,7 +232,7 @@ } } } - while(bFound); + while(bFound && (iSuggestionsLength > 0));
/* Check CLSID key */ if (RegOpenKey(hRootKey, pszKeyPath, &hSubKey) == ERROR_SUCCESS) @@ -237,7 +246,7 @@ iSuggestionsLength -= i;
lstrcpyn(pszSuggestions, szBuffer, iSuggestionsLength); - i = _tcslen(pszSuggestions) + 1; + i = MIN(_tcslen(pszSuggestions) + 1, iSuggestionsLength); pszSuggestions += i; iSuggestionsLength -= i; } _____
Modified: trunk/reactos/subsys/system/regedit/framewnd.c --- trunk/reactos/subsys/system/regedit/framewnd.c 2005-10-24 23:44:07 UTC (rev 18765) +++ trunk/reactos/subsys/system/regedit/framewnd.c 2005-10-24 23:46:55 UTC (rev 18766) @@ -470,34 +470,43 @@
return TRUE; }
-static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName) +BOOL CopyKeyName(HWND hWnd, HKEY hRootKey, LPCTSTR keyName) { - BOOL result; + BOOL bClipboardOpened = FALSE; + BOOL bSuccess = FALSE; + TCHAR szBuffer[512]; + HGLOBAL hGlobal; + LPTSTR s;
- result = OpenClipboard(hWnd); - if (result) { - result = EmptyClipboard(); - if (result) { + if (!OpenClipboard(hWnd)) + goto done; + bClipboardOpened = TRUE;
- /*HANDLE hClipData;*/ - /*hClipData = SetClipboardData(UINT uFormat, HANDLE hMem);*/ + if (!EmptyClipboard()) + goto done;
- } else { - /* error emptying clipboard*/ - /* DWORD dwError = GetLastError(); */ - ; - } - if (!CloseClipboard()) { - /* error closing clipboard*/ - /* DWORD dwError = GetLastError(); */ - ; - } - } else { - /* error opening clipboard*/ - /* DWORD dwError = GetLastError(); */ - ; - } - return result; + if (!RegKeyGetName(szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]), hRootKey, keyName)) + goto done; + + hGlobal = GlobalAlloc(GMEM_MOVEABLE, (_tcslen(szBuffer) + 1) * sizeof(TCHAR)); + if (!hGlobal) + goto done; + + s = GlobalLock(hGlobal); + _tcscpy(s, szBuffer); + GlobalUnlock(hGlobal); + +#ifdef UNICODE + SetClipboardData(CF_UNICODETEXT, hGlobal); +#else + SetClipboardData(CF_TEXT, hGlobal); +#endif + bSuccess = TRUE; + +done: + if (bClipboardOpened) + CloseClipboard(); + return bSuccess; }
static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType) @@ -860,7 +869,7 @@ break; } case ID_EDIT_COPYKEYNAME: - CopyKeyName(hWnd, _T("")); + CopyKeyName(hWnd, hKeyRoot, keyPath); break; case ID_EDIT_PERMISSIONS: if(keyPath != NULL && _tcslen(keyPath) > 0) _____
Modified: trunk/reactos/subsys/system/regedit/main.h --- trunk/reactos/subsys/system/regedit/main.h 2005-10-24 23:44:07 UTC (rev 18765) +++ trunk/reactos/subsys/system/regedit/main.h 2005-10-24 23:46:55 UTC (rev 18766) @@ -89,6 +89,7 @@
extern LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM); extern void SetupStatusBar(HWND hWnd, BOOL bResize); extern void UpdateStatusBar(void); +extern BOOL CopyKeyName(HWND hWnd, HKEY hRootKey, LPCTSTR keyName);
/* listview.c */ extern HWND CreateListView(HWND hwndParent, int id);