[PATCH] regedit: Implement deleting multiple values

Andre Wisplinghoff andre.wisplinghoff at gmail.com
Thu Jul 10 07:30:27 CDT 2008


---
 programs/regedit/De.rc      |    1 +
 programs/regedit/En.rc      |    1 +
 programs/regedit/Fr.rc      |    1 +
 programs/regedit/edit.c     |    7 ++++---
 programs/regedit/framewnd.c |   23 +++++++++++++++++++++--
 programs/regedit/listview.c |    6 +++---
 programs/regedit/main.h     |    3 ++-
 programs/regedit/resource.h |    1 +
 8 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/programs/regedit/De.rc b/programs/regedit/De.rc
index 493b219..6df36ad 100644
--- a/programs/regedit/De.rc
+++ b/programs/regedit/De.rc
@@ -299,6 +299,7 @@ BEGIN
     IDS_TOO_BIG_VALUE       "Der Wert ist zu groß (%ld)"
     IDS_DELETE_BOX_TITLE    "Bitte bestätigen"
     IDS_DELETE_BOX_TEXT     "Wollen Sie '%s' wirklich löschen?"
+    IDS_DELETE_BOX_TEXT_MULTIPLE "Wollen Sie diese Werte wirklich löschen?"
     IDS_NEWKEY              "Neuer Schlüssel #%d"
     IDS_NEWVALUE            "Neuer Wert #%d"
     IDS_NOTFOUND            "Suchfolge '%s' wurde nicht gefunden."
diff --git a/programs/regedit/En.rc b/programs/regedit/En.rc
index e538c02..8cc37aa 100644
--- a/programs/regedit/En.rc
+++ b/programs/regedit/En.rc
@@ -371,6 +371,7 @@ BEGIN
     IDS_TOO_BIG_VALUE       "Value is too big (%ld)"
     IDS_DELETE_BOX_TITLE    "Confirm Value Delete"
     IDS_DELETE_BOX_TEXT     "Are you sure you want to delete value '%s'?"
+    IDS_DELETE_BOX_TEXT_MULTIPLE "Are you sure you want to delete these values?"
     IDS_NEWKEY              "New Key #%d"
     IDS_NEWVALUE            "New Value #%d"
     IDS_NOTFOUND            "Search string '%s' not found"
diff --git a/programs/regedit/Fr.rc b/programs/regedit/Fr.rc
index fc455f0..079457f 100644
--- a/programs/regedit/Fr.rc
+++ b/programs/regedit/Fr.rc
@@ -294,6 +294,7 @@ BEGIN
     IDS_TOO_BIG_VALUE       "La valeur est trop grande (%ld)"
     IDS_DELETE_BOX_TITLE    "Confirmez l'effacement de valeur"
     IDS_DELETE_BOX_TEXT     "Êtes vous sûr vous voulez supprimer la valeur '%s'?"
+    IDS_DELETE_BOX_TEXT_MULTIPLE "Êtes vous sûr vous voulez supprimer cette valeurs?"
     IDS_NEWKEY              "Nouvelle Clé #%d"
     IDS_NEWVALUE            "Nouvelle Valeur #%d"
     IDS_NOTFOUND            "Occurence de '%s' non trouvée"
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c
index 5135dea..954e647 100644
--- a/programs/regedit/edit.c
+++ b/programs/regedit/edit.c
@@ -413,7 +413,7 @@ done:
     return result;
 }
 
-BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName)
+BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName, BOOL showMessageBox)
 {
     BOOL result = FALSE;
     LONG lRet;
@@ -423,8 +423,9 @@ BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName)
     lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey);
     if (lRet != ERROR_SUCCESS) return FALSE;
 
-    if (messagebox(hwnd, MB_YESNO | MB_ICONEXCLAMATION, IDS_DELETE_BOX_TITLE, IDS_DELETE_BOX_TEXT, visibleValueName) != IDYES)
-	goto done;
+    if (showMessageBox)
+        if (messagebox(hwnd, MB_YESNO | MB_ICONEXCLAMATION, IDS_DELETE_BOX_TITLE, IDS_DELETE_BOX_TEXT, visibleValueName) != IDYES)
+	        goto done;
 
     lRet = RegDeleteValue(hKey, valueName ? valueName : "");
     if (lRet != ERROR_SUCCESS && valueName) {
diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c
index fd20a62..b754096 100644
--- a/programs/regedit/framewnd.c
+++ b/programs/regedit/framewnd.c
@@ -619,9 +619,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     LPCTSTR valueName;
     TCHAR newKey[MAX_NEW_KEY_LEN];
     DWORD valueType;
+    int curIndex;
+    BOOL firstItem = TRUE;
 
     keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
-    valueName = GetValueName(g_pChildWnd->hListWnd);
 
     if (LOWORD(wParam) >= ID_FAVORITE_FIRST && LOWORD(wParam) <= ID_FAVORITE_LAST) {
         HKEY hKey;
@@ -664,11 +665,29 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 		DeleteNode(g_pChildWnd->hTreeWnd, 0);
             }
 	} else if (GetFocus() == g_pChildWnd->hListWnd) {
-	    if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName))
+        curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED);
+        while(curIndex != -1) {
+            valueName = GetItemText(g_pChildWnd->hListWnd, curIndex);
+            curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED);
+            if(curIndex != -1 && firstItem) {
+                TCHAR title[256];
+                TCHAR text[1024];
+                if(!LoadString(hInst, IDS_DELETE_BOX_TITLE, title, COUNT_OF(title)))
+                    lstrcpy(title, "Error");
+                if(!LoadString(hInst, IDS_DELETE_BOX_TEXT_MULTIPLE, text, COUNT_OF(text)))
+                    lstrcpy(text, "Unknown error string!");
+                if (MessageBox(hWnd, text, title, MB_YESNO | MB_ICONEXCLAMATION) != IDYES)
+                    break;
+            }
+            if (!DeleteValue(hWnd, hKeyRoot, keyPath, valueName, curIndex==-1 && firstItem))
+                break;
+            firstItem = FALSE;
+        }
 		RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
 	}
         break;
     case ID_EDIT_MODIFY:
+        valueName = GetValueName(g_pChildWnd->hListWnd);
         if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
             RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
         break;
diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c
index 4e2010f..ebb456a 100644
--- a/programs/regedit/listview.c
+++ b/programs/regedit/listview.c
@@ -54,7 +54,7 @@ static TCHAR g_szValueNotSet[64];
 static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
 static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT };
 
-static LPTSTR get_item_text(HWND hwndLV, int item)
+LPTSTR GetItemText(HWND hwndLV, UINT item)
 {
     LPTSTR newStr, curStr;
     unsigned int maxLen = 128;
@@ -88,7 +88,7 @@ LPCTSTR GetValueName(HWND hwndLV)
     item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED);
     if (item == -1) return NULL;
 
-    g_valueName = get_item_text(hwndLV, item);
+    g_valueName = GetItemText(hwndLV, item);
 
     return g_valueName;
 }
@@ -391,7 +391,7 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
             break;
 	case LVN_ENDLABELEDIT: {
 	        LPNMLVDISPINFO dispInfo = (LPNMLVDISPINFO)lParam;
-		LPTSTR valueName = get_item_text(hWnd, dispInfo->item.iItem);
+		LPTSTR valueName = GetItemText(hWnd, dispInfo->item.iItem);
                 LONG ret;
                 if (!valueName) return -1; /* cannot rename a default value */
 	        ret = RenameValue(hWnd, g_currentRootKey, g_currentPath, valueName, dispInfo->item.pszText);
diff --git a/programs/regedit/main.h b/programs/regedit/main.h
index 0c39101..7547ea0 100644
--- a/programs/regedit/main.h
+++ b/programs/regedit/main.h
@@ -109,6 +109,7 @@ extern void UpdateStatusBar(void);
 extern HWND CreateListView(HWND hwndParent, UINT id);
 extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highlightValue);
 extern HWND StartValueRename(HWND hwndLV);
+extern LPTSTR GetItemText(HWND hwndLV, UINT item);
 extern LPCTSTR GetValueName(HWND hwndLV);
 extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result);
 extern BOOL IsDefaultValue(HWND hwndLV, int i);
@@ -129,7 +130,7 @@ extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPTSTR newKeyNa
 extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType, LPTSTR valueName);
 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 DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName, BOOL showMessageBox);
 extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName);
 extern BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName);
 extern void error(HWND hwnd, INT resId, ...);
diff --git a/programs/regedit/resource.h b/programs/regedit/resource.h
index 711dada..c3b8456 100644
--- a/programs/regedit/resource.h
+++ b/programs/regedit/resource.h
@@ -121,6 +121,7 @@
 #define IDS_DELETE_BOX_TITLE		32840
 #define IDS_DELETE_BOX_TEXT		32841
 #define IDS_NOTFOUND    		32842
+#define IDS_DELETE_BOX_TEXT_MULTIPLE	32843
 #define IDD_EDIT_DWORD			32850
 #define IDC_DWORD_BASE			32852
 #define IDC_DWORD_HEX			32853
-- 
1.5.6.2


--------------000704050602000906000308--



More information about the wine-patches mailing list