[CHARMAP]
authorAmine Khaldi <amine.khaldi@reactos.org>
Sat, 21 Apr 2012 10:57:16 +0000 (10:57 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sat, 21 Apr 2012 10:57:16 +0000 (10:57 +0000)
* Implement LoadSettings() and SaveSettings(). Patch by Edijs Kolesnikovics with some minor changes by me.
See issue #6925 for more details.

svn path=/trunk/; revision=56382

reactos/base/applications/charmap/CMakeLists.txt
reactos/base/applications/charmap/charmap.c
reactos/base/applications/charmap/precomp.h
reactos/base/applications/charmap/settings.c [new file with mode: 0644]

index 7017fec..cb3878b 100644 (file)
@@ -6,13 +6,14 @@ list(APPEND SOURCE
     charmap.c
     lrgcell.c
     map.c
+    settings.c
     charmap.rc)
 
 add_executable(charmap ${SOURCE})
 
 set_module_type(charmap win32gui UNICODE)
 
-add_importlibs(charmap msvcrt user32 gdi32 comctl32 kernel32)
+add_importlibs(charmap advapi32 user32 gdi32 comctl32 msvcrt kernel32)
 
 add_pch(charmap precomp.h)
 
index 5b4b402..33d7351 100644 (file)
 
 #define ID_ABOUT    0x1
 
-typedef struct {
-    BOOL    IsAdvancedView;
-} SETTINGS;
-
 HINSTANCE hInstance;
-HWND      hCharmapDlg;
 HWND      hAdvancedDlg;
 HWND      hStatusWnd;
 HICON     hSmIcon;
 HICON     hBgIcon;
-SETTINGS  Settings;
 
 /* Font-enumeration callback */
 static
@@ -103,7 +97,7 @@ FillFontStyleComboList(HWND hwndCombo)
 }
 
 
-static
+extern
 VOID
 ChangeMapFont(HWND hDlg)
 {
@@ -464,6 +458,7 @@ PanelWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
         break;
 
     case WM_DESTROY:
+        SaveSettings();
         PostQuitMessage(0);
         return 0;
 
@@ -534,6 +529,7 @@ InitInstance(HINSTANCE hInst)
 
     if (hWnd != NULL)
     {
+        LoadSettings();
         ShowWindow(hWnd, SW_SHOW);
         UpdateWindow(hWnd);
     }
index 9825aa4..e59ad0d 100644 (file)
@@ -3,6 +3,8 @@
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
+#include <windowsx.h>
+#include <tchar.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <commctrl.h>
@@ -51,6 +53,12 @@ typedef struct {
     WCHAR ch;
 } MAPNOTIFY, *LPMAPNOTIFY;
 
+typedef struct {
+    BOOL IsAdvancedView;
+} SETTINGS;
+
+SETTINGS Settings;
+HWND hCharmapDlg;
 
 LRESULT CALLBACK LrgCellWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
@@ -59,4 +67,11 @@ VOID ShowAboutDlg(HWND hWndParent);
 BOOL RegisterMapClasses(HINSTANCE hInstance);
 VOID UnregisterMapClasses(HINSTANCE hInstance);
 
+/* charmap.c */
+extern VOID ChangeMapFont(HWND hDlg);
+
+/* settings.c */
+extern void LoadSettings(void);
+extern void SaveSettings(void);
+
 #endif /* __CHARMAP_PRECOMP_H */
diff --git a/reactos/base/applications/charmap/settings.c b/reactos/base/applications/charmap/settings.c
new file mode 100644 (file)
index 0000000..4eae8d9
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * PROJECT:     ReactOS Character Map
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        base/applications/charmap/settings.c
+ * PURPOSE:     save/load settings
+ * COPYRIGHT:   Copyright 2012 Edijs Kolesnikovics <terminedijs@yahoo.com>
+ *
+ */
+
+#include <precomp.h>
+
+
+const TCHAR g_szGeneralRegKey[] = _T("Software\\Microsoft\\CharMap");
+HWND hWnd;
+
+LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen)
+{
+    LONG lResult;
+    HKEY hSubKey = NULL;
+    DWORD cbData, dwType;
+
+    if (lpSubKey)
+    {
+        lResult = RegOpenKey(hKey, lpSubKey, &hSubKey);
+        if (lResult != ERROR_SUCCESS)
+            goto done;
+        hKey = hSubKey;
+    }
+
+    cbData = (dwBufferLen - 1) * sizeof(*pszBuffer);
+    lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData);
+    if (lResult != ERROR_SUCCESS)
+        goto done;
+    if (dwType != REG_SZ)
+    {
+        lResult = -1;
+        goto done;
+    }
+
+    pszBuffer[cbData / sizeof(*pszBuffer)] = _T('\0');
+
+done:
+    if (lResult != ERROR_SUCCESS)
+        pszBuffer[0] = _T('\0');
+    if (hSubKey)
+        RegCloseKey(hSubKey);
+    return lResult;
+}
+
+extern void LoadSettings(void)
+{
+    HKEY hKey = NULL;
+    int iItemIndex = -1;
+
+    if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
+    {
+        TCHAR szBuffer[MAX_PATH];
+        DWORD dwAdvanChecked;
+        unsigned long type = REG_DWORD, size = 1024;
+
+        /* Restore last selected font */
+        if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("Font"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
+        {
+            //Get combobox handle
+            hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
+
+            //Search for match and return index if match found
+            iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
+            if(iItemIndex != CB_ERR)
+            {
+                ComboBox_SetCurSel(hWnd, iItemIndex);
+                ChangeMapFont(hCharmapDlg);
+            }
+        }
+
+        /* Restore last selected character set */
+        if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("CodePage"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
+        {
+            //Get combobox handle
+            hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET);
+
+            iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
+            if(iItemIndex != CB_ERR)
+            {
+                ComboBox_SetCurSel(hWnd, iItemIndex);
+            }
+        }
+
+        RegQueryValueEx(hKey, _T("Advanced"), NULL, &type, (LPBYTE)&dwAdvanChecked, &size);
+        if(dwAdvanChecked == TRUE)
+            SendDlgItemMessage(hCharmapDlg, IDC_CHECK_ADVANCED, BM_CLICK, (dwAdvanChecked ? MF_CHECKED : MF_UNCHECKED), 0);
+
+    RegCloseKey(hKey);
+    }
+    else
+    {
+        /* Default font seems to be Arial */
+        hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
+
+        iItemIndex = ComboBox_FindStringExact(hWnd, -1, _T("Arial"));
+        if(iItemIndex != CB_ERR)
+        {
+            ComboBox_SetCurSel(hWnd, iItemIndex);
+            ChangeMapFont(hCharmapDlg);
+        }
+    }
+}
+
+extern void SaveSettings(void)
+{
+    HKEY hKey = NULL;
+
+    if (RegCreateKey(HKEY_CURRENT_USER, g_szGeneralRegKey, &hKey) == ERROR_SUCCESS)
+    {
+        if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS)
+        {
+            TCHAR szBuffer[MAX_PATH];
+
+            hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
+            ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
+
+            if(szBuffer != NULL && *szBuffer != '\0')
+                RegSetValueEx(hKey, _T("Font"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
+
+            hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET);
+            ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
+
+            if(szBuffer != NULL && *szBuffer != '\0')
+                RegSetValueEx(hKey, _T("CodePage"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
+
+            RegSetValueEx(hKey, _T("Advanced"), 0, REG_DWORD, (LPBYTE)&Settings.IsAdvancedView, (DWORD) sizeof(DWORD));
+
+            RegCloseKey(hKey);
+        }
+    }
+}