-/* PROJECT: ReactOS CE Applications Manager
- * LICENSE: GPL - See COPYING in the top level directory
- * AUTHORS: David Quintana <gigaherz@gmail.com>
- * Alexander Shaposhnikov <chaez.san@gmail.com>
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * FILE: base/applications/rapps/gui.cpp
+ * PURPOSE: GUI classes for RAPPS
+ * COPYRIGHT: Copyright 2015 David Quintana (gigaherz@gmail.com)
+ * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
*/
-#include "defines.h"
+#include "rapps.h"
#include "rapps.h"
#include "rosui.h"
HWND hListView = NULL;
-INT
-GetSystemColorDepth()
+INT GetSystemColorDepth()
{
DEVMODEW pDevMode;
INT ColorDepth;
else
InsertLoadedTextNewl_RichEdit(IDS_STATUS_INSTALLED, CFE_ITALIC);
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION, Info->szInstalledVersion, CFE_BOLD, 0);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_VERSION, Info->m_szInstalledVersion, CFE_BOLD, 0);
}
else
{
InsertLoadedTextNewl_RichEdit(IDS_STATUS_NOTINSTALLED, CFE_ITALIC);
}
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION, Info->szVersion, CFE_BOLD, 0);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_AVAILABLEVERSION, Info->m_szVersion, CFE_BOLD, 0);
}
static VOID InsertLicenseInfo_RichEdit(CAvailableApplicationInfo* Info)
{
ATL::CStringW szLicense;
- switch (Info->LicenseType)
+ switch (Info->m_LicenseType)
{
- case LICENSE_TYPE::OpenSource:
+ case LICENSE_OPENSOURCE:
szLicense.LoadStringW(IDS_LICENSE_OPENSOURCE);
break;
- case LICENSE_TYPE::Freeware:
+ case LICENSE_FREEWARE:
szLicense.LoadStringW(IDS_LICENSE_FREEWARE);
break;
- case LICENSE_TYPE::Trial:
+ case LICENSE_TRIAL:
szLicense.LoadStringW(IDS_LICENSE_TRIAL);
break;
default:
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->m_szLicense, CFE_BOLD, 0);
return;
}
- szLicense += L" (" + Info->szLicense + L")";
+ szLicense += L" (" + Info->m_szLicense + L")";
InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, szLicense, CFE_BOLD, 0);
}
return;
}
- const INT nTranslations = Info->Languages.GetSize();
+ const INT nTranslations = Info->m_LanguageLCIDs.GetSize();
ATL::CStringW szLangInfo;
ATL::CStringW szLoadedTextAvailability;
ATL::CStringW szLoadedAInfoText;
CAvailableApplicationInfo* Info = (CAvailableApplicationInfo*) ListViewGetlParam(Index);
if (!Info) return FALSE;
- NewRichEditText(Info->szName, CFE_BOLD);
+ NewRichEditText(Info->m_szName, CFE_BOLD);
InsertVersionInfo_RichEdit(Info);
InsertLicenseInfo_RichEdit(Info);
InsertLanguageInfo_RichEdit(Info);
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
- InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD, Info->szUrlDownload, CFE_BOLD, CFE_LINK);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_SIZE, Info->m_szSize, CFE_BOLD, 0);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLSITE, Info->m_szUrlSite, CFE_BOLD, CFE_LINK);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_DESCRIPTION, Info->m_szDesc, CFE_BOLD, 0);
+ InsertTextAfterLoaded_RichEdit(IDS_AINFO_URLDOWNLOAD, Info->m_szUrlDownload, CFE_BOLD, CFE_LINK);
return TRUE;
}
{ 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szInstallBtn },
{ 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szUninstallBtn },
{ 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szModifyBtn },
- { 3, ID_CHECK_ALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE,{0}, 0, (INT_PTR) szSelectAll},
+ { 3, ID_CHECK_ALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, (INT_PTR) szSelectAll},
{-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
{ 4, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
{ 5, ID_RESETDB, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
BOOL bHasAllChecked;
BOOL bAscending;
+ BOOL bHasCheckboxes;
public:
CAppsListView() :
+ bHasAllChecked(FALSE),
bAscending(TRUE),
- bHasAllChecked(FALSE)
+ bHasCheckboxes(FALSE)
{
}
+ VOID SetCheckboxesVisible(BOOL bIsVisible)
+ {
+ if (bIsVisible)
+ {
+ SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
+ }
+ else
+ {
+ SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
+ }
+
+ bHasCheckboxes = bIsVisible;
+ }
+
VOID ColumnClick(LPNMLISTVIEW pnmv)
{
SortContext ctx = {this, pnmv->iSubItem};
if (hwnd)
{
- SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
+ SetCheckboxesVisible(FALSE);
}
return hwnd;
VOID SetCheckState(INT item, BOOL fCheck)
{
- SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+ if (bHasCheckboxes)
+ {
+ SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+ }
}
VOID CheckAll()
{
- bHasAllChecked = !bHasAllChecked;
- SetCheckState(-1, bHasAllChecked);
+ if (bHasCheckboxes)
+ {
+ bHasAllChecked = !bHasAllChecked;
+ SetCheckState(-1, bHasAllChecked);
+ }
}
- ATL::CSimpleArray<PAPPLICATION_INFO> GetCheckedItems()
+ ATL::CSimpleArray<CAvailableApplicationInfo*> GetCheckedItems()
{
- ATL::CSimpleArray<PAPPLICATION_INFO> list;
+ if (!bHasCheckboxes)
+ {
+ return ATL::CSimpleArray<CAvailableApplicationInfo*>();
+ }
+
+ ATL::CSimpleArray<CAvailableApplicationInfo*> list;
for (INT i = 0; i >= 0; i = GetNextItem(i, LVNI_ALL))
{
if (GetCheckState(i) != FALSE)
{
- PAPPLICATION_INFO pAppInfo = (PAPPLICATION_INFO) GetItemData(i);
+ CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(i);
list.Add(pAppInfo);
}
}
return list;
}
- PAPPLICATION_INFO GetSelectedData()
+ CAvailableApplicationInfo* GetSelectedData()
{
INT item = GetSelectionMark();
- return (PAPPLICATION_INFO) GetItemData(item);
+ return (CAvailableApplicationInfo*) GetItemData(item);
}
};
class CSideTreeView :
public CUiWindow<CTreeView>
{
- HIMAGELIST hImageTreeView = ImageList_Create(TREEVIEW_ICON_SIZE, TREEVIEW_ICON_SIZE,
- GetSystemColorDepth() | ILC_MASK,
- 0, 1);
+ HIMAGELIST hImageTreeView;
public:
+ CSideTreeView() :
+ CUiWindow(),
+ hImageTreeView(ImageList_Create(TREEVIEW_ICON_SIZE, TREEVIEW_ICON_SIZE,
+ GetSystemColorDepth() | ILC_MASK,
+ 0, 1))
+ {
+ }
+
HTREEITEM AddItem(HTREEITEM hParent, ATL::CStringW &Text, INT Image, INT SelectedImage, LPARAM lParam)
{
return CUiWindow<CTreeView>::AddItem(hParent, const_cast<LPWSTR>(Text.GetString()), Image, SelectedImage, lParam);
~CSideTreeView()
{
DestroyImageList();
- CUiWindow<CTreeView>::~CUiWindow();
}
};
class CMainWindow :
public CWindowImpl<CMainWindow, CWindow, CFrameWinTraits>
{
- CUiPanel * m_ClientPanel;
- CUiSplitPanel * m_VSplitter;
- CUiSplitPanel * m_HSplitter;
+ CUiPanel* m_ClientPanel;
+ CUiSplitPanel* m_VSplitter;
+ CUiSplitPanel* m_HSplitter;
- CMainToolbar * m_Toolbar;
- CAppsListView * m_ListView;
+ CMainToolbar* m_Toolbar;
+ CAppsListView* m_ListView;
- CSideTreeView * m_TreeView;
- CUiWindow<CStatusBar> * m_StatusBar;
- CUiWindow<CRichEdit> * m_RichEdit;
+ CSideTreeView* m_TreeView;
+ CUiWindow<CStatusBar>* m_StatusBar;
+ CUiWindow<CRichEdit>* m_RichEdit;
- CUiWindow<CSearchBar> * m_SearchBar;
+ CUiWindow<CSearchBar>* m_SearchBar;
CAvailableApps m_AvailableApps;
LPWSTR pLink;
m_VSplitter->m_HorizontalAlignment = UiAlign_Stretch;
m_VSplitter->m_DynamicFirst = FALSE;
m_VSplitter->m_Horizontal = FALSE;
- m_VSplitter->m_MinFirst = 240;
- m_VSplitter->m_MinSecond = 300;
+ m_VSplitter->m_MinFirst = 0;
+ m_VSplitter->m_MinSecond = 320;
+ m_VSplitter->m_Pos = 240;
m_ClientPanel->Children().Append(m_VSplitter);
return m_VSplitter->Create(m_hWnd) != NULL;
m_HSplitter->m_HorizontalAlignment = UiAlign_Stretch;
m_HSplitter->m_DynamicFirst = TRUE;
m_HSplitter->m_Horizontal = TRUE;
- m_HSplitter->m_Pos = 32768;
- m_HSplitter->m_MinFirst = 300;
- m_HSplitter->m_MinSecond = 150;
+ m_HSplitter->m_Pos = INT_MAX; //set INT_MAX to use lowest possible position (m_MinSecond)
+ m_HSplitter->m_MinFirst = 10;
+ m_HSplitter->m_MinSecond = 140;
m_VSplitter->Second().Append(m_HSplitter);
return m_HSplitter->Create(m_hWnd) != NULL;
FreeLogs();
m_AvailableApps.FreeCachedEntries();
- if (IS_INSTALLED_ENUM(SelectedEnumType))
+ if (IsInstalledEnum(SelectedEnumType))
FreeInstalledAppList();
delete m_ClientPanel;
switch (((LPNMTREEVIEW) lParam)->itemNew.lParam)
{
case IDS_INSTALLED:
- UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+ UpdateApplicationsList(ENUM_ALL_INSTALLED);
break;
case IDS_APPLICATIONS:
- UpdateApplicationsList(ENUM_APPLICATIONS);
+ UpdateApplicationsList(ENUM_INSTALLED_APPLICATIONS);
break;
case IDS_UPDATES:
(pnic->uNewState & LVIS_FOCUSED) &&
!(pnic->uOldState & LVIS_FOCUSED))
{
- if (IS_INSTALLED_ENUM(SelectedEnumType))
+ if (IsInstalledEnum(SelectedEnumType))
ShowInstalledAppInfo(ItemIndex);
- if (isAvailableEnum(SelectedEnumType))
+ if (IsAvailableEnum(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(ItemIndex);
}
/* Check if the item is checked */
{
if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1)
{
- if (IS_INSTALLED_ENUM(SelectedEnumType))
+ if (IsInstalledEnum(SelectedEnumType))
ShowInstalledAppInfo(-1);
- if (isAvailableEnum(SelectedEnumType))
+ if (IsAvailableEnum(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(-1);
}
}
break;
case ID_INSTALL:
- if (nSelectedApps > 0)
+ if (IsAvailableEnum(SelectedEnumType))
{
- CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
- UpdateApplicationsList(-1);
- }
- else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
- {
- UpdateApplicationsList(-1);
- }
+ if (nSelectedApps > 0)
+ {
+ CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
+ UpdateApplicationsList(-1);
+ }
+ else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
+ {
+ UpdateApplicationsList(-1);
+ }
+ }
break;
case ID_UNINSTALL:
}
}
- static BOOL SearchPatternMatch(PCWSTR szHaystack, PCWSTR szNeedle)
+ static BOOL SearchPatternMatch(LPCWSTR szHaystack, LPCWSTR szNeedle)
{
if (!*szNeedle)
return TRUE;
return StrStrIW(szHaystack, szNeedle) != NULL;
}
- static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &szName, PINSTALLED_INFO Info)
+ static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &m_szName, PINSTALLED_INFO Info)
{
PINSTALLED_INFO ItemInfo;
ATL::CStringW szText;
INT Index;
- if (!SearchPatternMatch(szName.GetString(), szSearchPattern))
+ if (!SearchPatternMatch(m_szName.GetString(), szSearchPattern))
{
RegCloseKey(Info->hSubKey);
return TRUE;
}
- ItemInfo = (PINSTALLED_INFO) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO));
+ ItemInfo = new INSTALLED_INFO(*Info);
if (!ItemInfo)
{
RegCloseKey(Info->hSubKey);
return FALSE;
}
- RtlCopyMemory(ItemInfo, Info, sizeof(INSTALLED_INFO));
-
- Index = ListViewAddItem(ItemIndex, 0, szName, (LPARAM) ItemInfo);
+ Index = ListViewAddItem(ItemIndex, 0, m_szName, (LPARAM) ItemInfo);
/* Get version info */
GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
return TRUE;
}
- static BOOL CALLBACK s_EnumAvailableAppProc(PAPPLICATION_INFO Info, LPCWSTR szFolderPath)
+ static BOOL CALLBACK s_EnumAvailableAppProc(CAvailableApplicationInfo* Info, LPCWSTR szFolderPath)
{
INT Index;
HICON hIcon = NULL;
HIMAGELIST hImageListView = ListView_GetImageList(hListView, LVSIL_SMALL);
- if (!SearchPatternMatch(Info->szName, szSearchPattern) &&
- !SearchPatternMatch(Info->szDesc, szSearchPattern))
+ if (!SearchPatternMatch(Info->m_szName.GetString(), szSearchPattern) &&
+ !SearchPatternMatch(Info->m_szDesc.GetString(), szSearchPattern))
{
return TRUE;
}
/* Load icon from file */
ATL::CStringW szIconPath;
- szIconPath.Format(L"%lsicons\\%ls.ico", szFolderPath, Info->szName);
+ szIconPath.Format(L"%lsicons\\%ls.ico", szFolderPath, Info->m_szName.GetString());
hIcon = (HICON) LoadImageW(NULL,
szIconPath.GetString(),
IMAGE_ICON,
Index = ImageList_AddIcon(hImageListView, hIcon);
DestroyIcon(hIcon);
- Index = ListViewAddItem(Info->Category, Index, Info->szName, (LPARAM) Info);
+ Index = ListViewAddItem(Info->m_Category, Index, Info->m_szName.GetString(), (LPARAM) Info);
ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL);
- ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->szVersion.GetString()));
- ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->szDesc.GetString()));
+ ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->m_szVersion.GetString()));
+ ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString()));
return TRUE;
}
{
ATL::CStringW szBuffer1, szBuffer2;
HIMAGELIST hImageListView;
- bUpdating = TRUE;
+ BOOL bWasInInstalled = IsInstalledEnum(SelectedEnumType);
+ bUpdating = TRUE;
m_ListView->SetRedraw(FALSE);
nSelectedApps = 0;
- if (EnumType < 0) EnumType = SelectedEnumType;
+ if (EnumType < 0)
+ {
+ EnumType = SelectedEnumType;
+ }
- if (IS_INSTALLED_ENUM(EnumType))
+ //if previous one was INSTALLED purge the list
+ //TODO: make the Installed category a separate class to avoid doing this
+ if (bWasInInstalled)
{
FreeInstalledAppList();
}
m_ListView->DeleteAllItems();
- /* Create new ImageList */
+ // Create new ImageList
hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE,
LISTVIEW_ICON_SIZE,
GetSystemColorDepth() | ILC_MASK,
ImageList_Destroy(hImageListBuf);
}
- if (IS_INSTALLED_ENUM(EnumType))
+ if (IsInstalledEnum(EnumType))
{
- /* Enum installed applications and updates */
+ if (!bWasInInstalled)
+ {
+ m_ListView->SetCheckboxesVisible(FALSE);
+ }
+
+ HICON hIcon = (HICON) LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
+ ImageList_AddIcon(hImageListView, hIcon);
+ DestroyIcon(hIcon);
+
+ // Enum installed applications and updates
EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc);
EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc);
}
- else if (isAvailableEnum(EnumType))
+ else if (IsAvailableEnum(EnumType))
{
- /* Enum available applications */
- m_AvailableApps.EnumAvailableApplications(EnumType, s_EnumAvailableAppProc);
+ if (bWasInInstalled)
+ {
+ m_ListView->SetCheckboxesVisible(TRUE);
+ }
+
+ // Enum available applications
+ m_AvailableApps.Enum(EnumType, s_EnumAvailableAppProc);
}
SelectedEnumType = EnumType;
UpdateStatusBarText();
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 (m_ListView->GetItemCount() > 0)
{
ListView_SetColumnWidth(m_ListView->GetWindow(), 0, LVSCW_AUTOSIZE);
}
};
-// File interface
-
+// global interface
CMainWindow * g_MainWindow;
HWND CreateMainWindow()
g_MainWindow->GetRichEdit()->InsertText(szText, flags);
}
-/* ATL version of functions */
+CAvailableApps* GetAvailableApps()
+{
+ return g_MainWindow->GetAvailableApps();
+}
+
+// ATL version of functions above
VOID SetStatusBarText(const ATL::CStringW& szText)
{
SetStatusBarText(szText.GetString());
{
InsertRichEditText(szText.GetString(), flags);
}
-
-CAvailableApps* GetAvailableApps()
-{
- return g_MainWindow->GetAvailableApps();
-}