From 58f8fa9ec89c9f7ae2ffde7870d17fd4313ab21d Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Tue, 2 Jan 2018 22:45:59 +0200 Subject: [PATCH] [RAPPS] Make selection global - 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 --- base/applications/rapps/available.cpp | 42 +++++++++++++-------- base/applications/rapps/gui.cpp | 40 ++++++++++++++++++-- base/applications/rapps/include/available.h | 2 + base/applications/rapps/include/defines.h | 3 +- base/applications/rapps/include/resource.h | 2 + base/applications/rapps/lang/bg-BG.rc | 1 + base/applications/rapps/lang/cs-CZ.rc | 1 + base/applications/rapps/lang/de-DE.rc | 1 + base/applications/rapps/lang/en-US.rc | 1 + base/applications/rapps/lang/es-ES.rc | 1 + base/applications/rapps/lang/fr-FR.rc | 1 + base/applications/rapps/lang/he-IL.rc | 1 + base/applications/rapps/lang/it-IT.rc | 1 + base/applications/rapps/lang/ja-JP.rc | 1 + base/applications/rapps/lang/no-NO.rc | 1 + base/applications/rapps/lang/pl-PL.rc | 1 + base/applications/rapps/lang/pt-BR.rc | 1 + base/applications/rapps/lang/ro-RO.rc | 1 + base/applications/rapps/lang/ru-RU.rc | 1 + base/applications/rapps/lang/sk-SK.rc | 1 + base/applications/rapps/lang/sq-AL.rc | 1 + base/applications/rapps/lang/sv-SE.rc | 1 + base/applications/rapps/lang/tr-TR.rc | 1 + base/applications/rapps/lang/uk-UA.rc | 1 + base/applications/rapps/lang/zh-CN.rc | 1 + base/applications/rapps/lang/zh-TW.rc | 1 + base/applications/rapps/rapps.rc | 1 + 27 files changed, 92 insertions(+), 19 deletions(-) diff --git a/base/applications/rapps/available.cpp b/base/applications/rapps/available.cpp index b396e1dbb78..19101cef149 100644 --- a/base/applications/rapps/available.cpp +++ b/base/applications/rapps/available.cpp @@ -19,12 +19,9 @@ // 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 CAvailableApps::FindInfoList(const return result; } +ATL::CSimpleArray CAvailableApps::GetSelected() const +{ + ATL::CSimpleArray 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; diff --git a/base/applications/rapps/gui.cpp b/base/applications/rapps/gui.cpp index 62d1a1961ba..4118acbca56 100644 --- a/base/applications/rapps/gui.cpp +++ b/base/applications/rapps/gui.cpp @@ -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(Info->m_szVersion.GetString())); ListView_SetItemText(hListView, Index, 2, const_cast(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; diff --git a/base/applications/rapps/include/available.h b/base/applications/rapps/include/available.h index 1e9a1df63b3..adf4c73aeca 100644 --- a/base/applications/rapps/include/available.h +++ b/base/applications/rapps/include/available.h @@ -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 FindInfoList(const ATL::CSimpleArray &arrAppsNames) const; + ATL::CSimpleArray GetSelected() const; const ATL::CStringW& GetFolderPath() const; const ATL::CStringW& GetAppPath() const; diff --git a/base/applications/rapps/include/defines.h b/base/applications/rapps/include/defines.h index 7934e96b23a..159bcdc5041 100644 --- a/base/applications/rapps/include/defines.h +++ b/base/applications/rapps/include/defines.h @@ -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) diff --git a/base/applications/rapps/include/resource.h b/base/applications/rapps/include/resource.h index 9dd6764a477..b035f028078 100644 --- a/base/applications/rapps/include/resource.h +++ b/base/applications/rapps/include/resource.h @@ -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 @@ -108,6 +109,7 @@ #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 diff --git a/base/applications/rapps/lang/bg-BG.rc b/base/applications/rapps/lang/bg-BG.rc index 4b5fe9acf86..b9fb94f09fb 100644 --- a/base/applications/rapps/lang/bg-BG.rc +++ b/base/applications/rapps/lang/bg-BG.rc @@ -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 diff --git a/base/applications/rapps/lang/cs-CZ.rc b/base/applications/rapps/lang/cs-CZ.rc index 2ac4d2e26a1..52ad40bdd24 100644 --- a/base/applications/rapps/lang/cs-CZ.rc +++ b/base/applications/rapps/lang/cs-CZ.rc @@ -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 diff --git a/base/applications/rapps/lang/de-DE.rc b/base/applications/rapps/lang/de-DE.rc index d86a0513e26..4182c8c1a49 100644 --- a/base/applications/rapps/lang/de-DE.rc +++ b/base/applications/rapps/lang/de-DE.rc @@ -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 diff --git a/base/applications/rapps/lang/en-US.rc b/base/applications/rapps/lang/en-US.rc index 048344532d0..82a6aa0937d 100644 --- a/base/applications/rapps/lang/en-US.rc +++ b/base/applications/rapps/lang/en-US.rc @@ -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 diff --git a/base/applications/rapps/lang/es-ES.rc b/base/applications/rapps/lang/es-ES.rc index 1467f24cef2..97bf043e33d 100644 --- a/base/applications/rapps/lang/es-ES.rc +++ b/base/applications/rapps/lang/es-ES.rc @@ -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 diff --git a/base/applications/rapps/lang/fr-FR.rc b/base/applications/rapps/lang/fr-FR.rc index c438ecc0e42..59b9291ce16 100644 --- a/base/applications/rapps/lang/fr-FR.rc +++ b/base/applications/rapps/lang/fr-FR.rc @@ -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 diff --git a/base/applications/rapps/lang/he-IL.rc b/base/applications/rapps/lang/he-IL.rc index 9df4d561995..b1498345c91 100644 --- a/base/applications/rapps/lang/he-IL.rc +++ b/base/applications/rapps/lang/he-IL.rc @@ -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 diff --git a/base/applications/rapps/lang/it-IT.rc b/base/applications/rapps/lang/it-IT.rc index 0af2db3da7a..9c7008dade1 100644 --- a/base/applications/rapps/lang/it-IT.rc +++ b/base/applications/rapps/lang/it-IT.rc @@ -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 diff --git a/base/applications/rapps/lang/ja-JP.rc b/base/applications/rapps/lang/ja-JP.rc index 53bf912e225..7b5df0b7c87 100644 --- a/base/applications/rapps/lang/ja-JP.rc +++ b/base/applications/rapps/lang/ja-JP.rc @@ -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 diff --git a/base/applications/rapps/lang/no-NO.rc b/base/applications/rapps/lang/no-NO.rc index aea5c416cbd..aa7bbb1bb86 100644 --- a/base/applications/rapps/lang/no-NO.rc +++ b/base/applications/rapps/lang/no-NO.rc @@ -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 diff --git a/base/applications/rapps/lang/pl-PL.rc b/base/applications/rapps/lang/pl-PL.rc index 5f3214d9985..9dc447ce665 100644 --- a/base/applications/rapps/lang/pl-PL.rc +++ b/base/applications/rapps/lang/pl-PL.rc @@ -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 diff --git a/base/applications/rapps/lang/pt-BR.rc b/base/applications/rapps/lang/pt-BR.rc index 8f1fe5015e1..47e495d3901 100644 --- a/base/applications/rapps/lang/pt-BR.rc +++ b/base/applications/rapps/lang/pt-BR.rc @@ -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 diff --git a/base/applications/rapps/lang/ro-RO.rc b/base/applications/rapps/lang/ro-RO.rc index b3886d5f4a5..d13d72a2f1a 100644 --- a/base/applications/rapps/lang/ro-RO.rc +++ b/base/applications/rapps/lang/ro-RO.rc @@ -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 diff --git a/base/applications/rapps/lang/ru-RU.rc b/base/applications/rapps/lang/ru-RU.rc index 97c6a328e65..5f0788c9b65 100644 --- a/base/applications/rapps/lang/ru-RU.rc +++ b/base/applications/rapps/lang/ru-RU.rc @@ -210,6 +210,7 @@ BEGIN IDS_UNABLE_TO_WRITE "Не удалось записать данные на диск. Возможно, недостаточно свободного места на диске." IDS_SELECT_ALL "Выбрать все" IDS_INSTALL_SELECTED "Установить выбранное" + IDS_SELECTEDFORINST "Выбрано для установки" END STRINGTABLE diff --git a/base/applications/rapps/lang/sk-SK.rc b/base/applications/rapps/lang/sk-SK.rc index c65e4b6ec84..fa324aaf4a9 100644 --- a/base/applications/rapps/lang/sk-SK.rc +++ b/base/applications/rapps/lang/sk-SK.rc @@ -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 diff --git a/base/applications/rapps/lang/sq-AL.rc b/base/applications/rapps/lang/sq-AL.rc index 9d9f72c6a09..1656ce58e57 100644 --- a/base/applications/rapps/lang/sq-AL.rc +++ b/base/applications/rapps/lang/sq-AL.rc @@ -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 diff --git a/base/applications/rapps/lang/sv-SE.rc b/base/applications/rapps/lang/sv-SE.rc index 223e54c0997..4bfaa9a23cc 100644 --- a/base/applications/rapps/lang/sv-SE.rc +++ b/base/applications/rapps/lang/sv-SE.rc @@ -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 diff --git a/base/applications/rapps/lang/tr-TR.rc b/base/applications/rapps/lang/tr-TR.rc index 34f0c693e56..c3a49db6c37 100644 --- a/base/applications/rapps/lang/tr-TR.rc +++ b/base/applications/rapps/lang/tr-TR.rc @@ -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 diff --git a/base/applications/rapps/lang/uk-UA.rc b/base/applications/rapps/lang/uk-UA.rc index 4b6325da8f9..97aa1a6f278 100644 --- a/base/applications/rapps/lang/uk-UA.rc +++ b/base/applications/rapps/lang/uk-UA.rc @@ -218,6 +218,7 @@ BEGIN IDS_UNABLE_TO_WRITE "Записк на диск неможливий. Можливо, на диску недостатньо містця." IDS_SELECT_ALL "Вибрати все" IDS_INSTALL_SELECTED "Встановити обране" + IDS_SELECTEDFORINST "Обрані для встановлення" END STRINGTABLE diff --git a/base/applications/rapps/lang/zh-CN.rc b/base/applications/rapps/lang/zh-CN.rc index a482d8ecb4c..2ab1e036dd1 100644 --- a/base/applications/rapps/lang/zh-CN.rc +++ b/base/applications/rapps/lang/zh-CN.rc @@ -212,6 +212,7 @@ BEGIN IDS_UNABLE_TO_WRITE "无法写入磁盘。磁盘可能已满。" IDS_SELECT_ALL "全选/全反选" IDS_INSTALL_SELECTED "安装已选中的" + IDS_SELECTEDFORINST "Selected for installation" END STRINGTABLE diff --git a/base/applications/rapps/lang/zh-TW.rc b/base/applications/rapps/lang/zh-TW.rc index 236eee3b906..2636d7e4a16 100644 --- a/base/applications/rapps/lang/zh-TW.rc +++ b/base/applications/rapps/lang/zh-TW.rc @@ -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 diff --git a/base/applications/rapps/rapps.rc b/base/applications/rapps/rapps.rc index d200e179be3..4d4c796c2e7 100644 --- a/base/applications/rapps/rapps.rc +++ b/base/applications/rapps/rapps.rc @@ -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 -- 2.17.1