From: Giannis Adamopoulos Date: Tue, 29 Nov 2016 15:38:55 +0000 (+0000) Subject: [SHELL32] X-Git-Tag: ReactOS-0.4.4-FOSDEM2017~130 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=99548a5a34589686d0f1e23e6bf0db4c8a55049d [SHELL32] - CDefViewBckgrndMenu : Add class to handle the background menu of the CDefView and handle stuff that previously were handled by CDefaultContextMenu. Let the shell folders fill their own part of the background context menu. - CDefView: Create a CDefViewBckgrndMenu instead of a CDefaultContextMenu which was completely wrong. - CDesktopFolder, CFSFolder: Implement returning the background context menu in CreateViewObject. Note that I am not completely sure that the callback should be adding the Properties item. - CDefaultContextMenu: Remove code that was moved to CDefViewBckgrndMenu and try to improve the overzealous debug prints regarding the shell extensions. CORE-12410, CORE-12472 svn path=/trunk/; revision=73405 --- 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)) + { + ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr); + continue; + } + + if (m_bGroupPolicyActive) { - 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) { - 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); - } + ERR("Shell extension %s not approved!\n", pwszClsid); + continue; } - else - LoadDynamicContextMenuHandler(hKey, &clsid); } + + 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 */ - UINT IndexMenu = AddStaticContextMenusToMenu(hMenu, 0); + /* Add static context menu handlers */ + IndexMenu = AddStaticContextMenusToMenu(hMenu, IndexMenu); - /* 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)