653 lines
13 KiB
C++
653 lines
13 KiB
C++
|
//*******************************************************************************************
|
||
|
//
|
||
|
// 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; i<MAX_COL; ++i)
|
||
|
{
|
||
|
MENUITEMINFO mii;
|
||
|
mii.cbSize = sizeof(mii);
|
||
|
|
||
|
char szCommand[100];
|
||
|
if (!GetArrangeText(i, IDS_BYCOL_FMT, szCommand, sizeof(szCommand)))
|
||
|
{
|
||
|
mii.fMask = MIIM_TYPE;
|
||
|
mii.fType = MFT_SEPARATOR;
|
||
|
InsertMenuItem(hmView, IDC_ARRANGE_AUTO, FALSE, &mii);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
|
||
|
mii.fType = MFT_STRING;
|
||
|
mii.fState = MF_ENABLED;
|
||
|
mii.wID = IDC_ARRANGE_BY + i;
|
||
|
mii.dwTypeData = szCommand;
|
||
|
|
||
|
InsertMenuItem(hmView, IDC_ARRANGE_AUTO, FALSE, &mii);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CSFView::MergeViewMenu(HMENU hmenu, HMENU hmMerge)
|
||
|
{
|
||
|
HMENU hmView = _GetMenuFromID(hmenu, FCIDM_MENU_VIEW);
|
||
|
if (!hmView)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int iOptions = _GetOffsetFromID(hmView, FCIDM_MENU_VIEW_SEP_OPTIONS);
|
||
|
|
||
|
Cab_MergeMenus(hmView, hmMerge, (UINT)iOptions, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST,
|
||
|
MM_SUBMENUSHAVEIDS | MM_ADDSEPARATOR);
|
||
|
|
||
|
MergeArrangeMenu(hmView);
|
||
|
}
|
||
|
|
||
|
//*****************************************************************************
|
||
|
//
|
||
|
// CSFView::OnActivate
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// handles the UIActivate call by ShellBrowser
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// UINT uState - UIActivate flag
|
||
|
//
|
||
|
// Comments:
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
|
||
|
|
||
|
BOOL CSFView::OnActivate(UINT uState)
|
||
|
{
|
||
|
if (m_uState == uState)
|
||
|
{
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
OnDeactivate();
|
||
|
|
||
|
{
|
||
|
// Scope cMenu
|
||
|
CMenuTemp cMenu(CreateMenu());
|
||
|
|
||
|
if (!((HMENU)cMenu))
|
||
|
{
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
OLEMENUGROUPWIDTHS mwidth = { { 0, 0, 0, 0, 0, 0 } };
|
||
|
|
||
|
// insert menus into the shell browser
|
||
|
// Explorer returns the wrong value so don't check
|
||
|
m_psb->InsertMenusSB(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<IDC_ARRANGE_BY+MAX_COL)
|
||
|
{
|
||
|
ColumnClick(idCmd - IDC_ARRANGE_BY);
|
||
|
}
|
||
|
else if (pcm && 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<IDC_ARRANGE_BY+MAX_COL)
|
||
|
{
|
||
|
if (bToolTip)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
GetArrangeText(idCmd-IDC_ARRANGE_BY, IDS_BYCOL_HELP_FMT, pszText, cchText);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int iid = _FindIt(&c_idTbl[0].idCmd, idCmd-FCIDM_SHVIEWFIRST, sizeof(c_idTbl[0]),
|
||
|
ARRAYSIZE(c_idTbl));
|
||
|
if (iid >= 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;
|
||
|
}
|