diff --git a/reactos/dll/win32/shell32/CDefView.cpp b/reactos/dll/win32/shell32/CDefView.cpp index d2080577be0..121043feaa9 100644 --- a/reactos/dll/win32/shell32/CDefView.cpp +++ b/reactos/dll/win32/shell32/CDefView.cpp @@ -2223,15 +2223,13 @@ HRESULT WINAPI CDefView::GetItemObject(UINT uItem, REFIID riid, LPVOID *ppvOut) case SVGIO_BACKGROUND: if (IsEqualIID(riid, IID_IContextMenu)) { - //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE); if (!ppvOut) hr = E_OUTOFMEMORY; - IContextMenu* pcm; - hr = CDefFolderMenu_Create2(NULL, NULL, 0, NULL, m_pSFParent, NULL, 0, NULL, &pcm); + hr = CDefViewBckgrndMenu_CreateInstance(m_pSF2Parent, riid, ppvOut); if (FAILED_UNEXPECTEDLY(hr)) return hr; - *ppvOut = pcm; + } else if (IsEqualIID(riid, IID_IDispatch)) { diff --git a/reactos/dll/win32/shell32/CDefViewBckgrndMenu.cpp b/reactos/dll/win32/shell32/CDefViewBckgrndMenu.cpp new file mode 100644 index 00000000000..1e1bacdb922 --- /dev/null +++ b/reactos/dll/win32/shell32/CDefViewBckgrndMenu.cpp @@ -0,0 +1,286 @@ +/* + * PROJECT: shell32 + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/win32/shell32/CDefViewBckgrndMenu.cpp + * PURPOSE: background context menu of the CDefView + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +class CDefViewBckgrndMenu : + public CComObjectRootEx, + public IContextMenu3, + public IObjectWithSite +{ + private: + CComPtr m_site; + CComPtr m_psf; + CComPtr m_folderCM; + + BOOL _bIsDesktopBrowserMenu(); + BOOL _bCanPaste(); + public: + CDefViewBckgrndMenu(); + ~CDefViewBckgrndMenu(); + HRESULT Initialize(IShellFolder* psf); + + // IContextMenu + virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); + virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); + virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen); + + // IContextMenu2 + virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + + // IContextMenu3 + virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); + + // IObjectWithSite + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + BEGIN_COM_MAP(CDefViewBckgrndMenu) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + END_COM_MAP() +}; + +CDefViewBckgrndMenu::CDefViewBckgrndMenu() +{ +} + +CDefViewBckgrndMenu::~CDefViewBckgrndMenu() +{ +} + +BOOL CDefViewBckgrndMenu::_bIsDesktopBrowserMenu() +{ + if (!m_site) + return FALSE; + + /* Get a pointer to the shell browser */ + CComPtr psv; + HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv)); + if (FAILED_UNEXPECTEDLY(hr)) + return FALSE; + + FOLDERSETTINGS FolderSettings; + hr = psv->GetCurrentInfo(&FolderSettings); + if (FAILED_UNEXPECTEDLY(hr)) + return FALSE; + + return ((FolderSettings.fFlags & FWF_DESKTOP) == FWF_DESKTOP); +} + +BOOL CDefViewBckgrndMenu::_bCanPaste() +{ + /* If the folder doesn't have a drop target we can't paste */ + CComPtr pdt; + HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt)); + if (FAILED(hr)) + return FALSE; + + /* We can only paste if CFSTR_SHELLIDLIST is present in the clipboard */ + CComPtr pDataObj; + hr = OleGetClipboard(&pDataObj); + if (FAILED(hr)) + return FALSE; + + STGMEDIUM medium; + FORMATETC formatetc; + + /* Set the FORMATETC structure*/ + InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL); + hr = pDataObj->GetData(&formatetc, &medium); + if (FAILED(hr)) + return FALSE; + + ReleaseStgMedium(&medium); + return TRUE; +} + +HRESULT +CDefViewBckgrndMenu::Initialize(IShellFolder* psf) +{ + m_psf = psf; + return S_OK; +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::SetSite(IUnknown *pUnkSite) +{ + m_site = pUnkSite; + return S_OK; +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::GetSite(REFIID riid, void **ppvSite) +{ + if (!m_site) + return E_FAIL; + + return m_site->QueryInterface(riid, ppvSite); +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) +{ + HRESULT hr; + HMENU hMenuPart; + + /* Load the default part of the background context menu */ + hMenuPart = LoadMenuW(shell32_hInstance, L"MENU_002"); + if (hMenuPart) + { + /* Don't show the view submenu for the desktop */ + if (_bIsDesktopBrowserMenu()) + { + DeleteMenu(hMenuPart, FCIDM_SHVIEW_VIEW, MF_BYCOMMAND); + } + + /* Disable the paste options if it is not possible */ + if (!_bCanPaste()) + { + EnableMenuItem(hMenuPart, FCIDM_SHVIEW_INSERT, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(hMenuPart, FCIDM_SHVIEW_INSERTLINK, MF_BYCOMMAND | MF_GRAYED); + } + + /* merge general background context menu in */ + Shell_MergeMenus(hMenu, GetSubMenu(hMenuPart, 0), indexMenu, 0, 0xFFFF, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS); + indexMenu += GetMenuItemCount(GetSubMenu(hMenuPart, 0)); + DestroyMenu(hMenuPart); + } + else + { + ERR("Failed to load menu from resource!\n"); + } + + /* Query the shell folder to add any items it wants to add in the background context menu */ + hMenuPart = CreatePopupMenu(); + if (hMenuPart) + { + hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &m_folderCM)); + if (SUCCEEDED(hr)) + { + hr = m_folderCM->QueryContextMenu(hMenuPart, 0, idCmdFirst, idCmdLast, uFlags); + if (SUCCEEDED(hr)) + { + Shell_MergeMenus(hMenu, hMenuPart, indexMenu, 0, 0xFFFF, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS); + DestroyMenu(hMenuPart); + } + else + { + WARN("QueryContextMenu failed!\n"); + } + } + else + { + WARN("GetUIObjectOf didn't give any context menu!\n"); + } + } + else + { + ERR("CreatePopupMenu failed!\n"); + } + + return S_OK; +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) +{ + /* The commands that are handled by the def view are forwarded to it */ + switch (LOWORD(lpcmi->lpVerb)) + { + case FCIDM_SHVIEW_BIGICON: + case FCIDM_SHVIEW_SMALLICON: + case FCIDM_SHVIEW_LISTVIEW: + case FCIDM_SHVIEW_REPORTVIEW: + case 0x30: /* FIX IDS in resource files */ + case 0x31: + case 0x32: + case 0x33: + case FCIDM_SHVIEW_AUTOARRANGE: + case FCIDM_SHVIEW_SNAPTOGRID: + case FCIDM_SHVIEW_REFRESH: + if (!m_site) + return E_FAIL; + + /* Get a pointer to the shell browser */ + CComPtr psv; + HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + HWND hwndSV = NULL; + if (SUCCEEDED(psv->GetWindow(&hwndSV))) + SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0); + return S_OK; + } + + /* Unknown commands are added by the folder context menu so forward the invocation */ + return m_folderCM->InvokeCommand(lpcmi); + +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) +{ + if (m_folderCM) + { + return m_folderCM->GetCommandString(idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + } + + return E_NOTIMPL; +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(m_folderCM) + { + CComPtr pfolderCM2; + HRESULT hr = m_folderCM->QueryInterface(IID_PPV_ARG(IContextMenu2, &pfolderCM2)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return pfolderCM2->HandleMenuMsg(uMsg, wParam, lParam); + } + + return E_NOTIMPL; +} + +HRESULT +WINAPI +CDefViewBckgrndMenu::HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) +{ + if(m_folderCM) + { + CComPtr pfolderCM3; + HRESULT hr = m_folderCM->QueryInterface(IID_PPV_ARG(IContextMenu3, &pfolderCM3)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return pfolderCM3->HandleMenuMsg2(uMsg, wParam, lParam, plResult); + } + + return E_NOTIMPL; +} + + +HRESULT +CDefViewBckgrndMenu_CreateInstance(IShellFolder* psf, REFIID riid, void **ppv) +{ + return ShellObjectCreatorInit(psf, riid, ppv); +} diff --git a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp index 7f8efa07deb..1483ee65dbf 100644 --- a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp @@ -84,14 +84,11 @@ class CDefaultContextMenu : HRESULT LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsid); BOOL EnumerateDynamicContextHandlerForKey(HKEY hRootKey); UINT InsertMenuItemsOfDynamicContextMenuExtension(HMENU hMenu, UINT IndexMenu, UINT idCmdFirst, UINT idCmdLast); - UINT BuildBackgroundContextMenu(HMENU hMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags); UINT AddStaticContextMenusToMenu(HMENU hMenu, UINT IndexMenu); UINT BuildShellItemContextMenu(HMENU hMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags); - HRESULT NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh); HRESULT DoPaste(LPCMINVOKECOMMANDINFO lpcmi, BOOL bLink); HRESULT DoOpenOrExplore(LPCMINVOKECOMMANDINFO lpcmi); HRESULT DoCreateLink(LPCMINVOKECOMMANDINFO lpcmi); - HRESULT DoRefresh(LPCMINVOKECOMMANDINFO lpcmi); HRESULT DoDelete(LPCMINVOKECOMMANDINFO lpcmi); HRESULT DoCopyOrCut(LPCMINVOKECOMMANDINFO lpcmi, BOOL bCopy); HRESULT DoRename(LPCMINVOKECOMMANDINFO lpcmi); @@ -188,6 +185,12 @@ HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm, LPFND { TRACE("cidl %u\n", pdcm->cidl); + if (!pdcm->pcmcb && !lpfn) + { + ERR("CDefaultContextMenu needs a callback!\n"); + return E_INVALIDARG; + } + m_cidl = pdcm->cidl; m_apidl = const_cast(_ILCopyaPidl(pdcm->apidl, m_cidl)); if (m_cidl && !m_apidl) @@ -236,7 +239,7 @@ HRESULT CDefaultContextMenu::_DoCallback(UINT uMsg, WPARAM wParam, LPVOID lParam return m_pfnmcb(m_psf, NULL, m_pDataObj, uMsg, wParam, (LPARAM)lParam); } - return S_OK; + return E_FAIL; } void CDefaultContextMenu::AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb) @@ -325,20 +328,6 @@ HasClipboardData() return bRet; } -static -VOID -DisablePasteOptions(HMENU hMenu) -{ - MENUITEMINFOW mii; - - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STATE; - mii.fState = MFS_DISABLED; - - SetMenuItemInfoW(hMenu, FCIDM_SHVIEW_INSERT, FALSE, &mii); - SetMenuItemInfoW(hMenu, FCIDM_SHVIEW_INSERTLINK, FALSE, &mii); -} - BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded(const CLSID *pclsid) { @@ -375,8 +364,11 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsi return hr; hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey); - if (FAILED_UNEXPECTEDLY(hr)) + if (FAILED(hr)) + { + WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(pclsid), hr); return hr; + } PDynamicShellEntry pEntry = (DynamicShellEntry *)HeapAlloc(GetProcessHeap(), 0, sizeof(DynamicShellEntry)); if (!pEntry) @@ -406,7 +398,6 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsi BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey(HKEY hRootKey) { - WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid; DWORD cchName; HRESULT hr; @@ -437,24 +428,31 @@ CDefaultContextMenu::EnumerateDynamicContextHandlerForKey(HKEY hRootKey) hr = CLSIDFromString(wszBuf, &clsid); pwszClsid = wszBuf; } - if (SUCCEEDED(hr)) + + if (FAILED(hr)) { - if (m_bGroupPolicyActive) - { - if (RegGetValueW(HKEY_LOCAL_MACHINE, - L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", - pwszClsid, - RRF_RT_REG_SZ, - NULL, - NULL, - NULL) == ERROR_SUCCESS) - { - LoadDynamicContextMenuHandler(hKey, &clsid); - } - } - else - LoadDynamicContextMenuHandler(hKey, &clsid); + ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr); + continue; } + + if (m_bGroupPolicyActive) + { + if (RegGetValueW(HKEY_LOCAL_MACHINE, + L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", + pwszClsid, + RRF_RT_REG_SZ, + NULL, + NULL, + NULL) != ERROR_SUCCESS) + { + ERR("Shell extension %s not approved!\n", pwszClsid); + continue; + } + } + + hr = LoadDynamicContextMenuHandler(hKey, &clsid); + if (FAILED(hr)) + WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid); } RegCloseKey(hKey); @@ -494,66 +492,6 @@ CDefaultContextMenu::InsertMenuItemsOfDynamicContextMenuExtension(HMENU hMenu, U return IndexMenu; } -UINT -CDefaultContextMenu::BuildBackgroundContextMenu( - HMENU hMenu, - UINT iIdCmdFirst, - UINT iIdCmdLast, - UINT uFlags) -{ - UINT IndexMenu = 0; - HMENU hSubMenu; - - TRACE("BuildBackgroundContextMenu entered\n"); - - SFGAOF rfg = SFGAO_FILESYSTEM | SFGAO_FOLDER; - HRESULT hr = m_psf->GetAttributesOf(0, NULL, &rfg); - if (FAILED(hr)) - { - ERR("GetAttributesOf failed: %x\n", hr); - rfg = 0; - } - - hSubMenu = LoadMenuW(shell32_hInstance, L"MENU_002"); - if (hSubMenu) - { - /* view option is only available in browsing mode */ - if (_ILIsDesktop(m_pidlFolder)) - DeleteMenu(hSubMenu, FCIDM_SHVIEW_VIEW, MF_BYCOMMAND); - - /* merge general background context menu in */ - iIdCmdFirst = Shell_MergeMenus(hMenu, GetSubMenu(hSubMenu, 0), IndexMenu, 0, 0xFFFF, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS) + 1; - DestroyMenu(hSubMenu); - } - - if (!HasClipboardData()) - { - TRACE("disabling paste options\n"); - DisablePasteOptions(hMenu); - } - - /* Directory is progid of filesystem folders only */ - if ((rfg & (SFGAO_FILESYSTEM|SFGAO_FOLDER)) == (SFGAO_FILESYSTEM|SFGAO_FOLDER)) - { - /* Load context menu handlers */ - TRACE("Add background handlers: %p\n", m_pidlFolder); - HKEY hKey; - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory\\Background", 0, KEY_READ, &hKey) == ERROR_SUCCESS) - { - EnumerateDynamicContextHandlerForKey(hKey); - RegCloseKey(hKey); - } - - if (InsertMenuItemsOfDynamicContextMenuExtension(hMenu, GetMenuItemCount(hMenu) - 1, iIdCmdFirst, iIdCmdLast)) - { - /* seperate dynamic context menu items */ - _InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); - } - } - - return iIdCmdLast; -} - UINT CDefaultContextMenu::AddStaticContextMenusToMenu( HMENU hMenu, @@ -697,51 +635,55 @@ void WINAPI _InsertMenuItemW( InsertMenuItemW(hMenu, indexMenu, fByPosition, &mii); } -UINT -CDefaultContextMenu::BuildShellItemContextMenu( +HRESULT +WINAPI +CDefaultContextMenu::QueryContextMenu( HMENU hMenu, - UINT iIdCmdFirst, - UINT iIdCmdLast, + UINT IndexMenu, + UINT idCmdFirst, + UINT idCmdLast, UINT uFlags) { HRESULT hr; TRACE("BuildShellItemContextMenu entered\n"); - ASSERT(m_cidl >= 1); + /* Load static verbs and shell extensions from registry */ for (UINT i = 0; i < m_cKeys; i++) { AddStaticEntriesForKey(m_aKeys[i]); EnumerateDynamicContextHandlerForKey(m_aKeys[i]); } - /* add static actions */ - SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER; - hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg); - if (FAILED(hr)) - { - ERR("GetAttributesOf failed: %x\n", hr); - rfg = 0; - } + /* Add static context menu handlers */ + IndexMenu = AddStaticContextMenusToMenu(hMenu, IndexMenu); - /* add static context menu handlers */ - UINT IndexMenu = AddStaticContextMenusToMenu(hMenu, 0); - - /* now process dynamic context menu handlers */ + /* Add dynamic context menu handlers */ BOOL bAddSep = FALSE; - IndexMenu = InsertMenuItemsOfDynamicContextMenuExtension(hMenu, IndexMenu, iIdCmdFirst, iIdCmdLast); + IndexMenu = InsertMenuItemsOfDynamicContextMenuExtension(hMenu, IndexMenu, idCmdFirst, idCmdLast); TRACE("IndexMenu %d\n", IndexMenu); /* Now let the callback add its own items */ QCMINFO qcminfo; qcminfo.hmenu = hMenu; qcminfo.indexMenu = IndexMenu; - qcminfo.idCmdFirst = iIdCmdFirst; - qcminfo.idCmdLast = iIdCmdLast; + qcminfo.idCmdFirst = idCmdFirst; + qcminfo.idCmdLast = idCmdLast; qcminfo.pIdMap = NULL; _DoCallback(DFM_MERGECONTEXTMENU, uFlags, &qcminfo); IndexMenu = GetMenuItemCount(hMenu); + /* If this is a background context menu we are done */ + if (!m_cidl) + return S_OK; + + /* Get the attributes of the items */ + SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER; + hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg); + if (FAILED_UNEXPECTEDLY(hr)) + return S_OK; + + /* Add the standard menu entries based on the attributes of the items */ BOOL bClipboardData = (HasClipboardData() && (rfg & SFGAO_FILESYSTEM)); if (rfg & (SFGAO_CANCOPY | SFGAO_CANMOVE) || bClipboardData) { @@ -789,60 +731,6 @@ CDefaultContextMenu::BuildShellItemContextMenu( _InsertMenuItemW(hMenu, IndexMenu++, TRUE, FCIDM_SHVIEW_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), MFS_ENABLED); } - return iIdCmdLast; -} - -HRESULT -WINAPI -CDefaultContextMenu::QueryContextMenu( - HMENU hMenu, - UINT IndexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags) -{ - if (m_cidl) - idCmdFirst = BuildShellItemContextMenu(hMenu, idCmdFirst, idCmdLast, uFlags); - else - idCmdFirst = BuildBackgroundContextMenu(hMenu, idCmdFirst, idCmdLast, uFlags); - - return S_OK; -} - -HRESULT -CDefaultContextMenu::NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh) -{ - if (!m_site) - return E_FAIL; - - /* Get a pointer to the shell browser */ - CComPtr psv; - HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv)); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; - - HWND hwndSV = NULL; - if (SUCCEEDED(psv->GetWindow(&hwndSV))) - SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0); - return S_OK; -} - - -HRESULT CDefaultContextMenu::DoRefresh(LPCMINVOKECOMMANDINFO lpcmi) -{ - if (!m_site) - return E_FAIL; - - /* Get a pointer to the shell view */ - CComPtr psv; - HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv)); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; - - hr = psv->Refresh(); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; - return S_OK; } @@ -1285,21 +1173,6 @@ CDefaultContextMenu::InvokeCommand( /* Check if this is a Id */ switch (LOWORD(LocalInvokeInfo.lpVerb)) { - case FCIDM_SHVIEW_BIGICON: - case FCIDM_SHVIEW_SMALLICON: - case FCIDM_SHVIEW_LISTVIEW: - case FCIDM_SHVIEW_REPORTVIEW: - case 0x30: /* FIX IDS in resource files */ - case 0x31: - case 0x32: - case 0x33: - case FCIDM_SHVIEW_AUTOARRANGE: - case FCIDM_SHVIEW_SNAPTOGRID: - Result = NotifyShellViewWindow(&LocalInvokeInfo, FALSE); - break; - case FCIDM_SHVIEW_REFRESH: - Result = DoRefresh(&LocalInvokeInfo); - break; case FCIDM_SHVIEW_INSERT: Result = DoPaste(&LocalInvokeInfo, FALSE); break; diff --git a/reactos/dll/win32/shell32/CMakeLists.txt b/reactos/dll/win32/shell32/CMakeLists.txt index 474a79ade6e..cb42fc3f2a2 100644 --- a/reactos/dll/win32/shell32/CMakeLists.txt +++ b/reactos/dll/win32/shell32/CMakeLists.txt @@ -63,6 +63,7 @@ list(APPEND SOURCE CFileSysBindData.cpp CDefView.cpp CDefViewDual.cpp + CDefViewBckgrndMenu.cpp stubs.cpp systray.cpp CDefaultContextMenu.cpp diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp index 6ab512d1899..07678efb05c 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp @@ -529,8 +529,21 @@ HRESULT WINAPI CDesktopFolder::CreateViewObject( } else if (IsEqualIID (riid, IID_IContextMenu)) { - WARN ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; + HKEY hKeys[16]; + UINT cKeys = 0; + AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys); + + DEFCONTEXTMENU dcm; + dcm.hwnd = hwndOwner; + dcm.pcmcb = this; + dcm.pidlFolder = pidlRoot; + dcm.psf = this; + dcm.cidl = 0; + dcm.apidl = NULL; + dcm.cKeys = cKeys; + dcm.aKeys = hKeys; + dcm.punkAssociationInfo = NULL; + hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut); } else if (IsEqualIID (riid, IID_IShellView)) { @@ -646,13 +659,23 @@ HRESULT WINAPI CDesktopFolder::GetUIObjectOf( else { /* Do not use the context menu of the CFSFolder here. */ - /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */ + /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */ /* Otherwise operations like that involve items from both user and shared desktop will not work */ - IContextMenu * pCm = NULL; HKEY hKeys[16]; UINT cKeys = 0; AddFSClassKeysToArray(apidl[0], hKeys, &cKeys); - hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast(this), NULL, cKeys, hKeys, &pCm); + + DEFCONTEXTMENU dcm; + dcm.hwnd = hwndOwner; + dcm.pcmcb = this; + dcm.pidlFolder = pidlRoot; + dcm.psf = this; + dcm.cidl = cidl; + dcm.apidl = apidl; + dcm.cKeys = cKeys; + dcm.aKeys = hKeys; + dcm.punkAssociationInfo = NULL; + hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj); } } else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1)) @@ -844,6 +867,59 @@ HRESULT WINAPI CDesktopFolder::GetCurFolder(LPITEMIDLIST * pidl) return S_OK; } +HRESULT WINAPI CDesktopFolder::CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND) + return S_OK; + + /* no data object means no selection */ + if (!pdtobj) + { + if (uMsg == DFM_INVOKECOMMAND && wParam == DFM_CMD_PROPERTIES) + { + if (32 >= (UINT)ShellExecuteW(hwndOwner, L"open", L"rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL)) + return E_FAIL; + return S_OK; + } + else if (uMsg == DFM_MERGECONTEXTMENU) + { + QCMINFO *pqcminfo = (QCMINFO *)lParam; + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, FCIDM_SHVIEW_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), MFS_ENABLED); + } + + return S_OK; + } + + PIDLIST_ABSOLUTE pidlFolder; + PUITEMID_CHILD *apidl; + UINT cidl; + HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + if (cidl > 1) + ERR("SHMultiFileProperties is not yet implemented\n"); + + STRRET strFile; + hr = GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strFile); + if (SUCCEEDED(hr)) + { + hr = SH_ShowPropertiesDialog(strFile.pOleStr, pidlFolder, apidl); + if (FAILED(hr)) + ERR("SH_ShowPropertiesDialog failed\n"); + } + else + { + ERR("Failed to get display name\n"); + } + + SHFree(pidlFolder); + _ILFreeaPidl(apidl, cidl); + + return hr; +} + /************************************************************************* * SHGetDesktopFolder [SHELL32.@] */ diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.h b/reactos/dll/win32/shell32/folders/CDesktopFolder.h index e8a685fbada..76ee35fbf3b 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.h +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.h @@ -27,7 +27,8 @@ class CDesktopFolder : public CComCoClass, public CComObjectRootEx, public IShellFolder2, - public IPersistFolder2 + public IPersistFolder2, + public IContextMenuCB { private: /* both paths are parsible from the desktop */ @@ -75,6 +76,9 @@ class CDesktopFolder : // *** IPersistFolder2 methods *** virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST * pidl); + // IContextMenuCB + virtual HRESULT WINAPI CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam); + DECLARE_REGISTRY_RESOURCEID(IDR_SHELLDESKTOP) DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(CDesktopFolder) diff --git a/reactos/dll/win32/shell32/folders/CFSFolder.cpp b/reactos/dll/win32/shell32/folders/CFSFolder.cpp index 40c72b1e640..ae225d69d38 100644 --- a/reactos/dll/win32/shell32/folders/CFSFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CFSFolder.cpp @@ -371,8 +371,21 @@ HRESULT WINAPI CFSFolder::CreateViewObject(HWND hwndOwner, hr = CFSDropTarget_CreateInstance(sPathTarget, riid, ppvOut); else if (IsEqualIID (riid, IID_IContextMenu)) { - FIXME ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; + HKEY hKeys[16]; + UINT cKeys = 0; + AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys); + + DEFCONTEXTMENU dcm; + dcm.hwnd = hwndOwner; + dcm.pcmcb = this; + dcm.pidlFolder = pidlRoot; + dcm.psf = this; + dcm.cidl = 0; + dcm.apidl = NULL; + dcm.cKeys = cKeys; + dcm.aKeys = hKeys; + dcm.punkAssociationInfo = NULL; + hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut); } else if (IsEqualIID (riid, IID_IShellView)) { @@ -513,7 +526,7 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner, } else { - hr = IDataObject_Constructor (hwndOwner, pidlRoot, (LPCITEMIDLIST*)&pidlRoot, 1, (IDataObject **)&pObj); + hr = E_INVALIDARG; } } else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1)) @@ -1101,6 +1114,33 @@ HRESULT WINAPI CFSFolder::_LoadDynamicDropTargetHandler(const CLSID *pclsid, LPC HRESULT WINAPI CFSFolder::CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND) + return S_OK; + + /* no data object means no selection */ + if (!pdtobj) + { + if (uMsg == DFM_INVOKECOMMAND && wParam == DFM_CMD_PROPERTIES) + { + PUITEMID_CHILD pidlChild = ILClone(ILFindLastID(pidlRoot)); + LPITEMIDLIST pidlParent = ILClone(pidlRoot); + ILRemoveLastID(pidlParent); + HRESULT hr = SH_ShowPropertiesDialog(sPathTarget, pidlParent, &pidlChild); + if (FAILED(hr)) + ERR("SH_ShowPropertiesDialog failed\n"); + ILFree(pidlChild); + ILFree(pidlParent); + } + else if (uMsg == DFM_MERGECONTEXTMENU) + { + QCMINFO *pqcminfo = (QCMINFO *)lParam; + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, FCIDM_SHVIEW_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), MFS_ENABLED); + } + + return S_OK; + } + if (uMsg != DFM_INVOKECOMMAND || wParam != DFM_CMD_PROPERTIES) return S_OK; diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 5e608af34ad..8a0f2fb29c9 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Поставяне", FCIDM_SHVIEW_INSERT MENUITEM "Поставяне като връзка", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Свойства", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 5622ed6801b..653dac760a2 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 066d41752e0..812cc853bc4 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -44,8 +44,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "V&ložit", FCIDM_SHVIEW_INSERT MENUITEM "Vložit zást&upce", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "&Vlastnosti", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index 05785959dc1..aaf16d36ead 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -44,8 +44,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Indsæt", FCIDM_SHVIEW_INSERT MENUITEM "Indsæt som Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Egenskaber", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index dcd4feec9e9..706512ee90a 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Einfügen", FCIDM_SHVIEW_INSERT MENUITEM "Einfügen als Verweis", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "&Eigenschaften", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index bd9b2a917c0..72b232f1f52 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Επικόληση", FCIDM_SHVIEW_INSERT MENUITEM "Επικόληση συντόμευσης", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Ιδιότητες", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index b20cd2f2fa1..6531862cca5 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 12c7d592772..63fcf0118cf 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 0d7160b19c6..bb167f348d4 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -40,8 +40,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Pegar", FCIDM_SHVIEW_INSERT MENUITEM "Pegar acceso directo", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Propiedades", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index d056785e8bd..b30fa7d8793 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Liitä", FCIDM_SHVIEW_INSERT MENUITEM "Liitä Linkiksi", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Ominaisuudet", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 3fc8b3ab3b3..9980843ac8b 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Coller", FCIDM_SHVIEW_INSERT MENUITEM "Coller comme un lien", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Propriétés", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/he-IL.rc b/reactos/dll/win32/shell32/lang/he-IL.rc index 2878444fcfd..db3fc7ad48d 100644 --- a/reactos/dll/win32/shell32/lang/he-IL.rc +++ b/reactos/dll/win32/shell32/lang/he-IL.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "הדבק", FCIDM_SHVIEW_INSERT MENUITEM "הדבק כקיצור דרך", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "מאפיינים", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 5b0c09b7418..9a2d8175c24 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Beillesztés", FCIDM_SHVIEW_INSERT MENUITEM "Parancsikon beillesztése", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Beállítások", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 0064a51de02..e4c671f35ed 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Incolla", FCIDM_SHVIEW_INSERT MENUITEM "Crea Collegamento", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Proprietà", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index b680decec3d..de273073992 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "貼り付け", FCIDM_SHVIEW_INSERT MENUITEM "ショートカットの貼り付け", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "プロパティ", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 4b7308aecad..4bbed12ff8f 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index e2d198ba9ba..a04455ab817 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index c0cbb4210e8..9c9b1e53a0f 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Lim inn", FCIDM_SHVIEW_INSERT MENUITEM "Lim inn som snarvei", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Egenskaper", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index da8a5beb847..fb35477fb28 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -42,8 +42,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "W&klej", FCIDM_SHVIEW_INSERT MENUITEM "Wklej s&krót", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Właściwości", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index 1159ccf10be..38405fb654f 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Co&lar", FCIDM_SHVIEW_INSERT MENUITEM "Colar a&talho", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Propriedades", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index a74e45abbac..f46bf263b11 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Co&lar", FCIDM_SHVIEW_INSERT MENUITEM "Colar a&talho", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Propriedades", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index 8647b26ea81..38930ff1236 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -40,8 +40,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Lipește", FCIDM_SHVIEW_INSERT MENUITEM "Lipește ca sc&urtătură", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "&Proprietăți", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 1aa76de6795..1f6c5ed2264 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -40,8 +40,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Вставить", FCIDM_SHVIEW_INSERT MENUITEM "Вставить &ярлык", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Сво&йства", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 768439f6717..903dd14f1d8 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "&Prilepiť", FCIDM_SHVIEW_INSERT MENUITEM "Prilepiť od&kaz", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Vl&astnosti", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index aca00830466..2aa91bcebf0 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Paste", FCIDM_SHVIEW_INSERT MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/sq-AL.rc b/reactos/dll/win32/shell32/lang/sq-AL.rc index 90a9bef1d94..4a54f7d33ca 100644 --- a/reactos/dll/win32/shell32/lang/sq-AL.rc +++ b/reactos/dll/win32/shell32/lang/sq-AL.rc @@ -42,8 +42,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Ngjit", FCIDM_SHVIEW_INSERT MENUITEM "Ngjit si Lidhje", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Cilësime", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 95a6dfbd2d2..60335209038 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Klistra in", FCIDM_SHVIEW_INSERT MENUITEM "Klistra in som genväg", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Egenskaper", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index 7514cfaf4e7..73fd4b74234 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -40,8 +40,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Y&apıştır", FCIDM_SHVIEW_INSERT MENUITEM "K&ısayol Yapıştır", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "&Husûsîyetler", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 0f7ca0c0f9d..069512f5e6b 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -38,8 +38,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "Вставити", FCIDM_SHVIEW_INSERT MENUITEM "Вставити ярлик", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "Властивості", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 58929003f66..42785f04baf 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -47,8 +47,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "粘贴", FCIDM_SHVIEW_INSERT MENUITEM "粘贴快捷方式", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "属性", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 5bd3e14c6f1..2b9f286e467 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -46,8 +46,6 @@ BEGIN MENUITEM "", -1, MFT_SEPARATOR MENUITEM "貼上", FCIDM_SHVIEW_INSERT MENUITEM "貼上捷徑", FCIDM_SHVIEW_INSERTLINK - MENUITEM "", -1, MFT_SEPARATOR - MENUITEM "屬性", FCIDM_SHVIEW_PROPERTIES END END diff --git a/reactos/dll/win32/shell32/shfldr.h b/reactos/dll/win32/shell32/shfldr.h index 799e96b5525..504a94c0f2a 100644 --- a/reactos/dll/win32/shell32/shfldr.h +++ b/reactos/dll/win32/shell32/shfldr.h @@ -63,6 +63,8 @@ BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey); void AddFSClassKeysToArray(PCUITEMID_CHILD pidl, HKEY* array, UINT* cKeys); +HRESULT CDefViewBckgrndMenu_CreateInstance(IShellFolder* psf, REFIID riid, void **ppv); + HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE* ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl); static __inline int SHELL32_GUIDToStringA (REFGUID guid, LPSTR str)