You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			327 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			327 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
| // XTPFlowGraphNode.cpp : implementation of the CXTPFlowGraphNode class.
 | |
| //
 | |
| // This file is a part of the XTREME TOOLKIT PRO MFC class library.
 | |
| // (c)1998-2012 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 "Common/XTPPropExchange.h"
 | |
| #include "Common/XTPMarkupRender.h"
 | |
| 
 | |
| #include "XTPFlowGraphElement.h"
 | |
| #include "XTPFlowGraphNode.h"
 | |
| #include "XTPFlowGraphPage.h"
 | |
| #include "XTPFlowGraphControl.h"
 | |
| #include "XTPFlowGraphPaintManager.h"
 | |
| #include "XTPFlowGraphConnectionPoint.h"
 | |
| #include "XTPFlowGraphConnectionPoints.h"
 | |
| #include "XTPFlowGraphConnection.h"
 | |
| #include "XTPFlowGraphConnections.h"
 | |
| #include "XTPFlowGraphSelectedElements.h"
 | |
| #include "XTPFlowGraphNodes.h"
 | |
| #include "XTPFlowGraphNodeGroup.h"
 | |
| #include "XTPFlowGraphUndoManager.h"
 | |
| #include "XTPFlowGraphMessages.h"
 | |
| #include "XTPFlowGraphImage.h"
 | |
| 
 | |
| IMPLEMENT_SERIAL(CXTPFlowGraphNode, CXTPFlowGraphElement, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
 | |
| 
 | |
| 
 | |
| CXTPFlowGraphNode::CXTPFlowGraphNode()
 | |
| {
 | |
| 	m_pPage = NULL;
 | |
| 	m_ptLocation = CPoint(0, 0);
 | |
| 
 | |
| 	m_szUserSize = CSize(0, 0);
 | |
| 	m_szActualSize = CSize(0, 0);
 | |
| 
 | |
| 	m_clrNode = COLORREF(-1);
 | |
| 	m_nStyle = -1;
 | |
| 
 | |
| 	m_dwTag = 0;
 | |
| 	m_nId = 0;
 | |
| 	m_hWnd = NULL;
 | |
| 	m_szWindow = CSize(0, 0);
 | |
| 
 | |
| 	m_rcCaption.SetRectEmpty();
 | |
| 
 | |
| 	m_rcWindow.SetRectEmpty();
 | |
| 
 | |
| 	m_pGroup = NULL;
 | |
| 	m_nGroupId = NULL;
 | |
| 
 | |
| 	m_nArrangeIndex = -1;
 | |
| 	m_nArrangeLevel = -1;
 | |
| 	m_nArrangeComponent = -1;
 | |
| 
 | |
| 	m_nImageIndex = -1;
 | |
| 
 | |
| 	m_bLocked = FALSE;
 | |
| 
 | |
| 	m_pConnectionPoints = new CXTPFlowGraphConnectionPoints(this);
 | |
| 
 | |
| 	m_pNextVisibleNode = NULL;
 | |
| 
 | |
| 	m_pMarkupUIElement = NULL;
 | |
| 
 | |
| }
 | |
| 
 | |
| CXTPFlowGraphNode::~CXTPFlowGraphNode()
 | |
| {
 | |
| 	if (m_pConnectionPoints)
 | |
| 	{
 | |
| 		m_pConnectionPoints->RemoveAll();
 | |
| 
 | |
| 		m_pConnectionPoints->InternalRelease();
 | |
| 		m_pConnectionPoints = NULL;
 | |
| 	}
 | |
| 
 | |
| 	XTPMarkupReleaseElement(m_pMarkupUIElement);
 | |
| }
 | |
| 
 | |
| CXTPFlowGraphControl* CXTPFlowGraphNode::GetControl() const
 | |
| {
 | |
| 	if (!m_pPage)
 | |
| 		return NULL;
 | |
| 
 | |
| 	return m_pPage->GetControl();
 | |
| }
 | |
| 
 | |
| 
 | |
| void CXTPFlowGraphNode::RecalLayout(CXTPFlowGraphDrawContext* pDC)
 | |
| {
 | |
| 	CXTPFlowGraphPaintManager* pPaintManager = GetControl()->GetPaintManager();
 | |
| 
 | |
| 	pPaintManager->RecalcNodeLayout(pDC, this);
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::UpdateWindowPosition()
 | |
| {
 | |
| 	if (!m_hWnd)
 | |
| 		return;
 | |
| 
 | |
| 	CRect rc(m_rcWindow);
 | |
| 	rc.OffsetRect(m_ptLocation);
 | |
| 	rc = m_pPage->PageToScreen(rc);
 | |
| 
 | |
| 	::SetWindowPos(m_hWnd, 0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER | SWP_NOACTIVATE);
 | |
| }
 | |
| 
 | |
| 
 | |
| void CXTPFlowGraphNode::Draw(CXTPFlowGraphDrawContext* pDC)
 | |
| {
 | |
| 	CXTPFlowGraphPaintManager* pPaintManager = GetControl()->GetPaintManager();
 | |
| 
 | |
| 	pPaintManager->DrawNode(pDC, this);
 | |
| 
 | |
| 	UpdateWindowPosition();
 | |
| }
 | |
| 
 | |
| CRect CXTPFlowGraphNode::GetScreenRect() const
 | |
| {
 | |
| 	CRect rc(m_ptLocation, GetSize());
 | |
| 
 | |
| 	return m_pPage->PageToScreen(rc);
 | |
| }
 | |
| 
 | |
| CXTPFlowGraphImage* CXTPFlowGraphNode::GetImage() const
 | |
| {
 | |
| 	CXTPFlowGraphControl* pControl = GetControl();
 | |
| 	if (!pControl)
 | |
| 		return NULL;
 | |
| 
 | |
| 	return pControl->GetImages()->GetAt(m_nImageIndex);
 | |
| }
 | |
| 
 | |
| 
 | |
| void CXTPFlowGraphNode::DoPropExchange(CXTPPropExchange* pPX)
 | |
| {
 | |
| 	PX_String(pPX, _T("Caption"), m_strCaption, _T(""));
 | |
| 	PX_String(pPX, _T("Tooltip"), m_strTooltip, _T(""));
 | |
| 	PX_Point(pPX, _T("Location"), m_ptLocation, CPoint(0, 0));
 | |
| 	PX_DWord(pPX, _T("Color"), (DWORD)m_clrNode, (COLORREF)-1);
 | |
| 	PX_Int(pPX, _T("Style"), m_nStyle, (int)-1);
 | |
| 	PX_Int(pPX, _T("ImageIndex"), m_nImageIndex, (int)-1);
 | |
| 	PX_Size(pPX, _T("UserSize"), m_szUserSize, CSize(0, 0));
 | |
| 	PX_Bool(pPX, _T("Locked"), m_bLocked, FALSE);
 | |
| 
 | |
| 	DWORD dwTag = (DWORD)m_dwTag;
 | |
| 	PX_DWord(pPX, _T("Tag"), (DWORD)dwTag, 0);
 | |
| 	if (pPX->IsLoading())
 | |
| 		m_dwTag = dwTag;
 | |
| 
 | |
| 	PX_Int(pPX, _T("Id"), m_nId, 0);
 | |
| 
 | |
| 	if (pPX->IsLoading())
 | |
| 	{
 | |
| 		PX_Int(pPX, _T("GroupId"), m_nGroupId, 0);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		m_nGroupId = m_pGroup ? (int)(INT_PTR)m_pGroup : 0;
 | |
| 		PX_Int(pPX, _T("GroupId"), m_nGroupId, 0);
 | |
| 	}
 | |
| 
 | |
| 	m_pConnectionPoints->DoPropExchange(pPX);
 | |
| 
 | |
| 	if (pPX->IsLoading())
 | |
| 	{
 | |
| 		CXTPFlowGraphControl* pControl = GetControl();
 | |
| 		if (pControl)
 | |
| 		{
 | |
| 			m_pMarkupUIElement = XTPMarkupParseText(pControl->GetMarkupContext(), m_strCaption);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| CXTPFlowGraphConnectionPoint* CXTPFlowGraphNode::HitTestConnectionPoint(CPoint point)
 | |
| {
 | |
| 	point = m_pPage->ScreenToPage(point);
 | |
| 	point.Offset(-m_ptLocation);
 | |
| 
 | |
| 	for (int i = 0; i < m_pConnectionPoints->GetCount(); i++)
 | |
| 	{
 | |
| 		CXTPFlowGraphConnectionPoint* pPoint = m_pConnectionPoints->GetAt(i);
 | |
| 
 | |
| 		if (pPoint->GetRect().PtInRect(point))
 | |
| 			return pPoint;
 | |
| 	}
 | |
| 
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::Remove()
 | |
| {
 | |
| 	if (!m_pPage)
 | |
| 		return;
 | |
| 
 | |
| 	m_pPage->GetNodes()->Remove(this);
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::OnRemoved()
 | |
| {
 | |
| 	m_pConnectionPoints->RemoveAll();
 | |
| 
 | |
| 	if (m_pGroup)
 | |
| 	{
 | |
| 		m_pGroup->RemoveNode(this);
 | |
| 	}
 | |
| 
 | |
| 	CXTPFlowGraphElement::OnRemoved();
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::SetLocation(CPoint ptLocation)
 | |
| {
 | |
| 	CXTPFlowGraphControl* pControl = GetControl();
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		pControl->GetUndoManager()->AddUndoCommand(new CXTPFlowGraphUndoSetNodePositionCommand(this, m_ptLocation));
 | |
| 	}
 | |
| 
 | |
| 	m_ptLocation = ptLocation;
 | |
| 	OnGraphChanged();
 | |
| 
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		XTP_NM_FLOWGRAPH_NODECHANGED nc;
 | |
| 		nc.pNode = this;
 | |
| 
 | |
| 		pControl->SendNotifyMessage(XTP_FGN_NODELOCATIONCHANGED, &nc.hdr);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::SetSize(CSize sz)
 | |
| {
 | |
| 	CXTPFlowGraphControl* pControl = GetControl();
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		pControl->GetUndoManager()->AddUndoCommand(new CXTPFlowGraphUndoSetNodeSizeCommand(this, m_szUserSize));
 | |
| 	}
 | |
| 
 | |
| 	m_szUserSize = sz;
 | |
| 	OnGraphChanged();
 | |
| 
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		XTP_NM_FLOWGRAPH_NODECHANGED nc;
 | |
| 		nc.pNode = this;
 | |
| 
 | |
| 		pControl->SendNotifyMessage(XTP_FGN_NODELOCATIONCHANGED, &nc.hdr);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| CSize CXTPFlowGraphNode::GetSize() const
 | |
| {
 | |
| 	return m_szActualSize;
 | |
| }
 | |
| 
 | |
| CSize CXTPFlowGraphNode::GetUserSize() const
 | |
| {
 | |
| 	return m_szUserSize;
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::SetCaption(LPCTSTR lpszCaption)
 | |
| {
 | |
| 	CXTPFlowGraphControl* pControl = GetControl();
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		pControl->GetUndoManager()->AddUndoCommand(new CXTPFlowGraphUndoSetNodeCaptionCommand(this, m_strCaption));
 | |
| 	}
 | |
| 
 | |
| 	m_strCaption = lpszCaption;
 | |
| 
 | |
| 	XTPMarkupReleaseElement(m_pMarkupUIElement);
 | |
| 
 | |
| 	if (pControl)
 | |
| 	{
 | |
| 		m_pMarkupUIElement = XTPMarkupParseText(pControl->GetMarkupContext(), lpszCaption);
 | |
| 	}
 | |
| 
 | |
| 	OnGraphChanged();
 | |
| }
 | |
| 
 | |
| void CXTPFlowGraphNode::DrawWindowContent(CXTPFlowGraphDrawContext* /*pDC*/)
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| void CXTPFlowGraphNode::Select()
 | |
| {
 | |
| 	CXTPFlowGraphControl* pControl = GetControl();
 | |
| 	if (!pControl)
 | |
| 		return;
 | |
| 
 | |
| 	CXTPFlowGraphSelectedElements* pSelectedElements = m_pPage->GetSelection();
 | |
| 
 | |
| 	if (GetGroup() != NULL)
 | |
| 	{
 | |
| 		for (int j = 0; j < GetGroup()->GetCount(); j++)
 | |
| 		{
 | |
| 			CXTPFlowGraphNode* pNode = GetGroup()->GetAt(j);
 | |
| 			pSelectedElements->AddSelection(pNode);
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		pSelectedElements->AddSelection(this);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 |