Index: base/applications/rapps/listview.c =================================================================== --- base/applications/rapps/listview.c (revision 59451) +++ 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, MAKEINTRESOURCEW(IDR_APPLICATIONMENU)), 0), hInst, NULL); Index: base/applications/rapps/misc.c =================================================================== --- base/applications/rapps/misc.c (revision 59451) +++ base/applications/rapps/misc.c (working copy) @@ -145,9 +145,15 @@ } VOID -ShowPopupMenu(HWND hwnd, UINT MenuID) +ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem) { - HMENU hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0); + HMENU hPopupMenu; + if (MenuID) + hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0); + else + hPopupMenu = GetMenu(hwnd); + + SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE); POINT pt; GetCursorPos(&pt); @@ -155,7 +161,8 @@ SetForegroundWindow(hwnd); TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL); - DestroyMenu(hPopupMenu); + if (MenuID) + DestroyMenu(hPopupMenu); } BOOL Index: base/applications/rapps/rapps.h =================================================================== --- base/applications/rapps/rapps.h (revision 59451) +++ base/applications/rapps/rapps.h (working copy) @@ -147,7 +147,7 @@ int GetClientWindowHeight(HWND hwnd); VOID CopyTextToClipboard(LPCWSTR lpszText); VOID SetWelcomeText(VOID); -VOID ShowPopupMenu(HWND hwnd, UINT MenuID); +VOID ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem); BOOL StartProcess(LPWSTR lpPath, BOOL Wait); BOOL ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath); VOID InitLogs(VOID); Index: base/applications/rapps/richedit.c =================================================================== --- base/applications/rapps/richedit.c (revision 59451) +++ base/applications/rapps/richedit.c (working copy) @@ -35,7 +35,7 @@ SendMessageW(hRichEdit, EM_SETSEL, Link->chrg.cpMin, Link->chrg.cpMax); SendMessageW(hRichEdit, EM_GETSELTEXT, 0, (LPARAM)pLink); - ShowPopupMenu(hwnd, IDR_LINKMENU); + ShowPopupMenu(hwnd, IDR_LINKMENU, -1); } break; } Index: base/applications/rapps/winmain.c =================================================================== --- base/applications/rapps/winmain.c (revision 59451) +++ base/applications/rapps/winmain.c (working copy) @@ -522,6 +522,24 @@ EndDeferWindowPos(hdwp); } +BOOL IsSelectedNodeInstalled(void) +{ + HTREEITEM hSelectedItem = TreeView_GetSelection(hTreeView); + TV_ITEM tItem; + tItem.mask = TVIF_PARAM | TVIF_HANDLE; + tItem.hItem = hSelectedItem; + TreeView_GetItem(hTreeView, &tItem); + switch (tItem.lParam) + { + case IDS_INSTALLED: + case IDS_APPLICATIONS: + case IDS_UPDATES: + return TRUE; + default: + return FALSE; + } +} + LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { @@ -628,6 +646,58 @@ break; } } + + /* + Disable/enable items based on treeview selection + */ + HMENU hAppMenu = GetMenu(hwnd); + if (!hAppMenu) + { + MessageBoxW(hwnd, L"hAppMenu returned NULL!", NULL, MB_ICONERROR); + break; + } + + HMENU 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; @@ -641,6 +711,14 @@ if (pnkd->wVKey == VK_UP) ItemIndex -= 1; if (pnkd->wVKey == VK_DOWN) ItemIndex += 1; + + if (pnkd->wVKey == VK_RETURN) + { + if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1) + { + SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0); + } + } if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(ItemIndex); @@ -660,19 +738,34 @@ break; case NM_CLICK: - if (data->hwndFrom == hListView) + { + if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1) { if (IS_INSTALLED_ENUM(SelectedEnumType)) ShowInstalledAppInfo(-1); if (IS_AVAILABLE_ENUM(SelectedEnumType)) ShowAvailableAppInfo(-1); } - break; + } + break; + + case NM_DBLCLK: + { + if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1) + { + SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0); //Won't do anything if the program is already installed + } + } + break; case NM_RCLICK: - if (data->hwndFrom == hListView) - ShowPopupMenu(hListView, IDR_APPLICATIONMENU); - break; + { + if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1) + { + ShowPopupMenu(hListView, 0, ID_INSTALL); + } + } + break; case EN_LINK: RichEditOnLink(hwnd, (ENLINK*)lParam);