* AUTHORS: David Quintana <gigaherz@gmail.com>
* Alexander Shaposhnikov <chaez.san@gmail.com>
*/
+#include "defines.h"
#include "rapps.h"
+#include "rosui.h"
+#include "crichedit.h"
#include <shlobj_undoc.h>
#include <shlguid_undoc.h>
#include <atlwin.h>
#include <wininet.h>
#include <shellutils.h>
-
#include <rosctrls.h>
-#include "rosui.h"
-#include "crichedit.h"
-
#define SEARCH_TIMER_ID 'SR'
+#define LISTVIEW_ICON_SIZE 24
+#define TREEVIEW_ICON_SIZE 24
HWND hListView = NULL;
+INT GetSystemColorDepth()
+{
+ DEVMODEW pDevMode;
+ INT ColorDepth;
+
+ pDevMode.dmSize = sizeof(pDevMode);
+ pDevMode.dmDriverExtra = 0;
+
+ if (!EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &pDevMode))
+ {
+ /* TODO: Error message */
+ return ILC_COLOR;
+ }
+
+ switch (pDevMode.dmBitsPerPel)
+ {
+ case 32: ColorDepth = ILC_COLOR32; break;
+ case 24: ColorDepth = ILC_COLOR24; break;
+ case 16: ColorDepth = ILC_COLOR16; break;
+ case 8: ColorDepth = ILC_COLOR8; break;
+ case 4: ColorDepth = ILC_COLOR4; break;
+ default: ColorDepth = ILC_COLOR; break;
+ }
+
+ return ColorDepth;
+}
+
class CAvailableAppView
{
static inline VOID InsertTextAfterLoaded_RichEdit(UINT uStringID,
DWORD TextFlags)
{
ATL::CStringW szLoadedText;
- if (!szText.IsEmpty() && szLoadedText.LoadStringW(hInst, uStringID))
+ if (!szText.IsEmpty() && szLoadedText.LoadStringW(uStringID))
{
InsertRichEditText(szLoadedText, StringFlags);
InsertRichEditText(szText, TextFlags);
DWORD StringFlags)
{
ATL::CStringW szLoadedText;
- if (szLoadedText.LoadStringW(hInst, uStringID))
+ if (szLoadedText.LoadStringW(uStringID))
{
InsertRichEditText(L"\n", 0);
InsertRichEditText(szLoadedText, StringFlags);
switch (Info->LicenseType)
{
case LICENSE_TYPE::OpenSource:
- szLicense.LoadStringW(hInst, IDS_LICENSE_OPENSOURCE);
+ szLicense.LoadStringW(IDS_LICENSE_OPENSOURCE);
break;
case LICENSE_TYPE::Freeware:
- szLicense.LoadStringW(hInst, IDS_LICENSE_FREEWARE);
+ szLicense.LoadStringW(IDS_LICENSE_FREEWARE);
break;
case LICENSE_TYPE::Trial:
- szLicense.LoadStringW(hInst, IDS_LICENSE_TRIAL);
+ szLicense.LoadStringW(IDS_LICENSE_TRIAL);
break;
default:
InsertTextAfterLoaded_RichEdit(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
static VOID InsertLanguageInfo_RichEdit(CAvailableApplicationInfo* Info)
{
+ if (!Info->HasLanguageInfo())
+ {
+ return;
+ }
+
const INT nTranslations = Info->Languages.GetSize();
ATL::CStringW szLangInfo;
ATL::CStringW szLoadedTextAvailability;
ATL::CStringW szLoadedAInfoText;
+
szLoadedAInfoText.LoadStringW(IDS_AINFO_LANGUAGES);
+ //TODO: replace those hardcoded strings
if (Info->HasNativeLanguage())
{
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION);
+ if (nTranslations > 1)
+ {
+ ATL::CStringW buf;
+ buf.LoadStringW(IDS_LANGUAGE_MORE_PLACEHOLDER);
+ szLangInfo.Format(buf, nTranslations - 1);
+ }
+ else
+ {
+ szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
+ szLangInfo = L" (" + szLangInfo + L")";
+ }
}
else if (Info->HasEnglishLanguage())
{
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION);
+ if (nTranslations > 1)
+ {
+ ATL::CStringW buf;
+ buf.LoadStringW(IDS_LANGUAGE_AVAILABLE_PLACEHOLDER);
+ szLangInfo.Format(buf, nTranslations - 1);
+ }
+ else
+ {
+ szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
+ szLangInfo = L" (" + szLangInfo + L")";
+ }
}
else
{
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_NO_TRANSLATION);
}
- if (nTranslations > 1)
- {
- szLangInfo.Format(L" (+%d more)", nTranslations - 1);
- }
- else
- {
- szLangInfo.LoadStringW(IDS_LANGUAGE_SINGLE);
- szLangInfo = L" (" + szLangInfo + L")";
- }
-
InsertRichEditText(szLoadedAInfoText, CFE_BOLD);
InsertRichEditText(szLoadedTextAvailability, NULL);
InsertRichEditText(szLangInfo, CFE_ITALIC);
WCHAR szInstallBtn[MAX_STR_LEN];
WCHAR szUninstallBtn[MAX_STR_LEN];
WCHAR szModifyBtn[MAX_STR_LEN];
+ WCHAR szSelectAll[MAX_STR_LEN];
VOID AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex)
{
DeleteObject(hImage);
}
- HIMAGELIST InitImageList(VOID)
+ HIMAGELIST InitImageList()
{
HIMAGELIST hImageList;
hImageList = ImageList_Create(TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CXSMICON),
TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CYSMICON),
ILC_MASK | GetSystemColorDepth(),
- 1,
- 1);
+ 1, 1);
if (!hImageList)
{
/* TODO: Error message */
AddImageToImageList(hImageList, IDI_INSTALL);
AddImageToImageList(hImageList, IDI_UNINSTALL);
AddImageToImageList(hImageList, IDI_MODIFY);
+ AddImageToImageList(hImageList, IDI_CHECK_ALL);
AddImageToImageList(hImageList, IDI_REFRESH);
AddImageToImageList(hImageList, IDI_UPDATE_DB);
AddImageToImageList(hImageList, IDI_SETTINGS);
switch (idButton)
{
case ID_EXIT:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXIT);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_EXIT);
break;
case ID_INSTALL:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_INSTALL);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_INSTALL);
break;
case ID_UNINSTALL:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UNINSTALL);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_UNINSTALL);
break;
case ID_MODIFY:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_MODIFY);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_MODIFY);
break;
case ID_SETTINGS:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SETTINGS);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_SETTINGS);
break;
case ID_REFRESH:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_REFRESH);
break;
case ID_RESETDB:
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UPDATE_DB);
+ lpttt->lpszText = MAKEINTRESOURCEW(IDS_TOOLTIP_UPDATE_DB);
break;
}
}
{ 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 },
- { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
- { 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
- { 4, ID_RESETDB, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0},
- { 5, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
- { 5, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
- { 6, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 }
+ { 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 },
+ {-1, 0, TBSTATE_ENABLED, BTNS_SEP, { 0 }, 0, 0 },
+ { 6, ID_SETTINGS, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
+ { 7, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, { 0 }, 0, 0 },
};
LoadStringW(hInst, IDS_INSTALL, szInstallBtn, _countof(szInstallBtn));
LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, _countof(szUninstallBtn));
LoadStringW(hInst, IDS_MODIFY, szModifyBtn, _countof(szModifyBtn));
+ LoadStringW(hInst, IDS_SELECT_ALL, szSelectAll, _countof(szSelectAll));
m_hWnd = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
struct SortContext
{
CAppsListView * lvw;
- int iSubItem;
+ INT iSubItem;
};
-public:
+ BOOL bHasAllChecked;
BOOL bAscending;
+ BOOL bHasCheckboxes;
- CAppsListView()
+public:
+ CAppsListView() :
+ bAscending(TRUE),
+ bHasAllChecked(FALSE),
+ bHasCheckboxes(FALSE)
+ {
+ }
+
+ VOID SetCheckboxesVisible(BOOL bIsVisible)
{
- bAscending = TRUE;
+ if (bIsVisible)
+ {
+ SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
+ }
+ else
+ {
+ SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
+ }
+
+ bHasCheckboxes = bIsVisible;
}
VOID ColumnClick(LPNMLISTVIEW pnmv)
PVOID GetLParam(INT Index)
{
INT ItemIndex;
- LVITEM Item;
+ LVITEMW Item;
if (Index == -1)
{
BOOL AddColumn(INT Index, LPWSTR lpText, INT Width, INT Format)
{
- LV_COLUMN Column;
+ LVCOLUMNW 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;
INT AddItem(INT ItemIndex, INT IconIndex, LPWSTR lpText, LPARAM lParam)
{
- LV_ITEMW Item;
+ LVITEMW Item;
ZeroMemory(&Item, sizeof(Item));
HWND hwnd = CListView::Create(hwndParent, r, NULL, style, WS_EX_CLIENTEDGE, menu);
if (hwnd)
- SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
+ {
+ SetCheckboxesVisible(FALSE);
+ }
return hwnd;
}
+ BOOL GetCheckState(INT item)
+ {
+ return (BOOL) (GetItemState(item, LVIS_STATEIMAGEMASK) >> 12) - 1;
+ }
+
+ VOID SetCheckState(INT item, BOOL fCheck)
+ {
+ if (bHasCheckboxes)
+ {
+ SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
+ }
+ }
+
+ VOID CheckAll()
+ {
+ if (bHasCheckboxes)
+ {
+ bHasAllChecked = !bHasAllChecked;
+ SetCheckState(-1, bHasAllChecked);
+ }
+ }
+
+ ATL::CSimpleArray<CAvailableApplicationInfo*> GetCheckedItems()
+ {
+ 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)
+ {
+ CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(i);
+ list.Add(pAppInfo);
+ }
+ }
+ return list;
+ }
+
+ CAvailableApplicationInfo* GetSelectedData()
+ {
+ INT item = GetSelectionMark();
+ return (CAvailableApplicationInfo*) GetItemData(item);
+ }
};
class CSideTreeView :
INT Index;
HICON hIcon;
- hIcon = (HICON) LoadImage(hInst,
- MAKEINTRESOURCE(IconIndex),
- IMAGE_ICON,
- TREEVIEW_ICON_SIZE,
- TREEVIEW_ICON_SIZE,
- LR_CREATEDIBSECTION);
+ hIcon = (HICON) LoadImageW(hInst,
+ MAKEINTRESOURCE(IconIndex),
+ IMAGE_ICON,
+ TREEVIEW_ICON_SIZE,
+ TREEVIEW_ICON_SIZE,
+ LR_CREATEDIBSECTION);
if (hIcon)
{
Index = ImageList_AddIcon(hImageTreeView, hIcon);
DestroyIcon(hIcon);
}
- szText.LoadStringW(hInst, TextIndex);
+ szText.LoadStringW(TextIndex);
return AddItem(hRootItem, szText, Index, Index, TextIndex);
}
hInst, 0);
SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0);
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
SetWindowTextW(szBuf);
return m_hWnd;
}
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(TRUE)
+ bSearchEnabled(FALSE)
{
}
-private:
- VOID InitApplicationsList(VOID)
+private:
+ VOID InitApplicationsList()
{
ATL::CStringW szText;
/* Add columns to ListView */
- szText.LoadStringW(hInst, IDS_APP_NAME);
+ szText.LoadStringW(IDS_APP_NAME);
m_ListView->AddColumn(0, szText, 200, LVCFMT_LEFT);
- szText.LoadStringW(hInst, IDS_APP_INST_VERSION);
+ szText.LoadStringW(IDS_APP_INST_VERSION);
m_ListView->AddColumn(1, szText, 90, LVCFMT_RIGHT);
- szText.LoadStringW(hInst, IDS_APP_DESCRIPTION);
+ szText.LoadStringW(IDS_APP_DESCRIPTION);
m_ListView->AddColumn(3, szText, 250, LVCFMT_LEFT);
- UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+ // Unnesesary since the list updates on every TreeView selection
+ // UpdateApplicationsList(ENUM_ALL_COMPONENTS);
}
HTREEITEM AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
return m_TreeView->AddCategory(hRootItem, TextIndex, IconIndex);
}
- VOID InitCategoriesList(VOID)
+ VOID InitCategoriesList()
{
- HTREEITEM hRootItem;
-
- hRootItem = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
- AddCategory(hRootItem, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
- AddCategory(hRootItem, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
- AddCategory(hRootItem, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
- AddCategory(hRootItem, IDS_CAT_GAMES, IDI_CAT_GAMES);
- AddCategory(hRootItem, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
- AddCategory(hRootItem, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
- AddCategory(hRootItem, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
- AddCategory(hRootItem, IDS_CAT_EDU, IDI_CAT_EDU);
- AddCategory(hRootItem, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
- AddCategory(hRootItem, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
- AddCategory(hRootItem, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
- AddCategory(hRootItem, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
- AddCategory(hRootItem, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
- AddCategory(hRootItem, IDS_CAT_LIBS, IDI_CAT_LIBS);
- AddCategory(hRootItem, IDS_CAT_OTHER, IDI_CAT_OTHER);
+ HTREEITEM hRootItem1, hRootItem2;
+
+ hRootItem1 = AddCategory(TVI_ROOT, IDS_INSTALLED, IDI_CATEGORY);
+ AddCategory(hRootItem1, IDS_APPLICATIONS, IDI_APPS);
+ AddCategory(hRootItem1, IDS_UPDATES, IDI_APPUPD);
+
+ hRootItem2 = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
+ AddCategory(hRootItem2, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
+ AddCategory(hRootItem2, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
+ AddCategory(hRootItem2, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
+ AddCategory(hRootItem2, IDS_CAT_GAMES, IDI_CAT_GAMES);
+ AddCategory(hRootItem2, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
+ AddCategory(hRootItem2, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
+ AddCategory(hRootItem2, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
+ AddCategory(hRootItem2, IDS_CAT_EDU, IDI_CAT_EDU);
+ AddCategory(hRootItem2, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
+ AddCategory(hRootItem2, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
+ AddCategory(hRootItem2, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
+ AddCategory(hRootItem2, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
+ AddCategory(hRootItem2, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
+ AddCategory(hRootItem2, IDS_CAT_LIBS, IDI_CAT_LIBS);
+ AddCategory(hRootItem2, IDS_CAT_OTHER, IDI_CAT_OTHER);
m_TreeView->SetImageList();
- m_TreeView->Expand(hRootItem, TVE_EXPAND);
- m_TreeView->SelectItem(hRootItem);
+ m_TreeView->Expand(hRootItem1, TVE_EXPAND);
+ m_TreeView->Expand(hRootItem2, TVE_EXPAND);
+ m_TreeView->SelectItem(hRootItem1);
}
BOOL CreateStatusBar()
return m_HSplitter->Create(m_hWnd) != NULL;
}
- BOOL CreateSearchBar(VOID)
+ BOOL CreateSearchBar()
{
m_SearchBar = new CUiWindow<CSearchBar>();
m_SearchBar->m_VerticalAlignment = UiAlign_LeftTop;
BOOL CreateLayout()
{
- bool b = TRUE;
+ BOOL b = TRUE;
+ bUpdating = TRUE;
m_ClientPanel = new CUiPanel();
m_ClientPanel->m_VerticalAlignment = UiAlign_Stretch;
RECT rBottom;
/* Size status bar */
- m_StatusBar->SendMessage(WM_SIZE, 0, 0);
+ m_StatusBar->SendMessageW(WM_SIZE, 0, 0);
/* Size tool bar */
m_Toolbar->AutoSize();
m_VSplitter->m_Margin.bottom = rBottom.bottom - rBottom.top;
}
+ bUpdating = FALSE;
return b;
}
{
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;
}
RECT r = {0, 0, LOWORD(lParam), HIWORD(lParam)};
HDWP hdwp = NULL;
- int count = m_ClientPanel->CountSizableChildren();
+ INT count = m_ClientPanel->CountSizableChildren();
hdwp = BeginDeferWindowPos(count);
if (hdwp)
SaveSettings(hwnd);
FreeLogs();
+ m_AvailableApps.FreeCachedEntries();
if (IS_INSTALLED_ENUM(SelectedEnumType))
FreeInstalledAppList();
{
if (IS_INSTALLED_ENUM(SelectedEnumType))
ShowInstalledAppInfo(ItemIndex);
- if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ if (IsAvailableEnum(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(ItemIndex);
}
+ /* Check if the item is checked */
+ if ((pnic->uNewState & LVIS_STATEIMAGEMASK) && !bUpdating)
+ {
+ BOOL checked = ListView_GetCheckState(pnic->hdr.hwndFrom, pnic->iItem);
+ /* FIXME: HAX!
+ - preventing decremention below zero as a safeguard for ReactOS
+ In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled
+ Maybe LVIS_STATEIMAGEMASK is set incorrectly
+ */
+ nSelectedApps +=
+ (checked)
+ ? 1
+ : ((nSelectedApps > 0)
+ ? -1
+ : 0);
+ UpdateStatusBarText();
+ }
}
}
break;
{
if (IS_INSTALLED_ENUM(SelectedEnumType))
ShowInstalledAppInfo(-1);
- if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ if (IsAvailableEnum(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(-1);
}
}
if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1)
{
/* this won't do anything if the program is already installed */
- SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);
+ SendMessageW(hwnd, WM_COMMAND, ID_INSTALL, 0);
}
}
break;
if (wParam == SEARCH_TIMER_ID)
{
::KillTimer(hwnd, SEARCH_TIMER_ID);
- UpdateApplicationsList(-1);
+ if (bSearchEnabled)
+ UpdateApplicationsList(-1);
}
break;
}
}
}
- BOOL IsSelectedNodeInstalled(void)
+ BOOL IsSelectedNodeInstalled()
{
HTREEITEM hSelectedItem = m_TreeView->GetSelection();
TV_ITEM tItem;
{
ATL::CStringW szWndText;
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
m_SearchBar->GetWindowTextW(szWndText);
if (szBuf == szWndText)
{
- SearchEnabled = FALSE;
+ bSearchEnabled = FALSE;
m_SearchBar->SetWindowTextW(L"");
}
}
m_SearchBar->GetWindowTextW(szBuf);
if (szBuf.IsEmpty())
{
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
- SearchEnabled = FALSE;
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
+ bSearchEnabled = FALSE;
m_SearchBar->SetWindowTextW(szBuf.GetString());
}
}
{
ATL::CStringW szWndText;
- if (!SearchEnabled)
+ if (!bSearchEnabled)
{
- SearchEnabled = TRUE;
+ bSearchEnabled = TRUE;
break;
}
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
m_SearchBar->GetWindowTextW(szWndText);
if (szBuf == szWndText)
{
break;
case ID_INSTALL:
- if (DownloadApplication(-1))
- /* TODO: Implement install dialog
- * if (InstallApplication(-1))
- */
- UpdateApplicationsList(-1);
+ if (IsAvailableEnum(SelectedEnumType))
+ {
+ if (nSelectedApps > 0)
+ {
+ CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
+ UpdateApplicationsList(-1);
+ }
+ else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
+ {
+ UpdateApplicationsList(-1);
+ }
+
+ }
break;
case ID_UNINSTALL:
break;
case ID_RESETDB:
- m_AvailableApps.UpdateAppsDB();
+ CAvailableApps::ForceUpdateAppsDB();
UpdateApplicationsList(-1);
break;
case ID_ABOUT:
ShowAboutDialog();
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)
return StrStrIW(szHaystack, szNeedle) != NULL;
}
- static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info)
+ static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &szName, PINSTALLED_INFO Info)
{
PINSTALLED_INFO ItemInfo;
ATL::CStringW szText;
INT Index;
- if (!SearchPatternMatch(lpName, szSearchPattern))
+ if (!SearchPatternMatch(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, lpName, (LPARAM) ItemInfo);
+ Index = ListViewAddItem(ItemIndex, 0, 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;
return TRUE;
}
+ VOID UpdateStatusBarText()
+ {
+ if (m_StatusBar)
+ {
+ ATL::CStringW szBuffer;
+
+ szBuffer.Format(IDS_APPS_COUNT, m_ListView->GetItemCount(), nSelectedApps);
+ m_StatusBar->SetText(szBuffer);
+ }
+ }
VOID UpdateApplicationsList(INT EnumType)
{
ATL::CStringW szBuffer1, szBuffer2;
HIMAGELIST hImageListView;
+ BOOL bWasInInstalled = IS_INSTALLED_ENUM(SelectedEnumType);
- m_ListView->SendMessageW(WM_SETREDRAW, FALSE, 0);
+ bUpdating = TRUE;
+ m_ListView->SetRedraw(FALSE);
- if (EnumType < 0) EnumType = SelectedEnumType;
-
- if (IS_INSTALLED_ENUM(SelectedEnumType))
+ nSelectedApps = 0;
+ if (EnumType < 0)
+ {
+ EnumType = SelectedEnumType;
+ }
+
+ //if previous one was INSTALLED purge the list
+ //TODO: make the Installed category a separate class to avoid doing this
+ if (bWasInInstalled)
+ {
FreeInstalledAppList();
+ }
- (VOID) ListView_DeleteAllItems(hListView);
+ m_ListView->DeleteAllItems();
- /* Create new ImageList */
+ // 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 previous one was INSTALLED purge the list
+ if (IS_INSTALLED_ENUM(EnumType))
+ {
+ if (!bWasInInstalled)
+ {
+ m_ListView->SetCheckboxesVisible(FALSE);
+ }
+
+ HICON hIcon = (HICON) LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
+ ImageList_AddIcon(hImageListView, hIcon);
+ DestroyIcon(hIcon);
- if (IS_AVAILABLE_ENUM(EnumType))
+ // Enum installed applications and updates
+ EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc);
+ EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc);
+ }
+ else if (IsAvailableEnum(EnumType))
{
- /* Enum available applications */
+ if (bWasInInstalled)
+ {
+ m_ListView->SetCheckboxesVisible(TRUE);
+ }
+
+ // Enum available applications
m_AvailableApps.EnumAvailableApplications(EnumType, s_EnumAvailableAppProc);
}
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);
+ // 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);
+ }
- SendMessageW(hListView, WM_SETREDRAW, TRUE, 0);
+ bUpdating = FALSE;
+ m_ListView->SetRedraw(TRUE);
}
public:
HWND Create()
{
ATL::CStringW szWindowName;
- szWindowName.LoadStringW(hInst, IDS_APPTITLE);
+ szWindowName.LoadStringW(IDS_APPTITLE);
RECT r = {
(SettingsInfo.bSaveWndPos ? SettingsInfo.Left : CW_USEDEFAULT),
SetStatusBarText(szText.GetString());
}
-INT ListViewAddItem(INT ItemIndex, INT IconIndex, ATL::CStringW & Name, LPARAM lParam)
+INT ListViewAddItem(INT ItemIndex, INT IconIndex, const ATL::CStringW& Name, LPARAM lParam)
{
return ListViewAddItem(ItemIndex, IconIndex, const_cast<LPWSTR>(Name.GetString()), lParam);
}