reman3/Rayman_X/cpa/tempgrp/TAc/src/FAModif.cpp

331 lines
12 KiB
C++

//#################################################################################
//
// BASE IMPLEMENTATION CLASS OF DLL interface Modification
//
//#################################################################################
//
//
#include "stdafx.h"
#include "ACP_Base.h"
#include "ITF.h"
#include "TAC.h"
#include "TFa.h"
#include "TAn.h"
#include "FAModif.hpp"
#include "ACInterf.hpp"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Family_DelAllActions
// ----------------------------------------------------------------------------
// Description : constructor
// ----------------------------------------------------------------------------
Family_DelAllActions::Family_DelAllActions(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily)
:CPA_Modif(0, "Delete all actions", FALSE)
{
m_p_oParentDLL = _p_oParentDLL ;
m_p_oFamily = _p_oFamily ;
m_p_oInitialAction = NULL;
}
// ----------------------------------------------------------------------------
// Description : destructor
// ----------------------------------------------------------------------------
Family_DelAllActions::~Family_DelAllActions()
{
if( HasBeenDone() )
{
// delete all actions
POSITION stPosAction = m_oListOfActionsDeleted . GetHeadPosition () ;
while ( stPosAction )
{
CPA_Action *p_oAction = m_oListOfActionsDeleted . GetNext ( stPosAction ) ;
// delete all states of action
POSITION stPosState = p_oAction -> m_oListOfStates . GetHeadPosition () ;
while ( stPosState )
{
delete p_oAction -> m_oListOfStates . GetNext ( stPosState ) ;
}
delete p_oAction ;
}
}
}
// ----------------------------------------------------------------------------
// Description : Do 'DelAllActions'
// ----------------------------------------------------------------------------
BOOL Family_DelAllActions::Do()
{
// modify data
// save initial action
m_p_oInitialAction = m_p_oFamily -> mfn_p_oGetInitialAction() ;
// remove all actions from family
m_oListOfActionsDeleted . RemoveAll () ;
m_oListOfStates . RemoveAll();
m_oListOfInitialStates . RemoveAll();
//
while( ! m_p_oFamily -> m_oListOfActions . IsEmpty() )
{
CPA_Action *p_oAction = m_p_oFamily -> m_oListOfActions . GetHead();
// save action
m_oListOfActionsDeleted . AddTail( p_oAction );
// save default state
m_oListOfInitialStates . AddTail( p_oAction -> mfn_p_oGetDefaultState() );
// remove all state from action
while( ! p_oAction -> m_oListOfStates . IsEmpty() )
{
CPA_State *p_oState = p_oAction -> m_oListOfStates . GetHead();
// save state
m_oListOfStates . AddTail( p_oState );
// unvalidate && unsave
p_oState -> fn_bUnValidate () ;
p_oState -> fn_vNotifyUnSave();
// remove from action
p_oAction -> mfn_vRemoveState( p_oState );
}
// remove action
m_p_oFamily -> mfn_vRemoveAction( p_oAction );
//
g_oCoherenceManager . m_fn_vDeleteObject( p_oAction );
// unvalidate && unsave
p_oAction -> fn_bUnValidate () ;
p_oAction -> fn_vNotifyUnSave();
}
//
// no Initial Action
m_p_oFamily -> mfn_vSetInitialAction( NULL ) ;
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vAllActionsDeleted ( m_p_oFamily ) ;
return TRUE;
}
// ----------------------------------------------------------------------------
// Description : undo 'DelAllActions'
// ----------------------------------------------------------------------------
BOOL Family_DelAllActions::Undo()
{
// restore all actions
POSITION stPosAction = m_oListOfActionsDeleted . GetHeadPosition () ;
while ( stPosAction )
{
CPA_Action *p_oAction = m_oListOfActionsDeleted . GetNext ( stPosAction ) ;
m_p_oFamily -> mfn_vAddAction( p_oAction ) ;
// Re-register action
p_oAction -> fn_bValidate();
p_oAction -> fn_vNotifyRestore();
}
// restore all states
POSITION stPosState = m_oListOfStates . GetHeadPosition () ;
while ( stPosState )
{
CPA_State *p_oState = m_oListOfStates . GetNext ( stPosState ) ;
p_oState -> mfn_p_oGetAction() -> mfn_vAddState( p_oState );
// Re-register state
p_oState -> fn_bValidate();
p_oState -> fn_vNotifyRestore();
}
// restore all initial states
stPosState = m_oListOfInitialStates . GetHeadPosition () ;
while ( stPosState )
{
CPA_State *p_oState = m_oListOfStates . GetNext ( stPosState ) ;
p_oState -> mfn_p_oGetAction() -> mfn_vSetDefaultState( p_oState );
}
// uses coherence manager
stPosAction = m_oListOfActionsDeleted . GetHeadPosition () ;
while ( stPosAction )
{
CPA_Action *p_oAction = m_oListOfActionsDeleted . GetNext ( stPosAction ) ;
g_oCoherenceManager . m_fn_vRestoreObject( p_oAction );
}
// restore Initial Action
m_p_oFamily -> mfn_vSetInitialAction( m_p_oInitialAction ) ;
// update display
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vSetCurrentFamily ( m_p_oFamily ) ;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Family_StateChange
Family_StateChange::Family_StateChange(TAction_Interface *_p_oParentDLL, long _lTypeOfChange,
void *_p_vAfter, void *_p_vBefore,
long _lAfter /*=0*/, long _lBefore /*=0*/)
:CPA_Modif(0, "" , FALSE )
{
m_p_oParentDLL = _p_oParentDLL;
m_lTypeOfChange = _lTypeOfChange;
m_p_vBefore = _p_vBefore;
m_p_vAfter = _p_vAfter;
m_lBefore = _lBefore;
m_lAfter = _lAfter;
//
switch( m_lTypeOfChange )
{
case C_eNone : SetName(""); break;
case C_eMode : SetName("Swap Editor Mode"); break;
case C_eFamily : SetName("Select Family"); break;
case C_eAction : SetName("Select Action"); break;
case C_eActionList :
SetName("Select Action");
//
if( m_lBefore )
{
m_p_vBefore = (int*) malloc( m_lBefore * sizeof(int) );
memcpy( m_p_vBefore, _p_vBefore, m_lBefore * sizeof(int) );
}
else
m_p_vBefore = NULL;
//
if( m_lAfter )
{
m_p_vAfter = (int*) malloc( m_lAfter * sizeof(int) );
memcpy( m_p_vAfter, _p_vAfter, m_lAfter * sizeof(int) );
}
else
m_p_vAfter = NULL;
break;
case C_eState : SetName("Select State"); break;
case C_eNameList : SetName("Select List of Names"); break;
case C_eZAList : SetName("Select List of Activations"); break;
case C_eZA : SetName("Select Activation"); break;
}
}
Family_StateChange::~Family_StateChange()
{
if( m_lTypeOfChange == C_eActionList )
{
if( m_p_vBefore ) free( (int*)m_p_vBefore );
if( m_p_vAfter ) free( (int*)m_p_vAfter );
}
}
// actions
BOOL Family_StateChange::Do()
{
return ( mfn_bSomethingToDo() && mfn_vMakeChange( m_p_vAfter, m_lAfter ) );
}
BOOL Family_StateChange::Undo()
{
return ( mfn_bSomethingToDo() && mfn_vMakeChange( m_p_vBefore, m_lBefore ) );
}
BOOL Family_StateChange::mfn_bSomethingToDo()
{
switch( m_lTypeOfChange )
{
case C_eNone : return FALSE;
case C_eMode :
case C_eFamily :
case C_eAction :
case C_eState :
case C_eNameList:
case C_eZAList :
case C_eZA : return ( m_p_vAfter != m_p_vBefore );
case C_eActionList: return ( ( m_p_vAfter != m_p_vBefore ) || ( m_lAfter != m_lBefore ) );
}
return TRUE;
}
BOOL Family_StateChange::mfn_vMakeChange(void *_p_vValue, long _lValue)
{
switch( m_lTypeOfChange )
{
case C_eNone :
break;
case C_eMode :
m_p_oParentDLL -> mfn_vSetEditMode( (BOOL)_p_vValue, FALSE );
break;
case C_eFamily :
m_p_oParentDLL -> mfn_vSetCurrentFamily( (CPA_Family*)_p_vValue );
break;
case C_eAction :
m_p_oParentDLL -> mfn_vSetCurrentAction( (CPA_Action*)_p_vValue );
break;
case C_eActionList:
m_p_oParentDLL -> mfn_vSetCurrentActionList( (int*)_p_vValue, _lValue );
break;
case C_eState :
m_p_oParentDLL -> mfn_vSetCurrentState( (CPA_State*)_p_vValue );
break;
case C_eNameList:
m_p_oParentDLL -> mfn_vSetCurrentNameList( (CPA_tdoNameList*)_p_vValue );
break;
case C_eZAList :
m_p_oParentDLL -> mfn_vSetCurrentZAList( (CPA_ZonesActivatingList*)_p_vValue );
break;
case C_eZA :
m_p_oParentDLL -> mfn_vSetCurrentZA( (CPA_ZonesActivating*)_p_vValue );
break;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Family_ModifInitialAction
Family_ModifInitialAction::Family_ModifInitialAction(TAction_Interface *_p_oParentDLL, CPA_Family *_p_oFamily, CPA_Action *_p_oNewInitialAction)
:CPA_Modif(0, "Change Initial Action" , FALSE )
{
m_p_oParentDLL = _p_oParentDLL;
m_p_oFamily = _p_oFamily;
m_p_oNewInitialAction = _p_oNewInitialAction;
m_p_oPreviousInitialAction = m_p_oFamily -> mfn_p_oGetInitialAction();
}
Family_ModifInitialAction::~Family_ModifInitialAction()
{
}
// ----------------------------------------------------------------------------
// Description : Do 'ModifInitialAction'
// ----------------------------------------------------------------------------
BOOL Family_ModifInitialAction::Do()
{
m_p_oFamily -> mfn_vSetInitialAction( m_p_oNewInitialAction );
m_p_oNewInitialAction -> fn_vNotifySave();
m_p_oPreviousInitialAction -> fn_vNotifySave();
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily, m_p_oNewInitialAction );
return TRUE;
}
// ----------------------------------------------------------------------------
// Description : UnDo 'ModifInitialAction'
// ----------------------------------------------------------------------------
BOOL Family_ModifInitialAction::Undo()
{
m_p_oFamily -> mfn_vSetInitialAction( m_p_oPreviousInitialAction );
m_p_oNewInitialAction -> fn_vNotifySave();
m_p_oPreviousInitialAction -> fn_vNotifySave();
if( m_p_oParentDLL -> fn_bIsCurrentEditor () )
m_p_oParentDLL -> mfn_vActionCreated( m_p_oFamily, m_p_oPreviousInitialAction );
return TRUE;
}