reman3/Rayman_X/cpa/tempgrp/OAC/Src/DatCtrl/CPA_DatS.cpp

399 lines
13 KiB
C++

// Implementation file for the definition of a State characteristic
///////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "_AInterf.hpp"
#include "CPA_DatS.hpp"
#include "EDACActr.hpp"
#include "EDACCust.hpp"
//External Modules
#include "ErO.h"
#include "TFa.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
//**************************************************************************
//Constructor / Destructor
CPA_Editor_StateData::CPA_Editor_StateData(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__STATE)
{
m_pri_bIsTheInitialState = ( pclCurrentBaseData != NULL );
m_pclCurrentValueForStates = NULL;
m_pclOldValueForStates = NULL;
m_pclCurrentValueForActions = NULL;
m_pclOldValueForActions = NULL;
m_pclKeepedValueForUndoForStates = NULL;
m_pclKeepedValueForUndoForActions = NULL;
m_pclAction = NULL;
short wIndex = csScriptName.Find('|');
CString csFirstScritpName;
CString csSecondScritpName;
if ( wIndex != -1 )
{
csFirstScritpName = csScriptName.Left(csScriptName.GetLength() - wIndex);
csSecondScritpName = csScriptName.Right(wIndex - 1);
m_pro_csDataName = csFirstScritpName;
}
//Constructs the List of States (according to Family)
m_pclEnumDescriptorForStates = new CTL_Editor_EnumDescriptor(csFirstScritpName, 4/*long*/);
m_pclEnumDescriptorForActions = new CTL_Editor_EnumDescriptor(csSecondScritpName, 4/*long*/);
}
//**************************************************************************
CPA_Editor_StateData::~CPA_Editor_StateData()
{
delete m_pclEnumDescriptorForStates;
delete m_pclEnumDescriptorForActions;
}
//Member functions
//**************************************************************************************
//Function called to Init the data
void CPA_Editor_StateData::m_fn_vInitData()
{
}
//**************************************************************************
//Function called to read associated motor's data
void CPA_Editor_StateData::m_fn_vGetMotorData()
{
long lEnumValue;
ERROR_ASSERT( m_pclEnumDescriptorForStates->m_fn_ucGetEnumSize() == 4 );
CTL_fn_vGetMemory(m_pub_fn_pvGetMotorData(), &lEnumValue, 4);
//Gets corresponding State
tdxHandleToState hState = (tdxHandleToState)lEnumValue;
CPA_State *pclState = NULL;
CPA_Action *pclAction = NULL;
if ( hState != NULL )
{
pclState = (CPA_State *)g_pclInterface->GetMainWorld()->fn_p_oFindObjectWithEngine(hState, C_szStateTypeName);
pclAction = (pclState != NULL) ? pclState->mfn_p_oGetAction() : NULL;
CPA_Actor *pclActor = OAC_fn_pclGetParentActorOfData(this)->m_pclActor;
if ( m_pri_bIsTheInitialState )
{
pclActor->m_pub_fn_vSetInitialAction(pclAction);
pclActor->m_pub_fn_vSetInitialState(pclState);
}
else
{
pclActor->m_pub_fn_vSetCurrentAction(pclAction);
pclActor->m_pub_fn_vSetCurrentState(pclState);
}
}
//ANNECY VL PRT 09/04/98{
if ( M_bEditorsActive() )
//ENDANNECY VL}
m_fn_vConstructEnumDescriptors();
//Updates current value (pointer) for Actions
m_pclCurrentValueForActions = m_pclEnumDescriptorForActions->m_fn_pclGetElementFromEnumIndex((long)pclAction);
//Updates current value (pointer) for States
m_pclCurrentValueForStates = m_pclEnumDescriptorForStates->m_fn_pclGetElementFromEnumIndex(lEnumValue);
}
//**************************************************************************
//Function called to update associated motor's data
void CPA_Editor_StateData::m_fn_vUpdateMotorData(CTL_tdeUpdateReason eReason,
long _lUserDefinedReason /*= 0*/)
{
ERROR_ASSERT( m_pro_pvMotorData != NULL );
//Data must be coded on a long (to represent a pointer)
ERROR_ASSERT( m_pclEnumDescriptorForStates->m_fn_ucGetEnumSize() == 4 );
m_pclAction = (CPA_Action *)m_pclCurrentValueForActions->m_pub_fn_lGetValue();
tdxHandleToState hDefaultState = NULL;
if ( (m_pclAction != NULL) && (m_pclAction->mfn_p_oGetDefaultState() != NULL) )
hDefaultState = (tdxHandleToState)m_pclAction->mfn_p_oGetDefaultState()->GetData();
CTL_fn_vSetMemory(m_pro_pvMotorData, &hDefaultState, 4);
CPA_Actor *pclActor = OAC_fn_pclGetParentActorOfData(this)->m_pclActor;
if ( (OAC_tdeUpdateReason)_lUserDefinedReason != OAC_E_ur_InstanciatedFromModel )
{
CPA_State *pclState = (CPA_State *)g_pclInterface->GetMainWorld()->fn_p_oFindObjectWithEngine(hDefaultState, C_szStateTypeName);
//Sets pointers in parent Actor
if ( m_pri_bIsTheInitialState )
{
pclActor->m_pub_fn_vSetInitialAction(m_pclAction);
pclActor->m_pub_fn_vSetInitialState(pclState, TRUE);
}
else
{
pclActor->m_pub_fn_vSetCurrentAction(m_pclAction);
pclActor->m_pub_fn_vSetCurrentState(pclState);
}
}
if ( m_pro_td_p_fn_vDataHasChangedCallBack != NULL )
m_pro_td_p_fn_vDataHasChangedCallBack(this, eReason, _lUserDefinedReason);
//Special changes
m_fn_vDataHasBeenChanged(eReason, _lUserDefinedReason);
}
//************************************************************************
//Function called to update data with another one
void CPA_Editor_StateData::m_fn_vUpdateData(CTL_Editor_Data *pclSourceData,
CTL_tdeUpdateReason eReason,
long _lUserDefinedReason /*= 0*/)
{
ERROR_ASSERT( pclSourceData->m_pub_fn_tdeGetDataType() == m_pub_fn_tdeGetDataType() );
//Asserts Families are the Same
//TO BE DONE....
m_pclCurrentValueForStates = ((CPA_Editor_StateData *)pclSourceData)->m_pclCurrentValueForStates;
m_pclCurrentValueForActions = ((CPA_Editor_StateData *)pclSourceData)->m_pclCurrentValueForActions;
m_fn_vUpdateMotorData(eReason, _lUserDefinedReason);
}
//************************************************************************
//Function called to get a string representing the value of the data
CStringList *CPA_Editor_StateData::m_fn_pcslFormatDataValueString()
{
m_csStringList.RemoveAll();
ERROR_ASSERT( m_pclCurrentValueForActions != NULL );
if ( m_pclCurrentValueForActions != NULL )
{
CString csStringToReturn;
csStringToReturn.Format("%s", LPCTSTR(m_pclCurrentValueForActions->m_pub_fn_csGetElementName()));
m_csStringList.AddTail(csStringToReturn);
}
return &m_csStringList;
}
//************************************************************************
//Function called to set the value of the data according to a string representing it
void CPA_Editor_StateData::m_fn_vSetValueWithString(CStringList *pcslValueStringList)
{
ERROR_ASSERT(pcslValueStringList->GetCount() == 1);
CString csValueString = pcslValueStringList->GetHead();
m_fn_vConstructEnumDescriptors();
BOOL bFound = FALSE;
CTL_Editor_EnumElement *pclElement;
POSITION pos = m_pclEnumDescriptorForActions->GetHeadPosition();
while ( (pos != NULL) && (!bFound) )
{
pclElement = m_pclEnumDescriptorForActions->GetNext(pos);
bFound = ( pclElement->m_pub_fn_csGetElementName().CompareNoCase(csValueString) == 0 );
}
if ( bFound )
m_pclCurrentValueForActions = pclElement;
else
{
//Default Value
if ( m_pclEnumDescriptorForActions->GetCount() > 0 )
m_pclCurrentValueForActions = m_pclEnumDescriptorForActions->GetHead();
else
m_pclCurrentValueForActions = NULL;
}
m_fn_vUpdateMotorData();
}
//************************************************************************
//Function called to look if data has been modified (by motor for example)
void CPA_Editor_StateData::m_fn_vLookIfDataHasBeenModified()
{
m_fn_vGetMotorData();
m_pro_bDataHasChanged = ( m_pclCurrentValueForStates != m_pclOldValueForStates )
|| ( m_pclCurrentValueForActions != m_pclOldValueForActions );
if ( m_pro_bDataHasChanged )
{
m_pclOldValueForStates = m_pclCurrentValueForStates;
m_pclOldValueForActions = m_pclCurrentValueForActions;
}
}
//************************************************************************
//Function called when data has been really modified (i.e. value is different from previous one)
void CPA_Editor_StateData::m_fn_vDataHasBeenReallyModified()
{
}
//Undo
//************************************************************************
//Function called to save the current Value (for Undo)
void CPA_Editor_StateData::m_fn_vKeepCurrentValue()
{
m_pclKeepedValueForUndoForStates = m_pclCurrentValueForStates;
m_pclKeepedValueForUndoForActions = m_pclCurrentValueForActions;
}
//************************************************************************
//Function called to validate Undo for the current change
void CPA_Editor_StateData::m_fn_vRegisterUndoAction()
{
/* if ( m_pclKeepedValueForUndo->m_lEnumValue != m_pclCurrentValue->m_lEnumValue )
{
EdActors_ActorStateDataModif *pclModif = new EdActors_ActorStateDataModif(this,
m_pclKeepedValueForUndo,
m_pclCurrentValue);
m_pclParentActor->m_clUndoManager.AskFor(pclModif);
}
*/
}
//************************************************************************
//************************************************************************
//Specific functions
//************************************************************************
CTL_Editor_EnumDescriptor *CPA_Editor_StateData::m_fn_pclGetEnumDescriptorForActions()
{
return m_pclEnumDescriptorForActions;
}
//************************************************************************
CTL_Editor_EnumDescriptor *CPA_Editor_StateData::m_fn_pclGetEnumDescriptorForStates()
{
return m_pclEnumDescriptorForStates;
}
//************************************************************************
void CPA_Editor_StateData::m_fn_vConstructEnumDescriptors()
{
//Fills the List of States (according to Family)
CPA_Family *pclFamily = OAC_fn_pclGetParentActorOfData(this)->m_pclActor->m_pub_fn_pclGetFamily();
ERROR_ASSERT( pclFamily != NULL );
m_pclEnumDescriptorForStates->m_fn_vEmptyList();
////////////////////////////////////////
//For initial State
if ( m_pri_bIsTheInitialState )
{
POSITION pos = pclFamily->m_oListOfActions.GetHeadPosition();
CPA_Action *pclCurrentAction;
while ( pos != NULL )
{
pclCurrentAction = pclFamily->m_oListOfActions.GetNext(pos);
if ( ( pclCurrentAction != NULL ) && ( pclCurrentAction->mfn_p_oGetDefaultState() != NULL ))
m_pclEnumDescriptorForStates->m_fn_pclAddElement(pclCurrentAction->mfn_p_oGetDefaultState()->GetName(),
(long)(pclCurrentAction->mfn_p_oGetDefaultState()->GetData())
);
}
}
//For current State
else
{
POSITION pos = pclFamily->m_oListOfStates.GetHeadPosition();
CPA_State *pclCurrentState;
while ( pos != NULL )
{
pclCurrentState = pclFamily->m_oListOfStates.GetNext(pos);
if ( pclCurrentState != NULL )
m_pclEnumDescriptorForStates->m_fn_pclAddElement(pclCurrentState->GetName(),
(long)(pclCurrentState->GetData())
);
}
}
//Always adds a reference to NULL pointer
m_pclEnumDescriptorForStates->m_fn_pclAddElement("No State !", 0L);
////////////////////////////////////////
//For Initial and Current Action
m_pclEnumDescriptorForActions->m_fn_vEmptyList();
POSITION pos = pclFamily->m_oListOfActions.GetHeadPosition();
CPA_Action *pclCurrentAction;
while ( pos != NULL )
{
pclCurrentAction = pclFamily->m_oListOfActions.GetNext(pos);
if ( pclCurrentAction != NULL )
m_pclEnumDescriptorForActions->m_fn_pclAddElement( pclCurrentAction->GetName(),
(long)(pclCurrentAction)
);
}
//Always adds a reference to NULL pointer
m_pclEnumDescriptorForActions->m_fn_pclAddElement("No Action !", 0L);
}
//************************************************************************
//Called when Action Data has been changed, to update State Data
BOOL CPA_Editor_StateData::m_fn_bSetCurrentValueForStateAccordingToAction()
{
BOOL bReturn = FALSE;
if ( m_pclCurrentValueForActions != NULL )
{
//Gets new Action
CPA_Action *pclAction = (CPA_Action *)m_pclCurrentValueForActions->m_pub_fn_lGetValue();
if ( pclAction != NULL )
{
//Gets Action default state
CPA_State *pclActionDefaultState = pclAction->mfn_p_oGetDefaultState();
//Sets new current value for State
if ( pclActionDefaultState != NULL )
m_pclCurrentValueForStates = m_pclEnumDescriptorForStates->m_fn_pclGetElementFromEnumIndex((long)pclActionDefaultState->GetData());
else
m_pclCurrentValueForStates = m_pclEnumDescriptorForStates->m_fn_pclGetElementFromEnumIndex(0L);
}
else
m_pclCurrentValueForStates = m_pclEnumDescriptorForStates->m_fn_pclGetElementFromEnumIndex(0L);
bReturn = TRUE;
}
else
m_pclCurrentValueForStates = m_pclEnumDescriptorForStates->m_fn_pclGetElementFromEnumIndex(0L);
return bReturn;
}
//************************************************************************
BOOL CPA_Editor_StateData::m_pub_fn_bIsTheInitialState()
{
return m_pri_bIsTheInitialState;
}