@@ -1644,6 +1644,11 @@ CApplicationView::ProcessWindowMessage(
16441644 ItemCheckStateChanged (FALSE , (LPVOID)pnic->lParam );
16451645 }
16461646 }
1647+
1648+ /* Ensure that if there are any items still focused/selected,
1649+ * the ID_INSTALL menu item and toolbar button stay enabled */
1650+ if ((pnic->uChanged & LVIF_STATE) && !m_MainWindow->bUpdating )
1651+ _UpdateInstallBtn ();
16471652 }
16481653 break ;
16491654
@@ -2039,25 +2044,19 @@ BOOL
20392044CApplicationView::SetDisplayAppType (APPLICATION_VIEW_TYPE AppType)
20402045{
20412046 if (!m_ListView->SetDisplayAppType (AppType))
2042- {
20432047 return FALSE ;
2044- }
2048+
20452049 ApplicationViewType = AppType;
20462050 m_AppsInfo->SetWelcomeText (m_MainWindow->m_bAppwizMode );
20472051
2048- HMENU hMenu = :: GetMenu (m_hWnd );
2052+ HMENU hMenu = GetMenu ();
20492053 switch (AppType)
20502054 {
20512055 case AppViewTypeInstalledApps:
20522056 {
20532057 EnableMenuItem (hMenu, ID_INSTALL, MF_GRAYED);
2054- EnableMenuItem (hMenu, ID_UNINSTALL, MF_ENABLED);
2055- EnableMenuItem (hMenu, ID_MODIFY, MF_ENABLED);
2056- EnableMenuItem (hMenu, ID_REGREMOVE, MF_ENABLED);
2057-
20582058 m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_INSTALL, FALSE );
2059- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_UNINSTALL, TRUE );
2060- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_MODIFY, TRUE );
2059+
20612060 m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_CHECK_ALL, FALSE );
20622061 break ;
20632062 }
@@ -2067,18 +2066,22 @@ CApplicationView::SetDisplayAppType(APPLICATION_VIEW_TYPE AppType)
20672066 // We shouldn't get there in APPWIZ-mode.
20682067 ATLASSERT (!m_MainWindow->m_bAppwizMode );
20692068
2070- EnableMenuItem (hMenu, ID_INSTALL, MF_ENABLED);
2071- EnableMenuItem (hMenu, ID_UNINSTALL, MF_GRAYED);
2072- EnableMenuItem (hMenu, ID_MODIFY, MF_GRAYED);
2073- EnableMenuItem (hMenu, ID_REGREMOVE, MF_GRAYED);
2069+ /* Even if no ListView item is focused at this point, enable
2070+ * or disable ID_INSTALL if there are selected applications. */
2071+ _UpdateInstallBtn ();
20742072
2075- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_INSTALL, TRUE );
2076- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_UNINSTALL, FALSE );
2077- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_MODIFY, FALSE );
20782073 m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_CHECK_ALL, TRUE );
20792074 break ;
20802075 }
20812076 }
2077+
2078+ /* Always disable these items by default */
2079+ EnableMenuItem (hMenu, ID_UNINSTALL, MF_GRAYED);
2080+ EnableMenuItem (hMenu, ID_MODIFY, MF_GRAYED);
2081+ EnableMenuItem (hMenu, ID_REGREMOVE, MF_GRAYED);
2082+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_UNINSTALL, FALSE );
2083+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_MODIFY, FALSE );
2084+
20822085 return TRUE ;
20832086}
20842087
@@ -2163,30 +2166,70 @@ CApplicationView::RefreshDetailsPane(CAppInfo &Info, bool OnlyUpdateText)
21632166 m_AppsInfo->ShowAppInfo (Info, OnlyUpdateText);
21642167}
21652168
2166- // this function is called when a item of listview get focus.
2167- // CallbackParam is the param passed to listview when adding the item (the one getting focus now).
2169+ void
2170+ CApplicationView::_UpdateInstallBtn ()
2171+ {
2172+ if (ApplicationViewType == AppViewTypeInstalledApps)
2173+ {
2174+ EnableMenuItem (GetMenu (), ID_INSTALL, MF_GRAYED);
2175+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_INSTALL, FALSE );
2176+ }
2177+ else if (ApplicationViewType == AppViewTypeAvailableApps)
2178+ {
2179+ // We shouldn't get there in APPWIZ-mode.
2180+ ATLASSERT (!m_MainWindow->m_bAppwizMode );
2181+
2182+ /* Even if no ListView item is focused at this point, enable
2183+ * or disable ID_INSTALL if there are selected applications. */
2184+ BOOL CanInstall = !m_MainWindow->m_Selected .IsEmpty ();
2185+ CanInstall = CanInstall || (m_ListView->GetSelectedCount () > 0 );
2186+ EnableMenuItem (GetMenu (), ID_INSTALL, CanInstall ? MF_ENABLED : MF_GRAYED);
2187+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_INSTALL, CanInstall);
2188+ }
2189+ }
2190+
2191+ // This function is called when a ListView item gets the focus.
2192+ // CallbackParam is the param passed to the ListView when adding the item (the one getting focus now).
21682193VOID
21692194CApplicationView::ItemGetFocus (LPVOID CallbackParam)
21702195{
2171- if (CallbackParam)
2196+ if (!CallbackParam)
2197+ return ;
2198+
2199+ CAppInfo *Info = static_cast <CAppInfo *>(CallbackParam);
2200+ RefreshDetailsPane (*Info);
2201+
2202+ HMENU hMenu = GetMenu ();
2203+ if (ApplicationViewType == AppViewTypeInstalledApps)
21722204 {
2173- CAppInfo *Info = static_cast <CAppInfo *>(CallbackParam);
2174- RefreshDetailsPane (*Info);
2205+ /* ID_INSTALL is left disabled */
21752206
2176- if (ApplicationViewType == AppViewTypeInstalledApps)
2177- {
2178- HMENU hMenu = ::GetMenu (m_hWnd);
2207+ EnableMenuItem (hMenu, ID_UNINSTALL, MF_ENABLED);
2208+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_UNINSTALL, TRUE );
21792209
2180- BOOL CanModify = Info->CanModify ();
2210+ BOOL CanModify = Info->CanModify ();
2211+ EnableMenuItem (hMenu, ID_MODIFY, CanModify ? MF_ENABLED : MF_GRAYED);
2212+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_MODIFY, CanModify);
21812213
2182- EnableMenuItem (hMenu, ID_MODIFY, CanModify ? MF_ENABLED : MF_GRAYED);
2183- m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_MODIFY, CanModify);
2184- }
2214+ EnableMenuItem (hMenu, ID_REGREMOVE, MF_ENABLED);
2215+ }
2216+ else if (ApplicationViewType == AppViewTypeAvailableApps)
2217+ {
2218+ // We shouldn't get there in APPWIZ-mode.
2219+ ATLASSERT (!m_MainWindow->m_bAppwizMode );
2220+
2221+ EnableMenuItem (hMenu, ID_INSTALL, MF_ENABLED);
2222+ m_Toolbar->SendMessageW (TB_ENABLEBUTTON, ID_INSTALL, TRUE );
2223+
2224+ /* ID_UNINSTALL, ID_MODIFY and ID_REGREMOVE are left disabled */
2225+ // TODO: When we are able to detect whether this selected available
2226+ // application is already installed (could be an older version),
2227+ // do also what's done in the AppViewTypeInstalledApps case above.
21852228 }
21862229}
21872230
2188- // this function is called when a item of listview is checked/unchecked
2189- // CallbackParam is the param passed to listview when adding the item (the one getting changed now).
2231+ // This function is called when a ListView item (an application) is checked/unchecked.
2232+ // CallbackParam is the param passed to the ListView when adding the item (the one getting changed now).
21902233VOID
21912234CApplicationView::ItemCheckStateChanged (BOOL bChecked, LPVOID CallbackParam)
21922235{
0 commit comments