[RAPPS]
[reactos.git] / reactos / base / applications / rapps / winmain.c
index 9f6a0fc..a4e51ca 100644 (file)
@@ -8,20 +8,23 @@
 
 #include "rapps.h"
 
+#include <shellapi.h>
+
 HWND hMainWnd;
 HINSTANCE hInst;
 HIMAGELIST hImageTreeView = NULL;
 INT SelectedEnumType = ENUM_ALL_COMPONENTS;
 SETTINGS_INFO SettingsInfo;
 
-
 VOID
-FillDafaultSettings(PSETTINGS_INFO pSettingsInfo)
+FillDefaultSettings(PSETTINGS_INFO pSettingsInfo)
 {
     pSettingsInfo->bSaveWndPos = TRUE;
     pSettingsInfo->bUpdateAtStart = FALSE;
     pSettingsInfo->bLogEnabled = TRUE;
-    wcscpy(pSettingsInfo->szDownloadDir, L"C:\\Downloads");
+    StringCbCopyW(pSettingsInfo->szDownloadDir,
+                  sizeof(pSettingsInfo->szDownloadDir),
+                  L"C:\\Downloads");
     pSettingsInfo->bDelInstaller = FALSE;
 
     pSettingsInfo->Maximized = FALSE;
@@ -73,7 +76,7 @@ SaveSettings(HWND hwnd)
     if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"Software\\ReactOS\\rapps", 0, NULL,
         REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
     {
-        RegSetValueEx(hKey, L"Settings", 0, REG_BINARY, (LPBYTE)&SettingsInfo, sizeof(SETTINGS_INFO));
+        RegSetValueExW(hKey, L"Settings", 0, REG_BINARY, (LPBYTE)&SettingsInfo, sizeof(SETTINGS_INFO));
         RegCloseKey(hKey);
     }
 }
@@ -211,12 +214,14 @@ UpdateApplicationsList(INT EnumType)
 
     /* Destroy old image list */
     if (hImageListView)
-               ImageList_Destroy(hImageListView);
+        ImageList_Destroy(hImageListView);
 
     SelectedEnumType = EnumType;
 
     LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
-    swprintf(szBuffer1, szBuffer2, ListView_GetItemCount(hListView));
+    StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
+                    szBuffer2,
+                    ListView_GetItemCount(hListView));
     SetStatusBarText(szBuffer1);
 
     SetWelcomeText();
@@ -329,7 +334,9 @@ InitControls(HWND hwnd)
         InitCategoriesList();
 
         LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
-        swprintf(szBuffer1, szBuffer2, ListView_GetItemCount(hListView));
+        StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
+                        szBuffer2,
+                        ListView_GetItemCount(hListView));
         SetStatusBarText(szBuffer1);
         return TRUE;
     }
@@ -423,6 +430,11 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
             UpdateApplicationsList(-1);
             break;
 
+        case ID_RESETDB:
+            UpdateAppsDB();
+            UpdateApplicationsList(-1);
+            break;
+
         case ID_HELP:
             MessageBoxW(hwnd, L"Help not implemented yet", NULL, MB_OK);
             break;
@@ -626,21 +638,31 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
                 }
                 break;
 
-                case LVN_KEYDOWN:
+                case LVN_ITEMCHANGED:
                 {
-                    LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN) lParam;
+                    LPNMLISTVIEW pnic = (LPNMLISTVIEW) lParam;
 
-                    if (pnkd->hdr.hwndFrom == hListView)
+                    if (pnic->hdr.hwndFrom == hListView)
                     {
-                        INT ItemIndex = (INT) SendMessage(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
-
-                        if (pnkd->wVKey == VK_UP) ItemIndex -= 1;
-                        if (pnkd->wVKey == VK_DOWN) ItemIndex += 1;
+                        /* Check if this is a valid item
+                         * (technically, it can be also an unselect) */
+                        INT ItemIndex = pnic->iItem;
+                        if (ItemIndex == -1 ||
+                            ItemIndex >= ListView_GetItemCount(pnic->hdr.hwndFrom))
+                        {
+                            break;
+                        }
 
-                        if (IS_INSTALLED_ENUM(SelectedEnumType))
-                            ShowInstalledAppInfo(ItemIndex);
-                        if (IS_AVAILABLE_ENUM(SelectedEnumType))
-                            ShowAvailableAppInfo(ItemIndex);
+                        /* Check if the focus has been moved to another item */
+                        if ((pnic->uChanged & LVIF_STATE) &&
+                            (pnic->uNewState & LVIS_FOCUSED) &&
+                            !(pnic->uOldState & LVIS_FOCUSED))
+                        {
+                            if (IS_INSTALLED_ENUM(SelectedEnumType))
+                                ShowInstalledAppInfo(ItemIndex);
+                            if (IS_AVAILABLE_ENUM(SelectedEnumType))
+                                ShowAvailableAppInfo(ItemIndex);
+                        }
                     }
                 }
                 break;
@@ -717,6 +739,16 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
             return TRUE;
         }
 
+        case WM_SYSCOLORCHANGE:
+        {
+            /* Forward WM_SYSCOLORCHANGE to common controls */
+            SendMessage(hListView, WM_SYSCOLORCHANGE, 0, 0);
+            SendMessage(hTreeView, WM_SYSCOLORCHANGE, 0, 0);
+            SendMessage(hToolBar, WM_SYSCOLORCHANGE, 0, 0);
+            SendMessageW(hRichEdit, EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE));
+        }
+        break;
+
         case WM_DESTROY:
         {
             ShowWindow(hwnd, SW_HIDE);
@@ -745,19 +777,21 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
     WNDCLASSEXW WndClass = {0};
     WCHAR szWindowClass[] = L"ROSAPPMGR";
     WCHAR szWindowName[MAX_STR_LEN];
-    WCHAR szErrorText[MAX_STR_LEN];
     HANDLE hMutex = NULL;
     MSG Msg;
 
-    hInst = hInstance;
-
-    if (!IsUserAnAdmin())
+    switch (GetUserDefaultUILanguage())
     {
-        LoadStringW(hInst, IDS_USER_NOT_ADMIN, szErrorText, sizeof(szErrorText) / sizeof(WCHAR));
-        MessageBox(0, szErrorText, NULL, MB_OK | MB_ICONWARNING);
-        return 1;
+        case MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT):
+            SetProcessDefaultLayout(LAYOUT_RTL);
+            break;
+
+        default:
+            break;
     }
 
+    hInst = hInstance;
+
     hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
     if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
     {
@@ -772,7 +806,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
 
     if (!LoadSettings())
     {
-        FillDafaultSettings(&SettingsInfo);
+        FillDefaultSettings(&SettingsInfo);
     }
 
     InitLogs();
@@ -784,7 +818,6 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
     WndClass.lpszClassName = szWindowClass;
     WndClass.lpfnWndProc   = MainWindowProc;
     WndClass.hInstance     = hInstance;
-    WndClass.style         = CS_HREDRAW | CS_VREDRAW;
     WndClass.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
     WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
     WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);