mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 22:47:28 +00:00
[SHELL32]
- Implement copy / paste for files when tree view is present - Don't add shortcuts / executables to recent file list svn path=/trunk/; revision=49969
This commit is contained in:
parent
0b6a8d819a
commit
d6f6afee98
|
@ -685,6 +685,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv)
|
||||||
CHAR link_dir[MAX_PATH];
|
CHAR link_dir[MAX_PATH];
|
||||||
CHAR new_lnk_filepath[MAX_PATH];
|
CHAR new_lnk_filepath[MAX_PATH];
|
||||||
CHAR new_lnk_name[MAX_PATH];
|
CHAR new_lnk_name[MAX_PATH];
|
||||||
|
CHAR * ext;
|
||||||
IMalloc *ppM;
|
IMalloc *ppM;
|
||||||
LPITEMIDLIST pidl;
|
LPITEMIDLIST pidl;
|
||||||
HWND hwnd = 0; /* FIXME: get real window handle */
|
HWND hwnd = 0; /* FIXME: get real window handle */
|
||||||
|
@ -818,10 +819,29 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv)
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("full document name %s\n", debugstr_a(doc_name));
|
TRACE("full document name %s\n", debugstr_a(doc_name));
|
||||||
|
|
||||||
|
/* check if file is a shortcut */
|
||||||
|
ext = strrchr(doc_name, '.');
|
||||||
|
if (!lstrcmpiA(ext, ".lnk"))
|
||||||
|
{
|
||||||
|
IShellLinkA * ShellLink;
|
||||||
|
|
||||||
|
IShellLink_ConstructFromFile(NULL, &IID_IShellLinkA, (LPCITEMIDLIST)SHSimpleIDListFromPathA(doc_name), (LPVOID*)&ShellLink);
|
||||||
|
IShellLinkA_GetPath(ShellLink, doc_name, MAX_PATH, NULL, 0);
|
||||||
|
|
||||||
|
IShellLinkA_Release(ShellLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
ext = strrchr(doc_name, '.');
|
||||||
|
if (!lstrcmpiA(ext, ".exe"))
|
||||||
|
{
|
||||||
|
/* executables are not added */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PathStripPathA(doc_name);
|
PathStripPathA(doc_name);
|
||||||
TRACE("stripped document name %s\n", debugstr_a(doc_name));
|
TRACE("stripped document name %s\n", debugstr_a(doc_name));
|
||||||
|
|
||||||
|
|
||||||
/* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */
|
/* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */
|
||||||
|
|
||||||
{ /* on input needs:
|
{ /* on input needs:
|
||||||
|
|
|
@ -1594,11 +1594,144 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
|
||||||
}
|
}
|
||||||
else if(plvKeyDown->wVKey == 'C' && ctrl)
|
else if(plvKeyDown->wVKey == 'C' && ctrl)
|
||||||
{
|
{
|
||||||
FIXME("Need to copy\n");
|
if (ShellView_GetSelections(This))
|
||||||
|
{
|
||||||
|
IDataObject * pda;
|
||||||
|
|
||||||
|
if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
|
||||||
|
{
|
||||||
|
HRESULT hr = OleSetClipboard(pda);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
WARN("OleSetClipboard failed");
|
||||||
|
}
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(plvKeyDown->wVKey == 'V' && ctrl)
|
else if(plvKeyDown->wVKey == 'V' && ctrl)
|
||||||
{
|
{
|
||||||
FIXME("Need to paste\n");
|
IDataObject * pda;
|
||||||
|
STGMEDIUM medium;
|
||||||
|
FORMATETC formatetc;
|
||||||
|
LPITEMIDLIST * apidl;
|
||||||
|
LPITEMIDLIST pidl;
|
||||||
|
IShellFolder *psfFrom = NULL, *psfDesktop, *psfTarget = NULL;
|
||||||
|
LPIDA lpcida;
|
||||||
|
ISFHelper *psfhlpdst, *psfhlpsrc;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = OleGetClipboard(&pda);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
ERR("Failed to get clipboard with %lx\n", hr);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
|
||||||
|
hr = IDataObject_GetData(pda,&formatetc,&medium);
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
ERR("Failed to get clipboard data with %lx\n", hr);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lock the handle */
|
||||||
|
lpcida = GlobalLock(medium.u.hGlobal);
|
||||||
|
if (!lpcida)
|
||||||
|
{
|
||||||
|
ERR("failed to lock pidl\n");
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* convert the data into pidl */
|
||||||
|
apidl = _ILCopyCidaToaPidl(&pidl, lpcida);
|
||||||
|
|
||||||
|
if (!apidl)
|
||||||
|
{
|
||||||
|
ERR("failed to copy pidl\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(SHGetDesktopFolder(&psfDesktop)))
|
||||||
|
{
|
||||||
|
ERR("failed to get desktop folder\n");
|
||||||
|
SHFree(pidl);
|
||||||
|
_ILFreeaPidl(apidl, lpcida->cidl);
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_ILIsDesktop(pidl))
|
||||||
|
{
|
||||||
|
/* use desktop shellfolder */
|
||||||
|
psfFrom = psfDesktop;
|
||||||
|
}
|
||||||
|
else if (FAILED(IShellFolder_BindToObject(psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID*)&psfFrom)))
|
||||||
|
{
|
||||||
|
ERR("no IShellFolder\n");
|
||||||
|
|
||||||
|
IShellFolder_Release(psfDesktop);
|
||||||
|
SHFree(pidl);
|
||||||
|
_ILFreeaPidl(apidl, lpcida->cidl);
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
psfTarget = This->pSFParent;
|
||||||
|
|
||||||
|
|
||||||
|
/* get source and destination shellfolder */
|
||||||
|
if (FAILED(IShellFolder_QueryInterface(psfTarget, &IID_ISFHelper, (LPVOID*)&psfhlpdst)))
|
||||||
|
{
|
||||||
|
ERR("no IID_ISFHelper for destination\n");
|
||||||
|
|
||||||
|
IShellFolder_Release(psfFrom);
|
||||||
|
IShellFolder_Release(psfTarget);
|
||||||
|
SHFree(pidl);
|
||||||
|
_ILFreeaPidl(apidl, lpcida->cidl);
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(IShellFolder_QueryInterface(psfFrom, &IID_ISFHelper, (LPVOID*)&psfhlpsrc)))
|
||||||
|
{
|
||||||
|
ERR("no IID_ISFHelper for source\n");
|
||||||
|
|
||||||
|
ISFHelper_Release(psfhlpdst);
|
||||||
|
IShellFolder_Release(psfFrom);
|
||||||
|
IShellFolder_Release(psfTarget);
|
||||||
|
SHFree(pidl);
|
||||||
|
_ILFreeaPidl(apidl, lpcida->cidl);
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXXME
|
||||||
|
* do we want to perform a copy or move ???
|
||||||
|
*/
|
||||||
|
hr = ISFHelper_CopyItems(psfhlpdst, psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl);
|
||||||
|
|
||||||
|
ISFHelper_Release(psfhlpdst);
|
||||||
|
ISFHelper_Release(psfhlpsrc);
|
||||||
|
IShellFolder_Release(psfFrom);
|
||||||
|
SHFree(pidl);
|
||||||
|
_ILFreeaPidl(apidl, lpcida->cidl);
|
||||||
|
ReleaseStgMedium(&medium);
|
||||||
|
IDataObject_Release(pda);
|
||||||
|
TRACE("paste end hr %x\n", hr);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
|
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
|
||||||
|
|
Loading…
Reference in a new issue