regedit: implement key operations
Dimitrie O. Paun
dpaun at rogers.com
Sun Mar 14 12:20:58 CST 2004
Please ignore the last patch (Subject: "regedit: key insert & delete"),
this is an imporved version.
ChangeLog
Properly implement all key operations: new, delete, rename.
Fix rename command to handle both keys and values.
Index: programs/regedit/childwnd.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/childwnd.c,v
retrieving revision 1.6
diff -u -r1.6 childwnd.c
--- programs/regedit/childwnd.c 16 Jan 2004 21:20:54 -0000 1.6
+++ programs/regedit/childwnd.c 14 Mar 2004 17:40:04 -0000
@@ -247,6 +247,20 @@
case NM_SETFOCUS:
pChildWnd->nFocusPanel = 1;
break;
+ case TVN_ENDLABELEDIT: {
+ HKEY hRootKey;
+ LPNMTVDISPINFO dispInfo = (LPNMTVDISPINFO)lParam;
+ LPCTSTR path = GetItemPath(pChildWnd->hTreeWnd, 0, &hRootKey);
+ BOOL res = RenameKey(hWnd, hRootKey, path, dispInfo->item.pszText);
+ if (res) {
+ TVITEMEX item;
+ item.mask = TVIF_HANDLE | TVIF_TEXT;
+ item.hItem = TreeView_GetSelection(pChildWnd->hTreeWnd);
+ item.pszText = dispInfo->item.pszText;
+ TreeView_SetItem(pChildWnd->hTreeWnd, &item);
+ }
+ return res;
+ }
default:
goto def;
}
Index: programs/regedit/edit.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/edit.c,v
retrieving revision 1.12
diff -u -r1.12 edit.c
--- programs/regedit/edit.c 12 Mar 2004 19:44:47 -0000 1.12
+++ programs/regedit/edit.c 14 Mar 2004 16:14:59 -0000
@@ -156,13 +156,12 @@
return NULL;
}
-BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath)
+BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPTSTR keyName)
{
BOOL result = FALSE;
LONG lRet = ERROR_SUCCESS;
HKEY retKey;
- TCHAR keyName[32];
- TCHAR newKey[COUNT_OF(keyName) - 4];
+ TCHAR newKey[MAX_NEW_KEY_LEN - 4];
int keyNum;
HKEY hKey;
@@ -340,3 +339,48 @@
RegCloseKey(hKey);
return result;
}
+
+
+BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName)
+{
+ LPTSTR parentPath = 0;
+ LPCTSTR srcSubKey = 0;
+ HKEY parentKey = 0;
+ HKEY destKey = 0;
+ BOOL result = FALSE;
+ LONG lRet;
+
+ if (!keyPath || !newName) return FALSE;
+
+ if (!strrchr(keyPath, '\\')) {
+ parentKey = hRootKey;
+ srcSubKey = keyPath;
+ } else {
+ parentPath = strdup(keyPath);
+ srcSubKey = strrchr(parentPath, '\\') + 1;
+ *((LPTSTR)srcSubKey - 1) = 0;
+ lRet = RegOpenKeyEx(hRootKey, parentPath, 0, KEY_READ | KEY_CREATE_SUB_KEY, &parentKey);
+ if (lRet != ERROR_SUCCESS) goto done;
+ }
+
+ lRet = RegCreateKey(parentKey, newName, &destKey);
+ if (lRet != ERROR_SUCCESS) goto done;
+
+ /* FIXME: SHCopyKey does not copy the security attributes */
+ lRet = SHCopyKey(parentKey, srcSubKey, destKey, 0);
+ if (lRet != ERROR_SUCCESS) goto done;
+
+ lRet = SHDeleteKey(hRootKey, keyPath);
+ if (lRet != ERROR_SUCCESS) goto done;
+
+ result = TRUE;
+
+done:
+ RegCloseKey(destKey);
+ if (parentKey) {
+ RegCloseKey(parentKey);
+ free(parentPath);
+ }
+ return result;
+}
+
Index: programs/regedit/framewnd.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/framewnd.c,v
retrieving revision 1.13
diff -u -r1.13 framewnd.c
--- programs/regedit/framewnd.c 12 Mar 2004 19:44:47 -0000 1.13
+++ programs/regedit/framewnd.c 14 Mar 2004 01:53:05 -0000
@@ -438,6 +438,7 @@
HKEY hKeyRoot = 0;
LPCTSTR keyPath;
LPCTSTR valueName;
+ TCHAR newKey[MAX_NEW_KEY_LEN];
DWORD valueType;
keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
@@ -458,9 +459,11 @@
PrintRegistryHive(hWnd, _T(""));
break;
case ID_EDIT_DELETE:
- if (GetFocus() == g_pChildWnd->hTreeWnd) {
+ if (keyPath == 0 || *keyPath == 0) {
+ MessageBeep(MB_ICONHAND);
+ } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
if (DeleteKey(hWnd, hKeyRoot, keyPath))
- ;/* FIXME: TreeView should be refreshed */
+ DeleteNode(g_pChildWnd->hTreeWnd, 0);
} else if (GetFocus() == g_pChildWnd->hListWnd) {
if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName))
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
@@ -474,8 +477,10 @@
CopyKeyName(hWnd, _T(""));
break;
case ID_EDIT_NEW_KEY:
- CreateKey(hWnd, hKeyRoot, keyPath);
- /* FIXME: TreeView should be refreshed */
+ if (CreateKey(hWnd, hKeyRoot, keyPath, newKey)) {
+ if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKey))
+ StartKeyRename(g_pChildWnd->hTreeWnd);
+ }
break;
case ID_EDIT_NEW_STRINGVALUE:
valueType = REG_SZ;
@@ -487,10 +492,19 @@
valueType = REG_DWORD;
/* fall through */
create_value:
- if (CreateValue(hWnd, hKeyRoot, keyPath, valueType))
+ if (CreateValue(hWnd, hKeyRoot, keyPath, valueType)) {
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
+ /* FIXME: start rename */
+ }
+ break;
case ID_EDIT_RENAME:
- StartValueRename(g_pChildWnd->hListWnd);
+ if (keyPath == 0 || *keyPath == 0) {
+ MessageBeep(MB_ICONHAND);
+ } else if (GetFocus() == g_pChildWnd->hTreeWnd) {
+ StartKeyRename(g_pChildWnd->hTreeWnd);
+ } else if (GetFocus() == g_pChildWnd->hListWnd) {
+ StartValueRename(g_pChildWnd->hListWnd);
+ }
break;
break;
case ID_REGISTRY_PRINTERSETUP:
Index: programs/regedit/listview.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/listview.c,v
retrieving revision 1.8
diff -u -r1.8 listview.c
--- programs/regedit/listview.c 16 Jan 2004 23:02:44 -0000 1.8
+++ programs/regedit/listview.c 13 Mar 2004 13:45:50 -0000
@@ -251,14 +251,13 @@
{
}
-BOOL StartValueRename(HWND hwndLV)
+HWND StartValueRename(HWND hwndLV)
{
int item;
item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED | LVNI_SELECTED);
- if (item < 0) return FALSE;
- if (!ListView_EditLabel(hwndLV, item)) return FALSE;
- return TRUE;
+ if (item < 0) return 0;
+ return ListView_EditLabel(hwndLV, item);
}
static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Index: programs/regedit/main.h
===================================================================
RCS file: /var/cvs/wine/programs/regedit/main.h,v
retrieving revision 1.16
diff -u -r1.16 main.h
--- programs/regedit/main.h 12 Mar 2004 19:44:47 -0000 1.16
+++ programs/regedit/main.h 14 Mar 2004 15:40:08 -0000
@@ -35,6 +35,8 @@
#define PM_MODIFYVALUE 0
#define PM_NEW 1
+#define MAX_NEW_KEY_LEN 128
+
extern HINSTANCE hInst;
/******************************************************************************/
@@ -89,7 +91,7 @@
/* listview.c */
extern HWND CreateListView(HWND hwndParent, int id);
extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath);
-extern BOOL StartValueRename(HWND hwndLV);
+extern HWND StartValueRename(HWND hwndLV);
extern LPCTSTR GetValueName(HWND hwndLV);
extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result);
extern BOOL IsDefaultValue(HWND hwndLV, int i);
@@ -98,13 +100,17 @@
extern HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, int id);
extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
+extern BOOL DeleteNode(HWND hwndTV, HTREEITEM hItem);
+extern HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPTSTR name);
+extern HWND StartKeyRename(HWND hwndTV);
/* edit.c */
-extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath);
+extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPTSTR newKeyName);
extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType);
extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName);
extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath);
extern BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName);
extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName);
+extern BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName);
#endif /* __MAIN_H__ */
Index: programs/regedit/treeview.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/treeview.c,v
retrieving revision 1.8
diff -u -r1.8 treeview.c
--- programs/regedit/treeview.c 20 Jan 2004 01:33:02 -0000 1.8
+++ programs/regedit/treeview.c 13 Mar 2004 13:46:15 -0000
@@ -102,6 +102,13 @@
return pathBuffer;
}
+BOOL DeleteNode(HWND hwndTV, HTREEITEM hItem)
+{
+ if (!hItem) hItem = TreeView_GetSelection(hwndTV);
+ if (!hItem) return FALSE;
+ return TreeView_DeleteItem(hwndTV, hItem);
+}
+
static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren)
{
TVITEM tvi;
@@ -120,6 +127,47 @@
return TreeView_InsertItem(hwndTV, &tvins);
}
+
+HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPTSTR name)
+{
+ TCHAR buf[MAX_NEW_KEY_LEN];
+ HTREEITEM hNewItem = 0;
+ TVITEMEX item;
+
+ if (!hItem) hItem = TreeView_GetSelection(hwndTV);
+ if (!hItem) return FALSE;
+ if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDEDONCE)) {
+ hNewItem = AddEntryToTree(hwndTV, hItem, name, 0, 0);
+ } else {
+ item.mask = TVIF_CHILDREN | TVIF_HANDLE;
+ item.hItem = hItem;
+ if (!TreeView_GetItem(hwndTV, &item)) return FALSE;
+ item.cChildren = 1;
+ if (!TreeView_SetItem(hwndTV, &item)) return FALSE;
+ }
+ TreeView_Expand(hwndTV, hItem, TVE_EXPAND);
+ if (!hNewItem) {
+ for(hNewItem = TreeView_GetChild(hwndTV, hItem); hNewItem; hNewItem = TreeView_GetNextSibling(hwndTV, hNewItem)) {
+ item.mask = TVIF_HANDLE | TVIF_TEXT;
+ item.hItem = hNewItem;
+ item.pszText = buf;
+ item.cchTextMax = COUNT_OF(buf);
+ if (!TreeView_GetItem(hwndTV, &item)) continue;
+ if (lstrcmp(name, item.pszText) == 0) break;
+ }
+ }
+ if (hNewItem) TreeView_SelectItem(hwndTV, hNewItem);
+
+ return hNewItem;
+}
+
+HWND StartKeyRename(HWND hwndTV)
+{
+ HTREEITEM hItem;
+
+ if(!(hItem = TreeView_GetSelection(hwndTV))) return 0;
+ return TreeView_EditLabel(hwndTV, hItem);
+}
static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName)
{
--
Dimi.
More information about the wine-patches
mailing list