regedit: write support for strings

Dimitrie O. Paun dpaun at rogers.com
Mon Dec 1 15:51:14 CST 2003


Well,

I figured I should so something a bit more "useful" (in light of
the 0.9 release), so here is the first attempt. It's not too much,
and not too good, but after looking at the code, it needs some
major cleanup before I can do any work on it. So the plan is:
  -- get this in the tree, so I can cleanup my tree
  -- cleanup the code (proper indentation, etc)
  -- add more edit support to it.

ChangeLog
    Add support for editing strings.

Index: programs/regedit/En.rc
===================================================================
RCS file: /var/cvs/wine/programs/regedit/En.rc,v
retrieving revision 1.2
diff -u -r1.2 En.rc
--- programs/regedit/En.rc	30 Aug 2003 00:17:33 -0000	1.2
+++ programs/regedit/En.rc	1 Dec 2003 18:10:21 -0000
@@ -119,6 +119,20 @@
     DEFPUSHBUTTON   "OK",IDOK,195,6,30,11,WS_GROUP
 END
 
+IDD_EDIT_STRING DIALOG DISCARDABLE  22, 17, 210, 75
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Edit String"
+FONT 8, "System"
+BEGIN
+    LTEXT           "Value name:",IDC_STATIC,5,5,119,8
+    EDITTEXT        IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | WS_DISABLED
+    LTEXT           "Value data:",IDC_STATIC,5,30,119,8
+    EDITTEXT        IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP
+    DEFPUSHBUTTON   "OK",IDOK,140,60,30,11,WS_GROUP
+    DEFPUSHBUTTON   "Cancel",IDCANCEL,175,60,30,11,WS_GROUP
+END
+
+
 /*
  * String Table
  */
@@ -179,6 +193,14 @@
     ID_EDIT_COPYKEYNAME     "Copies the name of the selected key to the clipboard"
     ID_EDIT_FIND            "Finds a text string in a key, value or data"
     ID_EDIT_FINDNEXT        "Finds next occurrence of text specified in previous search"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    IDS_ERROR		    "Error"
+    IDS_BAD_VALUE           "Can't query value '%s'"
+    IDS_UNSUPPORTED_TYPE    "Can't edit keys of this type (%ld)"
+    IDS_TOO_BIG_VALUE       "Value is too big (%ld)"
 END
 
 /*****************************************************************/
Index: programs/regedit/Makefile.in
===================================================================
RCS file: /var/cvs/wine/programs/regedit/Makefile.in,v
retrieving revision 1.12
diff -u -r1.12 Makefile.in
--- programs/regedit/Makefile.in	4 Oct 2003 04:21:19 -0000	1.12
+++ programs/regedit/Makefile.in	29 Nov 2003 06:25:29 -0000
@@ -11,6 +11,7 @@
 C_SRCS = \
 	about.c \
 	childwnd.c \
+	edit.c \
 	framewnd.c \
 	listview.c \
 	main.c \
Index: programs/regedit/childwnd.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/childwnd.c,v
retrieving revision 1.1
diff -u -r1.1 childwnd.c
--- programs/regedit/childwnd.c	7 Aug 2003 03:10:13 -0000	1.1
+++ programs/regedit/childwnd.c	1 Dec 2003 07:07:22 -0000
@@ -22,16 +22,16 @@
 #include <windows.h>
 #include <tchar.h>
 #include <commctrl.h>
-#include <assert.h>
-#define ASSERT assert
 
 #include "main.h"
 
+ChildWnd* pChildWnd;
 
 /*******************************************************************************
  * Local module support methods
  */
 
+//FIXME: why do we need this, we should remove it, we have already FindRegRoot
 static void MakeFullRegPath(HWND hwndTV, HTREEITEM hItem, LPTSTR keyPath, int* pPathLen, int max)
 {
     TVITEM item;
@@ -128,12 +128,11 @@
 {
     static int last_split;
 /*    ChildWnd* pChildWnd = (ChildWnd*)GetWindowLong(hWnd, GWL_USERDATA); */
-    static ChildWnd* pChildWnd;
 
     switch (message) {
     case WM_CREATE:
         pChildWnd = (ChildWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
-        ASSERT(pChildWnd);
+	if (!pChildWnd) return 0;
         pChildWnd->nSplitPos = 250;
         pChildWnd->hTreeWnd = CreateTreeView(hWnd, pChildWnd->szPath, TREE_WINDOW);
         pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, pChildWnd->szPath*/);
Index: programs/regedit/framewnd.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/framewnd.c,v
retrieving revision 1.1
diff -u -r1.1 framewnd.c
--- programs/regedit/framewnd.c	7 Aug 2003 03:10:13 -0000	1.1
+++ programs/regedit/framewnd.c	1 Dec 2003 18:25:37 -0000
@@ -30,6 +30,7 @@
 #include <shellapi.h>
 
 #include "main.h"
+#include "edit.h"
 #include "regproc.h"
 
 /********************************************************************************
@@ -436,6 +437,19 @@
  */
 static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
+    HKEY hKeyRoot, hKey;
+    TCHAR keyPath[1000] = { 0 };
+    TCHAR valueName[255] = { 0 };
+    int keyPathLen = 0, item;
+    BOOL result = TRUE;
+    LONG lRet;
+
+    hKeyRoot = FindRegRoot(pChildWnd->hTreeWnd, 0, keyPath, &keyPathLen, sizeof(keyPath)/sizeof(TCHAR));
+    lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ, &hKey);
+    if (lRet != ERROR_SUCCESS) hKey = 0;
+    item = ListView_GetNextItem(pChildWnd->hListWnd, -1, LVNI_FOCUSED);
+    if (item != -1) ListView_GetItemText(pChildWnd->hListWnd, item, 0, valueName, sizeof(valueName)/sizeof(TCHAR));
+
 	switch (LOWORD(wParam)) {
     /* Parse the menu selections:*/
     case ID_REGISTRY_IMPORTREGISTRYFILE:
@@ -451,6 +465,10 @@
     case ID_REGISTRY_PRINT:
         PrintRegistryHive(hWnd, _T(""));
         break;
+    case ID_EDIT_MODIFY:
+	if (ModifyValue(hWnd, hKey, valueName))
+	    RefreshListView(pChildWnd->hListWnd, hKeyRoot, keyPath);
+	break;
     case ID_EDIT_COPYKEYNAME:
         CopyKeyName(hWnd, _T(""));
         break;
@@ -486,9 +504,11 @@
 #endif
         break;
     default:
-        return FALSE;
+        result = FALSE;
     }
-	return TRUE;
+
+    RegCloseKey(hKey);
+    return result;
 }
 
 /********************************************************************************
Index: programs/regedit/main.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/main.c,v
retrieving revision 1.3
diff -u -r1.3 main.c
--- programs/regedit/main.c	26 Nov 2003 04:09:00 -0000	1.3
+++ programs/regedit/main.c	1 Dec 2003 21:30:23 -0000
@@ -100,6 +100,8 @@
     d(GetMessageA)
     d(GetSubMenu)
     d(GetSystemMetrics)
+    d(GetWindowTextA)
+    d(GetWindowTextLengthA)
     d(InvertRect)
     d(IsWindowVisible)
     d(LoadAcceleratorsA)
@@ -110,6 +112,7 @@
     d(LoadMenuA)
     d(LoadStringA)
     d(MessageBeep)
+    d(MessageBoxA)
     d(MoveWindow)
     d(OpenClipboard)
     d(PostQuitMessage)
@@ -121,6 +124,7 @@
     d(SendMessageA)
     d(SetCapture)
     d(SetCursor)
+    d(SetDlgItemTextA)
     d(SetFocus)
     d(SetWindowLongA)
     d(SetWindowTextA)
Index: programs/regedit/main.h
===================================================================
RCS file: /var/cvs/wine/programs/regedit/main.h,v
retrieving revision 1.4
diff -u -r1.4 main.h
--- programs/regedit/main.h	26 Nov 2003 04:09:00 -0000	1.4
+++ programs/regedit/main.h	1 Dec 2003 21:14:18 -0000
@@ -59,6 +59,7 @@
 	WINDOWPLACEMENT pos;
 	TCHAR	szPath[MAX_PATH];
 } ChildWnd;
+extern ChildWnd* pChildWnd;
 
 /*******************************************************************************
  * Global Variables:
@@ -126,6 +127,8 @@
 d(GetStockObject)
 d(GetSubMenu)
 d(GetSystemMetrics)
+d(GetWindowTextA)
+d(GetWindowTextLengthA)
 d(ImageList_Add)
 d(ImageList_Create)
 d(ImageList_GetImageCount)
@@ -140,6 +143,7 @@
 d(LoadMenuA)
 d(LoadStringA)
 d(MessageBeep)
+d(MessageBoxA)
 d(MoveWindow)
 d(OpenClipboard)
 d(PostQuitMessage)
@@ -152,6 +156,7 @@
 d(SendMessageA)
 d(SetCapture)
 d(SetCursor)
+d(SetDlgItemTextA)
 d(SetFocus)
 d(SetWindowLongA)
 d(SetWindowTextA)
@@ -197,6 +202,8 @@
 #define GetStockObject pGetStockObject
 #define GetSubMenu pGetSubMenu
 #define GetSystemMetrics pGetSystemMetrics
+#define GetWindowTextA pGetWindowTextA
+#define GetWindowTextLengthA pGetWindowTextLengthA
 #define ImageList_Add pImageList_Add
 #define ImageList_Create pImageList_Create
 #define ImageList_GetImageCount pImageList_GetImageCount
@@ -211,6 +218,7 @@
 #define LoadMenuA pLoadMenuA
 #define LoadStringA pLoadStringA
 #define MessageBeep pMessageBeep
+#define MessageBoxA pMessageBoxA
 #define MoveWindow pMoveWindow
 #define OpenClipboard pOpenClipboard
 #define PostQuitMessage pPostQuitMessage
@@ -223,6 +231,7 @@
 #define SendMessageA pSendMessageA
 #define SetCapture pSetCapture
 #define SetCursor pSetCursor
+#define SetDlgItemTextA pSetDlgItemTextA
 #define SetFocus pSetFocus
 #define SetWindowLongA pSetWindowLongA
 #define SetWindowTextA pSetWindowTextA
Index: programs/regedit/resource.h
===================================================================
RCS file: /var/cvs/wine/programs/regedit/resource.h,v
retrieving revision 1.1
diff -u -r1.1 resource.h
--- programs/regedit/resource.h	7 Aug 2003 03:10:13 -0000	1.1
+++ programs/regedit/resource.h	1 Dec 2003 18:11:06 -0000
@@ -102,4 +102,13 @@
 #define ID_REGISTRY_PRINTERSETUP        32833
 #define ID_REGISTRY_SAVESUBTREEAS       32834
 #define IDS_LICENSE                     32835
+#define IDS_ERROR                       32836
+#define IDS_BAD_VALUE			32837
+#define IDS_UNSUPPORTED_TYPE		32838
+#define IDS_TOO_BIG_VALUE		32839
+
+#define IDD_EDIT_STRING			2000
+#define IDC_VALUE_NAME			2001
+#define IDC_VALUE_DATA			2002
+
 #define IDC_STATIC                      -1
Index: programs/regedit/treeview.c
===================================================================
RCS file: /var/cvs/wine/programs/regedit/treeview.c,v
retrieving revision 1.2
diff -u -r1.2 treeview.c
--- programs/regedit/treeview.c	8 Aug 2003 21:03:39 -0000	1.2
+++ programs/regedit/treeview.c	1 Dec 2003 06:55:30 -0000
@@ -48,6 +48,9 @@
 {
     HKEY hKey = NULL;
     TVITEM item;
+
+    if (!hItem) hItem = TreeView_GetSelection(hwndTV);
+
     item.mask = TVIF_PARAM;
     item.hItem = TreeView_GetParent(hwndTV, hItem);
 
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ programs/regedit/edit.h	2003-12-01 11:45:38.000000000 -0500
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2003 Dimitrie O. Paun
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define COUNT_OF(a) (sizeof(a)/sizeof(a[0]))
+
+BOOL ModifyValue(HWND hwnd, HKEY hKey, LPTSTR valueName);
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ programs/regedit/edit.c	2003-12-01 16:27:57.000000000 -0500
@@ -0,0 +1,142 @@
+/*
+ * Registry editing UI functions.
+ *
+ * Copyright (C) 2003 Dimitrie O. Paun
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define WIN32_LEAN_AND_MEAN     /* Exclude rarely-used stuff from Windows headers */
+
+#include <windows.h>
+#include <tchar.h>
+#include <commctrl.h>
+#include <commdlg.h>
+#include <cderr.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <shellapi.h>
+
+#include "edit.h"
+#include "main.h"
+#include "regproc.h"
+#include "resource.h"
+
+static TCHAR* editValueName;
+static TCHAR* stringValueData;
+
+void error(HWND hwnd, INT resId, ...)
+{
+    va_list ap;
+    TCHAR title[256];
+    TCHAR errfmt[1024];
+    TCHAR errstr[1024];
+    HINSTANCE hInstance;
+
+    hInstance = GetModuleHandle(0);
+
+    if (!LoadString(hInstance, IDS_ERROR, title, COUNT_OF(title)))
+	lstrcpy(title, "Error");
+
+    if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt)))
+	lstrcpy(errfmt, "Unknown error string!");
+
+    va_start(ap, resId);
+    _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap);
+    va_end(ap);
+
+    MessageBox(hwnd, errstr, title, MB_OK | MB_ICONERROR);
+}
+
+INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    TCHAR* valueData;
+    HWND hwndValue;
+    int len;
+
+    switch(uMsg)
+    {
+	case WM_INITDIALOG:
+	    SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+	    SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
+	    return TRUE;
+        case WM_COMMAND: 
+            switch (LOWORD(wParam)) 
+            { 
+                case IDOK:
+		    if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
+		    {
+		        if ((len = GetWindowTextLength(hwndValue))) 
+			{
+			    if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR))))
+			    {
+				stringValueData = valueData;
+				if (!GetWindowText(hwndValue, stringValueData, len + 1))
+				    *stringValueData = 0;
+			    }
+			}
+		    }
+                    /* Fall through */
+                case IDCANCEL: 
+                    EndDialog(hwndDlg, wParam); 
+                    return TRUE; 
+            } 
+    }
+    return FALSE;
+}
+
+BOOL ModifyValue(HWND hwnd, HKEY hKey, LPTSTR valueName)
+{
+    DWORD valueDataLen;
+    DWORD type;
+    LONG lRet;
+    BOOL result = FALSE;
+
+    if (!hKey || !valueName) return FALSE;
+
+    editValueName = valueName;
+
+    lRet = RegQueryValueEx(hKey, valueName, 0, &type, 0, &valueDataLen);
+    if (lRet != ERROR_SUCCESS) {
+	error(hwnd, IDS_BAD_VALUE, valueName);
+	goto done;
+    }
+
+    if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) {
+	if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) {
+	    error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
+	    goto done;
+	}
+        lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen);
+	if (lRet != ERROR_SUCCESS) {
+	    error(hwnd, IDS_BAD_VALUE, valueName);
+	    goto done;
+	}
+	if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) {
+	    lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1);
+	    if (lRet == ERROR_SUCCESS) result = TRUE;
+	}
+    } else if ( type == REG_DWORD ) {
+	MessageBox(hwnd, "Can't edit dwords for now", "Error", MB_OK | MB_ICONERROR);
+    } else {
+	error(hwnd, IDS_UNSUPPORTED_TYPE, type);
+    }
+
+done:
+    HeapFree(GetProcessHeap(), 0, stringValueData);
+    stringValueData = NULL;
+
+    return result;
+}


-- 
Dimi.




More information about the wine-patches mailing list