[RAPPS] Improvements & multiple selections
authorAlexander Shaposhnikov <sanchaez@reactos.org>
Thu, 20 Jul 2017 22:57:48 +0000 (22:57 +0000)
committerAlexander Shaposhnikov <sanchaez@reactos.org>
Thu, 20 Jul 2017 22:57:48 +0000 (22:57 +0000)
- Improved translations view - storing LCIDs now
- Added checkboxes on list view and Select All button (although they do nothing just yet)
- Made download dialogs nonmodal (yay, download and install multiple apps at once!)
- Minor code improvements

svn path=/branches/GSoC_2017/rapps/; revision=75384

reactos/base/applications/rapps/available.cpp
reactos/base/applications/rapps/gui.cpp
reactos/base/applications/rapps/lang/en-US.rc
reactos/base/applications/rapps/loaddlg.cpp
reactos/base/applications/rapps/rapps.h
reactos/base/applications/rapps/rapps.rc
reactos/base/applications/rapps/resource.h
reactos/base/applications/rapps/winmain.cpp

index 95ad915..5c9ca6d 100644 (file)
@@ -84,23 +84,30 @@ VOID CAvailableApplicationInfo::RetrieveLanguages()
 
     // Parse parameter string
     ATL::CStringW m_szLocale;
+    int iLCID;
     for (INT i = 0; szBuffer[i] != UNICODE_NULL; ++i)
     {
-        if (szBuffer[i] != cDelimiter)
+        if (szBuffer[i] != cDelimiter && szBuffer[i] != L'\n')
         {
             m_szLocale += szBuffer[i];
         }
         else
         {
-            Languages.Add(m_szLocale);
-            m_szLocale.Empty();
+            if (StrToIntExW(m_szLocale.GetString(), STIF_DEFAULT, &iLCID))
+            {
+                Languages.Add(static_cast<LCID>(iLCID));
+                m_szLocale.Empty();
+            }
         }
     }
 
     // For the text after delimiter
     if (!m_szLocale.IsEmpty())
     {
-        Languages.Add(m_szLocale);
+        if (StrToIntExW(m_szLocale.GetString(), STIF_DEFAULT, &iLCID))
+        {
+            Languages.Add(static_cast<LCID>(iLCID));
+        }
     }
 
     m_HasLanguageInfo = TRUE;
@@ -120,12 +127,7 @@ VOID CAvailableApplicationInfo::RetrieveLicenseType()
     }
 }
 
-BOOL CAvailableApplicationInfo::HasLanguageInfo() const
-{
-    return m_HasLanguageInfo;
-}
-
-BOOL CAvailableApplicationInfo::HasNativeLanguage() const
+BOOL CAvailableApplicationInfo::FindInLanguages(LCID what) const
 {
     if (!m_HasLanguageInfo)
     {
@@ -136,7 +138,7 @@ BOOL CAvailableApplicationInfo::HasNativeLanguage() const
     const INT nLanguagesSize = Languages.GetSize();
     for (INT i = 0; i < nLanguagesSize; ++i)
     {
-        if (Languages[i] == CConfigParser::GetLocale())
+        if (Languages[i] == what)
         {
             return TRUE;
         }
@@ -145,39 +147,19 @@ BOOL CAvailableApplicationInfo::HasNativeLanguage() const
     return FALSE;
 }
 
-BOOL CAvailableApplicationInfo::HasEnglishLanguage() const
+BOOL CAvailableApplicationInfo::HasLanguageInfo() const
 {
-    static ATL::CStringW szEnglishLocaleID;
-    const INT cchLocaleSize = m_Parser.GetLocaleSize();
-    if (!m_HasLanguageInfo)
-    {
-        return FALSE;
-    }
-
-    //Get English locale code
-    if (szEnglishLocaleID.IsEmpty())
-    {
-        INT result = GetLocaleInfoW(MAKELCID(LANG_ENGLISH, SORT_DEFAULT), LOCALE_ILANGUAGE,
-                                    szEnglishLocaleID.GetBuffer(cchLocaleSize), cchLocaleSize);
-        szEnglishLocaleID.ReleaseBuffer();
-        if (result != ERROR_SUCCESS)
-        {
-            return FALSE;
-        }
-
-    }
+    return m_HasLanguageInfo;
+}
 
-    //Find locale code in the list
-    const INT nLanguagesSize = Languages.GetSize();
-    for (INT i = 0; i < nLanguagesSize; ++i)
-    {
-        if (Languages[i] == szEnglishLocaleID)
-        {
-            return TRUE;
-        }
-    }
+BOOL CAvailableApplicationInfo::HasNativeLanguage() const
+{
+    return FindInLanguages(GetUserDefaultLCID());
+}
 
-    return FALSE;
+BOOL CAvailableApplicationInfo::HasEnglishLanguage() const
+{
+    return FindInLanguages(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), SORT_DEFAULT));
 }
 
 BOOL CAvailableApplicationInfo::IsInstalled() const
@@ -397,7 +379,7 @@ const LPCWSTR CAvailableApps::GetCabPathString()
 // CAvailableApps
 
 // CConfigParser
-ATL::CStringW CConfigParser::m_szLocale;
+ATL::CStringW CConfigParser::m_szLocaleID;
 ATL::CStringW CConfigParser::m_szCachedINISectionLocale;
 ATL::CStringW CConfigParser::m_szCachedINISectionLocaleNeutral;
 
@@ -410,7 +392,7 @@ CConfigParser::CConfigParser(const ATL::CStringW& FileName) : szConfigPath(GetIN
 ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
 {
     ATL::CStringW szDir;
-    static ATL::CStringW szBuffer;
+    ATL::CStringW szBuffer;
 
     GetStorageDirectory(szDir);
     szBuffer.Format(L"%ls\\rapps\\%ls", szDir, FileName);
@@ -420,24 +402,25 @@ ATL::CStringW CConfigParser::GetINIFullPath(const ATL::CStringW& FileName)
 
 VOID CConfigParser::CacheINILocaleLazy()
 {
-    if (m_szLocale.IsEmpty())
+    if (m_szLocaleID.IsEmpty())
     {
         // TODO: Set default locale if call fails
         // find out what is the current system lang code (e.g. "0a") and append it to SectionLocale
-        GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE,
-                       m_szLocale.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
-        m_szLocale.ReleaseBuffer();
-        m_szCachedINISectionLocale = L"Section." + m_szLocale;
+        GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
+                       m_szLocaleID.GetBuffer(m_cchLocaleSize), m_cchLocaleSize);
+
+        m_szLocaleID.ReleaseBuffer();
+        m_szCachedINISectionLocale = L"Section." + m_szLocaleID;
 
         // turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part
-        m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocale.Right(2);
+        m_szCachedINISectionLocaleNeutral = m_szCachedINISectionLocale + m_szLocaleID.Right(2);
     }
 }
 
 const ATL::CStringW& CConfigParser::GetLocale()
 {
     CacheINILocaleLazy();
-    return m_szLocale;
+    return m_szLocaleID;
 }
 
 INT CConfigParser::GetLocaleSize()
@@ -486,8 +469,6 @@ UINT CConfigParser::GetString(const ATL::CStringW& KeyName, ATL::CStringW& Resul
 UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
 {
     ATL::CStringW Buffer;
-    UNICODE_STRING BufferW;
-    ULONG Result;
 
     // grab the text version of our entry
     if (!GetString(KeyName, Buffer))
@@ -497,9 +478,8 @@ UINT CConfigParser::GetInt(const ATL::CStringW& KeyName)
         return FALSE;
 
     // convert it to an actual integer
-    RtlInitUnicodeString(&BufferW, Buffer.GetString());
-    RtlUnicodeStringToInteger(&BufferW, 0, &Result);
+    int result = StrToIntW(Buffer.GetString());
 
-    return (UINT) Result;
+    return (UINT) (result <= 0) ? 0 : result;
 }
-// CConfigParser
+// CConfigParser
\ No newline at end of file
index 8efd14b..917767d 100644 (file)
@@ -179,6 +179,7 @@ class CMainToolbar :
     WCHAR szInstallBtn[MAX_STR_LEN];
     WCHAR szUninstallBtn[MAX_STR_LEN];
     WCHAR szModifyBtn[MAX_STR_LEN];
+    WCHAR szSelectAll[MAX_STR_LEN];
 
     VOID AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex)
     {
@@ -217,6 +218,7 @@ class CMainToolbar :
         AddImageToImageList(hImageList, IDI_INSTALL);
         AddImageToImageList(hImageList, IDI_UNINSTALL);
         AddImageToImageList(hImageList, IDI_MODIFY);
+        AddImageToImageList(hImageList, IDI_CHECK_ALL);
         AddImageToImageList(hImageList, IDI_REFRESH);
         AddImageToImageList(hImageList, IDI_UPDATE_DB);
         AddImageToImageList(hImageList, IDI_SETTINGS);
@@ -272,17 +274,19 @@ public:
             { 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szInstallBtn },
             { 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szUninstallBtn },
             { 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szModifyBtn },
-            { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
-            { 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
-            { 4, ID_RESETDB,   TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0},
-            { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
-            { 5, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
-            { 6, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 }
+            { 3, ID_CHECK_ALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE,{0}, 0, (INT_PTR) szSelectAll},
+            {-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
+            { 4, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
+            { 5, ID_RESETDB,   TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
+            {-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
+            { 6, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
+            { 7, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
         };
 
         LoadStringW(hInst, IDS_INSTALL, szInstallBtn, _countof(szInstallBtn));
         LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, _countof(szUninstallBtn));
         LoadStringW(hInst, IDS_MODIFY, szModifyBtn, _countof(szModifyBtn));
+        LoadStringW(hInst, IDS_SELECT_ALL, szSelectAll, _countof(szSelectAll));
 
         m_hWnd = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL,
                                  WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
@@ -324,6 +328,7 @@ class CAppsListView :
         int iSubItem;
     };
 
+    BOOL HasAllChecked;
 public:
     BOOL bAscending;
 
@@ -443,11 +448,20 @@ public:
         HWND hwnd = CListView::Create(hwndParent, r, NULL, style, WS_EX_CLIENTEDGE, menu);
 
         if (hwnd)
-            SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
+        {
+            SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
+        }
 
         return hwnd;
     }
 
+    VOID CheckAll()
+    {
+        if (HasAllChecked)
+        {
+            
+        }
+    }
 };
 
 class CSideTreeView :
@@ -558,8 +572,8 @@ public:
         SearchEnabled(FALSE)
     {
     }
-private:
 
+private:
     VOID InitApplicationsList(VOID)
     {
         ATL::CStringW szText;
@@ -574,7 +588,8 @@ private:
         szText.LoadStringW(hInst, IDS_APP_DESCRIPTION);
         m_ListView->AddColumn(3, szText, 250, LVCFMT_LEFT);
 
-        //UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+        // Unnesesary since the list updates on every TreeView selection
+        // UpdateApplicationsList(ENUM_ALL_COMPONENTS);
     }
 
     HTREEITEM AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
@@ -1012,7 +1027,7 @@ private:
                 if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1)
                 {
                     /* this won't do anything if the program is already installed */
-                    SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);
+                    SendMessageW(hwnd, WM_COMMAND, ID_INSTALL, 0);
                 }
             }
             break;
@@ -1068,7 +1083,7 @@ private:
             if (wParam == SEARCH_TIMER_ID)
             {
                 ::KillTimer(hwnd, SEARCH_TIMER_ID);
-                if(SearchEnabled)
+                if (SearchEnabled)
                     UpdateApplicationsList(-1);
             }
             break;
@@ -1248,6 +1263,9 @@ private:
         case ID_ABOUT:
             ShowAboutDialog();
             break;
+
+        case ID_CHECK_ALL:
+            break;
         }
     }
 
index ccea543..820e1e6 100644 (file)
@@ -91,7 +91,7 @@ BEGIN
 END
 
 IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72
-STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+STYLE DS_SHELLFONT | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE 
 CAPTION "Downloading..."
 FONT 8, "MS Shell Dlg"
 BEGIN
@@ -207,6 +207,8 @@ BEGIN
     IDS_INTEG_CHECK_FAIL "The package did not pass the integrity check, it may have been corrupted or tampered with during downloading. Running the software is not recommended."
     IDS_INTERRUPTED_DOWNLOAD "The download was interrupted. Check connection to Internet."
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
+    IDS_SELECT_ALL "Select/Desellect All"
+    IDS_INSTALL_SELECTED "Install Selected"
 END
 
 STRINGTABLE
index a42dc3f..71844cb 100644 (file)
@@ -602,7 +602,7 @@ DownloadDlgProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         return FALSE;
 
     case WM_CLOSE:
-        EndDialog(Dlg, 0);
+        DestroyWindow(Dlg);
         return TRUE;
 
     default:
@@ -622,7 +622,7 @@ DownloadApplication(INT Index)
 
     WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_INSTALL, AppInfo->szName.GetString());
 
-    DialogBoxW(hInst,
+    CreateDialogW(hInst,
                MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
                hMainWnd,
                DownloadDlgProc);
@@ -638,7 +638,7 @@ DownloadApplicationsDB(LPCWSTR lpUrl)
 
     AppInfo = &IntInfo;
 
-    DialogBoxW(hInst,
+    CreateDialogW(hInst,
                MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
                hMainWnd,
                DownloadDlgProc);
index 9370549..61ad87e 100644 (file)
@@ -101,7 +101,7 @@ typedef struct
     ATL::CStringW szUrlSite;
     ATL::CStringW szUrlDownload;
     ATL::CStringW szCDPath;
-    ATL::CSimpleArray<ATL::CStringW> Languages;
+    ATL::CSimpleArray<LCID> Languages;
 
     /* caching mechanism related entries */
     ATL::CStringW sFileName;
@@ -146,7 +146,7 @@ typedef struct
 class CConfigParser
 {
     // Loacale names cache
-    static ATL::CStringW m_szLocale;
+    static ATL::CStringW m_szLocaleID;
     const static INT m_cchLocaleSize = 5;
     static ATL::CStringW m_szCachedINISectionLocale;
     static ATL::CStringW m_szCachedINISectionLocaleNeutral;
@@ -200,6 +200,7 @@ private:
     VOID RetrieveInstalledVersion();
     VOID RetrieveLanguages();
     VOID RetrieveLicenseType();
+    inline BOOL FindInLanguages(LCID what) const;
 };
 
 class CAvailableApps
index 0ebbd61..2151984 100644 (file)
@@ -22,6 +22,7 @@ IDI_APPS ICON "res/apps.ico"
 IDI_APPUPD ICON "res/appupd.ico"
 IDI_CATEGORY ICON "res/cat.ico"
 IDI_UPDATE_DB ICON "res/updatedb.ico"
+IDI_CHECK_ALL ICON "res/checksheet.ico"
 
 /* Categories */
 IDI_CAT_AUDIO ICON "res/cats/audio.ico"
index 0a918bc..2409b76 100644 (file)
@@ -12,6 +12,7 @@
 #define IDI_APPUPD               18
 #define IDI_CATEGORY             19
 #define IDI_UPDATE_DB            20
+#define IDI_CHECK_ALL            21
 
 /* Icons for categories */
 #define IDI_CAT_AUDIO            50
@@ -76,6 +77,7 @@
 #define ID_REFRESH               559
 #define ID_REGREMOVE             560
 #define ID_RESETDB               561
+#define ID_CHECK_ALL            562
 
 /* Strings */
 #define IDS_APPTITLE             100
 #define IDS_INTEG_CHECK_FAIL     123
 #define IDS_INTERRUPTED_DOWNLOAD 124
 #define IDS_UNABLE_TO_WRITE      125
+#define IDS_SELECT_ALL           126
+#define IDS_INSTALL_SELECTED     127
 
 /* Tooltips */
 #define IDS_TOOLTIP_INSTALL      200
index 32dfe36..a24e5cf 100644 (file)
@@ -188,15 +188,15 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
         GetAvailableApps()->UpdateAppsDB();
 
     /* Load the menu hotkeys */
-    KeyBrd = LoadAccelerators(NULL, MAKEINTRESOURCE(HOTKEYS));
+    KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCE(HOTKEYS));
 
     /* Message Loop */
     while (GetMessage(&Msg, NULL, 0, 0))
     {
-        if (!TranslateAccelerator(hMainWnd, KeyBrd, &Msg))
+        if (!TranslateAcceleratorW(hMainWnd, KeyBrd, &Msg))
         {
             TranslateMessage(&Msg);
-            DispatchMessage(&Msg);
+            DispatchMessageW(&Msg);
         }
     }