- Get autochk, calc, cmd, devmgr, expand, format, gettype, hostname, lsass, msconfig...
[reactos.git] / reactos / subsys / system / regedit / main.c
index 30bc08f..7d12455 100644 (file)
  * 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 <commctrl.h>
-#include <accctrl.h>
-#include <unknwn.h>
-#include <stdlib.h>
-#include <tchar.h>
-#include <process.h>
-#include <stdio.h>
-#include <fcntl.h>
-
-#include "main.h"
-#include "hexedit.h"
-#include "security.h"
+#include <regedit.h>
 
 BOOL ProcessCmdLine(LPSTR lpCmdLine);
 
@@ -47,6 +34,7 @@ HMENU hMenuFrame;
 HMENU hPopupMenus = 0;
 UINT nClipboardFormat;
 LPCTSTR strClipboardFormat = _T("TODO: SET CORRECT FORMAT");
+const TCHAR g_szGeneralRegKey[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit");
 
 
 #define MAX_LOADSTRING  100
@@ -71,7 +59,9 @@ TCHAR szChildClass[MAX_LOADSTRING];
 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 {
     BOOL AclUiAvailable;
-    
+    HMENU hEditMenu;
+    TCHAR szBuffer[256];
+
     WNDCLASSEX wcFrame = {
                              sizeof(WNDCLASSEX),
                              CS_HREDRAW | CS_VREDRAW/*style*/,
@@ -107,7 +97,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
                          };
     ATOM hChildWndClass = RegisterClassEx(&wcChild); /* register child windows class */
     hChildWndClass = hChildWndClass; /* warning eater */
-    
+
     RegisterHexEditorClass(hInstance);
 
     hMenuFrame = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDIT_MENU));
@@ -115,13 +105,13 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 
     /* Initialize the Windows Common Controls DLL */
     InitCommonControls();
-    
+
+    hEditMenu = GetSubMenu(hMenuFrame, 1);
+
     AclUiAvailable = InitializeAclUiDll();
     if(!AclUiAvailable)
     {
-      HMENU hEditMenu;
       /* hide the Edit/Permissions... menu entry */
-      hEditMenu = GetSubMenu(hMenuFrame, 1);
       if(hEditMenu != NULL)
       {
         RemoveMenu(hEditMenu, ID_EDIT_PERMISSIONS, MF_BYCOMMAND);
@@ -130,12 +120,15 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
       }
     }
 
+    if(hEditMenu != NULL)
+        SetMenuDefaultItem(hEditMenu, ID_EDIT_MODIFY, MF_BYCOMMAND);
+
     nClipboardFormat = RegisterClipboardFormat(strClipboardFormat);
     /* if (nClipboardFormat == 0) {
         DWORD dwError = GetLastError();
     } */
 
-    hFrameWnd = CreateWindowEx(WS_EX_WINDOWEDGE, (LPCTSTR)(int)hFrameWndClass, szTitle,
+    hFrameWnd = CreateWindowEx(WS_EX_WINDOWEDGE, (LPCTSTR)(UlongToPtr(hFrameWndClass)), szTitle,
                                WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
                                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                                NULL, hMenuFrame, hInstance, NULL/*lpParam*/);
@@ -152,6 +145,15 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
         SetupStatusBar(hFrameWnd, FALSE);
         CheckMenuItem(GetSubMenu(hMenuFrame, ID_VIEW_MENU), ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
     }
+
+    /* Restore position */
+    if (RegQueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey,
+        _T("LastKey"),
+        szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS)
+    {
+        SelectNode(g_pChildWnd->hTreeWnd, szBuffer);
+    }
+
     ShowWindow(hFrameWnd, nCmdShow);
     UpdateWindow(hFrameWnd);
     return TRUE;
@@ -159,10 +161,20 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 
 /******************************************************************************/
 
+/* we need to destroy the main menu before destroying the main window
+   to avoid a memory leak */
+
+void DestroyMainMenu() {
+       DestroyMenu(hMenuFrame);
+}
+
+/******************************************************************************/
+
 void ExitInstance(HINSTANCE hInstance)
 {
     UnregisterHexEditorClass(hInstance);
-    DestroyMenu(hMenuFrame);
+    
+    DestroyMenu(hPopupMenus);
     UnloadAclUiDll();
 }
 
@@ -182,6 +194,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
 {
     MSG msg;
     HACCEL hAccel;
+
     /*
         int hCrt;
         FILE *hf;
@@ -190,7 +203,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
         hf = _fdopen(hCrt, "w");
         *stdout = *hf;
         setvbuf(stdout, NULL, _IONBF, 0);
-     
+
        wprintf(L"command line exit, hInstance = %d\n", hInstance);
        getch();
        FreeConsole();
@@ -213,16 +226,17 @@ int APIENTRY WinMain(HINSTANCE hInstance,
     if (!InitInstance(hInstance, nCmdShow)) {
         return FALSE;
     }
-    hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_REGEDIT);
+    hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCEL));
 
     /* Main message loop */
     while (GetMessage(&msg, (HWND)NULL, 0, 0)) {
-        if (!TranslateAccelerator(msg.hwnd, hAccel, &msg) 
+        if (!TranslateAccelerator(hFrameWnd, hAccel, &msg)
             && !TranslateChildTabMessage(&msg)) {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
     }
+    
     ExitInstance(hInstance);
     return msg.wParam;
 }