[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
This commit is contained in:
Alexander Shaposhnikov 2017-07-26 13:30:46 +00:00
parent 1866b89100
commit ec9d05004b
6 changed files with 102 additions and 52 deletions

View file

@ -11,7 +11,6 @@
#include "rapps.h" #include "rapps.h"
// CAvailableApplicationInfo // CAvailableApplicationInfo
CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam) CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
: m_Parser(sFileNameParam) : m_Parser(sFileNameParam)
{ {
@ -311,7 +310,7 @@ BOOL CAvailableApps::EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnu
m_InfoList.RemoveAt(LastListPosition); m_InfoList.RemoveAt(LastListPosition);
delete Info; delete Info;
Info = nullptr; Info = NULL;
break; break;
} }
else else

View file

@ -111,8 +111,8 @@ class CAvailableAppView
ATL::CStringW szLangInfo; ATL::CStringW szLangInfo;
ATL::CStringW szLoadedTextAvailability; ATL::CStringW szLoadedTextAvailability;
ATL::CStringW szLoadedAInfoText; ATL::CStringW szLoadedAInfoText;
szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES);
szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES);
//TODO: replace those hardcoded strings //TODO: replace those hardcoded strings
if (Info->HasNativeLanguage()) 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; BOOL bHasAllChecked;
public:
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) PVOID GetLParam(INT Index)
{ {
INT ItemIndex; 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)); ZeroMemory(&Column, sizeof(Column));
Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
Column.iSubItem = Index; Column.iSubItem = Index;
Column.pszText = (LPTSTR) lpText; Column.pszText = lpText;
Column.cx = Width; Column.cx = Width;
Column.fmt = Format; 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<CRichEdit> * m_RichEdit;
CUiWindow<CSearchBar> * m_SearchBar; CUiWindow<CSearchBar> * m_SearchBar;
CAvailableApps m_AvailableApps;
LPWSTR pLink; LPWSTR pLink;
BOOL SearchEnabled; INT nSelectedApps;
CAvailableApps m_AvailableApps;
BOOL bSearchEnabled;
BOOL bUpdating;
public: public:
CMainWindow() : CMainWindow() :
m_ClientPanel(NULL), m_ClientPanel(NULL),
pLink(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 = new CUiWindow<CSearchBar>();
m_SearchBar->m_VerticalAlignment = UiAlign_LeftTop; 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 = new CUiPanel();
m_ClientPanel->m_VerticalAlignment = UiAlign_Stretch; 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); nSelectedApps = 0;
szBuffer1.Format(szBuffer2, m_ListView->GetItemCount()); UpdateStatusBarText();
m_StatusBar->SetText(szBuffer1);
return TRUE; return TRUE;
} }
@ -998,6 +1020,13 @@ private:
if (IS_AVAILABLE_ENUM(SelectedEnumType)) if (IS_AVAILABLE_ENUM(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(ItemIndex); 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) if (wParam == SEARCH_TIMER_ID)
{ {
::KillTimer(hwnd, 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(); HTREEITEM hSelectedItem = m_TreeView->GetSelection();
TV_ITEM tItem; TV_ITEM tItem;
@ -1156,7 +1185,7 @@ private:
m_SearchBar->GetWindowTextW(szWndText); m_SearchBar->GetWindowTextW(szWndText);
if (szBuf == szWndText) if (szBuf == szWndText)
{ {
SearchEnabled = FALSE; bSearchEnabled = FALSE;
m_SearchBar->SetWindowTextW(L""); m_SearchBar->SetWindowTextW(L"");
} }
} }
@ -1168,7 +1197,7 @@ private:
if (szBuf.IsEmpty()) if (szBuf.IsEmpty())
{ {
szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT); 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; break;
case ID_CHECK_ALL: 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; PINSTALLED_INFO Info;
while (Count >= 0) 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) VOID UpdateApplicationsList(INT EnumType)
{ {
ATL::CStringW szBuffer1, szBuffer2; ATL::CStringW szBuffer1, szBuffer2;
HIMAGELIST hImageListView; HIMAGELIST hImageListView;
bUpdating = TRUE;
m_ListView->SendMessageW(WM_SETREDRAW, FALSE, 0); m_ListView->SetRedraw(FALSE);
nSelectedApps = 0;
if (EnumType < 0) EnumType = SelectedEnumType; if (EnumType < 0) EnumType = SelectedEnumType;
if (IS_INSTALLED_ENUM(SelectedEnumType)) if (IS_INSTALLED_ENUM(SelectedEnumType))
FreeInstalledAppList(); FreeInstalledAppList();
(VOID) ListView_DeleteAllItems(hListView); m_ListView->DeleteAllItems();
/* Create new ImageList */ /* Create new ImageList */
hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE,
LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE,
GetSystemColorDepth() | ILC_MASK, GetSystemColorDepth() | ILC_MASK,
0, 1); 0, 1);
HIMAGELIST hImageListBuf = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); HIMAGELIST hImageListBuf = m_ListView->SetImageList(hImageListView, LVSIL_SMALL);
if (hImageListBuf) if (hImageListBuf)
{ {
ImageList_Destroy(hImageListBuf); ImageList_Destroy(hImageListBuf);
} }
if (IS_AVAILABLE_ENUM(EnumType)) if (IS_AVAILABLE_ENUM(EnumType))
{ {
/* Enum available applications */ /* Enum available applications */
@ -1404,17 +1446,16 @@ private:
SelectedEnumType = EnumType; SelectedEnumType = EnumType;
szBuffer2.LoadStringW(hInst, IDS_APPS_COUNT); UpdateStatusBarText();
szBuffer1.Format(szBuffer2, ListView_GetItemCount(hListView));
SetStatusBarText(szBuffer1);
SetWelcomeText(); SetWelcomeText();
/* set automatic column width for program names if the list is not empty */ /* set automatic column width for program names if the list is not empty */
if (ListView_GetItemCount(hListView) > 0) if (m_ListView->GetItemCount() > 0)
ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(m_ListView->GetWindow(), 0, LVSCW_AUTOSIZE);
SendMessageW(hListView, WM_SETREDRAW, TRUE, 0); bUpdating = FALSE;
m_ListView->SetRedraw(TRUE);
} }
public: public:

View file

@ -101,7 +101,7 @@ UninstallApplication(INT Index, BOOL bModify)
WCHAR szAppName[MAX_STR_LEN]; WCHAR szAppName[MAX_STR_LEN];
DWORD dwType, dwSize; DWORD dwType, dwSize;
INT ItemIndex; INT ItemIndex;
LVITEM Item; LVITEMW Item;
HKEY hKey; HKEY hKey;
PINSTALLED_INFO ItemInfo; PINSTALLED_INFO ItemInfo;

View file

@ -110,6 +110,16 @@ BEGIN
ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
END 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 STRINGTABLE
BEGIN BEGIN
IDS_TOOLTIP_INSTALL "Install" IDS_TOOLTIP_INSTALL "Install"
@ -187,7 +197,7 @@ BEGIN
IDS_INSTALL "Install" IDS_INSTALL "Install"
IDS_UNINSTALL "Uninstall" IDS_UNINSTALL "Uninstall"
IDS_MODIFY "Modify" 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_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_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_URL "http://www.reactos.org"

View file

@ -91,7 +91,7 @@ BEGIN
END END
IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72 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 "Загрузка..." CAPTION "Загрузка..."
FONT 8, "MS Shell Dlg" FONT 8, "MS Shell Dlg"
BEGIN BEGIN
@ -186,7 +186,7 @@ BEGIN
IDS_INSTALL "Установить" IDS_INSTALL "Установить"
IDS_UNINSTALL "Удалить" IDS_UNINSTALL "Удалить"
IDS_MODIFY "Изменить" IDS_MODIFY "Изменить"
IDS_APPS_COUNT "Количество: %d" IDS_APPS_COUNT "Количество приложений: %d; Выбрано: %d"
IDS_WELCOME_TITLE "Добро пожаловать в ""Менеджер приложений ReactOS""!\n\n" IDS_WELCOME_TITLE "Добро пожаловать в ""Менеджер приложений ReactOS""!\n\n"
IDS_WELCOME_TEXT "Выберите категорию слева и приложение для установки или удаления.\nСайт ReactOS: " IDS_WELCOME_TEXT "Выберите категорию слева и приложение для установки или удаления.\nСайт ReactOS: "
IDS_WELCOME_URL "http://www.reactos.org" IDS_WELCOME_URL "http://www.reactos.org"

View file

@ -99,7 +99,7 @@ BEGIN
END END
IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 220, 72 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 "Завантаження..." CAPTION "Завантаження..."
FONT 8, "MS Shell Dlg" FONT 8, "MS Shell Dlg"
BEGIN BEGIN
@ -194,7 +194,7 @@ BEGIN
IDS_INSTALL "Встановити" IDS_INSTALL "Встановити"
IDS_UNINSTALL "Видалити" IDS_UNINSTALL "Видалити"
IDS_MODIFY "Змінити" IDS_MODIFY "Змінити"
IDS_APPS_COUNT "Kількість додатків: %d" IDS_APPS_COUNT "Kількість додатків: %d; Обрано: %d"
IDS_WELCOME_TITLE "Ласкаво просимо в Менеджер додатків ReactOS!\n\n" IDS_WELCOME_TITLE "Ласкаво просимо в Менеджер додатків ReactOS!\n\n"
IDS_WELCOME_TEXT "Виберіть категорію зліва, а потім виберіть програми для встановлення чи видалення.\nСторінка ReactOS: " IDS_WELCOME_TEXT "Виберіть категорію зліва, а потім виберіть програми для встановлення чи видалення.\nСторінка ReactOS: "
IDS_WELCOME_URL "http://www.reactos.org" IDS_WELCOME_URL "http://www.reactos.org"