//------------------------------------------------------------------------------
// $Workfile: DropTarget.cpp $
// $Header: /SbjDev/SbjCore/DropTarget.cpp 2 11/12/08 2:22p Steve $
//
// Copyright � 2008 SbjCat
// All rights reserved.
//
//
// *** Authors ***
// Steve Johnson
//
// $Revision: 2 $
//
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "DropTarget.h"
#include "DataHandler.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
namespace SbjCore
{
namespace DragNDrop
{
struct DropTargetImpl
{
typedef std::map<CLIPFORMAT, DataHandler*> t_mapCFToDataHandler;
t_mapCFToDataHandler theDataHandlers;
DataHandler* pTheDataHandler;
IDropTargetHelper* pDropHelper;
DropTargetImpl() :
pTheDataHandler(NULL),
pDropHelper(NULL)
{
CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, (void**) &pDropHelper);
}
virtual ~DropTargetImpl()
{
try
{
if (pDropHelper != NULL)
{
pDropHelper->Release();
}
}
catch (...)
{
ASSERT(FALSE);
}
}
bool GetDataHandler(COleDataObject* pDataObject)
{
bool bRslt = false;
pTheDataHandler = NULL;
t_mapCFToDataHandler::iterator iter;
for (iter = theDataHandlers.begin(); iter != theDataHandlers.end(); iter++)
{
CLIPFORMAT nCF = iter->first;
if (pDataObject->GetGlobalData(nCF) != NULL)
{
pTheDataHandler = iter->second;
bRslt = true;
break;
}
}
return bRslt;
}
};
DropTarget::DropTarget() :
m_pImpl(new DropTargetImpl)
{
}
DropTarget::~DropTarget()
{
try
{
delete m_pImpl;
}
catch (...)
{
ASSERT(FALSE);
}
}
DROPEFFECT DropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
dwKeyState;
DROPEFFECT dwEffect = DROPEFFECT_NONE;
if (m_pImpl->GetDataHandler(pDataObject))
{
dwEffect = m_pImpl->pTheDataHandler->GetDropEffect(pDataObject, dwKeyState, point);
}
if (m_pImpl->pDropHelper)
{
IDataObject* piDataObj = pDataObject->GetIDataObject(FALSE);
pWnd->ClientToScreen(&point);
m_pImpl->pDropHelper->DragEnter(pWnd->GetSafeHwnd(), piDataObj, &point, dwEffect);
}
return dwEffect;
}
DROPEFFECT DropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
dwKeyState;
pDataObject;
DROPEFFECT dwEffect = DROPEFFECT_NONE;
if (m_pImpl->pTheDataHandler != NULL)
{
dwEffect = m_pImpl->pTheDataHandler->GetDropEffect(pDataObject, dwKeyState, point);;
}
if (m_pImpl->pDropHelper)
{
pWnd->ClientToScreen(&point);
m_pImpl->pDropHelper->DragOver(&point, dwEffect);
}
return dwEffect;
}
BOOL DropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
DROPEFFECT dropEffect, CPoint point)
{
pWnd;
bool bRslt = m_pImpl->pTheDataHandler->Handle(pDataObject, dropEffect, point);
m_pImpl->pTheDataHandler = NULL; // done with it
if (m_pImpl->pDropHelper)
{
IDataObject* piDataObj = pDataObject->GetIDataObject(FALSE);
pWnd->ClientToScreen(&point);
m_pImpl->pDropHelper->Drop(piDataObj, &point, dropEffect);
}
return bRslt;
}
void DropTarget::OnDragLeave(CWnd* pWnd)
{
pWnd;
if (m_pImpl->pDropHelper)
{
m_pImpl->pDropHelper->DragLeave();
}
}
void DropTarget::AddHandler(CLIPFORMAT nCF, DataHandler* pHandler)
{
m_pImpl->theDataHandlers[nCF] = pHandler;
}
}
}
//*** Modification History ***
// $Log: /SbjDev/SbjCore/DropTarget.cpp $
//
// 2 11/12/08 2:22p Steve
// Finished Generalization of Model v2.0.1