//******************************************************************************************* // // Filename : SFVMenu.cpp // // Implementation file for CSFView menu related methods // // Copyright (c) 1994 - 1996 Microsoft Corporation. All rights reserved // //******************************************************************************************* #include "Pch.H" #include "SFView.H" #include "SFVWnd.H" #include "Resource.H" enum { SUBMENU_EDIT, SUBMENU_VIEW, } ; enum { SUBMENUNF_EDIT, SUBMENUNF_VIEW, } ; static HMENU _GetMenuFromID(HMENU hmMain, UINT uID) { MENUITEMINFO miiSubMenu; miiSubMenu.cbSize = sizeof(MENUITEMINFO); miiSubMenu.fMask = MIIM_SUBMENU; miiSubMenu.cch = 0; // just in case if (!GetMenuItemInfo(hmMain, uID, FALSE, &miiSubMenu)) { return NULL; } return(miiSubMenu.hSubMenu); } static int _GetOffsetFromID(HMENU hmMain, UINT uID) { int index; for (index = GetMenuItemCount(hmMain)-1; index>=0; index--) { MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID; mii.cch = 0; // just in case if (GetMenuItemInfo(hmMain, (UINT)index, TRUE, &mii) && (mii.wID == FCIDM_MENU_VIEW_SEP_OPTIONS)) { // merge it right above the separator. break; } } return(index); } int CSFView::GetMenuIDFromViewMode() { switch (m_fs.ViewMode) { case FVM_SMALLICON: return(IDC_VIEW_SMALLICON); case FVM_LIST: return(IDC_VIEW_LIST); case FVM_DETAILS: return(IDC_VIEW_DETAILS); default: return(IDC_VIEW_ICON); } } BOOL CSFView::GetArrangeText(int iCol, UINT idFmt, LPSTR pszText, UINT cText) { char szFormat[200]; LoadString(g_ThisDll.GetInstance(), idFmt, szFormat, sizeof(szFormat)); LV_COLUMN col; char szText[80]; col.mask = LVCF_TEXT; col.pszText = szText; col.cchTextMax = sizeof(szText); if (!m_cView.GetColumn(iCol, &col)) { return(FALSE); } char szCommand[sizeof(szFormat)+sizeof(szText)]; wsprintf(szCommand, szFormat, szText); lstrcpyn(pszText, szCommand, cText); return(TRUE); } void CSFView::MergeArrangeMenu(HMENU hmView) { // Now add the sorting menu items for (int i=0; iInsertMenusSB(cMenu, &mwidth); // store this current menu m_cmCur.Attach(cMenu.Detach()); } // Get the edit menu in the browser HMENU hmEdit = _GetMenuFromID(m_cmCur, FCIDM_MENU_EDIT); if (uState == SVUIA_ACTIVATE_FOCUS) { // load the menu resource CMenuTemp cmMerge(LoadMenu(g_ThisDll.GetInstance(), MAKEINTRESOURCE(MENU_SFV_MAINMERGE))); if ((HMENU)cmMerge) { // merge it with Edit submenu Cab_MergeMenus(hmEdit, GetSubMenu(cmMerge, SUBMENU_EDIT), (UINT)-1, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS); // add the view menu MergeViewMenu(m_cmCur, GetSubMenu(cmMerge, SUBMENU_VIEW)); } } else { CMenuTemp cmMerge(LoadMenu(g_ThisDll.GetInstance(), MAKEINTRESOURCE(MENU_SFV_MAINMERGENF))); if ((HMENU)cmMerge) { Cab_MergeMenus(hmEdit, GetSubMenu(cmMerge, SUBMENUNF_EDIT), (UINT)-1, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS); // view menu MergeViewMenu(m_cmCur, GetSubMenu(cmMerge, SUBMENUNF_VIEW)); } } // install the composite menu into the shell browser m_psb->SetMenuSB(m_cmCur, NULL, m_cView); m_uState = uState; return TRUE; } BOOL CSFView::OnDeactivate() { if (m_uState != SVUIA_DEACTIVATE) { m_psb->SetMenuSB(NULL, NULL, NULL); m_psb->RemoveMenusSB(m_cmCur); DestroyMenu(m_cmCur.Detach()); m_uState = SVUIA_DEACTIVATE; } return TRUE; } //***************************************************************************** // // CSFView::OnCommand // // Purpose: // // handle the WM_COMMAND sent by the explorer to the view // // Comments: // //***************************************************************************** void CSFView::OnCommand(IContextMenu *pcm, WPARAM wParam, LPARAM lParam) { if (!pcm) { pcm = m_pcmSel; } if (pcm) { pcm->AddRef(); } CEnsureRelease erContext(pcm); int idCmd = GET_WM_COMMAND_ID(wParam, lParam); DWORD dwStyle; switch (idCmd) { // Set the FOLDERSETTINGS for this view case IDC_VIEW_ICON + FCIDM_SHVIEWFIRST: dwStyle = LVS_ICON; m_fs.ViewMode = FVM_ICON; goto SetStyle; case IDC_VIEW_SMALLICON + FCIDM_SHVIEWFIRST: dwStyle = LVS_SMALLICON; m_fs.ViewMode = FVM_SMALLICON; goto SetStyle; case IDC_VIEW_LIST + FCIDM_SHVIEWFIRST: dwStyle = LVS_LIST; m_fs.ViewMode = FVM_LIST; goto SetStyle; case IDC_VIEW_DETAILS + FCIDM_SHVIEWFIRST: dwStyle = LVS_REPORT; m_fs.ViewMode = FVM_DETAILS; goto SetStyle; // set the style of the Listview accordingly SetStyle: m_cView.SetStyle(dwStyle, LVS_TYPEMASK); CheckToolbar(); break; // handle the Copy operation case IDC_EDIT_COPY + FCIDM_SHVIEWFIRST: { LPDATAOBJECT pdtobj; if (!m_cView.OleInited() || FAILED(m_cView.GetUIObjectFromItem(IID_IDataObject, (LPVOID*)&pdtobj, SVGIO_SELECTION))) { MessageBeep(0); break; } CEnsureRelease erData(pdtobj); OleSetClipboard(pdtobj); break; } // handle selection of items case IDC_EDIT_SELALL + FCIDM_SHVIEWFIRST: SetFocus(m_cView); m_cView.SelAll(); break; case IDC_EDIT_INVSEL + FCIDM_SHVIEWFIRST: SetFocus(m_cView); m_cView.InvSel(); break; default: if (idCmd>=IDC_ARRANGE_BY && idCmd=SFV_CONTEXT_FIRST && idCmd<=SFV_CONTEXT_LAST) { // invoke the context menu CMINVOKECOMMANDINFO ici; ici.cbSize = sizeof(ici); ici.fMask = 0; ici.hwnd = m_hwndMain; ici.lpVerb = MAKEINTRESOURCE(idCmd - SFV_CONTEXT_FIRST); ici.lpParameters = NULL; ici.lpDirectory = NULL; ici.nShow = SW_SHOWNORMAL; pcm->InvokeCommand(&ici); } break; } } IContextMenu * CSFView::GetSelContextMenu() { if (!m_pcmSel) { if (FAILED(m_cView.GetUIObjectFromItem(IID_IContextMenu, (LPVOID *)&m_pcmSel, SVGIO_SELECTION))) { m_pcmSel = NULL; return(m_pcmSel); } } m_pcmSel->AddRef(); return(m_pcmSel); } void CSFView::ReleaseSelContextMenu() { if (m_pcmSel) { m_pcmSel->Release(); m_pcmSel = NULL; } } void CSFView::InitFileMenu(HMENU hmInit) { // // Don't touch the file menu unless we have the focus. // if (m_uState != SVUIA_ACTIVATE_FOCUS) { return; } BOOL bDeleteItems = FALSE; int i; // Remove all the menu items we've added. for (i = GetMenuItemCount(hmInit) - 1; i >= 0; --i) { if (!bDeleteItems) { MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID; mii.cch = 0; // just in case if (GetMenuItemInfo(hmInit, i, TRUE, &mii)) { if (mii.wID>=SFV_CONTEXT_FIRST && mii.wID<=SFV_CONTEXT_LAST) { bDeleteItems = TRUE; } } } if (bDeleteItems) { DeleteMenu(hmInit, i, MF_BYPOSITION); } } // Let the object add the separator. if (CSFViewDlg::IsMenuSeparator(hmInit, 0)) { DeleteMenu(hmInit, 0, MF_BYPOSITION); } // // Now add item specific commands to the menu // This is done by seeing if we already have a context menu // object for our selection. If not we generate it now. // IContextMenu *pcmSel = GetSelContextMenu(); if (pcmSel) { pcmSel->QueryContextMenu(hmInit, 0, SFV_CONTEXT_FIRST, SFV_CONTEXT_LAST, CMF_DVFILE); pcmSel->Release(); } // Note that the SelContextMenu stays around until the selection changes or we // close the window, but it doesn't really matter that much } void CSFView::InitEditMenu(HMENU hmInit) { ULONG dwAttr = SFGAO_CANCOPY; UINT uFlags = (m_cView.OleInited() && SUCCEEDED(m_cView.GetAttributesFromItem(&dwAttr, SVGIO_SELECTION)) && (dwAttr & SFGAO_CANCOPY)) ? MF_ENABLED : MF_GRAYED; EnableMenuItem(hmInit, IDC_EDIT_COPY + FCIDM_SHVIEWFIRST, uFlags | MF_BYCOMMAND); } void CSFView::InitViewMenu(HMENU hmInit) { int iCurViewMenuItem = GetMenuIDFromViewMode() + FCIDM_SHVIEWFIRST; UINT uEnable; CheckMenuRadioItem(hmInit, IDC_VIEW_ICON, IDC_VIEW_DETAILS, iCurViewMenuItem, MF_BYCOMMAND | MF_CHECKED); uEnable = (iCurViewMenuItem==IDC_VIEW_LIST+FCIDM_SHVIEWFIRST || iCurViewMenuItem==IDC_VIEW_DETAILS+FCIDM_SHVIEWFIRST) ? (MF_GRAYED | MF_BYCOMMAND) : (MF_ENABLED | MF_BYCOMMAND); uEnable = MF_GRAYED | MF_BYCOMMAND; EnableMenuItem(hmInit, IDC_ARRANGE_GRID + FCIDM_SHVIEWFIRST, uEnable); EnableMenuItem(hmInit, IDC_ARRANGE_AUTO + FCIDM_SHVIEWFIRST, uEnable); CheckMenuItem(hmInit, IDC_ARRANGE_AUTO + FCIDM_SHVIEWFIRST, ((uEnable == (MF_ENABLED | MF_BYCOMMAND)) && (m_fs.fFlags & FWF_AUTOARRANGE)) ? MF_CHECKED : MF_UNCHECKED); } //***************************************************************************** // // CSFView::OnInitMenuPopup // // Purpose: // // handle the WM_INITMENUPOPUP message received by CSFViewDlg // // //***************************************************************************** BOOL CSFView::OnInitMenuPopup(HMENU hmInit, int nIndex, BOOL fSystemMenu) { if (!(HMENU)m_cmCur) { return(TRUE); } MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_SUBMENU|MIIM_ID; mii.cch = 0; // just in case if (!GetMenuItemInfo(m_cmCur, nIndex, TRUE, &mii) || mii.hSubMenu!=hmInit) { return(TRUE); } switch (mii.wID) { case FCIDM_MENU_FILE: InitFileMenu(hmInit); break; case FCIDM_MENU_EDIT: InitEditMenu(hmInit); break; case FCIDM_MENU_VIEW: InitViewMenu(hmInit); break; default: return 1L; } return 0L; } int _FindIt(const UINT *puFirst, UINT uFind, UINT uStep, int cCount) { LPBYTE pbFirst = (LPBYTE)puFirst; for (--cCount, pbFirst+=cCount*uStep; cCount>=0; --cCount, pbFirst-=uStep) { if (*(UINT *)pbFirst == uFind) { break; } } return(cCount); } const struct { UINT idCmd; UINT idStr; UINT idTT; } c_idTbl[] = { IDC_VIEW_ICON, IDS_VIEW_ICON, IDS_TT_VIEW_ICON, IDC_VIEW_SMALLICON, IDS_VIEW_SMALLICON, IDS_TT_VIEW_SMALLICON, IDC_VIEW_LIST, IDS_VIEW_LIST, IDS_TT_VIEW_LIST, IDC_VIEW_DETAILS, IDS_VIEW_DETAILS, IDS_TT_VIEW_DETAILS, IDC_EDIT_COPY, IDS_EDIT_COPY, IDS_TT_EDIT_COPY, IDC_EDIT_SELALL, IDS_EDIT_SELALL, 0, IDC_EDIT_INVSEL, IDS_EDIT_INVSEL, 0, IDC_ARRANGE_GRID, IDS_ARRANGE_GRID, 0, IDC_ARRANGE_AUTO, IDS_ARRANGE_AUTO, 0, } ; void CSFView::GetCommandHelpText(UINT idCmd, LPSTR pszText, UINT cchText, BOOL bToolTip) { *pszText = 0; if (idCmd>=SFV_CONTEXT_FIRST && idCmd<=SFV_CONTEXT_LAST && m_pcmSel) { if (bToolTip) { return; } m_pcmSel->GetCommandString(idCmd - SFV_CONTEXT_FIRST, GCS_HELPTEXT, NULL, pszText, cchText); } else if (idCmd>=IDC_ARRANGE_BY && idCmd= 0) { LoadString(g_ThisDll.GetInstance(), bToolTip ? c_idTbl[iid].idTT : c_idTbl[iid].idStr, pszText, cchText); } } } LRESULT CSFView::OnMenuSelect(UINT idCmd, UINT uFlags, HMENU hmenu) { // If we dismissed the menu restore our status bar... if (!hmenu && LOWORD(uFlags)==0xffff) { m_psb->SendControlMsg(FCW_STATUS, SB_SIMPLE, 0, 0L, NULL); return 0L; } if (uFlags & (MF_SYSMENU | MF_SEPARATOR)) { return 0L; } char szHelpText[80 + 2*MAX_PATH]; szHelpText[0] = 0; // in case of failures below if (uFlags & MF_POPUP) { MENUITEMINFO miiSubMenu; miiSubMenu.cbSize = sizeof(MENUITEMINFO); miiSubMenu.fMask = MIIM_ID; miiSubMenu.cch = 0; // just in case if (!GetMenuItemInfo(hmenu, idCmd, TRUE, &miiSubMenu)) { return 0; } // Change the parameters to simulate a "normal" menu item idCmd = miiSubMenu.wID; uFlags &= ~MF_POPUP; } GetCommandHelpText(idCmd, szHelpText, sizeof(szHelpText), FALSE); m_psb->SendControlMsg(FCW_STATUS, SB_SETTEXT, SBT_NOBORDERS | 255, (LPARAM)szHelpText, NULL); m_psb->SendControlMsg(FCW_STATUS, SB_SIMPLE, 1, 0L, NULL); return 0; }