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.
		
		
		
		
		
			
		
			
	
	
		
			190 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
| 
											2 years ago
										 | // XTPFlowGraphConnections.cpp : implementation of the CXTPFlowGraphConnections 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 "XTPFlowGraphElement.h"
 | ||
|  | #include "XTPFlowGraphPage.h"
 | ||
|  | #include "XTPFlowGraphConnection.h"
 | ||
|  | #include "XTPFlowGraphConnections.h"
 | ||
|  | #include "XTPFlowGraphControl.h"
 | ||
|  | #include "XTPFlowGraphUndoManager.h"
 | ||
|  | #include "XTPFlowGraphMessages.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | CXTPFlowGraphConnections::CXTPFlowGraphConnections(CXTPFlowGraphPage* pPage) | ||
|  | { | ||
|  | 	m_pPage = pPage; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | CXTPFlowGraphConnections::~CXTPFlowGraphConnections() | ||
|  | { | ||
|  | 	RemoveAll(); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void CXTPFlowGraphConnections::RemoveAll() | ||
|  | { | ||
|  | 	if (m_arrConnections.GetSize() == 0) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	for (int i = 0; i < m_arrConnections.GetSize(); i++) | ||
|  | 	{ | ||
|  | 		CXTPFlowGraphConnection* pConnection = m_arrConnections[i]; | ||
|  | 
 | ||
|  | 		pConnection->OnRemoved(); | ||
|  | 
 | ||
|  | 		pConnection->m_pPage = NULL; | ||
|  | 		pConnection->m_nConnectionIndex = -1; | ||
|  | 
 | ||
|  | 		pConnection->InternalRelease(); | ||
|  | 	} | ||
|  | 	m_arrConnections.RemoveAll(); | ||
|  | 
 | ||
|  | 	m_pPage->OnGraphChanged(); | ||
|  | } | ||
|  | 
 | ||
|  | CXTPFlowGraphConnection* CXTPFlowGraphConnections::AddConnection(CXTPFlowGraphConnection* pConnection) | ||
|  | { | ||
|  | 	ASSERT(pConnection->m_nConnectionIndex == -1); | ||
|  | 	if (pConnection->m_nConnectionIndex != -1) | ||
|  | 		return pConnection; | ||
|  | 
 | ||
|  | 	CXTPFlowGraphControl* pControl = m_pPage->GetControl(); | ||
|  | 	if (!pControl) | ||
|  | 		return pConnection; | ||
|  | 
 | ||
|  | 	XTP_NM_FLOWGRAPH_CONNECTIONCHANGED cc; | ||
|  | 	cc.pConnection = pConnection; | ||
|  | 	cc.nAction = 0; | ||
|  | 
 | ||
|  | 	if (pControl->SendNotifyMessage(XTP_FGN_CONNECTIONCHANGED, &cc.hdr) == -1) | ||
|  | 		return pConnection; | ||
|  | 
 | ||
|  | 	pConnection->m_nConnectionIndex = (int)m_arrConnections.Add(pConnection); | ||
|  | 	pConnection->m_pPage = m_pPage; | ||
|  | 
 | ||
|  | 	pControl->GetUndoManager()->AddUndoCommand(new CXTPFlowGraphUndoAddConnectionCommand(pConnection)); | ||
|  | 
 | ||
|  | 	m_pPage->OnGraphChanged(); | ||
|  | 
 | ||
|  | 	return pConnection; | ||
|  | } | ||
|  | 
 | ||
|  | void CXTPFlowGraphConnections::Remove(CXTPFlowGraphConnection* pConnection) | ||
|  | { | ||
|  | 	if (pConnection->m_pPage != m_pPage) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	ASSERT(pConnection->m_nConnectionIndex != -1); | ||
|  | 	ASSERT(m_arrConnections[pConnection->m_nConnectionIndex] == pConnection); | ||
|  | 
 | ||
|  | 	RemoveAt(pConnection->m_nConnectionIndex); | ||
|  | } | ||
|  | 
 | ||
|  | void CXTPFlowGraphConnections::RemoveAt(int nIndex) | ||
|  | { | ||
|  | 	CXTPFlowGraphConnection* pConnection = GetAt(nIndex); | ||
|  | 	if (!pConnection) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	CXTPFlowGraphControl* pControl = m_pPage->GetControl(); | ||
|  | 	if (!pControl) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	XTP_NM_FLOWGRAPH_CONNECTIONCHANGED cc; | ||
|  | 	cc.pConnection = pConnection; | ||
|  | 	cc.nAction = 1; | ||
|  | 
 | ||
|  | 	if (pControl->SendNotifyMessage(XTP_FGN_CONNECTIONCHANGED, &cc.hdr) == -1) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	pControl->GetUndoManager()->AddUndoCommand(new CXTPFlowGraphUndoDeleteConnectionCommand(pConnection)); | ||
|  | 
 | ||
|  | 	int nCount = (int)m_arrConnections.GetSize(); | ||
|  | 
 | ||
|  | 	if (nIndex != nCount - 1) | ||
|  | 	{ | ||
|  | 		m_arrConnections[nIndex] = m_arrConnections[nCount - 1]; | ||
|  | 		m_arrConnections[nIndex]->m_nConnectionIndex = nIndex; | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	m_arrConnections.SetSize(nCount - 1); | ||
|  | 
 | ||
|  | 	pConnection->OnRemoved(); | ||
|  | 
 | ||
|  | 	pConnection->m_nConnectionIndex = -1; | ||
|  | 	pConnection->m_pPage = NULL; | ||
|  | 	pConnection->InternalRelease(); | ||
|  | 
 | ||
|  | 	m_pPage->OnGraphChanged(); | ||
|  | } | ||
|  | 
 | ||
|  | void CXTPFlowGraphConnections::DoPropExchange(CXTPPropExchange* pPX) | ||
|  | { | ||
|  | 	CXTPPropExchangeEnumeratorPtr pEnumRecords(pPX->GetEnumerator(_T("Connection"))); | ||
|  | 
 | ||
|  | 	if (pPX->IsStoring()) | ||
|  | 	{ | ||
|  | 		int nCount = (int)GetCount(); | ||
|  | 		POSITION pos = pEnumRecords->GetPosition((DWORD)nCount); | ||
|  | 
 | ||
|  | 		for (int i = 0; i < nCount; i++) | ||
|  | 		{ | ||
|  | 			CXTPFlowGraphConnection* pConnection = GetAt(i); | ||
|  | 			ASSERT(pConnection); | ||
|  | 
 | ||
|  | 			CXTPPropExchangeSection sec(pEnumRecords->GetNext(pos)); | ||
|  | 			PX_Object(&sec, pConnection, RUNTIME_CLASS(CXTPFlowGraphConnection)); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 		RemoveAll(); | ||
|  | 
 | ||
|  | 		POSITION pos = pEnumRecords->GetPosition(); | ||
|  | 
 | ||
|  | 		while (pos) | ||
|  | 		{ | ||
|  | 			CXTPFlowGraphConnection* pConnection = NULL; | ||
|  | 
 | ||
|  | 			CXTPPropExchangeSection sec(pEnumRecords->GetNext(pos)); | ||
|  | 			PX_Object(&sec, pConnection, RUNTIME_CLASS(CXTPFlowGraphConnection)); | ||
|  | 
 | ||
|  | 			if (!pConnection) | ||
|  | 				AfxThrowArchiveException(CArchiveException::badClass); | ||
|  | 
 | ||
|  | 			pConnection->m_pPage = m_pPage; | ||
|  | 			pConnection->m_nConnectionIndex = (int)m_arrConnections.Add(pConnection); | ||
|  | 
 | ||
|  | 			pConnection->RestoreConnection(); | ||
|  | 
 | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |