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