- Add some functionality
[reactos.git] / reactos / dll / cpl / input / settings.c
index fd25925..cefbd44 100644 (file)
 #include "resource.h"
 #include "input.h"
 
-#define BUFSIZE 80
+#define BUFSIZE 256
 
-static
-BOOL
-CreateDefaultLangList(HWND hWnd)
+static BOOL
+GetLayoutName(LPCTSTR lcid, LPCTSTR name)
 {
     HKEY hKey;
-    TCHAR szPreload[BUFSIZE];
-    TCHAR szCount[BUFSIZE];
-    TCHAR Lang[BUFSIZE];
     DWORD dwBufLen;
-    DWORD dwBufCLen;
-    DWORD cValues;
-    LONG lRet;
+    TCHAR szBuf[BUFSIZE];
+
+    _stprintf(szBuf, L"SYSTEM\\ControlSet001\\Control\\Keyboard Layouts\\%s",lcid);
+
+    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
+    {
+        dwBufLen = BUFSIZE;
+        if (RegQueryValueEx(hKey,L"Layout Text",NULL,NULL,(LPBYTE)name,&dwBufLen) == ERROR_SUCCESS)
+        {
+            RegCloseKey(hKey);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+static BOOL
+TreeView_GetItemText(HWND hTree, HTREEITEM hItem, LPTSTR name, DWORD buf)
+{
+    TVITEM tv = {0};
+
+    tv.mask = TVIF_TEXT | TVIF_HANDLE;
+    tv.hItem = hItem;
+    tv.pszText = name;
+    tv.cchTextMax = (int)buf;
+
+    return TreeView_GetItem(hTree, &tv);
+}
+
+static HTREEITEM
+GetRootHandle(HWND hWnd, TCHAR * Name)
+{
+    HTREEITEM hNext = 0, hRoot;
+    TCHAR Tmp[256];
+    HWND hTree;
+    DWORD i, count;
+    HKEY hKey;
+
+    hTree = GetDlgItem(hWnd, IDC_KEYLAYOUT_TREE);
+    hRoot = TreeView_GetRoot(hTree);
+
+    RegOpenKeyEx(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", 0, KEY_QUERY_VALUE, &hKey);
+    RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,&count,NULL,NULL,NULL,NULL);
+    RegCloseKey(hKey);
+
+    for (i = 0; i < count; i++)
+    {
+        if (i == 0)
+        {
+            (VOID) TreeView_GetItemText(hTree, hRoot, (LPTSTR)Tmp, 256);
+        }
+        else
+        {
+            if (i == 1)
+            {
+                hNext = TreeView_GetNextItem(hTree, hRoot, TVGN_NEXT);
+            }
+            else
+            {
+                hNext = TreeView_GetNextItem(hTree, hNext, TVGN_NEXT);
+            }
+            (VOID) TreeView_GetItemText(hTree, hNext, (LPTSTR)Tmp, 256);
+        }
+
+        if (_tcscmp(Name,Tmp) == 0)
+        {
+            if (i == 0) return hRoot;
+            return hNext;
+        }
+    }
+    return 0;
+}
+
+static BOOL
+InitDefaultLangList(HWND hWnd)
+{
+    HKEY hKey, hSubKey;
+    TCHAR szPreload[BUFSIZE], szCount[BUFSIZE], szSub[BUFSIZE];
+    TCHAR szName[BUFSIZE], Lang[BUFSIZE];
+    DWORD dwBufLen, dwBufCLen, cValues;
     INT Count;
     LCID Lcid;
+    TV_INSERTSTRUCT inc;
+    HWND TWwnd;
+    int Index[3];
+    HIMAGELIST hImgList;
+    HICON hIcon;
 
-    if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
-    {
+    ZeroMemory(&inc, sizeof(TV_INSERTSTRUCT));
+    inc.hInsertAfter = TVI_LAST;
+    inc.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE;
+    inc.hParent = TVI_ROOT;
+
+    hImgList = ImageList_Create(16,16,ILC_COLOR8 | ILC_MASK,5,5);
+    hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_KEYBOARD_ICO),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+    Index[0] = ImageList_AddIcon(hImgList,hIcon);
+    hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_MARKER_ICO),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+    Index[1] = ImageList_AddIcon(hImgList,hIcon);
+    hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_INFO_ICO),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+    Index[2] = ImageList_AddIcon(hImgList,hIcon);
+    DestroyIcon(hIcon);
+
+    TWwnd = GetDlgItem(hWnd, IDC_KEYLAYOUT_TREE);
+
+    if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
         return FALSE;
-    }
 
     RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,&cValues,NULL,NULL,NULL,NULL);
 
@@ -67,32 +160,98 @@ CreateDefaultLangList(HWND hWnd)
     {
         for (Count = 0; Count < cValues; Count++)
         {
-            szCount[0] = TEXT('\0');
+            szCount[0] = L'\0';
 
             dwBufCLen = BUFSIZE;
-            lRet = RegEnumValue(hKey,Count,(LPTSTR)szCount,&dwBufCLen,NULL,NULL,NULL,NULL);
+            RegEnumValue(hKey,Count,(LPTSTR)szCount,&dwBufCLen,NULL,NULL,NULL,NULL);
 
-            _stprintf(szCount,TEXT("%d"),Count + 1);
+            _stprintf(szCount,L"%d",Count + 1);
 
             dwBufLen = BUFSIZE;
             RegQueryValueEx(hKey,(LPTSTR)szCount,NULL,NULL,(LPBYTE)szPreload,&dwBufLen);
 
             Lcid = _tcstoul(szPreload, NULL, 16);
+            /* FIXME: If it is established more than one English layouts of the keyboard it is incorrectly determined Lang */
             GetLocaleInfo(Lcid, LOCALE_SLANGUAGE, (LPTSTR)Lang, sizeof(Lang));
 
-            SendMessage(hWnd,
-                        CB_ADDSTRING,
-                        0,
-                        (LPARAM)Lang);
+            if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Keyboard Layout\\Substitutes", 0, KEY_QUERY_VALUE, &hSubKey) != ERROR_SUCCESS)
+                return FALSE;
+
+            dwBufLen = BUFSIZE;
+            TCHAR szLOName[BUFSIZE], szBuf[BUFSIZE];
+            LONG Ret;
+            HTREEITEM hRoot = 0, hKeyBrd = 0, hParent;
+
+            Ret = RegQueryValueEx(hSubKey,(LPCTSTR)szPreload,NULL,NULL,(LPBYTE)szSub,&dwBufLen);
+            if (Ret == ERROR_SUCCESS) _tcscpy(szPreload, szSub);
+
+            GetLayoutName(szPreload,szLOName); 
+
+            hParent = GetRootHandle(hWnd, Lang);
+            if (hParent == 0)
+            {
+                inc.hParent = NULL;
+                inc.item.pszText = Lang;
+                inc.item.iImage = Index[2];
+                inc.item.iSelectedImage = Index[2];
+                if (Count == 0)
+                {
+                    inc.item.state = TVIS_BOLD;
+                    inc.item.stateMask = TVIS_BOLD;
+                }
+                else
+                {
+                    inc.item.state = !TVIS_BOLD;
+                    inc.item.stateMask = !TVIS_BOLD;
+                }
+                hRoot = TreeView_InsertItem(TWwnd, &inc);
+                if (Count == 0) (VOID) TreeView_SelectItem(TWwnd, hRoot);
+
+                LoadString(hApplet, IDS_KEYBOARD, (LPTSTR)szBuf, BUFSIZE);
+                inc.hParent = hRoot;
+                inc.item.pszText = szBuf;
+                inc.item.iImage = Index[0];
+                inc.item.iSelectedImage = Index[0];
+                inc.item.state = !TVIS_BOLD;
+                inc.item.stateMask = !TVIS_BOLD;
+                hKeyBrd = TreeView_InsertItem(TWwnd, &inc);
+                inc.hParent = hKeyBrd;
+            }
+            else
+            {
+                inc.hParent = TreeView_GetChild(TWwnd, hParent);
+            }
+
+            inc.item.pszText = szLOName;
+            inc.item.iImage = Index[1];
+            inc.item.iSelectedImage = Index[1];
             if (Count == 0)
             {
-                SendMessage(hWnd,
-                            CB_SELECTSTRING,
-                            (WPARAM)-1,
-                            (LPARAM)Lang);
+                inc.item.state = TVIS_BOLD;
+                inc.item.stateMask = TVIS_BOLD;
             }
-        }
+            else
+            {
+                inc.item.state = !TVIS_BOLD;
+                inc.item.stateMask = !TVIS_BOLD;
+            }
+            (VOID) TreeView_InsertItem(TWwnd, &inc);
+
+            (VOID) TreeView_SetImageList(TWwnd, hImgList, TVSIL_NORMAL);
+            (VOID) TreeView_Expand(TWwnd, hRoot, TVM_EXPAND);
+            (VOID) TreeView_Expand(TWwnd, hKeyBrd, TVM_EXPAND);
+
+            _stprintf(szName,L"%s - %s",Lang,szLOName);
 
+            RegCloseKey(hSubKey);
+
+            HWND CBwnd;
+            CBwnd = GetDlgItem(hWnd, IDC_DEFAULT_INPUT_LANG);
+            SendMessage(CBwnd,CB_ADDSTRING,0,(LPARAM)szName);
+            SendMessage(CBwnd,CB_SETITEMDATA,0,(LPARAM)Lcid);
+            if (Count == 0)
+                SendMessage(CBwnd,CB_SELECTSTRING,(WPARAM)-1,(LPARAM)szName);
+        }
     }
 
     RegCloseKey(hKey);
@@ -109,7 +268,7 @@ SettingPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
     switch (uMsg)
     {
         case WM_INITDIALOG:
-            CreateDefaultLangList(GetDlgItem(hwndDlg, IDC_DEFAULT_INPUT_LANG));
+            InitDefaultLangList(hwndDlg);
             break;
 
         case WM_COMMAND: