Distinguish between Open and Explore commands.
Execute items by default.
This commit is contained in:
parent
c4ec2108b1
commit
f045c9df81
|
@ -43,6 +43,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define NONAMELESSUNION
|
||||
#define NONAMELESSSTRUCT
|
||||
#include "windef.h"
|
||||
#include "winerror.h"
|
||||
#include "winbase.h"
|
||||
|
@ -808,6 +810,90 @@ static UINT ShellView_GetSelections(IShellViewImpl * This)
|
|||
return This->cidl;
|
||||
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
* ShellView_OpenSelectedItems()
|
||||
*/
|
||||
static HRESULT ShellView_OpenSelectedItems(IShellViewImpl * This)
|
||||
{
|
||||
static UINT CF_IDLIST = 0;
|
||||
HRESULT hr;
|
||||
IDataObject* selection;
|
||||
FORMATETC fetc;
|
||||
STGMEDIUM stgm;
|
||||
LPIDA pIDList;
|
||||
LPCITEMIDLIST parent_pidl;
|
||||
int i;
|
||||
|
||||
if (0 == ShellView_GetSelections(This))
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
|
||||
(LPCITEMIDLIST*)This->apidl, &IID_IDataObject,
|
||||
0, (LPVOID *)&selection);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
if (0 == CF_IDLIST)
|
||||
{
|
||||
CF_IDLIST = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
|
||||
}
|
||||
fetc.cfFormat = CF_IDLIST;
|
||||
fetc.ptd = NULL;
|
||||
fetc.dwAspect = DVASPECT_CONTENT;
|
||||
fetc.lindex = -1;
|
||||
fetc.tymed = TYMED_HGLOBAL;
|
||||
|
||||
hr = IDataObject_QueryGetData(selection, &fetc);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
hr = IDataObject_GetData(selection, &fetc, &stgm);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
pIDList = GlobalLock(stgm.u.hGlobal);
|
||||
|
||||
parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pIDList+pIDList->aoffset[0]);
|
||||
for (i = pIDList->cidl; i > 0; --i)
|
||||
{
|
||||
LPCITEMIDLIST pidl;
|
||||
SFGAOF attribs;
|
||||
|
||||
pidl = (LPCITEMIDLIST)((LPBYTE)pIDList+pIDList->aoffset[i]);
|
||||
|
||||
attribs = SFGAO_FOLDER;
|
||||
hr = IShellFolder_GetAttributesOf(This->pSFParent, 1, &pidl, &attribs);
|
||||
|
||||
if (SUCCEEDED(hr) && ! (attribs & SFGAO_FOLDER))
|
||||
{
|
||||
SHELLEXECUTEINFOA shexinfo;
|
||||
|
||||
shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA);
|
||||
shexinfo.fMask = SEE_MASK_INVOKEIDLIST; /* SEE_MASK_IDLIST is also possible. */
|
||||
shexinfo.hwnd = NULL;
|
||||
shexinfo.lpVerb = NULL;
|
||||
shexinfo.lpFile = NULL;
|
||||
shexinfo.lpParameters = NULL;
|
||||
shexinfo.lpDirectory = NULL;
|
||||
shexinfo.nShow = SW_NORMAL;
|
||||
shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
|
||||
|
||||
ShellExecuteExA(&shexinfo); /* Discard error/success info */
|
||||
|
||||
ILFree((LPITEMIDLIST)shexinfo.lpIDList);
|
||||
}
|
||||
}
|
||||
|
||||
GlobalUnlock(stgm.u.hGlobal);
|
||||
ReleaseStgMedium(&stgm);
|
||||
|
||||
IDataObject_Release(selection);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
* ShellView_DoContextMenu()
|
||||
*/
|
||||
|
@ -849,6 +935,9 @@ static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL
|
|||
/* let the ContextMenu merge its items in */
|
||||
if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
|
||||
{
|
||||
if (This->FolderSettings.fFlags & FWF_DESKTOP)
|
||||
SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
|
||||
|
||||
if( bDefault )
|
||||
{
|
||||
TRACE("-- get menu default command\n");
|
||||
|
@ -863,10 +952,13 @@ static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL
|
|||
if(uCommand > 0)
|
||||
{
|
||||
TRACE("-- uCommand=%u\n", uCommand);
|
||||
if (IsInCommDlg(This) && ((uCommand==FCIDM_SHVIEW_EXPLORE) || (uCommand==FCIDM_SHVIEW_OPEN)))
|
||||
if (uCommand==FCIDM_SHVIEW_OPEN && IsInCommDlg(This))
|
||||
{
|
||||
TRACE("-- dlg: OnDefaultCommand\n");
|
||||
OnDefaultCommand(This);
|
||||
if (FAILED(OnDefaultCommand(This)))
|
||||
{
|
||||
ShellView_OpenSelectedItems(This);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1144,6 +1236,22 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
|
|||
OnStateChange(This,CDBOSC_KILLFOCUS);
|
||||
break;
|
||||
|
||||
case NM_CUSTOMDRAW:
|
||||
TRACE("-- NM_CUSTOMDRAW %p\n",This);
|
||||
return CDRF_DODEFAULT;
|
||||
|
||||
case NM_RELEASEDCAPTURE:
|
||||
TRACE("-- NM_RELEASEDCAPTURE %p\n",This);
|
||||
break;
|
||||
|
||||
case NM_CLICK:
|
||||
TRACE("-- NM_CLICK %p\n",This);
|
||||
break;
|
||||
|
||||
case NM_RCLICK:
|
||||
TRACE("-- NM_RCLICK %p\n",This);
|
||||
break;
|
||||
|
||||
case HDN_ENDTRACKA:
|
||||
TRACE("-- HDN_ENDTRACKA %p\n",This);
|
||||
/*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
|
||||
|
@ -1155,6 +1263,10 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
|
|||
SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
|
||||
break;
|
||||
|
||||
case LVN_DELETEALLITEMS:
|
||||
TRACE("-- LVN_DELETEALLITEMS %p\n",This);
|
||||
return FALSE;
|
||||
|
||||
case LVN_INSERTITEM:
|
||||
TRACE("-- LVN_INSERTITEM (STUB)%p\n",This);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue