126 lines
2.9 KiB
C++
126 lines
2.9 KiB
C++
//
|
|
// Routines for implementing drop target capability to menubands.
|
|
//
|
|
|
|
#include "priv.h"
|
|
#include "mbdrop.h"
|
|
#include "iface.h" // for MBIF_
|
|
|
|
#define SUPERCLASS
|
|
|
|
|
|
//=================================================================
|
|
// Implementation of CMenuBandDropTarget
|
|
//=================================================================
|
|
|
|
// Constructor
|
|
CMenuBandDropTarget::CMenuBandDropTarget(HWND hwnd, int idTarget, DWORD dwFlags) :
|
|
_cRef(1), _hwndParent(hwnd), _idTarget(idTarget), _dwFlagsMBIF(dwFlags)
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CMenuBandDropTarget::AddRef()
|
|
{
|
|
_cRef++;
|
|
return _cRef;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CMenuBandDropTarget::Release()
|
|
{
|
|
ASSERT(_cRef > 0);
|
|
_cRef--;
|
|
|
|
if (_cRef > 0)
|
|
return _cRef;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CMenuBandDropTarget::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
HRESULT hres;
|
|
static const QITAB qit[] = {
|
|
QITABENT(CMenuBandDropTarget, IDropTarget),
|
|
{ 0 },
|
|
};
|
|
|
|
hres = QISearch(this, (LPCQITAB)qit, riid, ppvObj);
|
|
|
|
return hres;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: IDropTarget::DragEnter method
|
|
|
|
*/
|
|
STDMETHODIMP CMenuBandDropTarget::DragEnter(IDataObject * pdtobj, DWORD grfKeyState,
|
|
POINTL pt, DWORD * pdwEffect)
|
|
{
|
|
// If this item cascades out, then we want to pop the submenu open
|
|
// after a timer. We don't allow a drop on the cascadable item
|
|
// itself. (We could, but then we'd have to default to a location
|
|
// inside the submenu, and I'm lazy right now.)
|
|
|
|
if (*pdwEffect & (DROPEFFECT_MOVE | DROPEFFECT_COPY))
|
|
{
|
|
if (_dwFlagsMBIF & SMIF_SUBMENU)
|
|
{
|
|
// _idTimer = SetTimer(NULL, 0, 2000,
|
|
}
|
|
|
|
*pdwEffect &= (DROPEFFECT_MOVE | DROPEFFECT_COPY);
|
|
}
|
|
else
|
|
*pdwEffect = DROPEFFECT_NONE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: IDropTarget::DragOver method
|
|
|
|
*/
|
|
STDMETHODIMP CMenuBandDropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
|
|
{
|
|
*pdwEffect &= (DROPEFFECT_MOVE | DROPEFFECT_COPY);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: IDropTarget::DragLeave method
|
|
|
|
*/
|
|
STDMETHODIMP CMenuBandDropTarget::DragLeave(void)
|
|
{
|
|
// Kill timer, release object
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: IDropTarget::Drop method
|
|
|
|
*/
|
|
STDMETHODIMP CMenuBandDropTarget::Drop(IDataObject * pdtobj, DWORD grfKeyState, POINTL pt,
|
|
DWORD * pdwEffect)
|
|
{
|
|
if (*pdwEffect & (DROPEFFECT_MOVE | DROPEFFECT_COPY))
|
|
{
|
|
if (_dwFlagsMBIF & SMIF_SUBMENU)
|
|
{
|
|
// We don't allow drops on submenu items. Must go into
|
|
// cascaded menu.
|
|
*pdwEffect = DROPEFFECT_NONE;
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|