Regedit:  Optimized tree expansion
Modified: trunk/reactos/subsys/system/regedit/treeview.c

Modified: trunk/reactos/subsys/system/regedit/treeview.c
--- trunk/reactos/subsys/system/regedit/treeview.c	2005-09-28 23:52:24 UTC (rev 18144)
+++ trunk/reactos/subsys/system/regedit/treeview.c	2005-09-29 00:50:40 UTC (rev 18145)
@@ -123,7 +123,7 @@
     tvi.cChildren = dwChildren;
     tvi.lParam = (LPARAM)hKey;
     tvins.u.item = tvi;
-    tvins.hInsertAfter = (HTREEITEM)(hKey ? TVI_LAST : TVI_SORT);
+    tvins.hInsertAfter = (HTREEITEM)(hKey ? TVI_LAST : TVI_FIRST);
     tvins.hParent = hParent;
     return TreeView_InsertItem(hwndTV, &tvins);
 }
@@ -139,6 +139,7 @@
     LPTSTR pszNodes = NULL;
     BOOL bSuccess = FALSE;
     LPTSTR s;
+    BOOL bAddedAny;
 
     KeyPath = GetItemPath(hwndTV, hItem, &hRoot);
 
@@ -219,6 +220,7 @@
     }
 
     /* Now go through all the children in the registry, and check if any have to be added. */
+    bAddedAny = FALSE;
     for (dwIndex = 0; dwIndex < dwCount; dwIndex++) {
         DWORD cName = dwMaxSubKeyLen, dwSubCount;
         BOOL found;
@@ -249,10 +251,14 @@
             }
 
             AddEntryToTree(hwndTV, hItem, Name, NULL, dwSubCount);
+            bAddedAny = TRUE;
         }
     }
     RegCloseKey(hKey);
 
+    if (bAddedAny)
+        SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM) hItem);
+
     /* Now go through all the children in the tree, and check if any have to be removed. */
     childItem = TreeView_GetChild(hwndTV, hItem);
     while (childItem) {
@@ -306,6 +312,7 @@
     if (!hItem) return FALSE;
     if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDEDONCE)) {
 	hNewItem = AddEntryToTree(hwndTV, hItem, name, 0, 0);
+	SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM) hItem);
     } else {
 	item.mask = TVIF_CHILDREN | TVIF_HANDLE;
 	item.hItem = hItem;
@@ -514,6 +521,7 @@
     hNewItem = AddEntryToTree(hwndTV, hItem, szNewKey, NULL, 0);
     if (!hNewItem)
         goto done;
+    SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM) hItem);
     TreeView_EditLabel(hwndTV, hNewItem);
 
     bSuccess = TRUE;