[RAPPS] Make selection global 257/head
authorAlexander Shaposhnikov <sanchaez@reactos.org>
Tue, 2 Jan 2018 20:45:59 +0000 (22:45 +0200)
committerAlexander Shaposhnikov <sanchaez@reactos.org>
Wed, 3 Jan 2018 08:18:49 +0000 (10:18 +0200)
- Added a 'Selected for installation' category that shows what was selected.
  Selection is now kept between categories.
- New string is added to resources.
  ru-RU.rc and uk-UA.rc strings are translated.
CORE-13789

27 files changed:
base/applications/rapps/available.cpp
base/applications/rapps/gui.cpp
base/applications/rapps/include/available.h
base/applications/rapps/include/defines.h
base/applications/rapps/include/resource.h
base/applications/rapps/lang/bg-BG.rc
base/applications/rapps/lang/cs-CZ.rc
base/applications/rapps/lang/de-DE.rc
base/applications/rapps/lang/en-US.rc
base/applications/rapps/lang/es-ES.rc
base/applications/rapps/lang/fr-FR.rc
base/applications/rapps/lang/he-IL.rc
base/applications/rapps/lang/it-IT.rc
base/applications/rapps/lang/ja-JP.rc
base/applications/rapps/lang/no-NO.rc
base/applications/rapps/lang/pl-PL.rc
base/applications/rapps/lang/pt-BR.rc
base/applications/rapps/lang/ro-RO.rc
base/applications/rapps/lang/ru-RU.rc
base/applications/rapps/lang/sk-SK.rc
base/applications/rapps/lang/sq-AL.rc
base/applications/rapps/lang/sv-SE.rc
base/applications/rapps/lang/tr-TR.rc
base/applications/rapps/lang/uk-UA.rc
base/applications/rapps/lang/zh-CN.rc
base/applications/rapps/lang/zh-TW.rc
base/applications/rapps/rapps.rc

index b396e1d..19101ce 100644 (file)
 
  // CAvailableApplicationInfo
 CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
-    : m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE)
+    : m_IsSelected(FALSE), m_LicenseType(LICENSE_NONE), m_sFileName(sFileNameParam),
+    m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE)
 {
-    m_LicenseType = LICENSE_NONE;
-
-    m_sFileName = sFileNameParam;
-
     RetrieveGeneralInfo();
 }
 
@@ -355,17 +352,15 @@ BOOL CAvailableApps::Enum(INT EnumType, AVAILENUMPROC lpEnumProc)
         m_InfoList.AddTail(Info);
 
 skip_if_cached:
-        if (Info->m_Category == FALSE)
-            continue;
-
-        if (EnumType != Info->m_Category && EnumType != ENUM_ALL_AVAILABLE)
-            continue;
-
-        Info->RefreshAppInfo();
-
-        if (lpEnumProc)
-            lpEnumProc(Info, m_Strings.szAppsPath.GetString());
+        if (EnumType == Info->m_Category 
+            || EnumType == ENUM_ALL_AVAILABLE 
+            || (EnumType == ENUM_CAT_SELECTED && Info->m_IsSelected))
+        {
+            Info->RefreshAppInfo();
 
+            if (lpEnumProc)
+                lpEnumProc(Info, m_Strings.szAppsPath.GetString());
+        }
     } while (FindNextFileW(hFind, &FindFileData) != 0);
 
     FindClose(hFind);
@@ -407,6 +402,23 @@ ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::FindInfoList(const
     return result;
 }
 
+ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::GetSelected() const
+{
+    ATL::CSimpleArray<CAvailableApplicationInfo> result;
+    POSITION CurrentListPosition = m_InfoList.GetHeadPosition();
+    CAvailableApplicationInfo* Info;
+
+    while (CurrentListPosition != NULL)
+    {
+        Info = m_InfoList.GetNext(CurrentListPosition);
+        if (Info->m_IsSelected)
+        {
+            result.Add(*Info);
+        }
+    }
+    return result;
+}
+
 const ATL::CStringW& CAvailableApps::GetFolderPath() const
 {
     return m_Strings.szPath;
index 62d1a19..4118acb 100644 (file)
@@ -542,6 +542,30 @@ public:
         if (bHasCheckboxes)
         {
             SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+            SetSelected(item, fCheck);
+        }
+    }
+
+    VOID SetSelected(INT item, BOOL value)
+    {
+        if (item < 0)
+        {
+            for (INT i = 0; i >= 0; i = GetNextItem(i, LVNI_ALL))
+            {
+                CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(i);
+                if (pAppInfo)
+                {
+                    pAppInfo->m_IsSelected = value;
+                }
+            }
+        }
+        else
+        {
+            CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(item);
+            if (pAppInfo)
+            {
+                pAppInfo->m_IsSelected = value;
+            }
         }
     }
 
@@ -735,6 +759,8 @@ private:
         AddCategory(hRootItemInstalled, IDS_APPLICATIONS, IDI_APPS);
         AddCategory(hRootItemInstalled, IDS_UPDATES, IDI_APPUPD);
 
+        AddCategory(TVI_ROOT, IDS_SELECTEDFORINST, IDI_SELECTEDFORINST);
+
         hRootItemAvailable = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
         AddCategory(hRootItemAvailable, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
         AddCategory(hRootItemAvailable, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
@@ -1081,6 +1107,10 @@ private:
                     case IDS_CAT_VIDEO:
                         UpdateApplicationsList(ENUM_CAT_VIDEO);
                         break;
+
+                    case IDS_SELECTEDFORINST:
+                        UpdateApplicationsList(ENUM_CAT_SELECTED);
+                        break;
                     }
                 }
 
@@ -1153,7 +1183,7 @@ private:
                     /* Check if the item is checked */
                     if ((pnic->uNewState & LVIS_STATEIMAGEMASK) && !bUpdating)
                     {
-                        BOOL checked = ListView_GetCheckState(pnic->hdr.hwndFrom, pnic->iItem);
+                        BOOL checked = m_ListView->GetCheckState(pnic->iItem);
                         /* FIXME: HAX!
                         - preventing decremention below zero as a safeguard for ReactOS
                           In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled
@@ -1165,6 +1195,10 @@ private:
                             : ((nSelectedApps > 0)
                                ? -1
                                : 0);
+
+                        /* Update item's selection status */
+                        m_ListView->SetSelected(pnic->iItem, checked);
+
                         UpdateStatusBarText();
                     }
                 }
@@ -1399,7 +1433,7 @@ private:
             {
                 if (nSelectedApps > 0)
                 {
-                    CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
+                    CDownloadManager::DownloadListOfApplications(m_AvailableApps.GetSelected());
                     UpdateApplicationsList(-1);
                 }
                 else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
@@ -1541,6 +1575,7 @@ private:
 
         ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->m_szVersion.GetString()));
         ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString()));
+        ListView_SetCheckState(hListView, Index, Info->m_IsSelected);
 
         return TRUE;
     }
@@ -1565,7 +1600,6 @@ private:
         bUpdating = TRUE;
         m_ListView->SetRedraw(FALSE);
 
-        nSelectedApps = 0;
         if (EnumType < 0)
         {
             EnumType = SelectedEnumType;
index 1e9a1df..adf4c73 100644 (file)
@@ -25,6 +25,7 @@ inline BOOL IsLicenseType(INT x)
 struct CAvailableApplicationInfo
 {
     INT m_Category;
+    BOOL m_IsSelected;
     LicenseType m_LicenseType;
     ATL::CStringW m_szName;
     ATL::CStringW m_szRegName;
@@ -106,6 +107,7 @@ public:
 
     CAvailableApplicationInfo* FindInfo(const ATL::CStringW& szAppName) const;
     ATL::CSimpleArray<CAvailableApplicationInfo> FindInfoList(const ATL::CSimpleArray<ATL::CStringW> &arrAppsNames) const;
+    ATL::CSimpleArray<CAvailableApplicationInfo> GetSelected() const;
 
     const ATL::CStringW& GetFolderPath() const;
     const ATL::CStringW& GetAppPath() const;
index 7934e96..159bcdc 100644 (file)
@@ -50,13 +50,14 @@ enum AppsCategories
     ENUM_CAT_DRIVERS,
     ENUM_CAT_LIBS,
     ENUM_CAT_OTHER,
+    ENUM_CAT_SELECTED,
     ENUM_ALL_INSTALLED,
     ENUM_INSTALLED_APPLICATIONS = 31,
     ENUM_UPDATES = 32,
     ENUM_INSTALLED_MIN = ENUM_ALL_INSTALLED,
     ENUM_INSTALLED_MAX = ENUM_UPDATES,
     ENUM_AVAILABLE_MIN = ENUM_ALL_AVAILABLE,
-    ENUM_AVAILABLE_MAX = ENUM_CAT_OTHER,
+    ENUM_AVAILABLE_MAX = ENUM_CAT_SELECTED,
 };
 
 inline BOOL IsAvailableEnum(INT x)
index 9dd6764..b035f02 100644 (file)
@@ -13,6 +13,7 @@
 #define IDI_CATEGORY             19
 #define IDI_UPDATE_DB            20
 #define IDI_CHECK_ALL            21
+#define IDI_SELECTEDFORINST      22
 
 /* Icons for categories */
 #define IDI_CAT_AUDIO            50
 #define IDS_SELECT_ALL           126
 #define IDS_INSTALL_SELECTED     127
 #define IDS_UNABLE_TO_INSTALL    128
+#define IDS_SELECTEDFORINST      129
 
 /* Tooltips */
 #define IDS_TOOLTIP_INSTALL      200
index 4b5fe9a..b9fb94f 100644 (file)
@@ -214,6 +214,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 2ac4d2e..52ad40b 100644 (file)
@@ -215,6 +215,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index d86a051..4182c8c 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Schreibfehler. Prüfen Sie die Kapazität des Datenträgers!"
     IDS_SELECT_ALL "Alle/Keine"
     IDS_INSTALL_SELECTED "Ausgewählte Installieren"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 0483445..82a6aa0 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 1467f24..97bf043 100644 (file)
@@ -213,6 +213,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "No se ha podido escribir en el disco duro, es posible que no quede espacio libre."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index c438ecc..59b9291 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Impossible d'écrire sur le disque. Votre disque pourrait être plein."
     IDS_SELECT_ALL "Sélectionner/Désélectionner tout"
     IDS_INSTALL_SELECTED "Installer les sélectionnés"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 9df4d56..b149834 100644 (file)
@@ -212,6 +212,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 0af2db3..9c7008d 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Impossibile scrivere su disco: lo spazio libero potrebbe essere esaurito."
     IDS_SELECT_ALL "Seleziona/Deseleziona Tutte"
     IDS_INSTALL_SELECTED "Installa le selezionate"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 53bf912..7b5df0b 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index aea5c41..aa7bbb1 100644 (file)
@@ -209,6 +209,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 5f3214d..9dc447c 100644 (file)
@@ -218,6 +218,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Nie można zapisać na dysku. Dysk może być pełny."
     IDS_SELECT_ALL "Zaznacz/Odznacz Wszystko"
     IDS_INSTALL_SELECTED "Instaluj Zaznaczone"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 8f1fe50..47e495d 100644 (file)
@@ -212,6 +212,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index b3886d5..d13d72a 100644 (file)
@@ -219,6 +219,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Eșec la scrierea pe disc. Una din cauze poate fi atingerea limitei de capacitate."
     IDS_SELECT_ALL "Selectează/Deselectează Toate"
     IDS_INSTALL_SELECTED "Instalează selecționate"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 97c6a32..5f0788c 100644 (file)
@@ -210,6 +210,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Не удалось записать данные на диск. Возможно, недостаточно свободного места на диске."
     IDS_SELECT_ALL "Выбрать все"
     IDS_INSTALL_SELECTED "Установить выбранное"
+    IDS_SELECTEDFORINST "Выбрано для установки"
 END
 
 STRINGTABLE
index c65e4b6..fa324aa 100644 (file)
@@ -215,6 +215,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 9d9f72c..1656ce5 100644 (file)
@@ -214,6 +214,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 223e54c..4bfaa9a 100644 (file)
@@ -217,6 +217,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 34f0c69..c3a49db 100644 (file)
@@ -212,6 +212,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Diske yazılamıyor. Disk dolu olabilir."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 4b6325d..97aa1a6 100644 (file)
@@ -218,6 +218,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Записк на диск неможливий. Можливо, на диску недостатньо містця."
     IDS_SELECT_ALL "Вибрати все"
     IDS_INSTALL_SELECTED "Встановити обране"
+    IDS_SELECTEDFORINST "Обрані для встановлення"
 END
 
 STRINGTABLE
index a482d8e..2ab1e03 100644 (file)
@@ -212,6 +212,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "无法写入磁盘。磁盘可能已满。"
     IDS_SELECT_ALL "全选/全反选"
     IDS_INSTALL_SELECTED "安装已选中的"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index 236eee3..2636d7e 100644 (file)
@@ -212,6 +212,7 @@ BEGIN
     IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
     IDS_SELECT_ALL "Select/Deselect All"
     IDS_INSTALL_SELECTED "Install Selected"
+    IDS_SELECTEDFORINST "Selected for installation"
 END
 
 STRINGTABLE
index d200e17..4d4c796 100644 (file)
@@ -40,6 +40,7 @@ IDI_CAT_OTHER ICON "res/cats/other.ico"
 IDI_CAT_SCIENCE ICON "res/cats/science.ico"
 IDI_CAT_TOOLS ICON "res/cats/tools.ico"
 IDI_CAT_VIDEO ICON "res/cats/video.ico"
+IDI_SELECTEDFORINST ICON "res/select.ico"
 
 /* Accelerators -- key bindings */
 HOTKEYS ACCELERATORS