// XTPFlowGraphConnectionPoint.cpp : implementation of the CXTPFlowGraphConnectionPoint 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 "XTPFlowGraphControl.h"
#include "XTPFlowGraphPaintManager.h"
#include "XTPFlowGraphConnectionPoint.h"
#include "XTPFlowGraphImage.h"
#include "XTPFlowGraphUndoManager.h"
#include "XTPFlowGraphConnection.h"
#include "XTPFlowGraphConnectionPoints.h"

IMPLEMENT_SERIAL(CXTPFlowGraphConnectionPoint, CCmdTarget, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)


CXTPFlowGraphConnectionPoint::CXTPFlowGraphConnectionPoint()
{
	m_nStyle = -1;
	m_clrPoint = (COLORREF)-1;

	m_nId = (int)(INT_PTR)this;

	m_nType = xtpFlowGraphPointInput;

	m_bLocked = FALSE;

	m_nImageIndex = -1;

	m_pNode = NULL;

	m_nMaxConnections = -1;

	m_pMarkupUIElement = NULL;

	m_rcPoint.SetRectEmpty();

	m_nConnectionPointIndex = -1;

}

CXTPFlowGraphConnectionPoint::~CXTPFlowGraphConnectionPoint()
{
	XTPMarkupReleaseElement(m_pMarkupUIElement);
}

void CXTPFlowGraphConnectionPoint::DoPropExchange(CXTPPropExchange* pPX)
{
	PX_String(pPX, _T("Caption"), m_strCaption, _T(""));
	PX_String(pPX, _T("Tooltip"), m_strTooltip, _T(""));
	PX_DWord(pPX, _T("Color"), (DWORD)m_clrPoint, (COLORREF)-1);
	PX_Int(pPX, _T("Style"), m_nStyle, (int)-1);
	PX_Enum(pPX, _T("Type"), m_nType, xtpFlowGraphPointInput);

	PX_Int(pPX, _T("Id"), m_nId, 0);

	PX_Bool(pPX, _T("Locked"), m_bLocked, FALSE);

	PX_Int(pPX, _T("MaxConnections"), m_nMaxConnections, -1);

	PX_Int(pPX, _T("ImageIndex"), m_nImageIndex, -1);

	if (pPX->IsLoading())
	{
		CXTPFlowGraphControl* pControl = GetControl();
		if (pControl)
		{
			m_pMarkupUIElement = XTPMarkupParseText(pControl->GetMarkupContext(), m_strCaption);
		}
	}
}

CXTPFlowGraphControl* CXTPFlowGraphConnectionPoint::GetControl() const
{
	if (m_pNode)
		return m_pNode->GetControl();
	return NULL;
}

CXTPFlowGraphPage* CXTPFlowGraphConnectionPoint::GetPage() const
{
	if (m_pNode)
		return m_pNode->GetPage();
	return NULL;
}

void CXTPFlowGraphConnectionPoint::Remove()
{
	if (!m_pNode)
		return;

	m_pNode->GetConnectionPoints()->Remove(this);
}

BOOL CXTPFlowGraphConnectionPoint::HitTestConnectionArea(CPoint point) const
{
	CXTPFlowGraphPaintManager* pPaintManager = GetControl()->GetPaintManager();

	return pPaintManager->HitTestConnectionArea(this, point);
}

CXTPFlowGraphImage* CXTPFlowGraphConnectionPoint::GetImage() const
{
	CXTPFlowGraphControl* pControl = GetControl();
	if (!pControl)
		return NULL;

	return pControl->GetImages()->GetAt(m_nImageIndex);
}

void CXTPFlowGraphConnectionPoint::OnGraphChanged()
{
	if (m_pNode) m_pNode->OnGraphChanged();
}

void CXTPFlowGraphConnectionPoint::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 CXTPFlowGraphConnectionPoint::OnRemoved()
{
	int i;

	for (i = (int)m_arrInputConnections.GetSize() - 1; i >= 0; i--)
	{
		m_arrInputConnections[i]->Remove();
	}

	for (i = (int)m_arrOutputConnections.GetSize() - 1; i >= 0; i--)
	{
		m_arrOutputConnections[i]->Remove();
	}

	// Removed Connections should update them
	ASSERT(m_arrInputConnections.GetSize() == 0);
	ASSERT(m_arrOutputConnections.GetSize() == 0);

	CXTPFlowGraphElement::OnRemoved();
}