From 097e963a80d5f3121e818360a09d487d709ccfc0 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 18 Jan 2014 14:11:19 +0000 Subject: [PATCH] =?UTF-8?q?[RAPPS]=20-=20Allow=20double-clicking=20to=20in?= =?UTF-8?q?stall=20programs.=20Based=20on=20patch=20by=20Edijs=20Kolesniko?= =?UTF-8?q?vi=C4=8Ds=20and=20Yuntian=20Zhang.=20CORE-4357=20#resolve=20#co?= =?UTF-8?q?mment=20Thanks=20guys,=20this=20was=20a=20major=20annoyance.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=61675 --- reactos/base/applications/rapps/listview.c | 2 +- reactos/base/applications/rapps/misc.c | 24 ++++++- reactos/base/applications/rapps/rapps.h | 2 +- reactos/base/applications/rapps/richedit.c | 2 +- reactos/base/applications/rapps/winmain.c | 80 ++++++++++++++++++++-- 5 files changed, 99 insertions(+), 11 deletions(-) diff --git a/reactos/base/applications/rapps/listview.c b/reactos/base/applications/rapps/listview.c index f343e996aa0..7c65cabc08a 100644 --- a/reactos/base/applications/rapps/listview.c +++ b/reactos/base/applications/rapps/listview.c @@ -105,7 +105,7 @@ CreateListView(HWND hwnd) WS_CHILD | WS_VISIBLE | LVS_SORTASCENDING | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 205, 28, 465, 250, hwnd, - NULL, + GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_APPLICATIONMENU)), 0), hInst, NULL); diff --git a/reactos/base/applications/rapps/misc.c b/reactos/base/applications/rapps/misc.c index aa944a60f80..2bb16b6950b 100644 --- a/reactos/base/applications/rapps/misc.c +++ b/reactos/base/applications/rapps/misc.c @@ -149,17 +149,35 @@ SetWelcomeText(VOID) } VOID -ShowPopupMenu(HWND hwnd, UINT MenuID) +ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem) { - HMENU hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0); + HMENU hMenu = NULL; + HMENU hPopupMenu; + MENUITEMINFO mii; POINT pt; + if (MenuID) + { + hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)); + hPopupMenu = GetSubMenu(hMenu, 0); + } + else + hPopupMenu = GetMenu(hwnd); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STATE; + GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii); + if (!(mii.fState & MFS_GRAYED)) + SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE); + GetCursorPos(&pt); SetForegroundWindow(hwnd); TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL); - DestroyMenu(hPopupMenu); + if (hMenu) + DestroyMenu(hMenu); } BOOL diff --git a/reactos/base/applications/rapps/rapps.h b/reactos/base/applications/rapps/rapps.h index 7841890bd43..7d29c2fdcb6 100644 --- a/reactos/base/applications/rapps/rapps.h +++ b/reactos/base/applications/rapps/rapps.h @@ -149,7 +149,7 @@ int GetClientWindowWidth(HWND hwnd); 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 GetStorageDirectory(PWCHAR lpDirectory, DWORD cch); BOOL ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath); diff --git a/reactos/base/applications/rapps/richedit.c b/reactos/base/applications/rapps/richedit.c index 97aa9c60b0e..970a328f0ce 100644 --- a/reactos/base/applications/rapps/richedit.c +++ b/reactos/base/applications/rapps/richedit.c @@ -36,7 +36,7 @@ RichEditOnLink(HWND hwnd, ENLINK *Link) 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; } diff --git a/reactos/base/applications/rapps/winmain.c b/reactos/base/applications/rapps/winmain.c index 1fb11ad0189..f88eb942320 100644 --- a/reactos/base/applications/rapps/winmain.c +++ b/reactos/base/applications/rapps/winmain.c @@ -588,6 +588,25 @@ MainWndOnSize(HWND hwnd, WPARAM wParam, LPARAM lParam) 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) { @@ -692,6 +711,42 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) break; } } + + /* Disable/enable items based on treeview selection */ + if (IsSelectedNodeInstalled()) + { + EnableMenuItem(GetMenu(hwnd), ID_REGREMOVE, MF_ENABLED); + EnableMenuItem(GetMenu(hwnd), ID_INSTALL, MF_GRAYED); + EnableMenuItem(GetMenu(hwnd), ID_UNINSTALL, MF_ENABLED); + EnableMenuItem(GetMenu(hwnd), ID_MODIFY, MF_ENABLED); + + EnableMenuItem(GetMenu(hListView), ID_REGREMOVE, MF_ENABLED); + EnableMenuItem(GetMenu(hListView), ID_INSTALL, MF_GRAYED); + EnableMenuItem(GetMenu(hListView), ID_UNINSTALL, MF_ENABLED); + EnableMenuItem(GetMenu(hListView), 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(GetMenu(hwnd), ID_REGREMOVE, MF_GRAYED); + EnableMenuItem(GetMenu(hwnd), ID_INSTALL, MF_ENABLED); + EnableMenuItem(GetMenu(hwnd), ID_UNINSTALL, MF_GRAYED); + EnableMenuItem(GetMenu(hwnd), ID_MODIFY, MF_GRAYED); + + EnableMenuItem(GetMenu(hListView), ID_REGREMOVE, MF_GRAYED); + EnableMenuItem(GetMenu(hListView), ID_INSTALL, MF_ENABLED); + EnableMenuItem(GetMenu(hListView), ID_UNINSTALL, MF_GRAYED); + EnableMenuItem(GetMenu(hListView), 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; @@ -734,19 +789,34 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) 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);