//
//  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;
}