239 lines
5.8 KiB
C++
239 lines
5.8 KiB
C++
// 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;
|
|
}
|