From ec9d05004be73fa3fb3345ddd78329d2209a639d Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Wed, 26 Jul 2017 13:30:46 +0000 Subject: [PATCH] [RAPPS] Making checkboxes useful WIP - Added selection counter *NOTE: This requires changes in lang files* - Added Sellect/Desellect button functionality - Fixed some typos and macros-to-wide-functions svn path=/branches/GSoC_2017/rapps/; revision=75411 --- reactos/base/applications/rapps/available.cpp | 3 +- reactos/base/applications/rapps/gui.cpp | 129 ++++++++++++------ reactos/base/applications/rapps/installed.cpp | 2 +- reactos/base/applications/rapps/lang/en-US.rc | 12 +- reactos/base/applications/rapps/lang/ru-RU.rc | 4 +- reactos/base/applications/rapps/lang/uk-UA.rc | 4 +- 6 files changed, 102 insertions(+), 52 deletions(-) diff --git a/reactos/base/applications/rapps/available.cpp b/reactos/base/applications/rapps/available.cpp index 5c9ca6d8086..787f33f32a6 100644 --- a/reactos/base/applications/rapps/available.cpp +++ b/reactos/base/applications/rapps/available.cpp @@ -11,7 +11,6 @@ #include "rapps.h" // CAvailableApplicationInfo - CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam) : m_Parser(sFileNameParam) { @@ -311,7 +310,7 @@ BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnu m_InfoList.RemoveAt(LastListPosition); delete Info; - Info = nullptr; + Info = NULL; break; } else diff --git a/reactos/base/applications/rapps/gui.cpp b/reactos/base/applications/rapps/gui.cpp index 917767d20c1..0a5a925bdde 100644 --- a/reactos/base/applications/rapps/gui.cpp +++ b/reactos/base/applications/rapps/gui.cpp @@ -111,8 +111,8 @@ class CAvailableAppView ATL::CStringW szLangInfo; ATL::CStringW szLoadedTextAvailability; ATL::CStringW szLoadedAInfoText; - szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES); + szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES); //TODO: replace those hardcoded strings if (Info->HasNativeLanguage()) @@ -199,7 +199,7 @@ class CMainToolbar : DeleteObject(hImage); } - HIMAGELIST InitImageList(VOID) + HIMAGELIST InitImageList() { HIMAGELIST hImageList; @@ -328,13 +328,14 @@ class CAppsListView : int iSubItem; }; - BOOL HasAllChecked; -public: + BOOL bHasAllChecked; BOOL bAscending; - CAppsListView() +public: + CAppsListView() : + bAscending(TRUE), + bHasAllChecked(FALSE) { - bAscending = TRUE; } VOID ColumnClick(LPNMLISTVIEW pnmv) @@ -349,7 +350,7 @@ public: PVOID GetLParam(INT Index) { INT ItemIndex; - LVITEM Item; + LVITEMW Item; if (Index == -1) { @@ -379,13 +380,13 @@ public: BOOL AddColumn(INT Index, LPWSTR lpText, INT Width, INT Format) { - LV_COLUMN Column; + LV_COLUMNW Column; ZeroMemory(&Column, sizeof(Column)); Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; Column.iSubItem = Index; - Column.pszText = (LPTSTR) lpText; + Column.pszText = lpText; Column.cx = Width; Column.fmt = Format; @@ -449,18 +450,39 @@ public: if (hwnd) { - SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT ); + SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); } return hwnd; } + BOOL GetCheckState(INT item) + { + return (BOOL) GetItemState(item, LVIS_STATEIMAGEMASK); + } + + VOID SetCheckState(INT item, BOOL fCheck) + { + SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK); + } + VOID CheckAll() { - if (HasAllChecked) + bHasAllChecked = !bHasAllChecked; + SetCheckState(-1, bHasAllChecked); + } + + ATL::CAtlList GetCheckedItems() + { + ATL::CAtlList list; + for (INT i = 0; i != -1; i = GetNextItem(i, LVNI_ALL)) { - + if (GetCheckState(i) != FALSE) + { + list.AddTail((PAPPLICATION_INFO) GetItemData(i)); + } } + return list; } }; @@ -558,23 +580,24 @@ class CMainWindow : CUiWindow * m_RichEdit; CUiWindow * m_SearchBar; + CAvailableApps m_AvailableApps; LPWSTR pLink; - BOOL SearchEnabled; - - CAvailableApps m_AvailableApps; + INT nSelectedApps; + BOOL bSearchEnabled; + BOOL bUpdating; public: CMainWindow() : m_ClientPanel(NULL), pLink(NULL), - SearchEnabled(FALSE) + bSearchEnabled(FALSE) { } private: - VOID InitApplicationsList(VOID) + VOID InitApplicationsList() { ATL::CStringW szText; @@ -597,7 +620,7 @@ private: return m_TreeView->AddCategory(hRootItem, TextIndex, IconIndex); } - VOID InitCategoriesList(VOID) + VOID InitCategoriesList() { HTREEITEM hRootItem; @@ -703,7 +726,7 @@ private: return m_HSplitter->Create(m_hWnd) != NULL; } - BOOL CreateSearchBar(VOID) + BOOL CreateSearchBar() { m_SearchBar = new CUiWindow(); m_SearchBar->m_VerticalAlignment = UiAlign_LeftTop; @@ -716,7 +739,8 @@ private: BOOL CreateLayout() { - bool b = TRUE; + BOOL b = TRUE; + bUpdating = TRUE; m_ClientPanel = new CUiPanel(); m_ClientPanel->m_VerticalAlignment = UiAlign_Stretch; @@ -754,6 +778,7 @@ private: m_VSplitter->m_Margin.bottom = rBottom.bottom - rBottom.top; } + bUpdating = FALSE; return b; } @@ -761,16 +786,13 @@ private: { if (CreateLayout()) { - ATL::CStringW szBuffer1, szBuffer2; InitApplicationsList(); - InitCategoriesList(); - szBuffer2.LoadStringW(hInst, IDS_APPS_COUNT); - szBuffer1.Format(szBuffer2, m_ListView->GetItemCount()); + nSelectedApps = 0; + UpdateStatusBarText(); - m_StatusBar->SetText(szBuffer1); return TRUE; } @@ -998,6 +1020,13 @@ private: if (IS_AVAILABLE_ENUM(SelectedEnumType)) CAvailableAppView::ShowAvailableAppInfo(ItemIndex); } + /* Check if the item is checked */ + if ((pnic->uNewState & LVIS_STATEIMAGEMASK) && !bUpdating) + { + BOOL checked = m_ListView->GetCheckState(pnic->iItem); + nSelectedApps += (checked) ? 1 : -1; + UpdateStatusBarText(); + } } } break; @@ -1083,10 +1112,10 @@ private: if (wParam == SEARCH_TIMER_ID) { ::KillTimer(hwnd, SEARCH_TIMER_ID); - if (SearchEnabled) + if (bSearchEnabled) UpdateApplicationsList(-1); } - break; + break; } return FALSE; @@ -1119,7 +1148,7 @@ private: } } - BOOL IsSelectedNodeInstalled(void) + BOOL IsSelectedNodeInstalled() { HTREEITEM hSelectedItem = m_TreeView->GetSelection(); TV_ITEM tItem; @@ -1156,7 +1185,7 @@ private: m_SearchBar->GetWindowTextW(szWndText); if (szBuf == szWndText) { - SearchEnabled = FALSE; + bSearchEnabled = FALSE; m_SearchBar->SetWindowTextW(L""); } } @@ -1168,7 +1197,7 @@ private: if (szBuf.IsEmpty()) { szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT); - SearchEnabled = FALSE; + bSearchEnabled = FALSE; m_SearchBar->SetWindowTextW(szBuf.GetString()); } } @@ -1178,9 +1207,9 @@ private: { ATL::CStringW szWndText; - if (!SearchEnabled) + if (!bSearchEnabled) { - SearchEnabled = TRUE; + bSearchEnabled = TRUE; break; } @@ -1265,13 +1294,14 @@ private: break; case ID_CHECK_ALL: + m_ListView->CheckAll(); break; } } - VOID FreeInstalledAppList(VOID) + VOID FreeInstalledAppList() { - INT Count = ListView_GetItemCount(hListView) - 1; + INT Count = m_ListView->GetItemCount() - 1; PINSTALLED_INFO Info; while (Count >= 0) @@ -1369,33 +1399,45 @@ private: return TRUE; } + VOID UpdateStatusBarText() + { + if (m_StatusBar) + { + ATL::CStringW szBuffer1, szBuffer2; + + szBuffer2.LoadStringW(hInst, IDS_APPS_COUNT); + szBuffer1.Format(szBuffer2, m_ListView->GetItemCount(), nSelectedApps); + m_StatusBar->SetText(szBuffer1); + } + } VOID UpdateApplicationsList(INT EnumType) { ATL::CStringW szBuffer1, szBuffer2; HIMAGELIST hImageListView; + bUpdating = TRUE; - m_ListView->SendMessageW(WM_SETREDRAW, FALSE, 0); + m_ListView->SetRedraw(FALSE); + nSelectedApps = 0; if (EnumType < 0) EnumType = SelectedEnumType; if (IS_INSTALLED_ENUM(SelectedEnumType)) FreeInstalledAppList(); - (VOID) ListView_DeleteAllItems(hListView); + m_ListView->DeleteAllItems(); /* Create new ImageList */ hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE, GetSystemColorDepth() | ILC_MASK, 0, 1); - HIMAGELIST hImageListBuf = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); + HIMAGELIST hImageListBuf = m_ListView->SetImageList(hImageListView, LVSIL_SMALL); if (hImageListBuf) { ImageList_Destroy(hImageListBuf); } - if (IS_AVAILABLE_ENUM(EnumType)) { /* Enum available applications */ @@ -1404,17 +1446,16 @@ private: SelectedEnumType = EnumType; - szBuffer2.LoadStringW(hInst, IDS_APPS_COUNT); - szBuffer1.Format(szBuffer2, ListView_GetItemCount(hListView)); - SetStatusBarText(szBuffer1); + UpdateStatusBarText(); SetWelcomeText(); /* set automatic column width for program names if the list is not empty */ - if (ListView_GetItemCount(hListView) > 0) - ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE); + if (m_ListView->GetItemCount() > 0) + ListView_SetColumnWidth(m_ListView->GetWindow(), 0, LVSCW_AUTOSIZE); - SendMessageW(hListView, WM_SETREDRAW, TRUE, 0); + bUpdating = FALSE; + m_ListView->SetRedraw(TRUE); } public: diff --git a/reactos/base/applications/rapps/installed.cpp b/reactos/base/applications/rapps/installed.cpp index dbb86d6d795..80630b9a30f 100644 --- a/reactos/base/applications/rapps/installed.cpp +++ b/reactos/base/applications/rapps/installed.cpp @@ -101,7 +101,7 @@ UninstallApplication(INT Index, BOOL bModify) WCHAR szAppName[MAX_STR_LEN]; DWORD dwType, dwSize; INT ItemIndex; - LVITEM Item; + LVITEMW Item; HKEY hKey; PINSTALLED_INFO ItemInfo; diff --git a/reactos/base/applications/rapps/lang/en-US.rc b/reactos/base/applications/rapps/lang/en-US.rc index 820e1e6587a..8bedf8ea3f6 100644 --- a/reactos/base/applications/rapps/lang/en-US.rc +++ b/reactos/base/applications/rapps/lang/en-US.rc @@ -110,6 +110,16 @@ BEGIN ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 END +IDD_DOWNLOAD_DIALOG_MULTI DIALOGEX 0, 0, 220, 72 +STYLE DS_SHELLFONT | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE +CAPTION "Downloading (multiple)..." +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12 + EDITTEXT IDC_DOWNLOAD_STATUS, 10, 28, 200, 22, ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_DISABLED | NOT WS_BORDER + PUSHBUTTON "Cancel", IDCANCEL, 85, 53, 50, 15, WS_GROUP | WS_TABSTOP +END + STRINGTABLE BEGIN IDS_TOOLTIP_INSTALL "Install" @@ -187,7 +197,7 @@ BEGIN IDS_INSTALL "Install" IDS_UNINSTALL "Uninstall" IDS_MODIFY "Modify" - IDS_APPS_COUNT "Applications count: %d" + IDS_APPS_COUNT "Applications count: %d; Selected: %d" IDS_WELCOME_TITLE "Welcome to ReactOS Applications Manager!\n\n" IDS_WELCOME_TEXT "Choose a category on the left, then choose an application to install or uninstall.\nReactOS Web Site: " IDS_WELCOME_URL "http://www.reactos.org" diff --git a/reactos/base/applications/rapps/lang/ru-RU.rc b/reactos/base/applications/rapps/lang/ru-RU.rc index 4d25ead758b..40445488db0 100644 --- a/reactos/base/applications/rapps/lang/ru-RU.rc +++ b/reactos/base/applications/rapps/lang/ru-RU.rc @@ -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_SYSMENU | WS_VISIBLE CAPTION "Загрузка..." FONT 8, "MS Shell Dlg" BEGIN @@ -186,7 +186,7 @@ BEGIN IDS_INSTALL "Установить" IDS_UNINSTALL "Удалить" IDS_MODIFY "Изменить" - IDS_APPS_COUNT "Количество: %d" + IDS_APPS_COUNT "Количество приложений: %d; Выбрано: %d" IDS_WELCOME_TITLE "Добро пожаловать в ""Менеджер приложений ReactOS""!\n\n" IDS_WELCOME_TEXT "Выберите категорию слева и приложение для установки или удаления.\nСайт ReactOS: " IDS_WELCOME_URL "http://www.reactos.org" diff --git a/reactos/base/applications/rapps/lang/uk-UA.rc b/reactos/base/applications/rapps/lang/uk-UA.rc index 7939972b8fd..56195d50857 100644 --- a/reactos/base/applications/rapps/lang/uk-UA.rc +++ b/reactos/base/applications/rapps/lang/uk-UA.rc @@ -99,7 +99,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_SYSMENU | WS_VISIBLE CAPTION "Завантаження..." FONT 8, "MS Shell Dlg" BEGIN @@ -194,7 +194,7 @@ BEGIN IDS_INSTALL "Встановити" IDS_UNINSTALL "Видалити" IDS_MODIFY "Змінити" - IDS_APPS_COUNT "Kількість додатків: %d" + IDS_APPS_COUNT "Kількість додатків: %d; Обрано: %d" IDS_WELCOME_TITLE "Ласкаво просимо в Менеджер додатків ReactOS!\n\n" IDS_WELCOME_TEXT "Виберіть категорію зліва, а потім виберіть програми для встановлення чи видалення.\nСторінка ReactOS: " IDS_WELCOME_URL "http://www.reactos.org"