You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.3 KiB
187 lines
4.3 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1995.
|
|
//
|
|
// File: menuutil.cxx
|
|
//
|
|
// Contents: Context menu utilities, stolen from the shell. This is
|
|
// basically CDefFolderMenu_MergeMenu and its support.
|
|
//
|
|
// History: 20-Dec-95 BruceFo Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "headers.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "menuutil.hxx"
|
|
|
|
// Cannonical command names stolen from the shell
|
|
TCHAR const c_szDelete[] = TEXT("delete");
|
|
TCHAR const c_szCut[] = TEXT("cut");
|
|
TCHAR const c_szCopy[] = TEXT("copy");
|
|
TCHAR const c_szLink[] = TEXT("link");
|
|
TCHAR const c_szProperties[] = TEXT("properties");
|
|
TCHAR const c_szPaste[] = TEXT("paste");
|
|
TCHAR const c_szPasteLink[] = TEXT("pastelink");
|
|
TCHAR const c_szRename[] = TEXT("rename");
|
|
|
|
HMENU
|
|
LoadPopupMenu(
|
|
HINSTANCE hinst,
|
|
UINT id
|
|
)
|
|
{
|
|
HMENU hmParent = LoadMenu(hinst, MAKEINTRESOURCE(id));
|
|
if (NULL == hmParent)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
HMENU hmPopup = GetSubMenu(hmParent, 0);
|
|
RemoveMenu(hmParent, 0, MF_BYPOSITION);
|
|
DestroyMenu(hmParent);
|
|
|
|
return hmPopup;
|
|
}
|
|
|
|
HMENU
|
|
MyGetMenuFromID(
|
|
HMENU hmMain,
|
|
UINT uID
|
|
)
|
|
{
|
|
MENUITEMINFO mii;
|
|
|
|
mii.cbSize = sizeof(mii);
|
|
mii.fMask = MIIM_SUBMENU;
|
|
mii.cch = 0; // just in case
|
|
|
|
if (!GetMenuItemInfo(hmMain, uID, FALSE, &mii))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return mii.hSubMenu;
|
|
}
|
|
|
|
int
|
|
MyMergePopupMenus(
|
|
HMENU hmMain,
|
|
HMENU hmMerge,
|
|
int idCmdFirst,
|
|
int idCmdLast)
|
|
{
|
|
int i;
|
|
int idTemp;
|
|
int idMax = idCmdFirst;
|
|
|
|
for (i = GetMenuItemCount(hmMerge) - 1; i >= 0; --i)
|
|
{
|
|
MENUITEMINFO mii;
|
|
|
|
mii.cbSize = sizeof(mii);
|
|
mii.fMask = MIIM_ID | MIIM_SUBMENU;
|
|
mii.cch = 0; // just in case
|
|
|
|
if (!GetMenuItemInfo(hmMerge, i, TRUE, &mii))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
idTemp = Shell_MergeMenus(
|
|
MyGetMenuFromID(hmMain, mii.wID),
|
|
mii.hSubMenu,
|
|
0,
|
|
idCmdFirst,
|
|
idCmdLast,
|
|
MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS);
|
|
if (idMax < idTemp)
|
|
{
|
|
idMax = idTemp;
|
|
}
|
|
}
|
|
|
|
return idMax;
|
|
}
|
|
|
|
|
|
VOID
|
|
MyMergeMenu(
|
|
HINSTANCE hinst,
|
|
UINT idMainMerge,
|
|
UINT idPopupMerge,
|
|
LPQCMINFO pqcm)
|
|
{
|
|
HMENU hmMerge;
|
|
UINT idMax = pqcm->idCmdFirst;
|
|
UINT idTemp;
|
|
|
|
if (idMainMerge
|
|
&& (hmMerge = LoadPopupMenu(hinst, idMainMerge)) != NULL)
|
|
{
|
|
idMax = Shell_MergeMenus(
|
|
pqcm->hmenu,
|
|
hmMerge,
|
|
pqcm->indexMenu,
|
|
pqcm->idCmdFirst,
|
|
pqcm->idCmdLast,
|
|
MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS);
|
|
DestroyMenu(hmMerge);
|
|
}
|
|
|
|
if (idPopupMerge
|
|
&& (hmMerge = LoadMenu(hinst, MAKEINTRESOURCE(idPopupMerge))) != NULL)
|
|
{
|
|
idTemp = MyMergePopupMenus(
|
|
pqcm->hmenu,
|
|
hmMerge,
|
|
pqcm->idCmdFirst,
|
|
pqcm->idCmdLast);
|
|
if (idMax < idTemp)
|
|
{
|
|
idMax = idTemp;
|
|
}
|
|
DestroyMenu(hmMerge);
|
|
}
|
|
|
|
pqcm->idCmdFirst = idMax;
|
|
}
|
|
|
|
|
|
VOID
|
|
MyInsertMenu(
|
|
HINSTANCE hinst,
|
|
UINT idInsert,
|
|
LPQCMINFO pqcm)
|
|
{
|
|
HMENU hmInsert;
|
|
UINT idMax = pqcm->idCmdFirst;
|
|
|
|
if (idInsert
|
|
&& (hmInsert = LoadPopupMenu(hinst, idInsert)) != NULL)
|
|
{
|
|
for (int i = GetMenuItemCount(hmInsert) - 1; i >= 0; --i)
|
|
{
|
|
MENUITEMINFO mii;
|
|
|
|
mii.cbSize = sizeof(mii);
|
|
mii.fMask = MIIM_ID | MIIM_SUBMENU;
|
|
mii.cch = 0; // just in case
|
|
|
|
if (!GetMenuItemInfo(hmInsert, i, TRUE, &mii))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!InsertMenuItem(pqcm->hmenu, idMax, TRUE, &mii))
|
|
{
|
|
++idMax;
|
|
}
|
|
}
|
|
DestroyMenu(hmInsert);
|
|
}
|
|
|
|
pqcm->idCmdFirst = idMax;
|
|
}
|