// Implementation file for the definition of a characteristic type
/////////////////////////////////////////////////////////////////////
#include "StdAfx.h"

#include "ACP_Base.h"

/////////////////////////////////////////////////////
//////// !!!!!!!!!!!! DANGER !!!!!!!!!!! ////////////
/////////////////////////////////////////////////////
#define _ED_CAR_MUST_DEFINE_STRUCT_
#include "EdAllAct.hpp"
/////////////////////////////////////////////////////
//////// !!!!!!!!!!!! End DANGER !!!!!!!!!!! ////////
/////////////////////////////////////////////////////

#include "_AInterf.hpp"

#include "CPA_DatO.hpp"

#include "EDACactr.hpp"
#include "edtlist.hpp"
#include "EDACStrg.hpp"

//External Modules
#include "ITF.h"
#include "TAC.h"
#include "ErO.h"
//End of External Modules

#undef CPA_WANTS_IMPORT
#undef CPA_EXPORT
#define CPA_WANTS_EXPORT
    #include "_Actors.hpp"
#undef CPA_WANTS_EXPORT
#define CPA_WANTS_IMPORT

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//Constructors / Destructor
//**************************************************************************************
CPA_Editor_ObjectListData::CPA_Editor_ObjectListData(CString csScriptName,
																										 CTL_Editor_DataList *_pclParentList,
																										 CTL_Editor_Data *pclCurrentBaseData /*= NULL*/)
												 : CTL_Editor_Data(CTL_DATA_TYPE__USE_USER_DEFINED_TYPE,
																					 csScriptName,
																					 _pclParentList,
																					 pclCurrentBaseData,
																					 OAC_DATA_TYPE__OBJECT_LIST)
{
	m_p_oObjectList = NULL;
	m_p_oNameList = NULL;
	m_p_oZAList = NULL;
}

//**************************************************************************************
CPA_Editor_ObjectListData::~CPA_Editor_ObjectListData()
{

}

//**************************************************************************************
void CPA_Editor_ObjectListData::m_vSetZAList(CPA_ZonesActivatingList *_p_oZAList)
{
	if ( m_p_oZAList != _p_oZAList )
	{
		//tell the coherence manager to remember the actor no longer uses its old activation list.
		if ( m_p_oZAList )
			g_oCoherenceManager.m_fn_vRemoveALink(
				(CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(this)->m_pclActor,
				m_p_oZAList
			);
		//tell the coherence manager to remember the instance now uses the new activation list.
		if ( _p_oZAList )
			g_oCoherenceManager.m_fn_vAddALink(
				(CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(this)->m_pclActor,
				_p_oZAList
			);
		//now we can set the new value
		m_p_oZAList = _p_oZAList;

		if ( !g_pclInterface->GetInterface()->fn_bIsLoadingWorld() )
			OAC_fn_pclGetParentActorOfData(this)->m_pclActor->fn_vNotifySave();
	}
}

//**************************************************************************************
void CPA_Editor_ObjectListData::m_vSetObjectList(EdtList *_p_oObjectList)
{
	if ( m_p_oObjectList != _p_oObjectList )
	{
		if ( m_p_oObjectList )
			m_p_oObjectList->fn_bMakeActorNotUseThisList(OAC_fn_pclGetParentActorOfData(this) , FALSE);    // No NotifySave
		if ( _p_oObjectList )
			_p_oObjectList->fn_bMakeActorUseThisList(OAC_fn_pclGetParentActorOfData(this) , FALSE);    // No NotifySave
		//now we can set the new value
    m_p_oObjectList = _p_oObjectList; //should be useless...
	}
}

//**************************************************************************************
//Function called to Init the data
void CPA_Editor_ObjectListData::m_vUpdateEngineZAList()
{
	MS_tdxHandleToCollSet	hCollSet = (MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress();
	ZDX_tdxHandleToCsaList	hActivationList;

	// get engine activation list
	if ( m_p_oZAList )
		hActivationList = (ZDX_tdxHandleToCsaList) m_p_oZAList->GetData();
	else
		hActivationList	= NULL;

	//set activation list
	if ( m_pub_fn_csGetDataName() == C_szZdeName )
		CS_M_SetActivationList(Zde, hCollSet, hActivationList);
	else if ( m_pub_fn_csGetDataName() == C_szZddName )
		CS_M_SetActivationList(Zdd, hCollSet, hActivationList);
	else if ( m_pub_fn_csGetDataName() == C_szZdmName )
		CS_M_SetActivationList(Zdm, hCollSet, hActivationList);
	else if ( m_pub_fn_csGetDataName() == C_szZdrName )
		CS_M_SetActivationList(Zdr, hCollSet, hActivationList);
}

//**************************************************************************************
//Function called to Init the data
void CPA_Editor_ObjectListData::m_vUpdateEngineObjectList()
{
	MS_tdxHandleToCollSet	hCollSet = (MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress();
	ZDX_tdxHandleToZdxList	hZdxList;

	// get engine object list
	if ( m_p_oObjectList )
		hZdxList = (ZDX_tdxHandleToZdxList) m_p_oObjectList->fn_hGetMotorList();
	else
		hZdxList = NULL;

	// set object list
	if ( m_pub_fn_csGetDataName() == C_szZdeName )
		CS_M_SetZdxList(Zde, hCollSet, hZdxList);
	else if ( m_pub_fn_csGetDataName() == C_szZddName )
		CS_M_SetZdxList(Zdd, hCollSet, hZdxList);
	else if ( m_pub_fn_csGetDataName() == C_szZdmName )
		CS_M_SetZdxList(Zdm, hCollSet, hZdxList);
	else if ( m_pub_fn_csGetDataName() == C_szZdrName )
		CS_M_SetZdxList(Zdr, hCollSet, hZdxList);
}

//**************************************************************************************
//Function called to Init the data
void CPA_Editor_ObjectListData::m_fn_vInitData()
{
	if ( OAC_fn_bBelongsToAnInstance(this) )
	{
    // The instance must have the same list of names (Zdd/Zde/Zdm/Way) as the model
		EdActors_EditorActor *p_oEditorModel = OAC_fn_pclGetParentActorOfData(this)->m_pclActor->m_fn_pclGetModel()->m_fn_pclGetEditorActor();
		m_p_oNameList = ((CPA_Editor_ObjectListData *) p_oEditorModel->m_fn_p_oFindDataByName(m_pub_fn_csGetDataName()))->m_p_oNameList;
		//make it also update en editor list pointers according to the engine handles
		m_fn_vGetMotorData();
	}
}

//**************************************************************************************
//Function called to read associated motor's data
void CPA_Editor_ObjectListData::m_fn_vGetMotorData()
{
	//get the handle to the engine list
	ZDX_tdxHandleToZdxList hZdxList =  * (ZDX_tdxHandleToZdxList *) m_pro_pvMotorData;
	//the IA can change the activation lists and zone lists of an object -> read them and store them
	//in the editor data

	//find the reachable object for the engine list
	if ( hZdxList )
	{
		CPA_BaseObject *p_oZDxEdtList = g_pclInterface->GetMainWorld()->fn_p_oFindObjectWithEngine(
			hZdxList,
			C_szEdtListTypeName
		);
		//make the actor reference the found object list
    m_vSetObjectList((EdtList *)p_oZDxEdtList);
	}

	//do it too for m_p_oZAList
	ZDX_tdxHandleToCsaList hActivationList;
	if ( m_pub_fn_csGetDataName() == C_szZdeName )
		hActivationList = ((MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress())->hZdeActivationList;
	else if ( m_pub_fn_csGetDataName() == C_szZddName )
		hActivationList = ((MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress())->hZddActivationList;
	else if ( m_pub_fn_csGetDataName() == C_szZdmName )
		hActivationList = ((MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress())->hZdmActivationList;
	else if ( m_pub_fn_csGetDataName() == C_szZdrName )
		hActivationList = ((MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress())->hZdrActivationList;
	else if ( m_pub_fn_csGetDataName() == C_szWayName )
		hActivationList = NULL;
	else
  {
    ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
      "Setting editor list pointers from engine handles",
      "CPA_Editor_ObjectListData::m_fn_vGetMotorData()",
      E_ERROR_GRAVITY_FATAL,
      "No editor activation list was found for the engine activation list handle"
    );
    ERROR_ASSERT(FALSE);
  }
	//find the reachable object for the engine list
	if ( hActivationList )
  {
		CPA_ZonesActivatingList *p_oNewZAList = (CPA_ZonesActivatingList *) g_pclInterface->GetMainWorld()->fn_p_oFindObjectWithEngine(
			hActivationList,
			C_szZAListTypeName
		);
		m_vSetZAList(p_oNewZAList);
	}
}

//**************************************************************************************
//Function called to update associated motor's data from editor data
void CPA_Editor_ObjectListData::m_fn_vUpdateMotorData(CTL_tdeUpdateReason eReason,
																											long _lUserDefinedReason /*= 0*/)
{
	MS_tdxHandleToCollSet hCollSet = (MS_tdxHandleToCollSet) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress();
	MS_tdxHandleToMSWay hWay = (MS_tdxHandleToMSWay) OAC_fn_pclGetParentAMSOfData(this)->m_fn_pvGetBaseAddress();
	ZDX_tdxHandleToZdxList hZdxList;

	ZDX_tdxHandleToCsaList hActivationList;

	if ( m_p_oObjectList )
	{
		hZdxList = (ZDX_tdxHandleToZdxList) m_p_oObjectList->fn_hGetMotorList();
	}
	else
		hZdxList = NULL;

	if ( m_p_oZAList )
		hActivationList = (ZDX_tdxHandleToCsaList) m_p_oZAList->GetData();
	else
		hActivationList	= NULL;

	//set the object and activation list
	if ( m_pub_fn_csGetDataName() == C_szZdeName )
	{
		CS_M_SetZdxList(Zde, hCollSet, hZdxList);
		CS_M_SetActivationList(Zde, hCollSet, hActivationList);
	}
	else if ( m_pub_fn_csGetDataName() == C_szZddName )
	{
		CS_M_SetZdxList(Zdd, hCollSet, hZdxList);
		CS_M_SetActivationList(Zdd, hCollSet, hActivationList);
	}
	else if ( m_pub_fn_csGetDataName() == C_szZdmName )
	{
		CS_M_SetZdxList(Zdm, hCollSet, hZdxList);
		CS_M_SetActivationList(Zdm, hCollSet, hActivationList);
	}
	else if ( m_pub_fn_csGetDataName() == C_szZdrName )
	{
		CS_M_SetZdxList(Zdr, hCollSet, hZdxList);
		CS_M_SetActivationList(Zdr, hCollSet, hActivationList);
	}
	//Special changes
	m_fn_vDataHasBeenChanged(eReason, _lUserDefinedReason);
}

//************************************************************************
//Function called to update data with another one
void CPA_Editor_ObjectListData::m_fn_vUpdateData(CTL_Editor_Data *pclSourceData,
																								 CTL_tdeUpdateReason eReason,
																								 long _lUserDefinedReason /*= 0*/)
{
  ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
									"Copying data from a model into an instance",
									"CPA_Editor_ObjectListData::m_fn_vUpdateData(...)",
									E_ERROR_GRAVITY_FATAL,
									"The data types are not equal"
								);
  ERROR_ASSERT( pclSourceData->m_pub_fn_tdeGetDataType() == m_pub_fn_tdeGetDataType() );

	BOOL bChanged = FALSE;

	switch (eReason)
	{
	case E_ur_InstanciatedFromModel:
	case E_ur_ModelChangedNameList:
  	// do something only if the model has a valid name list
  	if ( ((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oNameList )
  	{
			//set the instance with the values of the model
			m_p_oNameList = ((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oNameList;
			// if the model has no default object list yet, create one.
			//if ( !((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oObjectList )
			//{
			tdstEdtListMess stMessage;
			stMessage.csListType = LPCTSTR(pclSourceData->m_pub_fn_csGetDataName());
			stMessage.pActor = (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(this)->m_pclActor;
			//create an object list for the model
			((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oNameList
			->m_pEdtListHandler->fn_poCreateEdtList(&stMessage);

	   //m_p_oObjectList = ((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oObjectList;

			bChanged = TRUE;

			/*m_fn_bSetLink(pclSourceData->m_fn_eGetLink());

			m_fn_vUpdateMotorData();*/
		}
		if ( ((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oZAList )
		{
			if ( ((CPA_tdoNameList *) ((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oZAList->GetOwner()) != m_p_oNameList )
        ((CPA_Editor_ObjectListData *) pclSourceData)->m_vSetZAList(NULL);
			else
        m_vSetZAList(((CPA_Editor_ObjectListData *) pclSourceData)->m_p_oZAList);

			bChanged = TRUE;
		}

		if ( bChanged )
		{
//			m_fn_bSetLink(pclSourceData->m_fn_eGetLink());
			m_fn_vUpdateMotorData(eReason, _lUserDefinedReason);
		}
  break;

 case E_ur_ModelEditedNameList:
  //if the model just modified the contents of some name lists, we dont care.
  break;

 default:
  ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
    "Copying data from a model into an instance",
    "CPA_Editor_ObjectListData::m_fn_vUpdateData(...)",
    E_ERROR_GRAVITY_FATAL,
    "No good valid reason was given for data update (i.e. model changed some data)"
  );
  ERROR_ASSERT(FALSE);
  break;
 }

}

//************************************************************************
//Function called to get a string representing the value of the data
CStringList *CPA_Editor_ObjectListData::m_fn_pcslFormatDataValueString()
{
	m_csStringList.RemoveAll();

	m_csStringList.AddTail(m_p_oNameList ? m_p_oNameList->GetName() : "");

	BOOL bSaveOL, bSaveZAL;

	//save the ZA list only for zones, and if we have one...
	bSaveZAL = ((m_p_oZAList && (m_pub_fn_csGetDataName() != C_szWayName)) ? TRUE : FALSE);

	if ( OAC_fn_bBelongsToAnInstance(this) ) //if an instance
	{
		//save the object list if we have one
		bSaveOL = (m_p_oObjectList ? TRUE : FALSE);
	}
	else //is a model
	{
		//a model does not save its ways object list, and zone object lists
		//are saved only if they have no virge field
		bSaveOL = (m_p_oObjectList && (m_pub_fn_csGetDataName() != C_szWayName) && m_p_oNameList->m_bHasACommonField());
	}

	m_csStringList.AddTail(bSaveOL ? m_p_oObjectList->GetName() : "");
	m_csStringList.AddTail(bSaveZAL ? m_p_oZAList->GetName() : "");
	return &m_csStringList;
}

//************************************************************************
//Function called to set the value of the data acoording to a string representing it
void CPA_Editor_ObjectListData::m_fn_vSetValueWithString(CStringList *pcslValueStringList)
{
  ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
    "Filling data with script information",
    "CPA_Editor_ObjectListData::m_fn_vSetValueWithString(...)",
    E_ERROR_GRAVITY_FATAL,
    "The number of fields to fill and provided data do not correspond"
  );
  ERROR_ASSERT(pcslValueStringList->GetCount() == 3);
	POSITION xPos = pcslValueStringList->GetHeadPosition();
	CString csNameList(pcslValueStringList->GetNext(xPos));
	CString csObjectList(pcslValueStringList->GetNext(xPos));
	CString csZAList(pcslValueStringList->GetNext(xPos));

	// Get the main world
	CPA_MainWorld * pMainWorld = OAC_fn_pclGetParentActorOfData(this)->m_pclActor->GetMainWorld ();

	// Search the name list
	if ( m_p_oNameList )
		g_oCoherenceManager.m_fn_vRemoveALink(
		 (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(this)->m_pclActor,
		 m_p_oNameList
		);
	m_p_oNameList = NULL;
	if ( !csNameList.IsEmpty() )
	{
    CPA_BaseObject *p_oFamily = (CPA_BaseObject *) OAC_fn_pclGetParentActorOfData(this)->m_pclActor->m_pub_fn_pclGetFamily();
    m_p_oNameList = (CPA_tdoNameList *) pMainWorld -> fn_p_oFindObject (csNameList, C_szZDdNameListType, p_oFamily);
		if ( !m_p_oNameList )
      m_p_oNameList = (CPA_tdoNameList *) pMainWorld -> fn_p_oFindObject (csNameList, C_szZDeNameListType, p_oFamily);
		if ( !m_p_oNameList )
      m_p_oNameList = (CPA_tdoNameList *) pMainWorld -> fn_p_oFindObject (csNameList, C_szZDmNameListType, p_oFamily);
		if ( !m_p_oNameList )
      m_p_oNameList = (CPA_tdoNameList *) pMainWorld -> fn_p_oFindObject (csNameList, C_szZDrNameListType, p_oFamily);
		// add by jt
		if ( !m_p_oNameList )
      m_p_oNameList = (CPA_tdoNameList *) pMainWorld -> fn_p_oFindObject (csNameList, C_szWayNameListType, p_oFamily);
		// end jt
    ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
      "Filling data with script information",
      "CPA_Editor_ObjectListData::m_fn_vSetValueWithString(...)",
      E_ERROR_GRAVITY_FATAL,
      "No editor name list was found with the specified name"
    );
    ERROR_ASSERT(m_p_oNameList);
	}
  //tell the coherence manager to remember the model now uses the new name list.
	if ( m_p_oNameList )
		g_oCoherenceManager.m_fn_vAddALink(
		 OAC_fn_pclGetParentActorOfData(this)->m_pclActor,
		 m_p_oNameList
		);


	// We set the pointer of the model to the name list
	if ( !csObjectList.IsEmpty() )
	{
		EdtList *p_oObjectList = (EdtList *) pMainWorld -> fn_p_oFindObject (csObjectList, C_szEdtListTypeName, m_p_oNameList ? m_p_oNameList : NO_CRITERIA );
    ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
      "Filling data with script information",
      "CPA_Editor_ObjectListData::m_fn_vSetValueWithString(...)",
      E_ERROR_GRAVITY_FATAL,
      "No editor object list was found with the specified name"
    );
    ERROR_ASSERT(p_oObjectList);
    m_vSetObjectList(p_oObjectList);
	}
	else
    m_vSetObjectList(NULL);

	if ( !csZAList.IsEmpty() )
	{
    m_vSetZAList((CPA_ZonesActivatingList *) pMainWorld -> fn_p_oFindObject (csZAList, C_szZAListTypeName));
    ERROR_PREPARE_M(g_c_csActorModuleNameForErrors,
										"Filling data with script information",
										"CPA_Editor_ObjectListData::m_fn_vSetValueWithString(...)",
										E_ERROR_GRAVITY_FATAL,
										"No editor activation list was found with the specified name"
									);
    ERROR_ASSERT(m_p_oZAList);
	}
	else
    m_vSetZAList(NULL);
}

//************************************************************************
//Function called to look if data has been modified (by motor for example)
void CPA_Editor_ObjectListData::m_fn_vLookIfDataHasBeenModified()
{
 BOOL bIsEditingAnInstance = OAC_fn_bBelongsToAnInstance(this);

 m_fn_vGetMotorData();

 m_pro_bDataHasChanged = bIsEditingAnInstance
 ? ((m_p_oObjectList != m_p_oOldObjectList) || (m_p_oZAList != m_p_oOldZAList ))
 : (m_p_oNameList != m_p_oOldNameList);

	if ( m_pro_bDataHasChanged )
 {
  if ( bIsEditingAnInstance )
	{
   m_p_oOldObjectList = m_p_oObjectList;
	 m_p_oOldZAList = m_p_oZAList;
	}
  else
   m_p_oOldNameList = m_p_oNameList;
 }
}

//************************************************************************
//Function called when data has been really modified (i.e. value is different from previous one)
void CPA_Editor_ObjectListData::m_fn_vDataHasBeenReallyModified()
{

}

//Undo
//************************************************************************
//Function called to save the current Value (for Undo)
void CPA_Editor_ObjectListData::m_fn_vKeepCurrentValue()
{
 m_p_oNameListKeptForUndo = m_p_oNameList;
 m_p_oObjectListKeptForUndo = m_p_oObjectList;
 m_p_oZAListKeptForUndo = m_p_oZAList;
}

//************************************************************************
//Function called to validate Undo for the current change
void CPA_Editor_ObjectListData::m_fn_vRegisterUndoAction()
{
 void *pKeptList, *pCurList;
 void *pKeptAlternateList, *pCurAlternateList;
 if ( OAC_fn_bBelongsToAnInstance(this) )
 {
  pKeptList = m_p_oObjectListKeptForUndo;
  pCurList = m_p_oObjectList;
	pKeptAlternateList = m_p_oZAListKeptForUndo;
	pCurAlternateList = m_p_oZAList;
 }
 else
 {
  pKeptList = m_p_oNameListKeptForUndo;
  pCurList = m_p_oNameList;
	pKeptAlternateList = NULL;
	pCurAlternateList = NULL;
 }

 CPA_ObjectListDataModif *pclModif = new CPA_ObjectListDataModif(this,
                                       pKeptList,
                                       pCurList,
																			 pKeptAlternateList,
																			 pCurAlternateList);

	OAC_fn_pclGetParentActorOfData(this)->m_clUndoManager.AskFor(pclModif);
}


//##################################################################"
//************************************************************************
//Constructor
CPA_ObjectListDataModif::CPA_ObjectListDataModif
(
 CPA_Editor_ObjectListData *p_oData,
 void *pOldList,
	void *pNewList,
	void *_pOldAlternateList,
	void *_pNewAlternateList
)
: CPA_Modif(0)
{
	m_p_oData = p_oData;
	m_pListAfterDo = pNewList;
	m_pListBeforeDo = pOldList;
	m_pAlternateListAfterDo = _pNewAlternateList;
	m_pAlternateListBeforeDo = _pOldAlternateList;

	CString csName;
	csName.Format("%s : modified", p_oData->m_pub_fn_csGetDataName());
	SetName(csName);
}

//************************************************************************
//Destructor
CPA_ObjectListDataModif::~CPA_ObjectListDataModif()
{

}

//************************************************************************
BOOL CPA_ObjectListDataModif::Do()
{
 if ( OAC_fn_bBelongsToAnInstance(m_p_oData) )
 {
  m_p_oData->m_vSetObjectList((EdtList *) m_pListAfterDo);
  m_p_oData->m_vSetZAList((CPA_ZonesActivatingList *) m_pAlternateListAfterDo);
 }
 else
 {
	//remove the link with the old name list
	if ( m_p_oData->m_p_oNameList )
		g_oCoherenceManager.m_fn_vRemoveALink(
		 (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(m_p_oData)->m_pclActor,
		 m_p_oData->m_p_oNameList
		);
	//set the name name list
  m_p_oData->m_p_oNameList = (CPA_tdoNameList *) m_pListAfterDo;
	//and set the link with the new name list
	if ( m_p_oData->m_p_oNameList )
		g_oCoherenceManager.m_fn_vAddALink(
		 (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(m_p_oData)->m_pclActor,
		 m_p_oData->m_p_oNameList
		);
  m_p_oData->m_vSetZAList((CPA_ZonesActivatingList *) m_pAlternateListAfterDo);
 }

 m_p_oData->m_fn_vUpdateMotorData();
 m_p_oData->m_pub_fn_vSetDataHasChanged(TRUE);
 m_p_oData->m_pub_fn_pclGetParentControl()->m_fn_vUpdate();

	OAC_fn_pclGetParentActorOfData(m_p_oData)->m_pclActor->fn_vNotifySave();

	return TRUE;
}

//************************************************************************
BOOL CPA_ObjectListDataModif::Undo()
{
 if ( OAC_fn_bBelongsToAnInstance(m_p_oData) )
 {
  m_p_oData->m_vSetObjectList((EdtList *) m_pListBeforeDo);
  m_p_oData->m_vSetZAList((CPA_ZonesActivatingList *) m_pAlternateListBeforeDo);
 }
 else
 {
	//remove the link with the old name list
	if ( m_p_oData->m_p_oNameList )
		g_oCoherenceManager.m_fn_vRemoveALink(
		 (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(m_p_oData)->m_pclActor,
		 m_p_oData->m_p_oNameList
		);
  m_p_oData->m_p_oNameList = (CPA_tdoNameList *) m_pListBeforeDo;
	//and set the link with the new name list
	if ( m_p_oData->m_p_oNameList )
		g_oCoherenceManager.m_fn_vAddALink(
		 (CPA_SaveObject *) OAC_fn_pclGetParentActorOfData(m_p_oData)->m_pclActor,
		 m_p_oData->m_p_oNameList
		);
  m_p_oData->m_vSetZAList((CPA_ZonesActivatingList *) m_pAlternateListAfterDo);
 }

 m_p_oData->m_fn_vUpdateMotorData();
 m_p_oData->m_pub_fn_vSetDataHasChanged(TRUE);
 m_p_oData->m_pub_fn_pclGetParentControl()->m_fn_vUpdate();

	return TRUE;
}

// ROMTEAM corrections (Nicu 06-02-98) {

//Function called to read associated motor's data
void OAC_FloatData::m_fn_vGetMotorData()
{   
    BOOL bMustReadData =    TRUE;
    if ( m_pro_td_p_fn_bDataMustBeRead != NULL )
        bMustReadData &=    m_pro_td_p_fn_bDataMustBeRead(this);

    if ( bMustReadData )
    {
        m_ldCurrentValue = *(long*)m_pro_pvMotorData / 65536.0;  

        //Calls Modification function if needed
        if ( m_pro_td_p_fn_vDataModifWhenRead != NULL )
            m_pro_td_p_fn_vDataModifWhenRead(this);
    }
}
    
//Function called to update associated motor's data
void OAC_FloatData::m_fn_vUpdateMotorData(CTL_tdeUpdateReason eReason, long _lUserDefinedReason)
{
    BOOL bMustWriteData = TRUE;
    if ( m_pro_td_p_fn_bDataMustBeWritten != NULL )
        bMustWriteData &=   m_pro_td_p_fn_bDataMustBeWritten(this);

    if ( bMustWriteData )
    {
        //Calls Modification function if needed
        if ( m_pro_td_p_fn_vDataModifWhenWrite != NULL )
            m_pro_td_p_fn_vDataModifWhenWrite(this);
    
        *(long*)m_pro_pvMotorData = (long)(m_ldCurrentValue * 65536.0 + 0.5);
        
        //Calls Modification function if needed
        if ( m_pro_td_p_fn_vDataModifWhenRead != NULL )
            m_pro_td_p_fn_vDataModifWhenRead(this);

        //Special changes
        m_fn_vDataHasBeenChanged(eReason, _lUserDefinedReason);
    }
}


//Function called to get a string representing the value of the data
CStringList *OAC_FloatData::m_fn_pcslFormatDataValueString()
{
    m_csStringList.RemoveAll();

    CString csStringToReturn;
    csStringToReturn.Format("%ld",  (long)(m_ldCurrentValue * 65536.0 + 0.5));
    m_csStringList.AddTail(csStringToReturn);

    return &m_csStringList;
}


//Function called to set the value of the data acoording to a string representing it
void OAC_FloatData::m_fn_vSetValueWithString(CStringList *pcslValueStringList)
{
    ERROR_ASSERT(pcslValueStringList->GetCount() == 1);
    CString csValueString = pcslValueStringList->GetHead();
    
    m_ldCurrentValue = atol(LPCTSTR(csValueString)) / 65536.0;

    m_fn_vUpdateMotorData();
}

// END ROMTEAM corrections (Nicu) }
