Regedit:  Implemented exporting specific branches
Modified: trunk/reactos/subsys/system/regedit/framewnd.c
Modified: trunk/reactos/subsys/system/regedit/regproc.c
Modified: trunk/reactos/subsys/system/regedit/regproc.h

Modified: trunk/reactos/subsys/system/regedit/framewnd.c
--- trunk/reactos/subsys/system/regedit/framewnd.c	2005-10-01 19:01:07 UTC (rev 18197)
+++ trunk/reactos/subsys/system/regedit/framewnd.c	2005-10-02 01:21:43 UTC (rev 18198)
@@ -294,31 +294,51 @@
 
 static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
 {
-    HWND hControl;
+    HWND hwndExportAll;
+    HWND hwndExportBranch;
+    HWND hwndExportBranchText;
     UINT_PTR iResult = 0;
+    OPENFILENAME *pOfn;
+    LPTSTR pszSelectedKey;
+    OFNOTIFY *pOfnNotify;
 
 	switch(uiMsg) {
 	case WM_INITDIALOG:
-        hControl = GetDlgItem(hdlg, IDC_EXPORT_ALL);
-        if (hControl)
-		{
-            EnableWindow(hControl, FALSE);
-            SendMessage(hControl, BM_SETCHECK, BST_CHECKED, 0);
-		}
+        pOfn = (OPENFILENAME *) lParam;
+        pszSelectedKey = (LPTSTR) pOfn->lCustData;
 
-        hControl = GetDlgItem(hdlg, IDC_EXPORT_BRANCH);
-        if (hControl)
-		{
-            EnableWindow(hControl, FALSE);
-            SendMessage(hControl, BM_SETCHECK, BST_UNCHECKED, 0);
-		}
+        hwndExportAll = GetDlgItem(hdlg, IDC_EXPORT_ALL);
+        if (hwndExportAll)
+			SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey[0] ? BST_UNCHECKED : BST_CHECKED, 0);
 
-        hControl = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT);
-        if (hControl)
-		{
-            EnableWindow(hControl, FALSE);
+        hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH);
+        if (hwndExportBranch)
+            SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey[0] ? BST_CHECKED : BST_UNCHECKED, 0);
+
+        hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT);
+        if (hwndExportBranchText)
+            SetWindowText(hwndExportBranchText, pszSelectedKey);
+        break;
+
+	case WM_NOTIFY:
+        if (((NMHDR *) lParam)->code == CDN_FILEOK)
+        {
+            pOfnNotify = (OFNOTIFY *) lParam;
+            pszSelectedKey = (LPTSTR) pOfnNotify->lpOFN->lCustData;
+
+            hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH);
+            hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT);
+            if (hwndExportBranch && hwndExportBranchText
+                && (SendMessage(hwndExportBranch, BM_GETCHECK, 0, 0) == BST_CHECKED))
+			{
+			    GetWindowText(hwndExportBranchText, pszSelectedKey, _MAX_PATH);
+			}
+			else
+			{
+			    pszSelectedKey[0] = '\0';
+			}
 		}
-		break;
+        break;
     }
     return iResult;
 }
@@ -328,12 +348,18 @@
     OPENFILENAME ofn;
     TCHAR ExportKeyPath[_MAX_PATH];
     TCHAR Caption[128];
+    HKEY hKeyRoot;
+    LPCTSTR pszKeyPath;
 
-    ExportKeyPath[0] = _T('\0');
+    /* Figure out which key path we are exporting */
+    pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
+    RegKeyGetName(ExportKeyPath, sizeof(ExportKeyPath) / sizeof(ExportKeyPath[0]),
+        hKeyRoot, pszKeyPath);
+
     InitOpenFileName(hWnd, &ofn);
     LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR));
     ofn.lpstrTitle = Caption;
-    /*    ofn.lCustData = ;*/
+    ofn.lCustData = (LPARAM) ExportKeyPath;
     ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK;
     ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
     ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE);

Modified: trunk/reactos/subsys/system/regedit/regproc.c
--- trunk/reactos/subsys/system/regedit/regproc.c	2005-10-01 19:01:07 UTC (rev 18197)
+++ trunk/reactos/subsys/system/regedit/regproc.c	2005-10-02 01:21:43 UTC (rev 18198)
@@ -1384,7 +1384,6 @@
     if (file) {
         fclose(file);
     }
-    HeapFree(GetProcessHeap(), 0, reg_key_name);
     HeapFree(GetProcessHeap(), 0, val_buf);
     return TRUE;
 }
@@ -1665,3 +1664,33 @@
     return lResult;
 }
 
+/******************************************************************************
+ * Key naming and parsing
+ */
+
+BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey)
+{
+    LPCTSTR pszRootKey;
+
+    if (hRootKey == HKEY_CLASSES_ROOT)
+        pszRootKey = TEXT("HKEY_CLASSES_ROOT");
+	else if (hRootKey == HKEY_CURRENT_USER)
+        pszRootKey = TEXT("HKEY_CURRENT_USER");
+	else if (hRootKey == HKEY_LOCAL_MACHINE)
+        pszRootKey = TEXT("HKEY_LOCAL_MACHINE");
+	else if (hRootKey == HKEY_USERS)
+        pszRootKey = TEXT("HKEY_USERS");
+	else if (hRootKey == HKEY_CURRENT_CONFIG)
+        pszRootKey = TEXT("HKEY_CURRENT_CONFIG");
+	else if (hRootKey == HKEY_DYN_DATA)
+        pszRootKey = TEXT("HKEY_DYN_DATA");
+    else
+        return FALSE;
+
+    if (lpSubKey[0])
+        _sntprintf(pszDest, iDestLength, TEXT("%s\\%s"), pszRootKey, lpSubKey);
+	else
+        _sntprintf(pszDest, iDestLength, TEXT("%s"), pszRootKey);
+    return TRUE;
+}
+

Modified: trunk/reactos/subsys/system/regedit/regproc.h
--- trunk/reactos/subsys/system/regedit/regproc.h	2005-10-01 19:01:07 UTC (rev 18197)
+++ trunk/reactos/subsys/system/regedit/regproc.h	2005-10-02 01:21:43 UTC (rev 18198)
@@ -91,4 +91,9 @@
 LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName);
 LONG RegRenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue);
 
+/*
+ * Miscellaneous
+ */
+BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey);
+
 /* EOF */