[RAPPS] Making checkboxes useful WIP
authorAlexander Shaposhnikov <sanchaez@reactos.org>
Wed, 26 Jul 2017 13:30:46 +0000 (13:30 +0000)
committerAlexander Shaposhnikov <sanchaez@reactos.org>
Wed, 26 Jul 2017 13:30:46 +0000 (13:30 +0000)
- 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
reactos/base/applications/rapps/gui.cpp
reactos/base/applications/rapps/installed.cpp
reactos/base/applications/rapps/lang/en-US.rc
reactos/base/applications/rapps/lang/ru-RU.rc
reactos/base/applications/rapps/lang/uk-UA.rc

index 5c9ca6d..787f33f 100644 (file)
@@ -11,7 +11,6 @@
 #include "rapps.h"
 
  // CAvailableApplicationInfo
 #include "rapps.h"
 
  // CAvailableApplicationInfo
-
 CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
     : m_Parser(sFileNameParam)
 {
 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;
                     m_InfoList.RemoveAt(LastListPosition);
 
                     delete Info;
-                    Info = nullptr;
+                    Info = NULL;
                     break;
                 }
                 else
                     break;
                 }
                 else
index 917767d..0a5a925 100644 (file)
@@ -111,8 +111,8 @@ class CAvailableAppView
         ATL::CStringW szLangInfo;
         ATL::CStringW szLoadedTextAvailability;
         ATL::CStringW szLoadedAInfoText;
         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())
 
         //TODO: replace those hardcoded strings
         if (Info->HasNativeLanguage())
@@ -199,7 +199,7 @@ class CMainToolbar :
         DeleteObject(hImage);
     }
 
         DeleteObject(hImage);
     }
 
-    HIMAGELIST InitImageList(VOID)
+    HIMAGELIST InitImageList()
     {
         HIMAGELIST hImageList;
 
     {
         HIMAGELIST hImageList;
 
@@ -328,13 +328,14 @@ class CAppsListView :
         int iSubItem;
     };
 
         int iSubItem;
     };
 
-    BOOL HasAllChecked;
-public:
+    BOOL bHasAllChecked;
     BOOL bAscending;
 
     BOOL bAscending;
 
-    CAppsListView()
+public:
+    CAppsListView() :
+        bAscending(TRUE),
+        bHasAllChecked(FALSE)
     {
     {
-        bAscending = TRUE;
     }
 
     VOID ColumnClick(LPNMLISTVIEW pnmv)
     }
 
     VOID ColumnClick(LPNMLISTVIEW pnmv)
@@ -349,7 +350,7 @@ public:
     PVOID GetLParam(INT Index)
     {
         INT ItemIndex;
     PVOID GetLParam(INT Index)
     {
         INT ItemIndex;
-        LVITEM Item;
+        LVITEMW Item;
 
         if (Index == -1)
         {
 
         if (Index == -1)
         {
@@ -379,13 +380,13 @@ public:
 
     BOOL AddColumn(INT Index, LPWSTR lpText, INT Width, INT Format)
     {
 
     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;
 
         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;
 
         Column.cx = Width;
         Column.fmt = Format;
 
@@ -449,18 +450,39 @@ public:
 
         if (hwnd)
         {
 
         if (hwnd)
         {
-            SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
+            SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
         }
 
         return hwnd;
     }
 
         }
 
         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()
     {
     VOID CheckAll()
     {
-        if (HasAllChecked)
+        bHasAllChecked = !bHasAllChecked;
+        SetCheckState(-1, bHasAllChecked);
+    }
+
+    ATL::CAtlList<PAPPLICATION_INFO> GetCheckedItems()
+    {
+        ATL::CAtlList<PAPPLICATION_INFO> 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<CRichEdit> * m_RichEdit;
 
     CUiWindow<CSearchBar> * m_SearchBar;
     CUiWindow<CRichEdit> * m_RichEdit;
 
     CUiWindow<CSearchBar> * m_SearchBar;
+    CAvailableApps m_AvailableApps;
 
     LPWSTR pLink;
 
 
     LPWSTR pLink;
 
-    BOOL SearchEnabled;
-
-    CAvailableApps m_AvailableApps;
+    INT nSelectedApps;
 
 
+    BOOL bSearchEnabled;
+    BOOL bUpdating;
 public:
     CMainWindow() :
         m_ClientPanel(NULL),
         pLink(NULL),
 public:
     CMainWindow() :
         m_ClientPanel(NULL),
         pLink(NULL),
-        SearchEnabled(FALSE)
+        bSearchEnabled(FALSE)
     {
     }
 
 private:
     {
     }
 
 private:
-    VOID InitApplicationsList(VOID)
+    VOID InitApplicationsList()
     {
         ATL::CStringW szText;
 
     {
         ATL::CStringW szText;
 
@@ -597,7 +620,7 @@ private:
         return m_TreeView->AddCategory(hRootItem, TextIndex, IconIndex);
     }
 
         return m_TreeView->AddCategory(hRootItem, TextIndex, IconIndex);
     }
 
-    VOID InitCategoriesList(VOID)
+    VOID InitCategoriesList()
     {
         HTREEITEM hRootItem;
 
     {
         HTREEITEM hRootItem;
 
@@ -703,7 +726,7 @@ private:
         return m_HSplitter->Create(m_hWnd) != NULL;
     }
 
         return m_HSplitter->Create(m_hWnd) != NULL;
     }
 
-    BOOL CreateSearchBar(VOID)
+    BOOL CreateSearchBar()
     {
         m_SearchBar = new CUiWindow<CSearchBar>();
         m_SearchBar->m_VerticalAlignment = UiAlign_LeftTop;
     {
         m_SearchBar = new CUiWindow<CSearchBar>();
         m_SearchBar->m_VerticalAlignment = UiAlign_LeftTop;
@@ -716,7 +739,8 @@ private:
 
     BOOL CreateLayout()
     {
 
     BOOL CreateLayout()
     {
-        bool b = TRUE;
+        BOOL b = TRUE;
+        bUpdating = TRUE;
 
         m_ClientPanel = new CUiPanel();
         m_ClientPanel->m_VerticalAlignment = UiAlign_Stretch;
 
         m_ClientPanel = new CUiPanel();
         m_ClientPanel->m_VerticalAlignment = UiAlign_Stretch;
@@ -754,6 +778,7 @@ private:
             m_VSplitter->m_Margin.bottom = rBottom.bottom - rBottom.top;
         }
 
             m_VSplitter->m_Margin.bottom = rBottom.bottom - rBottom.top;
         }
 
+        bUpdating = FALSE;
         return b;
     }
 
         return b;
     }
 
@@ -761,16 +786,13 @@ private:
     {
         if (CreateLayout())
         {
     {
         if (CreateLayout())
         {
-            ATL::CStringW szBuffer1, szBuffer2;
 
             InitApplicationsList();
 
             InitApplicationsList();
-
             InitCategoriesList();
 
             InitCategoriesList();
 
-            szBuffer2.LoadStringW(hInst, IDS_APPS_COUNT);
-            szBuffer1.Format(szBuffer2, m_ListView->GetItemCount());
+            nSelectedApps = 0;
+            UpdateStatusBarText();
 
 
-            m_StatusBar->SetText(szBuffer1);
             return TRUE;
         }
 
             return TRUE;
         }
 
@@ -998,6 +1020,13 @@ private:
                         if (IS_AVAILABLE_ENUM(SelectedEnumType))
                             CAvailableAppView::ShowAvailableAppInfo(ItemIndex);
                     }
                         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;
                 }
             }
             break;
@@ -1083,10 +1112,10 @@ private:
             if (wParam == SEARCH_TIMER_ID)
             {
                 ::KillTimer(hwnd, SEARCH_TIMER_ID);
             if (wParam == SEARCH_TIMER_ID)
             {
                 ::KillTimer(hwnd, SEARCH_TIMER_ID);
-                if (SearchEnabled)
+                if (bSearchEnabled)
                     UpdateApplicationsList(-1);
             }
                     UpdateApplicationsList(-1);
             }
-            break;
+        break;
         }
 
         return FALSE;
         }
 
         return FALSE;
@@ -1119,7 +1148,7 @@ private:
         }
     }
 
         }
     }
 
-    BOOL IsSelectedNodeInstalled(void)
+    BOOL IsSelectedNodeInstalled()
     {
         HTREEITEM hSelectedItem = m_TreeView->GetSelection();
         TV_ITEM tItem;
     {
         HTREEITEM hSelectedItem = m_TreeView->GetSelection();
         TV_ITEM tItem;
@@ -1156,7 +1185,7 @@ private:
                 m_SearchBar->GetWindowTextW(szWndText);
                 if (szBuf == szWndText)
                 {
                 m_SearchBar->GetWindowTextW(szWndText);
                 if (szBuf == szWndText)
                 {
-                    SearchEnabled = FALSE;
+                    bSearchEnabled = FALSE;
                     m_SearchBar->SetWindowTextW(L"");
                 }
             }
                     m_SearchBar->SetWindowTextW(L"");
                 }
             }
@@ -1168,7 +1197,7 @@ private:
                 if (szBuf.IsEmpty())
                 {
                     szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
                 if (szBuf.IsEmpty())
                 {
                     szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
-                    SearchEnabled = FALSE;
+                    bSearchEnabled = FALSE;
                     m_SearchBar->SetWindowTextW(szBuf.GetString());
                 }
             }
                     m_SearchBar->SetWindowTextW(szBuf.GetString());
                 }
             }
@@ -1178,9 +1207,9 @@ private:
             {
                 ATL::CStringW szWndText;
 
             {
                 ATL::CStringW szWndText;
 
-                if (!SearchEnabled)
+                if (!bSearchEnabled)
                 {
                 {
-                    SearchEnabled = TRUE;
+                    bSearchEnabled = TRUE;
                     break;
                 }
 
                     break;
                 }
 
@@ -1265,13 +1294,14 @@ private:
             break;
 
         case ID_CHECK_ALL:
             break;
 
         case ID_CHECK_ALL:
+            m_ListView->CheckAll();
             break;
         }
     }
 
             break;
         }
     }
 
-    VOID FreeInstalledAppList(VOID)
+    VOID FreeInstalledAppList()
     {
     {
-        INT Count = ListView_GetItemCount(hListView) - 1;
+        INT Count = m_ListView->GetItemCount() - 1;
         PINSTALLED_INFO Info;
 
         while (Count >= 0)
         PINSTALLED_INFO Info;
 
         while (Count >= 0)
@@ -1369,33 +1399,45 @@ private:
         return TRUE;
     }
 
         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;
 
     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();
 
         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);
 
         /* 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 (hImageListBuf)
         {
             ImageList_Destroy(hImageListBuf);
         }
 
-
         if (IS_AVAILABLE_ENUM(EnumType))
         {
             /* Enum available applications */
         if (IS_AVAILABLE_ENUM(EnumType))
         {
             /* Enum available applications */
@@ -1404,17 +1446,16 @@ private:
 
         SelectedEnumType = EnumType;
 
 
         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 */
 
         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:
     }
 
 public:
index dbb86d6..80630b9 100644 (file)
@@ -101,7 +101,7 @@ UninstallApplication(INT Index, BOOL bModify)
     WCHAR szAppName[MAX_STR_LEN];
     DWORD dwType, dwSize;
     INT ItemIndex;
     WCHAR szAppName[MAX_STR_LEN];
     DWORD dwType, dwSize;
     INT ItemIndex;
-    LVITEM Item;
+    LVITEMW Item;
     HKEY hKey;
     PINSTALLED_INFO ItemInfo;
 
     HKEY hKey;
     PINSTALLED_INFO ItemInfo;
 
index 820e1e6..8bedf8e 100644 (file)
@@ -110,6 +110,16 @@ BEGIN
     ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
 END
 
     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"
 STRINGTABLE
 BEGIN
     IDS_TOOLTIP_INSTALL "Install"
@@ -187,7 +197,7 @@ BEGIN
     IDS_INSTALL "Install"
     IDS_UNINSTALL "Uninstall"
     IDS_MODIFY "Modify"
     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"
     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"
index 4d25ead..4044548 100644 (file)
@@ -91,7 +91,7 @@ BEGIN
 END
 
 IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72
 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
 CAPTION "Загрузка..."
 FONT 8, "MS Shell Dlg"
 BEGIN
@@ -186,7 +186,7 @@ BEGIN
     IDS_INSTALL "Установить"
     IDS_UNINSTALL "Удалить"
     IDS_MODIFY "Изменить"
     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"
     IDS_WELCOME_TITLE "Добро пожаловать в ""Менеджер приложений ReactOS""!\n\n"
     IDS_WELCOME_TEXT "Выберите категорию слева и приложение для установки или удаления.\nСайт ReactOS: "
     IDS_WELCOME_URL "http://www.reactos.org"
index 7939972..56195d5 100644 (file)
@@ -99,7 +99,7 @@ BEGIN
 END
 
 IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72
 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
 CAPTION "Завантаження..."
 FONT 8, "MS Shell Dlg"
 BEGIN
@@ -194,7 +194,7 @@ BEGIN
     IDS_INSTALL "Встановити"
     IDS_UNINSTALL "Видалити"
     IDS_MODIFY "Змінити"
     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"
     IDS_WELCOME_TITLE "Ласкаво просимо в Менеджер додатків ReactOS!\n\n"
     IDS_WELCOME_TEXT "Виберіть категорію зліва, а потім виберіть програми для встановлення чи видалення.\nСторінка ReactOS: "
     IDS_WELCOME_URL "http://www.reactos.org"