mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
Better DropTarget.
This commit is contained in:
parent
e2051cd084
commit
3539693b3c
1 changed files with 372 additions and 251 deletions
|
@ -2,7 +2,7 @@
|
|||
* Shell Folder stuff
|
||||
*
|
||||
* Copyright 1997 Marcus Meissner
|
||||
* Copyright 1998 Juergen Schmied
|
||||
* Copyright 1998, 1999 Juergen Schmied
|
||||
*
|
||||
* IShellFolder with IDropTarget, IPersistFolder
|
||||
*
|
||||
|
@ -26,159 +26,7 @@
|
|||
|
||||
DEFAULT_DEBUG_CHANNEL(shell)
|
||||
|
||||
/***************************************************************************
|
||||
* IDropTarget interface definition for the ShellFolder
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{ ICOM_VTABLE(IDropTarget)* lpvtbl;
|
||||
ULONG ref;
|
||||
} ISFDropTarget;
|
||||
|
||||
static struct ICOM_VTABLE(IDropTarget) dtvt;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* ISFDropTarget implementation
|
||||
*/
|
||||
|
||||
static IDropTarget * WINAPI ISFDropTarget_Constructor(void)
|
||||
{
|
||||
ISFDropTarget* sf;
|
||||
|
||||
sf = HeapAlloc(GetProcessHeap(), 0, sizeof(ISFDropTarget));
|
||||
|
||||
if (sf)
|
||||
{ sf->lpvtbl = &dtvt;
|
||||
sf->ref = 1;
|
||||
}
|
||||
|
||||
return (IDropTarget *)sf;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_QueryInterface(
|
||||
IDropTarget *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
char xriid[50];
|
||||
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
||||
|
||||
TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
|
||||
|
||||
if ( !This || !ppvObj)
|
||||
return E_INVALIDARG;
|
||||
|
||||
*ppvObj = NULL;
|
||||
|
||||
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
|
||||
{ *ppvObj = This;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IDropTarget)) /*IShellFolder*/
|
||||
{ *ppvObj = (ISFDropTarget*)This;
|
||||
}
|
||||
|
||||
if(*ppvObj)
|
||||
{ IDropTarget_AddRef((IDropTarget*)*ppvObj);
|
||||
TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
TRACE("-- Interface: E_NOINTERFACE\n");
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||
|
||||
shell32_ObjCount++;
|
||||
|
||||
return ++(This->ref);
|
||||
}
|
||||
|
||||
static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
shell32_ObjCount--;
|
||||
|
||||
if (!--(This->ref))
|
||||
{ TRACE("-- destroying ISFDropTarget (%p)\n",This);
|
||||
HeapFree(GetProcessHeap(),0,This);
|
||||
return 0;
|
||||
}
|
||||
return This->ref;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragEnter(
|
||||
IDropTarget *iface,
|
||||
IDataObject *pDataObject,
|
||||
DWORD grfKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragOver(
|
||||
IDropTarget *iface,
|
||||
DWORD grfKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
FIXME("Stub: This=%p\n",This);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragLeave(
|
||||
IDropTarget *iface)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
FIXME("Stub: This=%p\n",This);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_Drop(
|
||||
IDropTarget *iface,
|
||||
IDataObject* pDataObject,
|
||||
DWORD grfKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
ICOM_THIS(ISFDropTarget,iface);
|
||||
|
||||
FIXME("Stub: This=%p\n",This);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static struct ICOM_VTABLE(IDropTarget) dtvt =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
ISFDropTarget_QueryInterface,
|
||||
ISFDropTarget_AddRef,
|
||||
ISFDropTarget_Release,
|
||||
ISFDropTarget_DragEnter,
|
||||
ISFDropTarget_DragOver,
|
||||
ISFDropTarget_DragLeave,
|
||||
ISFDropTarget_Drop
|
||||
};
|
||||
#define MEM_DEBUG 1
|
||||
|
||||
/***************************************************************************
|
||||
* GetNextElement (internal function)
|
||||
|
@ -276,10 +124,11 @@ static HRESULT SHELL32_CoCreateInitSF (
|
|||
|
||||
*ppvOut = NULL;
|
||||
|
||||
hr = SHCoCreateInstance(NULL, clsid, NULL, iid, (LPVOID*)&pShellFolder);
|
||||
/* we have to ask first for IPersistFolder, some special folders are expecting this */
|
||||
hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
|
||||
hr = IPersistFolder_QueryInterface(pPersistFolder, iid, (LPVOID*)&pShellFolder);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
absPidl = ILCombine (pidlRoot, pidlChild);
|
||||
|
@ -319,14 +168,7 @@ static HRESULT SHELL32_GetDisplayNameOfChild(
|
|||
hr = IShellFolder_GetDisplayNameOf(psfChild, pidlNext, dwFlags | SHGDN_INFOLDER, &strTemp);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if (strTemp.uType == STRRET_CSTRA)
|
||||
{
|
||||
lstrcpynA(szOut , strTemp.u.cStr, dwOutLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
FIXME("wrong return type");
|
||||
}
|
||||
hr = StrRetToStrNA(szOut, dwOutLen, &strTemp, pidlNext);
|
||||
}
|
||||
|
||||
IShellFolder_Release(psfChild);
|
||||
|
@ -349,20 +191,44 @@ typedef struct
|
|||
DWORD ref;
|
||||
|
||||
ICOM_VTABLE(IPersistFolder)* lpvtblPersistFolder;
|
||||
ICOM_VTABLE(IDropTarget)* lpvtblDropTarget;
|
||||
|
||||
CLSID* pclsid;
|
||||
|
||||
LPSTR sMyPath;
|
||||
LPITEMIDLIST absPidl; /* complete pidl */
|
||||
|
||||
UINT cfShellIDList; /* clipboardformat for IDropTarget */
|
||||
BOOL fAcceptFmt; /* flag for pending Drop */
|
||||
} IGenericSFImpl;
|
||||
|
||||
static struct ICOM_VTABLE(IShellFolder) sfvt;
|
||||
|
||||
static struct ICOM_VTABLE(IPersistFolder) psfvt;
|
||||
static struct ICOM_VTABLE(IDropTarget) dtvt;
|
||||
|
||||
static IShellFolder * ISF_MyComputer_Constructor(void);
|
||||
|
||||
#define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder)))
|
||||
#define _ICOM_THIS_From_IPersistFolder(class, name) class* This = (class*)(((char*)name)-_IPersistFolder_Offset);
|
||||
|
||||
static struct ICOM_VTABLE(IDropTarget) dtvt;
|
||||
#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget)))
|
||||
#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
|
||||
|
||||
/**************************************************************************
|
||||
* registers clipboardformat once
|
||||
*/
|
||||
static void SF_RegisterClipFmt (IShellFolder * iface)
|
||||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
if (!This->cfShellIDList)
|
||||
{
|
||||
This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* IShellFolder_Constructor
|
||||
|
@ -382,8 +248,11 @@ static IShellFolder * IShellFolder_Constructor(
|
|||
|
||||
sf->lpvtbl=&sfvt;
|
||||
sf->lpvtblPersistFolder=&psfvt;
|
||||
sf->lpvtblDropTarget=&dtvt;
|
||||
sf->pclsid = (CLSID*)&CLSID_SFFile;
|
||||
|
||||
sf->cfShellIDList=0;
|
||||
sf->fAcceptFmt=FALSE;
|
||||
|
||||
TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,sfParent, pidl);
|
||||
pdump(pidl);
|
||||
|
||||
|
@ -449,19 +318,27 @@ static HRESULT WINAPI IShellFolder_fnQueryInterface(
|
|||
{ *ppvObj = This;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IShellFolder))
|
||||
{ *ppvObj = (IShellFolder*)This;
|
||||
}
|
||||
{
|
||||
*ppvObj = (IShellFolder*)This;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IPersist))
|
||||
{ *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
|
||||
}
|
||||
{
|
||||
*ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IPersistFolder))
|
||||
{ *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
|
||||
}
|
||||
{
|
||||
*ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder);
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IDropTarget))
|
||||
{
|
||||
*ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
|
||||
SF_RegisterClipFmt((IShellFolder*)This);
|
||||
}
|
||||
|
||||
if(*ppvObj)
|
||||
{
|
||||
IUnknown_AddRef((IUnknown*)(*ppvObj));
|
||||
TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
||||
TRACE("-- Interface = %p\n", *ppvObj);
|
||||
return S_OK;
|
||||
}
|
||||
TRACE("-- Interface: E_NOINTERFACE\n");
|
||||
|
@ -476,6 +353,9 @@ static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder * iface)
|
|||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
#ifdef MEM_DEBUG
|
||||
TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
|
||||
#endif
|
||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||
|
||||
shell32_ObjCount++;
|
||||
|
@ -489,6 +369,9 @@ static ULONG WINAPI IShellFolder_fnRelease(IShellFolder * iface)
|
|||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
#ifdef MEM_DEBUG
|
||||
TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 ));
|
||||
#endif
|
||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||
|
||||
shell32_ObjCount--;
|
||||
|
@ -643,7 +526,7 @@ static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder * iface, LPCITEM
|
|||
|
||||
*ppvOut = NULL;
|
||||
|
||||
if ((iid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(iid, &IID_MyComputer))
|
||||
if ((iid=_ILGetGUIDPointer(pidl)))
|
||||
{
|
||||
/* we have to create a alien folder */
|
||||
if ( SUCCEEDED(SHCoCreateInstance(NULL, iid, NULL, riid, (LPVOID*)&pShellFolder))
|
||||
|
@ -811,39 +694,43 @@ static HRESULT WINAPI IShellFolder_fnCompareIDs(
|
|||
}
|
||||
|
||||
/**************************************************************************
|
||||
* IShellFolder_fnCreateViewObject
|
||||
* Creates an View Object representing the ShellFolder
|
||||
* IShellView / IShellBrowser / IContextMenu
|
||||
*
|
||||
* PARAMETERS
|
||||
* HWND hwndOwner, // Handle of owner window
|
||||
* REFIID riid, // Requested initial interface
|
||||
* LPVOID* ppvObject) // Resultant interface*
|
||||
*
|
||||
* NOTES
|
||||
* the same as SHCreateShellFolderViewEx ???
|
||||
* IShellFolder_fnCreateViewObject
|
||||
*/
|
||||
static HRESULT WINAPI IShellFolder_fnCreateViewObject( IShellFolder * iface,
|
||||
HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
LPSHELLVIEW pShellView;
|
||||
char xriid[50];
|
||||
HRESULT hr;
|
||||
LPSHELLVIEW pShellView;
|
||||
char xriid[50];
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
WINE_StringFromCLSID(riid,xriid);
|
||||
TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
|
||||
|
||||
*ppvOut = NULL;
|
||||
if(ppvOut)
|
||||
{
|
||||
*ppvOut = NULL;
|
||||
|
||||
pShellView = IShellView_Constructor((IShellFolder *) This);
|
||||
|
||||
if(!pShellView)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
hr = pShellView->lpvtbl->fnQueryInterface(pShellView, riid, ppvOut);
|
||||
pShellView->lpvtbl->fnRelease(pShellView);
|
||||
if(IsEqualIID(riid, &IID_IDropTarget))
|
||||
{
|
||||
hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, ppvOut);
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IContextMenu))
|
||||
{
|
||||
FIXME("IContextMenu not implemented\n");
|
||||
hr = E_NOTIMPL;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IShellView))
|
||||
{
|
||||
pShellView = IShellView_Constructor((IShellFolder *) This);
|
||||
if(pShellView)
|
||||
{
|
||||
hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
|
||||
IShellView_Release(pShellView);
|
||||
}
|
||||
}
|
||||
}
|
||||
TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
|
||||
return hr;
|
||||
}
|
||||
|
@ -925,59 +812,50 @@ static HRESULT WINAPI IShellFolder_fnGetUIObjectOf(
|
|||
|
||||
char xclsid[50];
|
||||
LPITEMIDLIST pidl;
|
||||
LPUNKNOWN pObj = NULL;
|
||||
|
||||
IUnknown* pObj = NULL;
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
WINE_StringFromCLSID(riid,xclsid);
|
||||
|
||||
TRACE("(%p)->(%u,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
|
||||
This,hwndOwner,cidl,apidl,xclsid,prgfInOut,ppvOut);
|
||||
|
||||
if (!ppvOut)
|
||||
return E_INVALIDARG;
|
||||
if (ppvOut)
|
||||
{
|
||||
*ppvOut = NULL;
|
||||
|
||||
*ppvOut = NULL;
|
||||
if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
|
||||
{
|
||||
pObj = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)This, This->absPidl, apidl, cidl);
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1))
|
||||
{
|
||||
pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
|
||||
hr = S_OK;
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1))
|
||||
{
|
||||
pidl = ILCombine(This->absPidl,apidl[0]);
|
||||
pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
|
||||
SHFree(pidl);
|
||||
hr = S_OK;
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
|
||||
{
|
||||
hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, (LPVOID*)&pObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = E_NOINTERFACE;
|
||||
}
|
||||
|
||||
if(IsEqualIID(riid, &IID_IContextMenu))
|
||||
{
|
||||
if(cidl < 1)
|
||||
return E_INVALIDARG;
|
||||
if(!pObj)
|
||||
hr = E_OUTOFMEMORY;
|
||||
|
||||
pObj = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)This, This->absPidl, apidl, cidl);
|
||||
*ppvOut = pObj;
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IDataObject))
|
||||
{
|
||||
if (cidl < 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IExtractIconA))
|
||||
{
|
||||
if (cidl != 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
pidl = ILCombine(This->absPidl,apidl[0]);
|
||||
pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
|
||||
SHFree(pidl);
|
||||
}
|
||||
else if (IsEqualIID(riid, &IID_IDropTarget))
|
||||
{
|
||||
if (cidl < 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
pObj = (LPUNKNOWN)ISFDropTarget_Constructor();
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("(%p)->E_NOINTERFACE\n",This);
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
if(!pObj)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
*ppvOut = pObj;
|
||||
return S_OK;
|
||||
TRACE("(%p)->hr=0x%08lx\n",This, hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -1264,18 +1142,27 @@ static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder * iface, LPCITEMI
|
|||
|
||||
*ppvOut = NULL;
|
||||
|
||||
if (!(clsid=_ILGetGUIDPointer(pidl))) return E_INVALIDARG;
|
||||
|
||||
if ( IsEqualIID(clsid, &IID_MyComputer))
|
||||
if ((clsid=_ILGetGUIDPointer(pidl)))
|
||||
{
|
||||
pShellFolder = ISF_MyComputer_Constructor();
|
||||
}
|
||||
if ( IsEqualIID(clsid, &IID_MyComputer))
|
||||
{
|
||||
pShellFolder = ISF_MyComputer_Constructor();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* shell extension */
|
||||
if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
/* file system folder on the desktop */
|
||||
LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
|
||||
pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
|
||||
ILFree(pidltemp);
|
||||
}
|
||||
|
||||
if (_ILIsPidlSimple(pidl)) /* no sub folders */
|
||||
|
@ -1294,6 +1181,49 @@ static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder * iface, LPCITEMI
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* ISF_Desktop_fnCreateViewObject
|
||||
*/
|
||||
static HRESULT WINAPI ISF_Desktop_fnCreateViewObject( IShellFolder * iface,
|
||||
HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
LPSHELLVIEW pShellView;
|
||||
char xriid[50];
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
WINE_StringFromCLSID(riid,xriid);
|
||||
TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
|
||||
|
||||
if(ppvOut)
|
||||
{
|
||||
*ppvOut = NULL;
|
||||
|
||||
if(IsEqualIID(riid, &IID_IDropTarget))
|
||||
{
|
||||
FIXME("IDropTarget not implemented\n");
|
||||
hr = E_NOTIMPL;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IContextMenu))
|
||||
{
|
||||
FIXME("IContextMenu not implemented\n");
|
||||
hr = E_NOTIMPL;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IShellView))
|
||||
{
|
||||
pShellView = IShellView_Constructor((IShellFolder *) This);
|
||||
if(pShellView)
|
||||
{
|
||||
hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
|
||||
IShellView_Release(pShellView);
|
||||
}
|
||||
}
|
||||
}
|
||||
TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* ISF_Desktop_fnGetAttributesOf
|
||||
*/
|
||||
|
@ -1326,6 +1256,10 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder * iface,UINT ci
|
|||
*rgfInOut &= attributes;
|
||||
goto next;
|
||||
}
|
||||
else
|
||||
{ /* some shell-extension */
|
||||
*rgfInOut &= 0xb0000154;
|
||||
}
|
||||
}
|
||||
else if (_ILIsFolder( *apidl))
|
||||
{
|
||||
|
@ -1401,7 +1335,7 @@ static ICOM_VTABLE(IShellFolder) sfdvt =
|
|||
ISF_Desktop_fnBindToObject,
|
||||
IShellFolder_fnBindToStorage,
|
||||
IShellFolder_fnCompareIDs,
|
||||
IShellFolder_fnCreateViewObject,
|
||||
ISF_Desktop_fnCreateViewObject,
|
||||
ISF_Desktop_fnGetAttributesOf,
|
||||
IShellFolder_fnGetUIObjectOf,
|
||||
ISF_Desktop_fnGetDisplayNameOf,
|
||||
|
@ -1559,6 +1493,49 @@ static HRESULT WINAPI ISF_MyComputer_fnBindToObject( IShellFolder * iface, LPCIT
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* ISF_MyComputer_fnCreateViewObject
|
||||
*/
|
||||
static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject( IShellFolder * iface,
|
||||
HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
ICOM_THIS(IGenericSFImpl, iface);
|
||||
|
||||
LPSHELLVIEW pShellView;
|
||||
char xriid[50];
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
WINE_StringFromCLSID(riid,xriid);
|
||||
TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
|
||||
|
||||
if(ppvOut)
|
||||
{
|
||||
*ppvOut = NULL;
|
||||
|
||||
if(IsEqualIID(riid, &IID_IDropTarget))
|
||||
{
|
||||
FIXME("IDropTarget not implemented\n");
|
||||
hr = E_NOTIMPL;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IContextMenu))
|
||||
{
|
||||
FIXME("IContextMenu not implemented\n");
|
||||
hr = E_NOTIMPL;
|
||||
}
|
||||
else if(IsEqualIID(riid, &IID_IShellView))
|
||||
{
|
||||
pShellView = IShellView_Constructor((IShellFolder *) This);
|
||||
if(pShellView)
|
||||
{
|
||||
hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
|
||||
IShellView_Release(pShellView);
|
||||
}
|
||||
}
|
||||
}
|
||||
TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* ISF_MyComputer_fnGetAttributesOf
|
||||
*/
|
||||
|
@ -1691,7 +1668,7 @@ static ICOM_VTABLE(IShellFolder) sfmcvt =
|
|||
ISF_MyComputer_fnBindToObject,
|
||||
IShellFolder_fnBindToStorage,
|
||||
IShellFolder_fnCompareIDs,
|
||||
IShellFolder_fnCreateViewObject,
|
||||
ISF_MyComputer_fnCreateViewObject,
|
||||
ISF_MyComputer_fnGetAttributesOf,
|
||||
IShellFolder_fnGetUIObjectOf,
|
||||
ISF_MyComputer_fnGetDisplayNameOf,
|
||||
|
@ -1711,6 +1688,8 @@ static HRESULT WINAPI ISFPersistFolder_QueryInterface(
|
|||
{
|
||||
_ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
|
||||
}
|
||||
|
||||
|
@ -1723,6 +1702,8 @@ static ULONG WINAPI ISFPersistFolder_AddRef(
|
|||
{
|
||||
_ICOM_THIS_From_IPersistFolder(IShellFolder, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_AddRef((IShellFolder*)This);
|
||||
}
|
||||
|
||||
|
@ -1735,6 +1716,8 @@ static ULONG WINAPI ISFPersistFolder_Release(
|
|||
{
|
||||
_ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_Release((IShellFolder*)This);
|
||||
}
|
||||
|
||||
|
@ -1747,6 +1730,8 @@ static HRESULT WINAPI ISFPersistFolder_GetClassID(
|
|||
{
|
||||
_ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
if (!lpClassId) return E_POINTER;
|
||||
*lpClassId = *This->pclsid;
|
||||
|
||||
|
@ -1765,6 +1750,8 @@ static HRESULT WINAPI ISFPersistFolder_Initialize(
|
|||
{
|
||||
_ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
if(This->absPidl)
|
||||
{
|
||||
SHFree(This->absPidl);
|
||||
|
@ -1784,3 +1771,137 @@ static ICOM_VTABLE(IPersistFolder) psfvt =
|
|||
ISFPersistFolder_Initialize
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* ISFDropTarget implementation
|
||||
*/
|
||||
static BOOL ISFDropTarget_QueryDrop(
|
||||
IDropTarget *iface,
|
||||
DWORD dwKeyState,
|
||||
LPDWORD pdwEffect)
|
||||
{
|
||||
DWORD dwEffect = *pdwEffect;
|
||||
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
*pdwEffect = DROPEFFECT_NONE;
|
||||
|
||||
if (This->fAcceptFmt)
|
||||
{ /* Does our interpretation of the keystate ... */
|
||||
*pdwEffect = KeyStateToDropEffect(dwKeyState);
|
||||
|
||||
/* ... matches the desired effect ? */
|
||||
if (dwEffect & *pdwEffect)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_QueryInterface(
|
||||
IDropTarget *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
|
||||
}
|
||||
|
||||
static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_AddRef((IShellFolder*)This);
|
||||
}
|
||||
|
||||
static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
return IShellFolder_Release((IShellFolder*)This);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragEnter(
|
||||
IDropTarget *iface,
|
||||
IDataObject *pDataObject,
|
||||
DWORD dwKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
FORMATETC fmt;
|
||||
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)->(DataObject=%p)\n",This,pDataObject);
|
||||
|
||||
InitFormatEtc(fmt, This->cfShellIDList, TYMED_HGLOBAL);
|
||||
|
||||
This->fAcceptFmt = (S_OK == IDataObject_QueryGetData(pDataObject, &fmt)) ? TRUE : FALSE;
|
||||
|
||||
ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragOver(
|
||||
IDropTarget *iface,
|
||||
DWORD dwKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if(!pdwEffect) return E_INVALIDARG;
|
||||
|
||||
ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_DragLeave(
|
||||
IDropTarget *iface)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
This->fAcceptFmt = FALSE;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ISFDropTarget_Drop(
|
||||
IDropTarget *iface,
|
||||
IDataObject* pDataObject,
|
||||
DWORD dwKeyState,
|
||||
POINTL pt,
|
||||
DWORD *pdwEffect)
|
||||
{
|
||||
_ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
|
||||
|
||||
FIXME("(%p) object dropped\n",This);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static struct ICOM_VTABLE(IDropTarget) dtvt =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
ISFDropTarget_QueryInterface,
|
||||
ISFDropTarget_AddRef,
|
||||
ISFDropTarget_Release,
|
||||
ISFDropTarget_DragEnter,
|
||||
ISFDropTarget_DragOver,
|
||||
ISFDropTarget_DragLeave,
|
||||
ISFDropTarget_Drop
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue