#define LISTVIEW_ICON_SIZE 24
#define TREEVIEW_ICON_SIZE 24
-HWND hListView = NULL;
-
INT GetSystemColorDepth()
{
DEVMODEW pDevMode;
bIsAscending = !bIsAscending;
}
- PVOID GetLParam(INT Index)
- {
- INT ItemIndex;
- LVITEMW Item;
-
- if (Index == -1)
- {
- ItemIndex = (INT) SendMessage(LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
- if (ItemIndex == -1)
- return NULL;
- }
- else
- {
- ItemIndex = Index;
- }
-
- ZeroMemory(&Item, sizeof(Item));
-
- Item.mask = LVIF_PARAM;
- Item.iItem = ItemIndex;
- if (!GetItem(&Item))
- return NULL;
-
- return (PVOID) Item.lParam;
- }
-
BOOL AddColumn(INT Index, ATL::CStringW& Text, INT Width, INT Format)
{
return AddColumn(Index, const_cast<LPWSTR>(Text.GetString()), Width, Format);
return (InsertColumn(Index, &Column) == -1) ? FALSE : TRUE;
}
- INT AddItem(INT ItemIndex, INT IconIndex, LPWSTR lpText, LPARAM lParam)
+ INT AddItem(INT ItemIndex, INT IconIndex, LPCWSTR lpText, LPARAM lParam)
{
LVITEMW Item;
ZeroMemory(&Item, sizeof(Item));
Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
- Item.pszText = lpText;
+ Item.pszText = const_cast<LPWSTR>(lpText);
Item.lParam = lParam;
Item.iItem = ItemIndex;
Item.iImage = IconIndex;
BOOL bSearchEnabled;
BOOL bUpdating;
+ ATL::CStringW szSearchPattern;
+ INT SelectedEnumType;
+
public:
CMainWindow() :
m_ClientPanel(NULL),
pLink(NULL),
- bSearchEnabled(FALSE)
+ bSearchEnabled(FALSE),
+ SelectedEnumType(ENUM_ALL_INSTALLED)
{
}
m_ListView->m_HorizontalAlignment = UiAlign_Stretch;
m_HSplitter->First().Append(m_ListView);
- hListView = m_ListView->Create(m_hWnd);
- return hListView != NULL;
+ return m_ListView->Create(m_hWnd) != NULL;
}
BOOL CreateRichEdit()
}
+ VOID RemoveSelectedAppFromRegistry()
+ {
+ PINSTALLED_INFO Info;
+ WCHAR szFullName[MAX_PATH] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";
+ ATL::CStringW szMsgText, szMsgTitle;
+ INT ItemIndex = m_ListView->GetNextItem(-1, LVNI_FOCUSED);
+
+ if (!IsInstalledEnum(SelectedEnumType))
+ return;
+
+ Info = reinterpret_cast<PINSTALLED_INFO>(m_ListView->GetItemData(ItemIndex));
+ if (!Info || !Info->hSubKey || (ItemIndex == -1))
+ return;
+
+ if (!szMsgText.LoadStringW(IDS_APP_REG_REMOVE) ||
+ !szMsgTitle.LoadStringW(IDS_INFORMATION))
+ return;
+
+ if (MessageBoxW(szMsgText, szMsgTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
+ {
+ ATL::CStringW::CopyChars(szFullName,
+ MAX_PATH,
+ Info->szKeyName.GetString(),
+ MAX_PATH - wcslen(szFullName));
+
+ if (RegDeleteKeyW(Info->hRootKey, szFullName) == ERROR_SUCCESS)
+ {
+ m_ListView->DeleteItem(ItemIndex);
+ return;
+ }
+
+ if (!szMsgText.LoadStringW(IDS_UNABLE_TO_REMOVE))
+ return;
+
+ MessageBoxW(szMsgText.GetString(), NULL, MB_OK | MB_ICONERROR);
+ }
+ }
+
+ BOOL UninstallSelectedApp(BOOL bModify)
+ {
+ WCHAR szAppName[MAX_STR_LEN];
+
+ if (!IsInstalledEnum(SelectedEnumType))
+ return FALSE;
+
+ INT ItemIndex = m_ListView->GetNextItem(-1, LVNI_FOCUSED);
+ if (ItemIndex == -1)
+ return FALSE;
+
+ m_ListView->GetItemText(ItemIndex, 0, szAppName, _countof(szAppName));
+ WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_REMOVE, szAppName);
+
+ PINSTALLED_INFO ItemInfo = (PINSTALLED_INFO)m_ListView->GetItemData(ItemIndex);
+ return UninstallApplication(ItemInfo, bModify);
+ }
BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId)
{
theResult = 0;
break;
case ID_UNINSTALL:
- if (UninstallApplication(-1, FALSE))
+ if (UninstallSelectedApp(FALSE))
UpdateApplicationsList(-1);
break;
case ID_MODIFY:
- if (UninstallApplication(-1, TRUE))
+ if (UninstallSelectedApp(TRUE))
UpdateApplicationsList(-1);
break;
case ID_REGREMOVE:
- RemoveAppFromRegistry(-1);
+ RemoveSelectedAppFromRegistry();
break;
case ID_REFRESH:
while (Count >= 0)
{
- Info = (PINSTALLED_INFO) ListViewGetlParam(Count);
+ Info = (PINSTALLED_INFO) m_ListView->GetItemData(Count);
if (Info)
{
RegCloseKey(Info->hSubKey);
return StrStrIW(szHaystack, szNeedle) != NULL;
}
- static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &m_szName, PINSTALLED_INFO Info)
+ BOOL CALLBACK EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &m_szName, PINSTALLED_INFO Info)
{
PINSTALLED_INFO ItemInfo;
ATL::CStringW szText;
return FALSE;
}
- Index = ListViewAddItem(ItemIndex, 0, m_szName, (LPARAM) ItemInfo);
+ Index = m_ListView->AddItem(ItemIndex, 0, m_szName.GetString(), (LPARAM) ItemInfo);
/* Get version info */
ItemInfo->GetApplicationString(L"DisplayVersion", szText);
- ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(szText.GetString()));
+ m_ListView->SetItemText(Index, 1, szText.GetString());
/* Get comments */
ItemInfo->GetApplicationString(L"Comments", szText);
- ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(szText.GetString()));
+ m_ListView->SetItemText(Index, 2, szText.GetString());
return TRUE;
}
- static BOOL CALLBACK s_EnumAvailableAppProc(CAvailableApplicationInfo* Info, LPCWSTR szFolderPath)
+ BOOL EnumAvailableAppProc(CAvailableApplicationInfo* Info, LPCWSTR szFolderPath)
{
INT Index;
HICON hIcon = NULL;
- HIMAGELIST hImageListView = ListView_GetImageList(hListView, LVSIL_SMALL);
+ HIMAGELIST hImageListView = (HIMAGELIST)m_ListView->SendMessage(LVM_GETIMAGELIST, LVSIL_SMALL, 0);
if (!SearchPatternMatch(Info->m_szName.GetString(), szSearchPattern) &&
!SearchPatternMatch(Info->m_szDesc.GetString(), szSearchPattern))
Index = ImageList_AddIcon(hImageListView, hIcon);
DestroyIcon(hIcon);
- 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->m_szVersion.GetString()));
- ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString()));
- ListView_SetCheckState(hListView, Index, Info->m_IsSelected);
+ Index = m_ListView->AddItem(Info->m_Category, Index, Info->m_szName.GetString(), (LPARAM) Info);
+ m_ListView->SetImageList(hImageListView, LVSIL_SMALL);
+ m_ListView->SetItemText(Index, 1, Info->m_szVersion.GetString());
+ m_ListView->SetItemText(Index, 2, Info->m_szDesc.GetString());
+ m_ListView->SetCheckState(Index, Info->m_IsSelected);
return TRUE;
}
+ static BOOL CALLBACK s_EnumInstalledAppProc(INT ItemIndex, ATL::CStringW &m_szName, PINSTALLED_INFO Info, PVOID param)
+ {
+ CMainWindow* pThis = (CMainWindow*)param;
+ return pThis->EnumInstalledAppProc(ItemIndex, m_szName, Info);
+ }
+
+ static BOOL CALLBACK s_EnumAvailableAppProc(CAvailableApplicationInfo* Info, LPCWSTR szFolderPath, PVOID param)
+ {
+ CMainWindow* pThis = (CMainWindow*)param;
+ return pThis->EnumAvailableAppProc(Info, szFolderPath);
+ }
+
VOID UpdateStatusBarText()
{
if (m_StatusBar)
DestroyIcon(hIcon);
// Enum installed applications and updates
- EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc);
- EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc);
+ EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc, this);
+ EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc, this);
}
else if (IsAvailableEnum(EnumType))
{
}
// Enum available applications
- m_AvailableApps.Enum(EnumType, s_EnumAvailableAppProc);
+ m_AvailableApps.Enum(EnumType, s_EnumAvailableAppProc, this);
}
SelectedEnumType = EnumType;
return CWindowImpl::Create(NULL, r, szWindowName.GetString(), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE);
}
-
- CStatusBar * GetStatusBar()
- {
- return m_StatusBar;
- }
-
- CAppsListView * GetListView()
- {
- return m_ListView;
- }
-
- CRichEdit * GetRichEdit()
- {
- return m_RichEdit;
- }
-
- CAvailableApps * GetAvailableApps()
- {
- return &m_AvailableApps;
- }
};
-// global interface
-CMainWindow * g_MainWindow;
-
-HWND CreateMainWindow()
-{
- g_MainWindow = new CMainWindow();
- return g_MainWindow->Create();
-}
-
-DWORD_PTR ListViewGetlParam(INT item)
-{
- if (item < 0)
- {
- item = g_MainWindow->GetListView()->GetSelectionMark();
- }
- return g_MainWindow->GetListView()->GetItemData(item);
-}
-
-VOID SetStatusBarText(LPCWSTR szText)
-{
- g_MainWindow->GetStatusBar()->SetText(szText);
-}
-
-INT ListViewAddItem(INT ItemIndex, INT IconIndex, LPWSTR lpName, LPARAM lParam)
-{
- return g_MainWindow->GetListView()->AddItem(ItemIndex, IconIndex, lpName, lParam);
-}
-
-VOID NewRichEditText(LPCWSTR szText, DWORD flags)
-{
- g_MainWindow->GetRichEdit()->SetText(szText, flags);
-}
-
-VOID InsertRichEditText(LPCWSTR szText, DWORD flags)
-{
- g_MainWindow->GetRichEdit()->InsertText(szText, flags);
-}
-
-CAvailableApps* GetAvailableApps()
-{
- return g_MainWindow->GetAvailableApps();
-}
-
-// ATL version of functions above
-VOID SetStatusBarText(const ATL::CStringW& szText)
-{
- SetStatusBarText(szText.GetString());
-}
-
-INT ListViewAddItem(INT ItemIndex, INT IconIndex, const ATL::CStringW& Name, LPARAM lParam)
-{
- return ListViewAddItem(ItemIndex, IconIndex, const_cast<LPWSTR>(Name.GetString()), lParam);
-}
-
-VOID NewRichEditText(const ATL::CStringW& szText, DWORD flags)
-{
- NewRichEditText(szText.GetString(), flags);
-}
-
-VOID InsertRichEditText(const ATL::CStringW& szText, DWORD flags)
-{
- InsertRichEditText(szText.GetString(), flags);
-}
-
VOID ShowMainWindow(INT nShowCmd)
{
HACCEL KeyBrd;
MSG Msg;
- hMainWnd = CreateMainWindow();
+ CMainWindow* wnd = new CMainWindow();
+ if (!wnd)
+ return;
- if (hMainWnd)
- {
- /* Maximize it if we must */
- ShowWindow(hMainWnd, ((SettingsInfo.bSaveWndPos && SettingsInfo.Maximized) ? SW_MAXIMIZE : nShowCmd));
- UpdateWindow(hMainWnd);
+ hMainWnd = wnd->Create();
+ if (!hMainWnd)
+ return;
- /* Load the menu hotkeys */
- KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCEW(HOTKEYS));
+ /* Maximize it if we must */
+ ShowWindow(hMainWnd, ((SettingsInfo.bSaveWndPos && SettingsInfo.Maximized) ? SW_MAXIMIZE : nShowCmd));
+ UpdateWindow(hMainWnd);
- /* Message Loop */
- while (GetMessageW(&Msg, NULL, 0, 0))
+ /* Load the menu hotkeys */
+ KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCEW(HOTKEYS));
+
+ /* Message Loop */
+ while (GetMessageW(&Msg, NULL, 0, 0))
+ {
+ if (!TranslateAcceleratorW(hMainWnd, KeyBrd, &Msg))
{
- if (!TranslateAcceleratorW(hMainWnd, KeyBrd, &Msg))
- {
- TranslateMessage(&Msg);
- DispatchMessageW(&Msg);
- }
+ TranslateMessage(&Msg);
+ DispatchMessageW(&Msg);
}
- }
+ }
+
+ delete wnd;
}