BOOL CXTPCoreTreeControl::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint /*point*/)
{
	if (!m_pDragOverItem)
		return FALSE;

	CXTPCoreTreeItem* pDragOverItem = m_pDragOverItem;
	m_pDragOverItem = NULL;

	RedrawControl();

	if (dropEffect != DROPEFFECT_COPY && dropEffect != DROPEFFECT_MOVE)
		return FALSE;

	if (!pDataObject || !pDataObject->IsDataAvailable(GetClipboardFormat()))
		return FALSE;


	CXTPCoreTreeItem* pItemDrop = CXTPCoreTreeItem::CreateFromOleData(pDataObject);
	if (!pItemDrop)
		return FALSE;


	if (m_nDropPosition == xtpCoreTreeDropAfter)
	{
		pDragOverItem->GetParentItems()->AddItemAfter(pItemDrop, pDragOverItem);
	}
	else if (m_nDropPosition == xtpCoreTreeDropBefore)
	{
		pDragOverItem->GetParentItems()->AddItemBefore(pItemDrop, pDragOverItem);
	}
	else if (m_nDropPosition == xtpCoreTreeDropChild)
	{
		pDragOverItem->GetChildren()->AddItemBefore(pItemDrop, NULL);
		pDragOverItem->SetExpanded();
	}
	else
	{
		ASSERT(FALSE);
	}

	SetFocusedItem(pItemDrop);

	return TRUE;
}
HRESULT DataObj_CopyHIDA(IDataObject *pdtobj, CIDA **ppida)
{
    *ppida = NULL;

    FORMATETC fmte = {GetClipboardFormat(&g_cfHIDA, CFSTR_SHELLIDLIST), NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    STGMEDIUM medium;
    HRESULT hr = pdtobj->GetData(&fmte, &medium);
    if (SUCCEEDED(hr))
    {
        void const *pSrc = GlobalLock(medium.hGlobal);
        size_t const cbSize = GlobalSize(medium.hGlobal);
        *ppida = (CIDA *)GlobalAlloc(GPTR, cbSize);
        hr = *ppida ? S_OK : E_OUTOFMEMORY;
        if (SUCCEEDED(hr))
        {
            memcpy(*ppida, pSrc, cbSize);
        }
        ReleaseStgMedium(&medium);
    }
    return hr;
}