DragonNest/Third/XTToolkitPro/Samples/TaskPanel/ToolBox/PageDragAndDropClient.cpp

240 lines
5.8 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// PageDragAndDropClient.cpp : implementation file
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "toolbox.h"
#include "PageDragAndDropClient.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPageDragAndDropClient
CPageDragAndDropClient::CPageDragAndDropClient()
{
m_imageManager.SetIcons(IDB_TRASH, 0, 0, CSize(48, 48));
m_bDragging = FALSE;
}
CPageDragAndDropClient::~CPageDragAndDropClient()
{
for (int i = 0; i < m_arrItems.GetSize(); i++)
{
m_arrItems[i]->InternalRelease();
}
}
BEGIN_MESSAGE_MAP(CPageDragAndDropClient, CStatic)
//{{AFX_MSG_MAP(CPageDragAndDropClient)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPageDragAndDropClient message handlers
BOOL CPageDragAndDropClient::OnEraseBkgnd(CDC* )
{
return TRUE;
}
CXTPTaskPanel* CPageDragAndDropClient::GetTaskPanel()
{
CWnd* pSplitterWnd = GetParentFrame()->GetDlgItem(AFX_IDW_PANE_FIRST);
ASSERT_KINDOF(CSplitterWnd, pSplitterWnd);
return (CXTPTaskPanel*)pSplitterWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
}
void CPageDragAndDropClient::OnPaint()
{
CPaintDC dcPaint(this); // device context for painting
CXTPClientRect rc(this);
CXTPBufferDC dc(dcPaint, rc);
dc.FillSolidRect(rc, GetSysColor(COLOR_3DFACE));
for (int i = 0; i < m_arrItems.GetSize(); i++)
{
CXTPTaskPanelGroupItem* pItem = m_arrItems[i];
CRect rcItem = pItem->GetItemRect();
GetTaskPanel()->GetPaintManager()->DrawGroupItemFrame(&dc, pItem, rcItem);
CXTPImageManagerIcon* pImage = GetTaskPanel()->GetImageManager()->GetImage(pItem->GetIconIndex());
if (pImage)
{
CPoint ptIcon((rcItem.right + rcItem.left - 16) / 2, (rcItem.top + rcItem.bottom - 16) / 2);
pImage->Draw(&dc, ptIcon, pImage->GetIcon());
}
}
CRect rcTrash(rc.right - 72, rc.bottom - 72, rc.right - 12, rc.bottom - 12);
dc.FillSolidRect(rcTrash, GetSysColor(COLOR_3DFACE));
dc.Draw3dRect(rcTrash, GetSysColor(COLOR_3DHIGHLIGHT), GetSysColor(COLOR_3DSHADOW));
CXTPImageManagerIcon* pImage = m_imageManager.GetImage(0, 48);
if (pImage)
{
CPoint ptImage((rcTrash.right + rcTrash.left - 48) / 2, (rcTrash.top + rcTrash.bottom - 48) / 2);
pImage->Draw(&dc, ptImage, pImage->GetIcon());
}
}
void CPageDragAndDropClient::PreSubclassWindow()
{
Register(this);
EnableToolTips();
CStatic::PreSubclassWindow();
}
BOOL CPageDragAndDropClient::PtInTrash(CPoint point)
{
CXTPClientRect rc(this);
CRect rcTrash(rc.right - 72, rc.bottom - 72, rc.right - 12, rc.bottom - 12);
return rcTrash.PtInRect(point);
}
DROPEFFECT CPageDragAndDropClient::OnDragOver(CWnd* /*pWnd*/, COleDataObject* pDataObject,
DWORD dwKeyState, CPoint point)
{
if (!pDataObject || !pDataObject->IsDataAvailable(CXTPTaskPanel::GetClipboardFormat()))
return DROPEFFECT_NONE;
if (PtInTrash(point))
return DROPEFFECT_MOVE;
if (!m_bDragging || ((dwKeyState & MK_CONTROL) == MK_CONTROL))
return DROPEFFECT_COPY;
return DROPEFFECT_MOVE;
}
BOOL CPageDragAndDropClient::OnDrop(CWnd* /*pWnd*/, COleDataObject* pDataObject,
DROPEFFECT /*dropEffect*/, CPoint point)
{
if (PtInTrash(point))
return TRUE;
CXTPTaskPanelGroupItem* pItemDrop = (CXTPTaskPanelGroupItem*)CXTPTaskPanelItem::CreateFromOleData(pDataObject);
if (!pItemDrop)
return FALSE;
ASSERT_KINDOF(CXTPTaskPanelGroupItem, pItemDrop);
m_arrItems.Add(pItemDrop);
pItemDrop->SetItemRect(CRect(point.x - 14, point.y - 14, point.x + 14, point.y + 14));
Invalidate(FALSE);
return TRUE;
}
int CPageDragAndDropClient::HitTest(CPoint point) const
{
for (int i = (int)m_arrItems.GetSize() - 1; i >= 0; i--)
{
CXTPTaskPanelGroupItem* pItem = m_arrItems[i];
if (pItem->GetItemRect().PtInRect(point))
return i;
}
return -1;
}
void CPageDragAndDropClient::OnLButtonDown(UINT /*nFlags*/, CPoint point)
{
int nHit = HitTest(point);
CXTPTaskPanelGroupItem* pItem = (nHit >= 0? m_arrItems[nHit]: NULL);
if (!pItem)
return;
COleDataSource ds;
if (!pItem->PrepareDrag(ds))
return;
m_bDragging = TRUE;
DROPEFFECT dropEffect = ds.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE);
m_bDragging = FALSE;
if (dropEffect == DROPEFFECT_MOVE)
{
pItem->InternalRelease();
m_arrItems.RemoveAt(nHit);
}
Invalidate(FALSE);
}
INT_PTR CPageDragAndDropClient::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
// check child windows first by calling CControlBar
INT_PTR nHit = CWnd::OnToolHitTest(point, pTI);
if (nHit != -1)
return nHit;
int nItem = HitTest(point);
CXTPTaskPanelGroupItem* pItem = (nItem >= 0? m_arrItems[nItem]: NULL);
if (pItem)
{
int nHit = pItem->GetID();
CString strTip = pItem->GetCaption();
if (strTip.GetLength() == 0)
return -1;
#if _MSC_VER < 1200 // MFC 5.0
if (pTI != NULL)
#else
if (pTI != NULL)
#endif
{
pTI->hwnd = GetSafeHwnd();
pTI->rect = pItem->GetItemRect();
pTI->uId = nHit;
pTI->lpszText = (LPTSTR) ::calloc(strTip.GetLength() + 1, sizeof(TCHAR));
if( pTI->lpszText != NULL ) STRCPY_S(pTI->lpszText, strTip.GetLength() + 1, (LPCTSTR)strTip);
}
return TRUE;
}
return -1;
}