[SHELL32] Implement Move To Folder (#3056)

- Add context menu item "Mo&ve to folder..." and implement the action.
- Implement the "Mo&ve to folder..." menu item of "Edit" menu of Explorer.
CORE-11132
This commit is contained in:
Katayama Hirofumi MZ 2020-08-18 05:30:54 +09:00 committed by GitHub
parent 679c95597c
commit 46ff964e22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 590 additions and 9 deletions

View file

@ -9,8 +9,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell);
static HRESULT
_GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida)
HRESULT _GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida)
{
static CLIPFORMAT s_cfHIDA = 0;
if (s_cfHIDA == 0)

View file

@ -1,11 +1,13 @@
/*
* PROJECT: shell32
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: CopyTo implementation
* PURPOSE: CopyTo and MoveTo implementation
* COPYRIGHT: Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#pragma once
HRESULT _GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida);
class CCopyToMenu :
public CComCoClass<CCopyToMenu, &CLSID_CopyToMenu>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@ -56,3 +58,54 @@ public:
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
END_COM_MAP()
};
class CMoveToMenu :
public CComCoClass<CMoveToMenu, &CLSID_MoveToMenu>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IContextMenu2,
public IObjectWithSite,
public IShellExtInit
{
protected:
UINT m_idCmdFirst, m_idCmdLast, m_idCmdMoveTo;
CComPtr<IDataObject> m_pDataObject;
CComPtr<IUnknown> m_pSite;
HRESULT DoMoveToFolder(LPCMINVOKECOMMANDINFO lpici);
HRESULT DoRealMove(LPCMINVOKECOMMANDINFO lpici, PCUIDLIST_ABSOLUTE pidl);
CStringW DoGetFileTitle();
public:
CComHeapPtr<ITEMIDLIST> m_pidlFolder;
WNDPROC m_fnOldWndProc;
CMoveToMenu();
~CMoveToMenu();
// 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);
// IShellExtInit
virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
// IObjectWithSite
virtual HRESULT WINAPI SetSite(IUnknown *pUnkSite);
virtual HRESULT WINAPI GetSite(REFIID riid, void **ppvSite);
DECLARE_REGISTRY_RESOURCEID(IDR_MOVETOMENU)
DECLARE_NOT_AGGREGATABLE(CMoveToMenu)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMoveToMenu)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
END_COM_MAP()
};

View file

@ -1823,6 +1823,7 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
case FCIDM_SHVIEW_RENAME:
case FCIDM_SHVIEW_PROPERTIES:
case FCIDM_SHVIEW_COPYTO:
case FCIDM_SHVIEW_MOVETO:
return OnExplorerCommand(dwCmdID, TRUE);
case FCIDM_SHVIEW_INSERT:

View file

@ -49,6 +49,7 @@ struct _StaticInvokeCommandMap_
{ "properties", FCIDM_SHVIEW_PROPERTIES},
{ "rename", FCIDM_SHVIEW_RENAME},
{ "copyto", FCIDM_SHVIEW_COPYTO },
{ "moveto", FCIDM_SHVIEW_MOVETO },
};
class CDefaultContextMenu :
@ -95,7 +96,7 @@ class CDefaultContextMenu :
HRESULT DoRename(LPCMINVOKECOMMANDINFO lpcmi);
HRESULT DoProperties(LPCMINVOKECOMMANDINFO lpcmi);
HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFO lpici);
HRESULT DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici);
HRESULT DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFO lpici, BOOL bCopy);
HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFO lpcmi);
HRESULT InvokeRegVerb(LPCMINVOKECOMMANDINFO lpcmi);
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFO lpcmi, PStaticShellEntry pEntry);
@ -895,7 +896,7 @@ CDefaultContextMenu::DoProperties(
}
HRESULT
CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
CDefaultContextMenu::DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFO lpici, BOOL bCopy)
{
HRESULT hr = E_FAIL;
if (!m_pDataObj)
@ -905,7 +906,12 @@ CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
}
CComPtr<IContextMenu> pContextMenu;
hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL, IID_PPV_ARG(IContextMenu, &pContextMenu));
if (bCopy)
hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
IID_PPV_ARG(IContextMenu, &pContextMenu));
else
hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
IID_PPV_ARG(IContextMenu, &pContextMenu));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -918,7 +924,10 @@ CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
if (FAILED_UNEXPECTEDLY(hr))
return hr;
lpici->lpVerb = "copyto";
if (bCopy)
lpici->lpVerb = "copyto";
else
lpici->lpVerb = "moveto";
return pContextMenu->InvokeCommand(lpici);
}
@ -1279,7 +1288,10 @@ CDefaultContextMenu::InvokeCommand(
Result = DoCreateNewFolder(&LocalInvokeInfo);
break;
case FCIDM_SHVIEW_COPYTO:
Result = DoCopyToFolder(&LocalInvokeInfo);
Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
break;
case FCIDM_SHVIEW_MOVETO:
Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
break;
default:
Result = E_INVALIDARG;

View file

@ -84,6 +84,7 @@ list(APPEND SOURCE
CNewMenu.cpp
CSendToMenu.cpp
CCopyToMenu.cpp
CMoveToMenu.cpp
CShellDispatch.cpp
CFolder.cpp
CFolderItems.cpp

View file

@ -0,0 +1,345 @@
/*
* PROJECT: shell32
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: MoveTo implementation
* COPYRIGHT: Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "precomp.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
CMoveToMenu::CMoveToMenu() :
m_idCmdFirst(0),
m_idCmdLast(0),
m_idCmdMoveTo(-1)
{
}
CMoveToMenu::~CMoveToMenu()
{
}
#define WM_ENABLEOK (WM_USER + 0x2000)
static LRESULT CALLBACK
WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CMoveToMenu *this_ =
reinterpret_cast<CMoveToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
switch (uMsg)
{
case WM_ENABLEOK:
SendMessageW(hwnd, BFFM_ENABLEOK, 0, (BOOL)lParam);
return 0;
}
return CallWindowProcW(this_->m_fnOldWndProc, hwnd, uMsg, wParam, lParam);
}
static int CALLBACK
BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
CMoveToMenu *this_ =
reinterpret_cast<CMoveToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
switch (uMsg)
{
case BFFM_INITIALIZED:
{
SetWindowLongPtr(hwnd, GWLP_USERDATA, lpData);
this_ = reinterpret_cast<CMoveToMenu *>(lpData);
// Select initial directory
SendMessageW(hwnd, BFFM_SETSELECTION, FALSE,
reinterpret_cast<LPARAM>(static_cast<LPCITEMIDLIST>(this_->m_pidlFolder)));
// Set caption
CString strCaption(MAKEINTRESOURCEW(IDS_MOVEITEMS));
SetWindowTextW(hwnd, strCaption);
// Set OK button text
CString strMove(MAKEINTRESOURCEW(IDS_MOVEBUTTON));
SetDlgItemText(hwnd, IDOK, strMove);
// Subclassing
this_->m_fnOldWndProc =
reinterpret_cast<WNDPROC>(
SetWindowLongPtr(hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(WindowProc)));
// Disable OK
PostMessageW(hwnd, WM_ENABLEOK, 0, FALSE);
break;
}
case BFFM_SELCHANGED:
{
WCHAR szPath[MAX_PATH];
LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(lParam);
szPath[0] = 0;
SHGetPathFromIDListW(pidl, szPath);
if (ILIsEqual(pidl, this_->m_pidlFolder))
PostMessageW(hwnd, WM_ENABLEOK, 0, FALSE);
else if (PathFileExistsW(szPath) || _ILIsDesktop(pidl))
PostMessageW(hwnd, WM_ENABLEOK, 0, TRUE);
else
PostMessageW(hwnd, WM_ENABLEOK, 0, FALSE);
break;
}
}
return FALSE;
}
HRESULT CMoveToMenu::DoRealMove(LPCMINVOKECOMMANDINFO lpici, LPCITEMIDLIST pidl)
{
CComHeapPtr<CIDA> pCIDA;
HRESULT hr = _GetCidlFromDataObject(m_pDataObject, &pCIDA);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
PCUIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pCIDA);
if (!pidlParent)
{
ERR("HIDA_GetPIDLFolder failed\n");
return E_FAIL;
}
CStringW strFiles;
WCHAR szPath[MAX_PATH];
for (UINT n = 0; n < pCIDA->cidl; ++n)
{
PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(pCIDA, n);
if (!pidlRelative)
continue;
CComHeapPtr<ITEMIDLIST> pidlCombine(ILCombine(pidlParent, pidlRelative));
if (!pidl)
return E_FAIL;
SHGetPathFromIDListW(pidlCombine, szPath);
if (n > 0)
strFiles += L'|';
strFiles += szPath;
}
strFiles += L'|'; // double null-terminated
strFiles.Replace(L'|', L'\0');
if (_ILIsDesktop(pidl))
SHGetSpecialFolderPathW(NULL, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
else
SHGetPathFromIDListW(pidl, szPath);
INT cchPath = lstrlenW(szPath);
if (cchPath + 1 < MAX_PATH)
{
szPath[cchPath + 1] = 0; // double null-terminated
}
else
{
ERR("Too long path\n");
return E_FAIL;
}
SHFILEOPSTRUCTW op = { lpici->hwnd };
op.wFunc = FO_MOVE;
op.pFrom = strFiles;
op.pTo = szPath;
op.fFlags = FOF_ALLOWUNDO;
return ((SHFileOperation(&op) == 0) ? S_OK : E_FAIL);
}
CStringW CMoveToMenu::DoGetFileTitle()
{
CStringW ret = L"(file)";
CComHeapPtr<CIDA> pCIDA;
HRESULT hr = _GetCidlFromDataObject(m_pDataObject, &pCIDA);
if (FAILED_UNEXPECTEDLY(hr))
return ret;
PCUIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pCIDA);
if (!pidlParent)
{
ERR("HIDA_GetPIDLFolder failed\n");
return ret;
}
WCHAR szPath[MAX_PATH];
PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(pCIDA, 0);
if (!pidlRelative)
{
ERR("HIDA_GetPIDLItem failed\n");
return ret;
}
CComHeapPtr<ITEMIDLIST> pidlCombine(ILCombine(pidlParent, pidlRelative));
if (SHGetPathFromIDListW(pidlCombine, szPath))
ret = PathFindFileNameW(szPath);
else
ERR("Cannot get path\n");
if (pCIDA->cidl > 1)
ret += L" ...";
return ret;
}
HRESULT CMoveToMenu::DoMoveToFolder(LPCMINVOKECOMMANDINFO lpici)
{
WCHAR wszPath[MAX_PATH];
HRESULT hr = E_FAIL;
TRACE("DoMoveToFolder(%p)\n", lpici);
if (!SHGetPathFromIDListW(m_pidlFolder, wszPath))
{
ERR("SHGetPathFromIDListW failed\n");
return hr;
}
CStringW strFileTitle = DoGetFileTitle();
CStringW strTitle;
strTitle.Format(IDS_MOVETOTITLE, static_cast<LPCWSTR>(strFileTitle));
BROWSEINFOW info = { lpici->hwnd };
info.pidlRoot = NULL;
info.lpszTitle = strTitle;
info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
info.lpfn = BrowseCallbackProc;
info.lParam = reinterpret_cast<LPARAM>(this);
CComHeapPtr<ITEMIDLIST> pidl(SHBrowseForFolder(&info));
if (pidl)
{
hr = DoRealMove(lpici, pidl);
}
return hr;
}
HRESULT WINAPI
CMoveToMenu::QueryContextMenu(HMENU hMenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
MENUITEMINFOW mii;
UINT Count = 0;
TRACE("CMoveToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
m_idCmdFirst = m_idCmdLast = idCmdFirst;
// insert separator if necessary
CStringW strCopyTo(MAKEINTRESOURCEW(IDS_COPYTOMENU));
WCHAR szBuff[128];
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.dwTypeData = szBuff;
mii.cch = _countof(szBuff);
if (GetMenuItemInfoW(hMenu, indexMenu - 1, TRUE, &mii) &&
mii.fType != MFT_SEPARATOR &&
!(mii.fType == MFT_STRING && CStringW(szBuff) == strCopyTo))
{
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_SEPARATOR;
if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
{
++indexMenu;
++Count;
}
}
// insert "Move to folder..."
CStringW strText(MAKEINTRESOURCEW(IDS_MOVETOMENU));
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = strText.GetBuffer();
mii.cch = wcslen(mii.dwTypeData);
mii.wID = m_idCmdLast;
if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
{
m_idCmdMoveTo = m_idCmdLast++;
++indexMenu;
++Count;
}
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count);
}
HRESULT WINAPI
CMoveToMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
{
HRESULT hr = E_FAIL;
TRACE("CMoveToMenu::InvokeCommand(%p)\n", lpici);
if (HIWORD(lpici->lpVerb) == 0)
{
if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdMoveTo)
{
hr = DoMoveToFolder(lpici);
}
}
else
{
if (::lstrcmpiA(lpici->lpVerb, "moveto") == 0)
{
hr = DoMoveToFolder(lpici);
}
}
return hr;
}
HRESULT WINAPI
CMoveToMenu::GetCommandString(UINT_PTR idCmd,
UINT uType,
UINT *pwReserved,
LPSTR pszName,
UINT cchMax)
{
FIXME("%p %lu %u %p %p %u\n", this,
idCmd, uType, pwReserved, pszName, cchMax);
return E_NOTIMPL;
}
HRESULT WINAPI
CMoveToMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TRACE("This %p uMsg %x\n", this, uMsg);
return E_NOTIMPL;
}
HRESULT WINAPI
CMoveToMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID)
{
m_pidlFolder.Attach(ILClone(pidlFolder));
m_pDataObject = pdtobj;
return S_OK;
}
HRESULT WINAPI CMoveToMenu::SetSite(IUnknown *pUnkSite)
{
m_pSite = pUnkSite;
return S_OK;
}
HRESULT WINAPI CMoveToMenu::GetSite(REFIID riid, void **ppvSite)
{
if (!m_pSite)
return E_FAIL;
return m_pSite->QueryInterface(riid, ppvSite);
}

View file

@ -1003,4 +1003,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1008,4 +1008,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1008,4 +1008,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1003,4 +1003,8 @@ BEGIN
IDS_COPYTOTITLE "Wählen Sie den Ort, in den '%s' kopiert werden soll. Klicken Sie anschließend auf Kopieren."
IDS_COPYITEMS "Elemente kopieren"
IDS_COPYBUTTON "Kopieren"
IDS_MOVETOMENU "In Ordner &verschieben..."
IDS_MOVETOTITLE "Wählen Sie den Ort, in den '%s' verschoben werden soll. Klicken Sie anschließend auf Verschieben."
IDS_MOVEITEMS "Elemente verschieben"
IDS_MOVEBUTTON "Verschieben"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1011,4 +1011,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1009,4 +1009,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1004,4 +1004,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -997,4 +997,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1001,4 +1001,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -998,4 +998,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -999,4 +999,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1008,4 +1008,8 @@ BEGIN
IDS_COPYTOTITLE "Zaznacz miejsce, w które chcesz skopiować '%s', a następnie kliknij przycisk Kopiuj."
IDS_COPYITEMS "Kopiowanie elementów"
IDS_COPYBUTTON "Kopiuj"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1004,4 +1004,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1009,4 +1009,8 @@ BEGIN
IDS_COPYTOTITLE "Выберите расположение, куда вы хотите скопировать '%s', затем нажмите кнопку 'Копировать'."
IDS_COPYITEMS "Копирование элементов"
IDS_COPYBUTTON "Копировать"
IDS_MOVETOMENU "Переместить в папку..."
IDS_MOVETOTITLE "Выберите место, куда Вы хотите переместить '%s'. Затем нажмите кнопку 'Переместить.'"
IDS_MOVEITEMS "Перемещение предметов"
IDS_MOVEBUTTON "Переместить"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1006,4 +1006,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1004,4 +1004,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1002,4 +1002,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1012,4 +1012,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -1013,4 +1013,8 @@ BEGIN
IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then click the Copy button."
IDS_COPYITEMS "Copy Items"
IDS_COPYBUTTON "Copy"
IDS_MOVETOMENU "Mo&ve to folder..."
IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then click the Move button."
IDS_MOVEITEMS "Move Items"
IDS_MOVEBUTTON "Move"
END

View file

@ -81,7 +81,7 @@
#include "COpenWithMenu.h"
#include "CNewMenu.h"
#include "CSendToMenu.h"
#include "CCopyToMenu.h"
#include "CCopyToMoveToMenu.h"
#include "dialogs/filedefext.h"
#include "dialogs/drvdefext.h"
#include "CQueryAssociations.h"

View file

@ -0,0 +1,26 @@
HKCR
{
NoRemove CLSID
{
ForceRemove {C2FBB631-2971-11D1-A18C-00C04FD75D13} = s 'ReactOS MoveTo Object Service'
{
val flags = d '1'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
NoRemove AllFilesystemObjects
{
NoRemove shellex
{
NoRemove ContextMenuHandlers
{
ForceRemove MoveTo = s '{C2FBB631-2971-11D1-A18C-00C04FD75D13}'
{
}
}
}
}
}

View file

@ -31,3 +31,4 @@ IDR_SHELL REGISTRY "res/rgs/shell.rgs"
IDR_ACTIVEDESKTOP REGISTRY "res/rgs/activedesktop.rgs"
IDR_SENDTOMENU REGISTRY "res/rgs/sendtomenu.rgs"
IDR_COPYTOMENU REGISTRY "res/rgs/copytomenu.rgs"
IDR_MOVETOMENU REGISTRY "res/rgs/movetomenu.rgs"

View file

@ -291,6 +291,7 @@ BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_NewMenu, CNewMenu)
OBJECT_ENTRY(CLSID_SendToMenu, CSendToMenu)
OBJECT_ENTRY(CLSID_CopyToMenu, CCopyToMenu)
OBJECT_ENTRY(CLSID_MoveToMenu, CMoveToMenu)
OBJECT_ENTRY(CLSID_StartMenu, CStartMenuDummy)
OBJECT_ENTRY(CLSID_MenuBandSite, CMenuSite)
OBJECT_ENTRY(CLSID_MenuBand, CMenuBand)

View file

@ -301,6 +301,10 @@
#define IDS_COPYTOTITLE 30533
#define IDS_COPYITEMS 30534
#define IDS_COPYBUTTON 30535
#define IDS_MOVETOMENU 30536
#define IDS_MOVETOTITLE 30537
#define IDS_MOVEITEMS 30538
#define IDS_MOVEBUTTON 30539
/* Dialogs */
@ -801,6 +805,7 @@
#define IDM_RENAME (FCIDM_SHVIEW_RENAME - 0x7000)
#define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000)
#define IDM_COPYTO (FCIDM_SHVIEW_COPYTO - 0x7000)
#define IDM_MOVETO (FCIDM_SHVIEW_MOVETO - 0x7000)
#define IDM_DRAGFILE 0xce
#define IDM_COPYHERE 0x7
@ -842,3 +847,4 @@
#define IDR_ACTIVEDESKTOP 157
#define IDR_SENDTOMENU 158
#define IDR_COPYTOMENU 159
#define IDR_MOVETOMENU 160