[SHELL32]

- If there is no default menu item, make Open With menu item the default, rename it to Open and disallow it to be submenu.
See issue #6801 for more details.

svn path=/trunk/; revision=54964
This commit is contained in:
Rafal Harabien 2012-01-14 17:50:33 +00:00
parent ac19035f70
commit fa989547b6

View file

@ -1160,44 +1160,47 @@ HRESULT WINAPI COpenWithMenu::QueryContextMenu(
UINT idCmdLast, UINT idCmdLast,
UINT uFlags) UINT uFlags)
{ {
MENUITEMINFOW mii;
WCHAR wszBuf[100];
INT DefaultPos;
TRACE("hMenu %p indexMenu %u idFirst %u idLast %u uFlags %u\n", hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); TRACE("hMenu %p indexMenu %u idFirst %u idLast %u uFlags %u\n", hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, wszBuf, _countof(wszBuf))) INT DefaultPos = GetMenuDefaultItem(hMenu, TRUE, 0);
WCHAR wszName[100];
UINT NameId = (DefaultPos == -1 ? IDS_OPEN : IDS_OPEN_WITH);
if (!LoadStringW(shell32_hInstance, NameId, wszName, _countof(wszName)))
{ {
ERR("Failed to load string\n"); ERR("Failed to load string\n");
return E_FAIL; return E_FAIL;
} }
/* Init cmd id */ /* Init first cmd id and submenu */
m_idCmdFirst = m_idCmdLast = idCmdFirst; m_idCmdFirst = m_idCmdLast = idCmdFirst;
m_hSubMenu = NULL;
/* Load applications list */ /* If we are going to be default item, we shouldn't be submenu */
m_pAppList->Load(); if (DefaultPos != -1)
m_pAppList->LoadRecommended(m_wszPath);
/* Create submenu only if the is some choice */
if (m_pAppList->GetRecommendedCount() > 1)
{ {
m_hSubMenu = CreatePopupMenu(); /* Load applications list */
m_pAppList->Load();
m_pAppList->LoadRecommended(m_wszPath);
for(unsigned i = 0; i < m_pAppList->GetCount(); ++i) /* Create submenu only if there is more than one application and menu has a default item */
if (m_pAppList->GetRecommendedCount() > 1)
{ {
COpenWithList::SApp *pApp = m_pAppList->GetList() + i; m_hSubMenu = CreatePopupMenu();
if (pApp->bRecommended)
AddApp(pApp); for(UINT i = 0; i < m_pAppList->GetCount(); ++i)
{
COpenWithList::SApp *pApp = m_pAppList->GetList() + i;
if (pApp->bRecommended)
AddApp(pApp);
}
AddChooseProgramItem();
} }
AddChooseProgramItem();
} }
else
m_hSubMenu = NULL;
DefaultPos = GetMenuDefaultItem(hMenu, TRUE, 0);
/* Insert menu item */
MENUITEMINFOW mii;
ZeroMemory(&mii, sizeof(mii)); ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii); mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
@ -1211,14 +1214,15 @@ HRESULT WINAPI COpenWithMenu::QueryContextMenu(
mii.wID = m_idCmdLast; mii.wID = m_idCmdLast;
mii.fType = MFT_STRING; mii.fType = MFT_STRING;
mii.dwTypeData = (LPWSTR)wszBuf; mii.dwTypeData = (LPWSTR)wszName;
mii.cch = wcslen(wszBuf); mii.cch = wcslen(wszName);
mii.fState = MFS_ENABLED; mii.fState = MFS_ENABLED;
if (DefaultPos == -1) if (DefaultPos == -1)
mii.fState |= MFS_DEFAULT; mii.fState |= MFS_DEFAULT;
InsertMenuItemW(hMenu, DefaultPos + 1, TRUE, &mii); if (!InsertMenuItemW(hMenu, DefaultPos + 1, TRUE, &mii))
return E_FAIL;
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, m_idCmdLast - m_idCmdFirst + 1); return MAKE_HRESULT(SEVERITY_SUCCESS, 0, m_idCmdLast - m_idCmdFirst + 1);
} }