[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"
// 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

View file

@ -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<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;
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<CSearchBar>();
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:

View file

@ -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;

View file

@ -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"

View file

@ -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"

View file

@ -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"