//ROMTEAM Networks (Gabriela Dumitrascu 25/02/98)

///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : NtwObj.hpp
//   
// Definition of the graph editors objects   
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from  :	CPA_Object
//					CPA_EdMot<ACP_tdxHandleOfLink>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Creation date: 1998-03-02                        Author: CPA2 Gabi Dumitrascu
///////////////////////////////////////////////////////////////////////////////////////////////////
// Modification date:			                      Author: 
///////////////////////////////////////////////////////////////////////////////////////////////////


#ifndef __NTWOBJ_HPP__
#define __NTWOBJ_HPP__

#define _WP_D_WPARC_FREIND_
#include "Wparc.h"
#include "ogd.h"


class NtwDia;
class Waypoint_Interface;


class Graph : public CPA_SaveObject, public CPA_EdMot<WP_tdHandleOfGraph> 
{
//protected:
public:
	static NtwDia* ms_poNtwDia;
	static Waypoint_Interface* ms_poInterface;
	static BOOL ms_bNotifyHeader;

// Shaitan Correction {
	CPA_List<CPA_SuperObject> ms_oListOfArrows; // list of all arrows of the graph
//End Shaitan Correction }

	CPA_SuperObject* m_poSuperObject;					// super object
	BOOL m_bSave;

public:
	static CPA_List<Graph> ms_oListOfGraph;				//// list of all the graph
	//--- static 
	static void fn_vInitObject (Waypoint_Interface* poInterface);
	static Waypoint_Interface* GetInterface (void) { return ms_poInterface; }

	static void fn_vCallbackSave ( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action _eAction );
	static void fn_vCallbackEmptySectionWPGraph( SCR_tdst_File_Description *p_stFile, char *_p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action	_eAction );
	static void fn_vCallbackEmptySectionWPSommet( SCR_tdst_File_Description *p_stFile, char *_p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action	_eAction );

	static void fn_vSetDialog ( NtwDia* poNtwDia );
	static void fn_vSetNotifyHeader (BOOL bNotifyHeader) { ms_bNotifyHeader = bNotifyHeader; }
	static void fn_vRefreshGraph (void);

	static Graph* fn_pGetGraph(WP_tdhWayPoint hWP);

	static NtwDia* fn_pGetDialog ( void ) { return ms_poNtwDia; }
	static CPA_List<Graph>* fn_poGetListOfGraph (void) { return &ms_oListOfGraph; }

	static WayPoint* GetWaypoint(WP_tdhWayPoint hWP);

	Graph( CPA_ObjectDLLBase *p_oDLL, CString csName = "1", BOOL bSave = TRUE );
	Graph ( CPA_ObjectDLLBase *p_oDLL, WP_tdHandleOfGraph hEngineGraph, CString csName, CString csFileName, CString csSectionName );
	Graph( Graph& rGraph );
	~Graph();
	
	Graph& operator= (Graph& rGraph);

	//--- data
	long GetDataType (void);
	void* GetData (void) {return GetStruct();}

	// Unicity
    tdeMissingCriteria fn_eCheckUnicity (const CString csNewName);

	//--- save
	void fn_vNotifySave				(void);
	void fn_vNotifyUnSave			(void);
	void fn_vNotifyRestore			(void);
	void fn_vNotifyRename			(void);
	void fn_vUpdateReference		(CPA_SaveObject *pReferencedObject);
		
	//---set
	void SetSuperObject ( CPA_SuperObject* poSuperObject) { m_poSuperObject=poSuperObject; }
	void fn_vSetSave (BOOL bSave) { m_bSave=bSave; }

	//----get
	CPA_SuperObject* GetSuperObject (void) {return m_poSuperObject;}
	WP_tdHandleOfGraph GetEngineStruct() {return (WP_tdHandleOfGraph)GetStruct();}
	

// Shaitan Correction {
	void fn_vAddNode(WP_tdhWayPoint hWP, BOOL pBlock);
	BOOL fn_bRemoveNode(int iNode, BOOL pBlock);
	void fn_vAddNode(WayPoint *pWP, BOOL pBlock);
	BOOL fn_bRemoveNode(WayPoint *pWP, BOOL pBlock);
//End Shaitan Correction }
	BOOL fn_bHasNode(WP_tdhWayPoint hWP) {return fn_iGetNodeOfWayPoint(hWP) != -1;}
	BOOL fn_bHasNode(WayPoint *pWP) {return fn_bHasNode((WP_tdhWayPoint)pWP->GetEngineStruct());}
	int fn_iGetNumberOfNodes() {return WPG_fn_lNumberOfWaypointOfGraph(GetEngineStruct());}
	WP_tdhGraphNode fn_hGetNode(int iNode);
	WP_tdhWayPoint fn_hGetWayPointOfNode(int iNode);
	int fn_iGetNodeOfWayPoint(WP_tdhWayPoint hWP);

	int fn_iGetNumberOfArcs(WP_tdhGraphNode hNode);
	WP_tdHandleOfArc fn_hGetArc(WP_tdhGraphNode hNode, int iArc);
	int fn_iGetArcOfNode(WP_tdhGraphNode hNode, WP_tdhGraphNode hArcNode);
	BOOL fn_bNodeHasArc(WP_tdhGraphNode hNode, WP_tdhGraphNode hArcNode) {return fn_iGetArcOfNode(hNode, hArcNode) != -1;}
// Shaitan Correction {
	void fn_vAddArcToNode(WP_tdhGraphNode hNode, WP_tdhGraphNode hArcNode, BOOL pBlock);
	void fn_vAddArcToNode(WayPoint *pSrcNode, WayPoint *pDstNode, BOOL bUpdate, BOOL pBlock);
	void fn_vRemoveArcOfNode(WP_tdhGraphNode hNode, int iArc, BOOL pBlock);
	void fn_vRemoveArcOfNode(WayPoint *pSrcNode, WayPoint *pDstNode, BOOL pBlock);
//End Shaitan Correction }
	void fn_vSetDefaultArcWeight(WP_tdhGraphNode hNode, int iArc);
	void fn_vSetDefaultAllArcsWeight();
// Shaitan NewParam {
	long fn_lGetDefaultArcWeight(WayPoint* pSrcNode, WayPoint* pDstNode);
	void fn_vSetAllArcsCapacity(long lCapacity);
//End Shaitan NewParam }

// Shaitan Correction {
	void fn_vInitGraphicConnections (void); 
	void fn_vUpdateConnection		(CPA_SuperObject *pConnection, BOOL bUpdate);
	void fn_vDisplayConnection		(CPA_SuperObject *pConnection, BOOL bUpdate);
	void fn_vDisplayAllLinks		(BOOL bDisplay, BOOL bUpdate);
	void fn_vDisplayOutLinks		(WayPoint* pSrcNode, BOOL bUpdate);
	void fn_vDisplayInLinks			(WayPoint* pDstNode, BOOL bUpdate);
	void fn_vUpdateConnections		(WayPoint *pMovedWP, BOOL bUpdate);

	void fn_vAddGraphicConnection		(CPA_SuperObject *pConnection);
	void fn_vRemoveGraphicConnection	(CPA_SuperObject *pConnection);

	CPA_SuperObject * GetGraphicConnection (WayPoint* pSrcNode, WayPoint* pDstNode);

	void GetConnectionsToWaypoint (WayPoint *pNode, int iType, CPA_List<CPA_SuperObject> *pListToFill);

	void SetConnectionCapacity	(WayPoint *pSrcNode, WayPoint *pDstNode, long lCapacity);
	void SetConnectionWeight	(WayPoint *pSrcNode, WayPoint *pDstNode, long lWeight);
	long GetConnectionCapacity	(WayPoint *pSrcNode, WayPoint *pDstNode);
	long GetConnectionWeight	(WayPoint *pSrcNode, WayPoint *pDstNode);

// Shaitan NewParam {
	void SetNodeType	(WayPoint *pSrcNode, long lType);
	long GetNodeType	(WayPoint *pSrcNode);

	WayPoint * GetPrevNode (WayPoint *pSrcNode);
	WayPoint * GetNextNode (WayPoint *pSrcNode);

	WayPoint * GetPrevConnection (WayPoint *pSrcNode, WayPoint *pDstNode);
	WayPoint * GetNextConnection (WayPoint *pSrcNode, WayPoint *pDstNode);
//End Shaitan NewParam }

	void fn_vShowWaypoints (BOOL bShow);
//End Shaitan Correction }


};


class Connection : public Arrow3D
{
// Shaitan Correction {
/*
public:
	
	int m_iGraph, m_iNode, m_iArc;
	// construct
	Connection(CPA_EditorBase *p_oEditor, int iGraph, int iNode, int iArc);
*/
private:
	Graph		*m_pGraph;
	WayPoint	*m_pSrcWP;
	WayPoint	*m_pDstWP;
	long		m_lCapacity;
	long		m_lWeight;

public:
	Graph		* GetGraph		 (void) { return m_pGraph; }
	WayPoint	* GetSrcWayPoint (void) { return m_pSrcWP; }
	WayPoint	* GetDstWayPoint (void) { return m_pDstWP; }
	long		  GetCapacity	 (void) { return m_lCapacity; }
	long		  GetWeight		 (void) { return m_lWeight;	}

	void SetCapacity (long lCapacity)	{ m_lCapacity = lCapacity; }
	void SetWeight	 (long lWeight)		{ m_lWeight = lWeight; }

	Connection(CPA_EditorBase *p_oEditor, Graph *pGraph, WayPoint *pSrcWP, WayPoint *pDstWP, long m_lCapacity, long m_lWeight);
//End Shaitan Correction }
};


#endif //__NTWOBJ_HPP__

//ENDROMTEAM Networks (Gabriela Dumitrascu)
