VOID UpdateApplicationsList(INT EnumType) { WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN]; HICON hIcon; HIMAGELIST hImageListView; (VOID) ListView_DeleteAllItems(hListView); /* Create image list */ hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE, GetSystemColorDepth() | ILC_MASK, 0, 1); hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE, LR_CREATEDIBSECTION); ImageList_AddIcon(hImageListView, hIcon); DestroyIcon(hIcon); if (EnumType == -1) EnumType = SelectedEnumType; if (IS_INSTALLED_ENUM(SelectedEnumType)) FreeInstalledAppList(); else if (IS_AVAILABLE_ENUM(SelectedEnumType)) FreeAvailableAppList(); if (IS_INSTALLED_ENUM(EnumType)) { /* Enum installed applications and updates */ EnumInstalledApplications(EnumType, TRUE, EnumInstalledAppProc); EnumInstalledApplications(EnumType, FALSE, EnumInstalledAppProc); } else if (IS_AVAILABLE_ENUM(EnumType)) { /* Enum availabled applications */ EnumAvailableApplications(EnumType, EnumAvailableAppProc); } /* Set image list for ListView */ hImageListView = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); /* Destroy old image list */ if (hImageListView) ImageList_Destroy(hImageListView); SelectedEnumType = EnumType; LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR)); swprintf(szBuffer1, szBuffer2, ListView_GetItemCount(hListView)); SetStatusBarText(szBuffer1); SetWelcomeText(); }
VOID RemoveAppFromRegistry(INT Index) { PINSTALLED_INFO Info; WCHAR szFullName[MAX_PATH] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"; WCHAR szMsgText[MAX_STR_LEN], szMsgTitle[MAX_STR_LEN]; INT ItemIndex = SendMessage(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED); if (!IS_INSTALLED_ENUM(SelectedEnumType)) return; Info = (PINSTALLED_INFO) ListViewGetlParam(Index); if (!Info || !Info->hSubKey || (ItemIndex == -1)) return; if (!LoadStringW(hInst, IDS_APP_REG_REMOVE, szMsgText, sizeof(szMsgText) / sizeof(WCHAR)) || !LoadStringW(hInst, IDS_INFORMATION, szMsgTitle, sizeof(szMsgTitle) / sizeof(WCHAR))) return; if (MessageBoxW(hMainWnd, szMsgText, szMsgTitle, MB_YESNO | MB_ICONQUESTION) == IDYES) { wcsncat(szFullName, Info->szKeyName, MAX_PATH - wcslen(szFullName)); if (RegDeleteKeyW(Info->hRootKey, szFullName) == ERROR_SUCCESS) { (VOID) ListView_DeleteItem(hListView, ItemIndex); return; } if (!LoadStringW(hInst, IDS_UNABLE_TO_REMOVE, szMsgText, sizeof(szMsgText) / sizeof(WCHAR))) return; MessageBoxW(hMainWnd, szMsgText, NULL, MB_OK | MB_ICONERROR); } }
BOOL UninstallApplication(INT Index, BOOL bModify) { WCHAR szModify[] = L"ModifyPath"; WCHAR szUninstall[] = L"UninstallString"; WCHAR szPath[MAX_PATH]; WCHAR szAppName[MAX_STR_LEN]; DWORD dwType, dwSize; INT ItemIndex; LVITEM Item; HKEY hKey; PINSTALLED_INFO ItemInfo; if (!IS_INSTALLED_ENUM(SelectedEnumType)) return FALSE; if (Index == -1) { ItemIndex = (INT) SendMessageW(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED); if (ItemIndex == -1) return FALSE; } else { ItemIndex = Index; } ListView_GetItemText(hListView, ItemIndex, 0, szAppName, sizeof(szAppName) / sizeof(WCHAR)); WriteLogMessage(EVENTLOG_SUCCESS, MSG_SUCCESS_REMOVE, szAppName); ZeroMemory(&Item, sizeof(LVITEM)); Item.mask = LVIF_PARAM; Item.iItem = ItemIndex; if (!ListView_GetItem(hListView, &Item)) return FALSE; ItemInfo = (PINSTALLED_INFO)Item.lParam; hKey = ItemInfo->hSubKey; dwType = REG_SZ; dwSize = MAX_PATH; if (RegQueryValueExW(hKey, bModify ? szModify : szUninstall, NULL, &dwType, (LPBYTE)szPath, &dwSize) != ERROR_SUCCESS) { return FALSE; } return StartProcess(szPath, TRUE); }
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_CREATE: if (!InitControls(hwnd)) PostMessage(hwnd, WM_CLOSE, 0, 0); if (SettingsInfo.bUpdateAtStart) UpdateAppsDB(); break; case WM_COMMAND: MainWndOnCommand(hwnd, wParam, lParam); break; case WM_NOTIFY: { LPNMHDR data = (LPNMHDR)lParam; switch (data->code) { case TVN_SELCHANGED: { if (data->hwndFrom == hTreeView) { switch (((LPNMTREEVIEW)lParam)->itemNew.lParam) { case IDS_INSTALLED: UpdateApplicationsList(ENUM_ALL_COMPONENTS); break; case IDS_APPLICATIONS: UpdateApplicationsList(ENUM_APPLICATIONS); break; case IDS_UPDATES: UpdateApplicationsList(ENUM_UPDATES); break; case IDS_AVAILABLEFORINST: UpdateApplicationsList(ENUM_ALL_AVAILABLE); break; case IDS_CAT_AUDIO: UpdateApplicationsList(ENUM_CAT_AUDIO); break; case IDS_CAT_DEVEL: UpdateApplicationsList(ENUM_CAT_DEVEL); break; case IDS_CAT_DRIVERS: UpdateApplicationsList(ENUM_CAT_DRIVERS); break; case IDS_CAT_EDU: UpdateApplicationsList(ENUM_CAT_EDU); break; case IDS_CAT_ENGINEER: UpdateApplicationsList(ENUM_CAT_ENGINEER); break; case IDS_CAT_FINANCE: UpdateApplicationsList(ENUM_CAT_FINANCE); break; case IDS_CAT_GAMES: UpdateApplicationsList(ENUM_CAT_GAMES); break; case IDS_CAT_GRAPHICS: UpdateApplicationsList(ENUM_CAT_GRAPHICS); break; case IDS_CAT_INTERNET: UpdateApplicationsList(ENUM_CAT_INTERNET); break; case IDS_CAT_LIBS: UpdateApplicationsList(ENUM_CAT_LIBS); break; case IDS_CAT_OFFICE: UpdateApplicationsList(ENUM_CAT_OFFICE); break; case IDS_CAT_OTHER: UpdateApplicationsList(ENUM_CAT_OTHER); break; case IDS_CAT_SCIENCE: UpdateApplicationsList(ENUM_CAT_SCIENCE); break; case IDS_CAT_TOOLS: UpdateApplicationsList(ENUM_CAT_TOOLS); break; case IDS_CAT_VIDEO: UpdateApplicationsList(ENUM_CAT_VIDEO); break; } } } break; case LVN_ITEMCHANGED: { LPNMLISTVIEW pnic = (LPNMLISTVIEW) lParam; if (pnic->hdr.hwndFrom == hListView) { /* Check if this is a valid item * (technically, it can be also an unselect) */ INT ItemIndex = pnic->iItem; if (ItemIndex == -1 || ItemIndex >= ListView_GetItemCount(pnic->hdr.hwndFrom)) { break; } /* Check if the focus has been moved to another item */ if ((pnic->uChanged & LVIF_STATE) && (pnic->uNewState & LVIS_FOCUSED) && !(pnic->uOldState & LVIS_FOCUSED)) { if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(ItemIndex); if (IS_AVAILABLE_ENUM(SelectedEnumType)) ShowAvailableAppInfo(ItemIndex); } } } break; case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; (VOID) ListView_SortItems(hListView, ListViewCompareFunc, pnmv->iSubItem); bAscending = !bAscending; } break; case NM_CLICK: if (data->hwndFrom == hListView) { if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(-1); if (IS_AVAILABLE_ENUM(SelectedEnumType)) ShowAvailableAppInfo(-1); } break; case NM_RCLICK: if (data->hwndFrom == hListView) ShowPopupMenu(hListView, IDR_APPLICATIONMENU); break; case EN_LINK: RichEditOnLink(hwnd, (ENLINK*)lParam); break; case TTN_GETDISPINFO: ToolBarOnGetDispInfo((LPTOOLTIPTEXT)lParam); break; } } break; case WM_PAINT: break; case WM_SIZE: { if ((GetClientWindowHeight(hMainWnd) - GetWindowHeight(hStatusBar) - SPLIT_WIDTH) < GetHSplitterPos()) { INT NewSplitPos = GetClientWindowHeight(hwnd) - 100 - GetWindowHeight(hStatusBar) - SPLIT_WIDTH; if (NewSplitPos > GetWindowHeight(hToolBar) + SPLIT_WIDTH) SetHSplitterPos(NewSplitPos); } MainWndOnSize(hwnd, wParam, lParam); } break; case WM_SIZING: { int RichEditHeight = GetWindowHeight(hRichEdit); LPRECT pRect = (LPRECT)lParam; while (RichEditHeight <= 100) { if (GetHSplitterPos() - 1 < GetWindowHeight(hToolBar) + GetWindowHeight(hListView) + SPLIT_WIDTH) break; SetHSplitterPos(GetHSplitterPos() - 1); RichEditHeight++; } if (pRect->right-pRect->left < 565) pRect->right = pRect->left + 565; if (pRect->bottom-pRect->top < 300) pRect->bottom = pRect->top + 300; return TRUE; } case WM_SYSCOLORCHANGE: { /* Forward WM_SYSCOLORCHANGE to common controls */ SendMessage(hListView, WM_SYSCOLORCHANGE, 0, 0); SendMessage(hTreeView, WM_SYSCOLORCHANGE, 0, 0); SendMessage(hToolBar, WM_SYSCOLORCHANGE, 0, 0); SendMessageW(hRichEdit, EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); } break; case WM_DESTROY: { ShowWindow(hwnd, SW_HIDE); SaveSettings(hwnd); FreeLogs(); if (IS_AVAILABLE_ENUM(SelectedEnumType)) FreeAvailableAppList(); if (IS_INSTALLED_ENUM(SelectedEnumType)) FreeInstalledAppList(); if (hImageTreeView) ImageList_Destroy(hImageTreeView); PostQuitMessage(0); return 0; } break; } return DefWindowProc(hwnd, Msg, wParam, lParam); }
BOOL ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT& theResult, DWORD dwMapId) { theResult = 0; switch (Msg) { case WM_CREATE: if (!InitControls()) ::PostMessage(hwnd, WM_CLOSE, 0, 0); break; case WM_DESTROY: { ShowWindow(SW_HIDE); SaveSettings(hwnd); FreeLogs(); FreeCachedAvailableEntries(); if (IS_INSTALLED_ENUM(SelectedEnumType)) FreeInstalledAppList(); if (hImageTreeView) ImageList_Destroy(hImageTreeView); delete m_ClientPanel; PostQuitMessage(0); return 0; } case WM_COMMAND: OnCommand(wParam, lParam); break; case WM_NOTIFY: { LPNMHDR data = (LPNMHDR) lParam; switch (data->code) { case TVN_SELCHANGED: { if (data->hwndFrom == m_TreeView->m_hWnd) { switch (((LPNMTREEVIEW) lParam)->itemNew.lParam) { case IDS_INSTALLED: UpdateApplicationsList(ENUM_ALL_COMPONENTS); break; case IDS_APPLICATIONS: UpdateApplicationsList(ENUM_APPLICATIONS); break; case IDS_UPDATES: UpdateApplicationsList(ENUM_UPDATES); break; case IDS_AVAILABLEFORINST: UpdateApplicationsList(ENUM_ALL_AVAILABLE); break; case IDS_CAT_AUDIO: UpdateApplicationsList(ENUM_CAT_AUDIO); break; case IDS_CAT_DEVEL: UpdateApplicationsList(ENUM_CAT_DEVEL); break; case IDS_CAT_DRIVERS: UpdateApplicationsList(ENUM_CAT_DRIVERS); break; case IDS_CAT_EDU: UpdateApplicationsList(ENUM_CAT_EDU); break; case IDS_CAT_ENGINEER: UpdateApplicationsList(ENUM_CAT_ENGINEER); break; case IDS_CAT_FINANCE: UpdateApplicationsList(ENUM_CAT_FINANCE); break; case IDS_CAT_GAMES: UpdateApplicationsList(ENUM_CAT_GAMES); break; case IDS_CAT_GRAPHICS: UpdateApplicationsList(ENUM_CAT_GRAPHICS); break; case IDS_CAT_INTERNET: UpdateApplicationsList(ENUM_CAT_INTERNET); break; case IDS_CAT_LIBS: UpdateApplicationsList(ENUM_CAT_LIBS); break; case IDS_CAT_OFFICE: UpdateApplicationsList(ENUM_CAT_OFFICE); break; case IDS_CAT_OTHER: UpdateApplicationsList(ENUM_CAT_OTHER); break; case IDS_CAT_SCIENCE: UpdateApplicationsList(ENUM_CAT_SCIENCE); break; case IDS_CAT_TOOLS: UpdateApplicationsList(ENUM_CAT_TOOLS); break; case IDS_CAT_VIDEO: UpdateApplicationsList(ENUM_CAT_VIDEO); break; } } HMENU mainMenu = ::GetMenu(hwnd); HMENU lvwMenu = ::GetMenu(m_ListView->m_hWnd); /* Disable/enable items based on treeview selection */ if (IsSelectedNodeInstalled()) { EnableMenuItem(mainMenu, ID_REGREMOVE, MF_ENABLED); EnableMenuItem(mainMenu, ID_INSTALL, MF_GRAYED); EnableMenuItem(mainMenu, ID_UNINSTALL, MF_ENABLED); EnableMenuItem(mainMenu, ID_MODIFY, MF_ENABLED); EnableMenuItem(lvwMenu, ID_REGREMOVE, MF_ENABLED); EnableMenuItem(lvwMenu, ID_INSTALL, MF_GRAYED); EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_ENABLED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_ENABLED); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, TRUE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, FALSE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, TRUE); } else { EnableMenuItem(mainMenu, ID_REGREMOVE, MF_GRAYED); EnableMenuItem(mainMenu, ID_INSTALL, MF_ENABLED); EnableMenuItem(mainMenu, ID_UNINSTALL, MF_GRAYED); EnableMenuItem(mainMenu, ID_MODIFY, MF_GRAYED); EnableMenuItem(lvwMenu, ID_REGREMOVE, MF_GRAYED); EnableMenuItem(lvwMenu, ID_INSTALL, MF_ENABLED); EnableMenuItem(lvwMenu, ID_UNINSTALL, MF_GRAYED); EnableMenuItem(lvwMenu, ID_MODIFY, MF_GRAYED); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_REGREMOVE, FALSE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_INSTALL, TRUE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE); m_Toolbar->SendMessage(TB_ENABLEBUTTON, ID_MODIFY, FALSE); } } break; case LVN_ITEMCHANGED: { LPNMLISTVIEW pnic = (LPNMLISTVIEW) lParam; if (pnic->hdr.hwndFrom == m_ListView->m_hWnd) { /* Check if this is a valid item * (technically, it can be also an unselect) */ INT ItemIndex = pnic->iItem; if (ItemIndex == -1 || ItemIndex >= ListView_GetItemCount(pnic->hdr.hwndFrom)) { break; } /* Check if the focus has been moved to another item */ if ((pnic->uChanged & LVIF_STATE) && (pnic->uNewState & LVIS_FOCUSED) && !(pnic->uOldState & LVIS_FOCUSED)) { if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(ItemIndex); if (IS_AVAILABLE_ENUM(SelectedEnumType)) ShowAvailableAppInfo(ItemIndex); } } } break; case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; m_ListView->ColumnClick(pnmv); } break; case NM_CLICK: { if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1) { if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(-1); if (IS_AVAILABLE_ENUM(SelectedEnumType)) ShowAvailableAppInfo(-1); } } break; case NM_DBLCLK: { 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); } } break; case NM_RCLICK: { if (data->hwndFrom == m_ListView->m_hWnd && ((LPNMLISTVIEW) lParam)->iItem != -1) { ShowPopupMenu(m_ListView->m_hWnd, 0, ID_INSTALL); } } break; case EN_LINK: OnLink((ENLINK*) lParam); break; case TTN_GETDISPINFO: m_Toolbar->OnGetDispInfo((LPTOOLTIPTEXT) lParam); break; } } break; case WM_SIZE: OnSize(hwnd, wParam, lParam); break; case WM_SIZING: { LPRECT pRect = (LPRECT) lParam; if (pRect->right - pRect->left < 565) pRect->right = pRect->left + 565; if (pRect->bottom - pRect->top < 300) pRect->bottom = pRect->top + 300; return TRUE; } case WM_SYSCOLORCHANGE: { /* Forward WM_SYSCOLORCHANGE to common controls */ m_ListView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_TreeView->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_Toolbar->SendMessage(WM_SYSCOLORCHANGE, 0, 0); m_ListView->SendMessage(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); } break; case WM_TIMER: if (wParam == SEARCH_TIMER_ID) { ::KillTimer(hwnd, SEARCH_TIMER_ID); UpdateApplicationsList(-1); } break; } return FALSE; }
VOID UpdateApplicationsList(INT EnumType) { WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN]; HICON hIcon; HIMAGELIST hImageListView; m_ListView->SendMessage(WM_SETREDRAW, FALSE, 0); if (EnumType == -1) EnumType = SelectedEnumType; if (IS_INSTALLED_ENUM(SelectedEnumType)) FreeInstalledAppList(); (VOID) ListView_DeleteAllItems(hListView); /* Create image list */ hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE, GetSystemColorDepth() | ILC_MASK, 0, 1); hIcon = (HICON) LoadImage(hInst, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, LISTVIEW_ICON_SIZE, LISTVIEW_ICON_SIZE, LR_CREATEDIBSECTION); ImageList_AddIcon(hImageListView, hIcon); DestroyIcon(hIcon); if (IS_INSTALLED_ENUM(EnumType)) { /* Enum installed applications and updates */ EnumInstalledApplications(EnumType, TRUE, s_EnumInstalledAppProc); EnumInstalledApplications(EnumType, FALSE, s_EnumInstalledAppProc); } else if (IS_AVAILABLE_ENUM(EnumType)) { /* Enum availabled applications */ EnumAvailableApplications(EnumType, s_EnumAvailableAppProc); } /* Set image list for ListView */ hImageListView = ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL); /* Destroy old image list */ if (hImageListView) ImageList_Destroy(hImageListView); SelectedEnumType = EnumType; LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2)); StringCbPrintfW(szBuffer1, sizeof(szBuffer1), szBuffer2, ListView_GetItemCount(hListView)); SetStatusBarText(szBuffer1); 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); SendMessage(hListView, WM_SETREDRAW, TRUE, 0); }