Index: base/applications/rapps/listview.c =================================================================== --- base/applications/rapps/listview.c (revision 58310) +++ base/applications/rapps/listview.c (working copy) @@ -106,7 +106,7 @@ WS_CHILD | WS_VISIBLE | LVS_SORTASCENDING | LVS_REPORT | LVS_SINGLESEL, 205, 28, 465, 250, hwnd, - NULL, + GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCE(IDR_APPLICATIONMENU)), 0), hInst, NULL); Index: base/applications/rapps/winmain.c =================================================================== --- base/applications/rapps/winmain.c (revision 58310) +++ base/applications/rapps/winmain.c (working copy) @@ -517,9 +517,35 @@ EndDeferWindowPos(hdwp); } +/* + Loops twice to check if selected node or parent of selected node is IDS_INSTALLED + to see if selected node is of installed applications. +*/ +BOOL IsSelectedNodeInstalled(void) +{ + HTREEITEM hSelectedItem = TreeView_GetSelection(hTreeView); + int iDepth; + for (iDepth = 0 ; iDepth < 2 ; iDepth++) + { + TV_ITEM tItem; + tItem.mask = TVIF_PARAM | TVIF_HANDLE; + tItem.hItem = hSelectedItem; + if (TreeView_GetItem(hTreeView, &tItem)) + { + if (tItem.lParam == IDS_INSTALLED) + return TRUE; + else + hSelectedItem = TreeView_GetParent(hTreeView, hSelectedItem); + } + } + return FALSE; +} + LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { + HMENU hAppMenu, hListViewMenu; + switch (Msg) { case WM_CREATE: @@ -623,6 +649,58 @@ break; } } + + /* + Disable/enable items based on treeview selection + */ + hAppMenu = GetMenu(hwnd); + if (!hAppMenu) + { + MessageBoxW(hwnd, L"hAppMenu returned NULL!", NULL, MB_ICONERROR); + break; + } + + hListViewMenu = GetMenu(hListView); + if (!hListViewMenu) + { + MessageBoxW(hwnd, L"hListViewMenu returned NULL!", NULL, MB_ICONERROR); + break; + } + + if (IsSelectedNodeInstalled()) + { + EnableMenuItem(hAppMenu, ID_REGREMOVE, MF_ENABLED); + EnableMenuItem(hAppMenu, ID_INSTALL, MF_GRAYED); + EnableMenuItem(hAppMenu, ID_UNINSTALL, MF_ENABLED); + EnableMenuItem(hAppMenu, ID_MODIFY, MF_ENABLED); + + EnableMenuItem(hListViewMenu, ID_REGREMOVE, MF_ENABLED); + EnableMenuItem(hListViewMenu, ID_INSTALL, MF_GRAYED); + EnableMenuItem(hListViewMenu, ID_UNINSTALL, MF_ENABLED); + EnableMenuItem(hListViewMenu, ID_MODIFY, MF_ENABLED); + + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_REGREMOVE, TRUE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_INSTALL, FALSE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_UNINSTALL, TRUE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_MODIFY, TRUE); + } + else + { + EnableMenuItem(hAppMenu, ID_REGREMOVE, MF_GRAYED); + EnableMenuItem(hAppMenu, ID_INSTALL, MF_ENABLED); + EnableMenuItem(hAppMenu, ID_UNINSTALL, MF_GRAYED); + EnableMenuItem(hAppMenu, ID_MODIFY, MF_GRAYED); + + EnableMenuItem(hListViewMenu, ID_REGREMOVE, MF_GRAYED); + EnableMenuItem(hListViewMenu, ID_INSTALL, MF_ENABLED); + EnableMenuItem(hListViewMenu, ID_UNINSTALL, MF_GRAYED); + EnableMenuItem(hListViewMenu, ID_MODIFY, MF_GRAYED); + + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_REGREMOVE, FALSE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_INSTALL, TRUE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_UNINSTALL, FALSE); + SendMessage(hToolBar, TB_ENABLEBUTTON, ID_MODIFY, FALSE); + } } break; @@ -636,6 +714,13 @@ if (pnkd->wVKey == VK_UP) ItemIndex -= 1; if (pnkd->wVKey == VK_DOWN) ItemIndex += 1; + if (pnkd->wVKey == VK_RETURN) + { + if (IsSelectedNodeInstalled()) + SendMessage(hwnd, WM_COMMAND, ID_UNINSTALL, 0); + else + SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0); + } if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(ItemIndex); @@ -645,6 +730,15 @@ } break; + case NM_DBLCLK: + { + if (IsSelectedNodeInstalled()) + SendMessage(hwnd, WM_COMMAND, ID_UNINSTALL, 0); + else + SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0); + } + break; + case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; @@ -666,7 +760,18 @@ case NM_RCLICK: if (data->hwndFrom == hListView) - ShowPopupMenu(hListView, IDR_APPLICATIONMENU); + { + POINT pt; + HMENU hListViewMenu = GetMenu(hListView); + if (!hListViewMenu) + { + MessageBox(0, TEXT("hListViewMenu is NULL"), 0, MB_OK | MB_ICONINFORMATION); + break; + } + GetCursorPos(&pt); + SetForegroundWindow(hwnd); + TrackPopupMenu(hListViewMenu, 0, pt.x, pt.y, 0, hwnd, NULL); + } break; case EN_LINK: