Author: janderwald
Date: Tue Dec 7 14:35:54 2010
New Revision: 49969
URL:
http://svn.reactos.org/svn/reactos?rev=49969&view=rev
Log:
[SHELL32]
- Implement copy / paste for files when tree view is present
- Don't add shortcuts / executables to recent file list
Modified:
trunk/reactos/dll/win32/shell32/shellord.c
trunk/reactos/dll/win32/shell32/shlview.c
Modified: trunk/reactos/dll/win32/shell32/shellord.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shellord…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] Tue Dec 7 14:35:54 2010
@@ -685,6 +685,7 @@
CHAR link_dir[MAX_PATH];
CHAR new_lnk_filepath[MAX_PATH];
CHAR new_lnk_name[MAX_PATH];
+ CHAR * ext;
IMalloc *ppM;
LPITEMIDLIST pidl;
HWND hwnd = 0; /* FIXME: get real window handle */
@@ -818,9 +819,28 @@
}
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);
TRACE("stripped document name %s\n", debugstr_a(doc_name));
-
/* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */
Modified: trunk/reactos/dll/win32/shell32/shlview.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlview.…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shlview.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shlview.c [iso-8859-1] Tue Dec 7 14:35:54 2010
@@ -1594,11 +1594,144 @@
}
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)
{
- 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
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);