Public Member Functions | Protected Attributes

IDropTargetImpl Class Reference

implementation of IDropTarget interface More...

#include <dragdropimpl.h>

Inheritance diagram for IDropTargetImpl:
Inheritance graph
[legend]
Collaboration diagram for IDropTargetImpl:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 IDropTargetImpl (HWND m_hTargetWnd)
virtual ~IDropTargetImpl ()
void AddSuportedFormat (FORMATETC &ftetc)
virtual bool OnDrop (FORMATETC *pFmtEtc, STGMEDIUM &medium, DWORD *pdwEffect)=0
virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
virtual ULONG STDMETHODCALLTYPE AddRef ()
virtual ULONG STDMETHODCALLTYPE Release ()
bool QueryDrop (DWORD grfKeyState, LPDWORD pdwEffect)
virtual HRESULT STDMETHODCALLTYPE DragEnter (IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)
virtual HRESULT STDMETHODCALLTYPE DragOver (DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)
virtual HRESULT STDMETHODCALLTYPE DragLeave ()
virtual HRESULT STDMETHODCALLTYPE Drop (IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect)

Protected Attributes

HWND m_hTargetWnd

Detailed Description

implementation of IDropTarget interface

Definition at line 168 of file dragdropimpl.h.


Constructor & Destructor Documentation

IDropTargetImpl::IDropTargetImpl ( HWND  m_hTargetWnd )

Definition at line 331 of file dragdropimpl.cpp.

References m_hTargetWnd.

 :  m_cRefCount(0),
    m_bAllowDrop(false),
    m_pDropTargetHelper(NULL),
    m_pSupportedFrmt(NULL),
    m_hTargetWnd(hTargetWnd)
{
    assert(m_hTargetWnd != NULL);

    if (FAILED(CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER,
                     IID_IDropTargetHelper,(LPVOID*)&m_pDropTargetHelper)))
        m_pDropTargetHelper = NULL;
}
IDropTargetImpl::~IDropTargetImpl (  ) [virtual]

Definition at line 345 of file dragdropimpl.cpp.

{
    if (m_pDropTargetHelper != NULL)
    {
        m_pDropTargetHelper->Release();
        m_pDropTargetHelper = NULL;
    }
}

Member Function Documentation

virtual ULONG STDMETHODCALLTYPE IDropTargetImpl::AddRef (  ) [inline, virtual]

Definition at line 192 of file dragdropimpl.h.

Referenced by ShellBrowser::InitDragDrop(), and DesktopShellView::InitDragDrop().

{return ++m_cRefCount;}

Here is the caller graph for this function:

void IDropTargetImpl::AddSuportedFormat ( FORMATETC &  ftetc ) [inline]

Definition at line 184 of file dragdropimpl.h.

Referenced by ShellBrowser::InitDragDrop(), and DesktopShellView::InitDragDrop().

{m_formatetc.push_back(ftetc);}

Here is the caller graph for this function:

HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragEnter ( IDataObject __RPC_FAR *  pDataObj,
DWORD  grfKeyState,
POINTL  pt,
DWORD __RPC_FAR *  pdwEffect 
) [virtual]

Definition at line 424 of file dragdropimpl.cpp.

References m_hTargetWnd, and QueryDrop().

{
    if (pDataObj == NULL)
        return E_INVALIDARG;

    if (m_pDropTargetHelper)
        m_pDropTargetHelper->DragEnter(m_hTargetWnd, pDataObj, (LPPOINT)&pt, *pdwEffect);

    //IEnumFORMATETC* pEnum;
    //pDataObj->EnumFormatEtc(DATADIR_GET,&pEnum);
    //FORMATETC ftm;
    //for()
    //pEnum->Next(1,&ftm,0);
    //pEnum->Release();
    m_pSupportedFrmt = NULL;

    for(FormatArray::iterator it=m_formatetc.begin(); it!=m_formatetc.end(); ++it)
    {
        m_bAllowDrop = (pDataObj->QueryGetData(&*it) == S_OK)? true: false;

        if (m_bAllowDrop)
        {
            m_pSupportedFrmt = &*it;
            break;
        }
    }

    QueryDrop(grfKeyState, pdwEffect);

    return S_OK;
}

Here is the call graph for this function:

HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragLeave ( void   ) [virtual]

Reimplemented in DesktopDropTarget, and TreeDropTarget.

Definition at line 473 of file dragdropimpl.cpp.

Referenced by DesktopDropTarget::DragLeave().

{
    if (m_pDropTargetHelper)
        m_pDropTargetHelper->DragLeave();

    m_bAllowDrop = false;
    m_pSupportedFrmt = NULL;

    return S_OK;
}

Here is the caller graph for this function:

HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragOver ( DWORD  grfKeyState,
POINTL  pt,
DWORD __RPC_FAR *  pdwEffect 
) [virtual]

Reimplemented in DesktopDropTarget, and TreeDropTarget.

Definition at line 460 of file dragdropimpl.cpp.

References QueryDrop().

Referenced by DesktopDropTarget::DragOver().

{
    if (m_pDropTargetHelper)
        m_pDropTargetHelper->DragOver((LPPOINT)&pt, *pdwEffect);

    QueryDrop(grfKeyState, pdwEffect);

    return S_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

HRESULT STDMETHODCALLTYPE IDropTargetImpl::Drop ( IDataObject __RPC_FAR *  pDataObj,
DWORD  grfKeyState,
POINTL  pt,
DWORD __RPC_FAR *  pdwEffect 
) [virtual]

Definition at line 484 of file dragdropimpl.cpp.

References OnDrop(), and QueryDrop().

{
    if (pDataObj == NULL)
        return E_INVALIDARG;

    if (m_pDropTargetHelper)
        m_pDropTargetHelper->Drop(pDataObj, (LPPOINT)&pt, *pdwEffect);

    if (QueryDrop(grfKeyState, pdwEffect))
    {
        if (m_bAllowDrop && m_pSupportedFrmt != NULL)
        {
            STGMEDIUM medium;

            if (pDataObj->GetData(m_pSupportedFrmt, &medium) == S_OK)
            {
                if (OnDrop(m_pSupportedFrmt, medium, pdwEffect)) //does derive class wants us to free medium?
                    ReleaseStgMedium(&medium);
            }
        }
    }

    m_bAllowDrop = false;
    *pdwEffect = DROPEFFECT_NONE;
    m_pSupportedFrmt = NULL;

    return S_OK;
}

Here is the call graph for this function:

virtual bool IDropTargetImpl::OnDrop ( FORMATETC *  pFmtEtc,
STGMEDIUM &  medium,
DWORD *  pdwEffect 
) [pure virtual]

Implemented in DesktopDropTarget, and TreeDropTarget.

Referenced by Drop().

Here is the caller graph for this function:

bool IDropTargetImpl::QueryDrop ( DWORD  grfKeyState,
LPDWORD  pdwEffect 
)

Definition at line 382 of file dragdropimpl.cpp.

Referenced by DragEnter(), DragOver(), and Drop().

{
    DWORD dwOKEffects = *pdwEffect;

    if (!m_bAllowDrop)
    {
       *pdwEffect = DROPEFFECT_NONE;
       return false;
    }

    //CTRL+SHIFT  -- DROPEFFECT_LINK
    //CTRL        -- DROPEFFECT_COPY
    //SHIFT       -- DROPEFFECT_MOVE
    //no modifier -- DROPEFFECT_MOVE or whatever is allowed by src
    *pdwEffect = (grfKeyState & MK_CONTROL) ?
                 ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY ):
                 ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_MOVE : DROPEFFECT_NONE );
    if (*pdwEffect == 0)
    {
       // No modifier keys used by user while dragging.
       if (DROPEFFECT_COPY & dwOKEffects)
          *pdwEffect = DROPEFFECT_COPY;
       else if (DROPEFFECT_MOVE & dwOKEffects)
          *pdwEffect = DROPEFFECT_MOVE;
       else if (DROPEFFECT_LINK & dwOKEffects)
          *pdwEffect = DROPEFFECT_LINK;
       else
       {
          *pdwEffect = DROPEFFECT_NONE;
       }
    }
    else
    {
       // Check if the drag source application allows the drop effect desired by user.
       // The drag source specifies this in DoDragDrop
       if (!(*pdwEffect & dwOKEffects))
          *pdwEffect = DROPEFFECT_NONE;
    }

    return (DROPEFFECT_NONE == *pdwEffect)?false:true;
}

Here is the caller graph for this function:

HRESULT STDMETHODCALLTYPE IDropTargetImpl::QueryInterface ( REFIID  riid,
void __RPC_FAR *__RPC_FAR *  ppvObject 
) [virtual]

Definition at line 354 of file dragdropimpl.cpp.

{
    *ppvObject = NULL;
    if (IID_IUnknown==riid || IID_IDropTarget==riid)
        *ppvObject=this;

    if (*ppvObject != NULL)
    {
        ((LPUNKNOWN)*ppvObject)->AddRef();
        return S_OK;
    }

    return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE IDropTargetImpl::Release (  ) [virtual]

Definition at line 370 of file dragdropimpl.cpp.

Referenced by ShellBrowser::InitDragDrop(), DesktopShellView::InitDragDrop(), and ShellBrowser::~ShellBrowser().

{
   long nTemp = --m_cRefCount;

   assert(nTemp >= 0);

   if (nTemp == 0)
      delete this;

   return nTemp;
}

Here is the caller graph for this function:


Member Data Documentation


The documentation for this class was generated from the following files:

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage