* 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);
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_AVAILABLE_TRANSLATION);
if (nTranslations > 1)
{
- szLangInfo.Format(L" (+%d more)", nTranslations - 1);
+ ATL::CStringW buf;
+ buf.LoadStringW(IDS_LANGUAGE_MORE_PLACEHOLDER);
+ szLangInfo.Format(buf, nTranslations - 1);
}
else
{
szLoadedTextAvailability.LoadStringW(IDS_LANGUAGE_ENGLISH_TRANSLATION);
if (nTranslations > 1)
{
- szLangInfo.Format(L" (+%d available)", nTranslations - 1);
+ ATL::CStringW buf;
+ buf.LoadStringW(IDS_LANGUAGE_AVAILABLE_PLACEHOLDER);
+ szLangInfo.Format(buf, nTranslations - 1);
}
else
{
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 */
struct SortContext
{
CAppsListView * lvw;
- int iSubItem;
+ INT iSubItem;
};
BOOL bHasAllChecked;
SetCheckState(-1, bHasAllChecked);
}
- ATL::CSimpleArray<PAPPLICATION_INFO> GetCheckedItems()
+ ATL::CSimpleArray<CAvailableApplicationInfo*> GetCheckedItems()
{
- ATL::CSimpleArray<PAPPLICATION_INFO> list;
+ 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);
}
};
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;
}
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);
// Unnesesary since the list updates on every TreeView selection
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()
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);
- nSelectedApps += (checked) ? 1 : -1;
+ /* 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();
}
}
{
if (IS_INSTALLED_ENUM(SelectedEnumType))
ShowInstalledAppInfo(-1);
- if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ if (IsAvailableEnum(SelectedEnumType))
CAvailableAppView::ShowAvailableAppInfo(-1);
}
}
if (bSearchEnabled)
UpdateApplicationsList(-1);
}
- break;
+ break;
}
return FALSE;
{
ATL::CStringW szWndText;
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
m_SearchBar->GetWindowTextW(szWndText);
if (szBuf == szWndText)
{
m_SearchBar->GetWindowTextW(szBuf);
if (szBuf.IsEmpty())
{
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
bSearchEnabled = FALSE;
m_SearchBar->SetWindowTextW(szBuf.GetString());
}
break;
}
- szBuf.LoadStringW(hInst, IDS_SEARCH_TEXT);
+ szBuf.LoadStringW(IDS_SEARCH_TEXT);
m_SearchBar->GetWindowTextW(szWndText);
if (szBuf == szWndText)
{
break;
case ID_INSTALL:
- if (nSelectedApps)
+ if (IsAvailableEnum(SelectedEnumType))
{
- СDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems());
- UpdateApplicationsList(-1);
- }
- else if(СDownloadManager::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:
break;
case ID_RESETDB:
- m_AvailableApps.UpdateAppsDB();
+ CAvailableApps::ForceUpdateAppsDB();
UpdateApplicationsList(-1);
break;
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;
if (EnumType < 0) EnumType = SelectedEnumType;
if (IS_INSTALLED_ENUM(SelectedEnumType))
+ {
FreeInstalledAppList();
+ }
m_ListView->DeleteAllItems();
ImageList_Destroy(hImageListBuf);
}
- if (IS_AVAILABLE_ENUM(EnumType))
+ if (IS_INSTALLED_ENUM(EnumType))
+ {
+ 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))
{
/* Enum available applications */
m_AvailableApps.EnumAvailableApplications(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);
+ }
bUpdating = FALSE;
m_ListView->SetRedraw(TRUE);
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);
}