/*============================================================================= * * Filename: CPAZnAtv.cpp * Version: 1.0 * Date: 14/02/97 * Author: Marc Trabucato * * Description: implementation of CPA_ZonesActivating class * *===========================================================================*/ #ifdef ACTIVE_EDITOR #include "stdafx.h" #include "ACP_Base.h" #include "ITF.h" #include "DPT.h" #include "TAC.h" #include "TFa.h" #include "OAc.h" #include "ErO.h" #include "ACInterf.hpp" /****************************************************************************** * Macros ******************************************************************************/ #define M_ForEachElement(p_oList,p_oElement,Pos) \ for( p_oElement = (p_oList) -> GetHeadElement( Pos ) ; \ p_oElement ; \ p_oElement = (p_oList) -> GetNextElement( Pos ) \ ) #define M_CHAR(string) ( (char*) (LPCTSTR) (string) ) /****************************************************************************** * Constants ******************************************************************************/ #define C_cNoZone 0 #define C_cZDd 1 #define C_cZDe 2 #define C_cZDm 4 #define C_cZDr 8 /*============================================================================= * * Description: implementation of CPA_ZdxIndex class * *===========================================================================*/ DeclareTemplateStatic(ZDX_tdxHandleToZdxIndexList) DeclareTemplateStatic(ZDX_tdxHandleToZoneSetList) DeclareTemplateStatic(ZDX_tdxHandleToCsaList) DeclareTemplateStatic(ZDX_tdxHandleToZoneSetEncapsulation) void del(ZDX_tdxHandleToZdxIndexList h) { if (M_GetMainApp()->m_bLeavingApplication) return; fn_vFreeZdxIndexListElement(h); } // ---------------------------------------------------------------------------- // Description : init engine functions // ---------------------------------------------------------------------------- void CPA_ZdxIndex::Init() { CPA_EdMot::Init(fn_p_stCreateZdxIndexListElement,NULL/*ZDX_fn_vCopyStruct_ZdxIndexListElement*/,del); } // ---------------------------------------------------------------------------- // Description : constructor // ---------------------------------------------------------------------------- CPA_ZdxIndex::CPA_ZdxIndex(ZDX_tdxHandleToZdxIndexList _hEngineStruct) :CPA_EdMot(_hEngineStruct) { if( !_hEngineStruct && !GetStruct() ) SetStruct(fn_p_stCreateZdxIndexListElement()); } // ---------------------------------------------------------------------------- // Description : destructor // ---------------------------------------------------------------------------- CPA_ZdxIndex::~CPA_ZdxIndex() { } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZdxIndex::mfn_vSetIndex(unsigned short usIndex) { if( GetStruct() ) { //fn_vSetIndexOfZdxIndexList( GetStruct(), usIndex ); GetStruct() -> uwZdxIndex = usIndex; } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- unsigned short CPA_ZdxIndex::mfn_usGetIndex(void) { return ( GetStruct() ? fn_uwGetIndexFromZdxIndexList( GetStruct() ) : -1 ); } /*=============================================================================* *=============================================================================* *=============================================================================* *=============================================================================* *=============================================================================* * * * Description: implementation of CPA_ZonesActivating class * * *=============================================================================* *=============================================================================* *=============================================================================* *=============================================================================* *=============================================================================*/ // ---------------------------------------------------------------------------- // Description : init engine functions // ---------------------------------------------------------------------------- void CPA_ZonesActivating::Init() { CPA_EdMot::Init(fn_p_stCreateZoneSetListElement,NULL,fn_vFreeZoneSetListElement); } /*----------------------------------------------------------------------------- * Description : save 'NewActivationZone' section *---------------------------------------------------------------------------*/ void CPA_ZonesActivating::fn_vCallBackSave( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_p_vData, SCR_tde_Ntfy_Action _eAction) { CPA_ZonesActivating *p_oZA = (CPA_ZonesActivating*)_p_vData; char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szIdName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; POSITION stPos; CPA_ZdxIndex *p_oZdxIndex; char szValue[10]; unsigned int uiLastIndent = SCR_g_ui_SvL0_IndentationLevel; SCR_g_ui_SvL0_IndentationLevel = 1; switch ( _eAction ) { case SCR_EA_Ntfy_AddSection: case SCR_EA_Ntfy_RebuildSection: // construct section name SCR_fn_v_RdL0_SplitSectionName( _p_szSectionName, NULL, szActionName, szIdName ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, NULL, szActionName, szIdName ); // save begin section SCR_M_SvL0_SaveBeginSection(_p_stFile, szSectionName, SCR_CC_C_Cfg_EOL ); // save entries M_ForEachElement( &p_oZA -> m_oListOfZDxNameIdx, p_oZdxIndex, stPos ) { SCR_M_SvL0_SaveEntry(_p_stFile, "ZdxIndex", SCR_CC_C_Cfg_NoChar ); SCR_fn_v_SvL0_SaveParameters_MP(_p_stFile, SCR_EF_SvL0_Normal, 1, itoa( p_oZdxIndex -> mfn_usGetIndex(), szValue, 10 ) ); } // save end section SCR_M_SvL0_SaveEndSection(_p_stFile, SCR_CC_C_Cfg_EOL ); SCR_M_SvL0_SaveBlankLine( _p_stFile ); // update 'Existing section' bool p_oZA -> fn_vSectionSaved(); break; case SCR_EA_Ntfy_DeleteSection: p_oZA -> fn_vSectionDeleted(); break; } SCR_g_ui_SvL0_IndentationLevel = uiLastIndent; } // ---------------------------------------------------------------------------- // Description : constructor (to create a new element) // ---------------------------------------------------------------------------- CPA_ZonesActivating::CPA_ZonesActivating( CPA_EditorBase *_p_oEditor, CPA_BaseObject *_p_oOwnerNamesList, CString _csName /*=""*/) :CPA_SaveObject( _p_oEditor, C_szZATypeName, E_ss_Responsible, _p_oOwnerNamesList, TRUE, fn_szGetFamiliesDataPath(), CPA_ZonesActivating::fn_vCallBackSave), CPA_EdMot() { ASSERT( _p_oOwnerNamesList ); // Section and File Name char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; char szReferencedSectionName[SCR_CV_ui_Cfg_MaxLenName]; strcpy( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, "\\" ); strcat( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, ".acz" ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, szFileName, "ActivationZone", NULL ); SCR_fn_v_RdL0_ComputeSectionName( szReferencedSectionName, szSectionName, "NewActivationZone", "" ); SetReferencedSectionName( szReferencedSectionName ); SetSectionData( this ); SetExistingSection( FALSE ); // Name if( fn_eRename( _csName ) != E_mc_None ) SetDefaultValidName( _csName ); fn_vUpdateSectionName(); // Init Datas m_oListOfZDxNameIdx . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hZdxIndexList : NULL ) ; m_oListOfZAListUsing . RemoveAll(); // fn_vNotifySave(); } // ---------------------------------------------------------------------------- // Description : constructor (to encapsulate an existing engine element) // ---------------------------------------------------------------------------- CPA_ZonesActivating::CPA_ZonesActivating(CPA_EditorBase *_p_oEditor, CPA_BaseObject *_p_oOwnerNamesList, CString _csName, ZDX_tdxHandleToZoneSetList hZoneSetList) :CPA_SaveObject( _p_oEditor, C_szZATypeName, E_ss_Responsible, _p_oOwnerNamesList, TRUE, fn_szGetFamiliesDataPath(), CPA_ZonesActivating::fn_vCallBackSave), CPA_EdMot(hZoneSetList) { ASSERT( _p_oOwnerNamesList ); // Section and File Name char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; char szReferencedSectionName[SCR_CV_ui_Cfg_MaxLenName]; strcpy( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, "\\" ); strcat( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, ".acz" ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, szFileName, "ActivationZone", NULL ); SCR_fn_v_RdL0_ComputeSectionName( szReferencedSectionName, szSectionName, "NewActivationZone", "" ); SetReferencedSectionName( szReferencedSectionName ); SetSectionData( this ); SetExistingSection( TRUE ); // Name if( fn_eRename( _csName ) != E_mc_None ) SetDefaultValidName( _csName ); fn_vUpdateSectionName(); // Init Datas m_oListOfZDxNameIdx . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hZdxIndexList : NULL ) ; // fill list of ZdxIndex ZDX_tdxHandleToZdxIndexList hZdxIndexList; int iIndex = 0; LST2_M_StaticForEachElementOf( & GetStruct() -> hZdxIndexList, hZdxIndexList, iIndex) { CPA_ZdxIndex *p_ZdxIndex = new CPA_ZdxIndex( hZdxIndexList ); m_oListOfZDxNameIdx . AddTail( p_ZdxIndex, FALSE ); } m_oListOfZAListUsing . RemoveAll(); } // ---------------------------------------------------------------------------- // Description : destructor // ---------------------------------------------------------------------------- CPA_ZonesActivating::~CPA_ZonesActivating() { if (M_GetMainApp()->m_bLeavingApplication == FALSE) { while( ! m_oListOfZDxNameIdx . IsEmpty() ) { delete (m_oListOfZDxNameIdx . RemoveHead()); } while( ! m_oListOfZAListUsing . IsEmpty() ) { free( m_oListOfZAListUsing . RemoveHead() ); } } } // ---------------------------------------------------------------------------- // Description : check unicity using family // ---------------------------------------------------------------------------- tdeMissingCriteria CPA_ZonesActivating::fn_eCheckUnicity( const CString csNewName ) { CPA_BaseObject *p_oFamily = GetOwner() -> GetOwner(); CPA_List oList; long lNbObjects; if (csNewName.IsEmpty()) return E_mc_NoName; // // search ZA with same name on invalid objects lNbObjects = GetInvalidObjectList() -> fn_lFindObjects( & oList, csNewName, GetType() ); if( lNbObjects > 0 ) { // find objects with same name // search object with same family POSITION xPos = oList . GetHeadPosition(); while( xPos ) { CPA_BaseObject* p_oZA = oList . GetNext( xPos ); if( p_oZA -> GetOwner() -> GetOwner() == p_oFamily ) { // find one object, invalid name return ( E_mc_OwnerUnicity ); } } } oList . RemoveAll(); // search ZA with same name on valid objects lNbObjects = GetBaseObjectList() -> fn_lFindObjects( & oList, csNewName, GetType() ); if( lNbObjects > 0 ) { // find objects with same name // search object with same family POSITION xPos = oList . GetHeadPosition(); while( xPos ) { CPA_BaseObject* p_oZA = oList . GetNext( xPos ); if( p_oZA -> GetOwner() -> GetOwner() == p_oFamily ) { // find one object, invalid name return ( E_mc_OwnerUnicity ); } } } // ok return ( E_mc_None ); } // ---------------------------------------------------------------------------- // Description : overload SetStruct function // ---------------------------------------------------------------------------- void CPA_ZonesActivating::SetStruct(ZDX_tdxHandleToZoneSetList _hZdxIndexList) { CPA_EdMot::SetStruct(_hZdxIndexList); m_oListOfZDxNameIdx . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hZdxIndexList : NULL ) ; } // ---------------------------------------------------------------------------- // Description : set Activation of given zone // ---------------------------------------------------------------------------- void CPA_ZonesActivating::mfn_vSetZoneActivation(unsigned short _usZoneIndex, BOOL _bActivation) { if ( _usZoneIndex < ((CPA_tdoNameList*)GetOwner())->GetCount() ) { POSITION stPos = mfn_xGetPosZoneActivation( _usZoneIndex ); if( stPos && !_bActivation) { CPA_ZdxIndex *p_oZdxIndex = m_oListOfZDxNameIdx . GetAt( stPos ); m_oListOfZDxNameIdx . RemoveAt( stPos ); delete p_oZdxIndex; } else if( !stPos && _bActivation ) { CPA_ZdxIndex *p_oZdxIndex = new CPA_ZdxIndex(); p_oZdxIndex -> mfn_vSetIndex( _usZoneIndex ); stPos = m_oListOfZDxNameIdx . GetHeadPosition(); while( stPos && m_oListOfZDxNameIdx . GetAt( stPos ) -> mfn_usGetIndex() < _usZoneIndex ) { m_oListOfZDxNameIdx . GetNext( stPos ); } if( stPos ) m_oListOfZDxNameIdx . InsertBefore( stPos, p_oZdxIndex ); else m_oListOfZDxNameIdx . AddTail( p_oZdxIndex ); } } } // ---------------------------------------------------------------------------- // Description : delete zone of given index and shift bigger indexes // ---------------------------------------------------------------------------- void CPA_ZonesActivating::mfn_vRemoveZone(unsigned short _usZoneIndex) { POSITION xPos = m_oListOfZDxNameIdx . GetHeadPosition(); while ( xPos ) { POSITION xCurPos = xPos; CPA_ZdxIndex *p_oZdxIndex = m_oListOfZDxNameIdx . GetNext( xPos ); unsigned short usCurrentIdx = p_oZdxIndex -> mfn_usGetIndex(); // if( usCurrentIdx == _usZoneIndex ) { // remove current index m_oListOfZDxNameIdx . RemoveAt( xCurPos ); delete p_oZdxIndex; } else if( usCurrentIdx > _usZoneIndex ) { // shift current index p_oZdxIndex -> mfn_vSetIndex( usCurrentIdx-1 ); } } } // ---------------------------------------------------------------------------- // Description : insert zone of given index and shift bigger indexes // ---------------------------------------------------------------------------- void CPA_ZonesActivating::mfn_vInsertZone(unsigned short _usZoneIndex) { POSITION stPos = m_oListOfZDxNameIdx . GetHeadPosition(); while ( stPos ) { CPA_ZdxIndex *p_oZdxIndex = m_oListOfZDxNameIdx . GetNext( stPos ); unsigned short usCurrentIdx = p_oZdxIndex -> mfn_usGetIndex(); // if( usCurrentIdx >= _usZoneIndex ) { // shift current index p_oZdxIndex -> mfn_vSetIndex( usCurrentIdx+1 ); } } } // ---------------------------------------------------------------------------- // Description : return copy of current ZA // ---------------------------------------------------------------------------- CPA_ZonesActivating *CPA_ZonesActivating::mfn_p_oDuplicateZA() { CPA_ZonesActivating *p_oNewZA = new CPA_ZonesActivating( GetEditor(), GetOwner(), "CopyOf"+GetName() ); POSITION stPos = m_oListOfZDxNameIdx . GetHeadPosition(); while( stPos ) { CPA_ZdxIndex *p_oZdxIndex = m_oListOfZDxNameIdx . GetNext( stPos ); p_oNewZA -> mfn_vSetZoneActivation( p_oZdxIndex -> mfn_usGetIndex(), TRUE ); } return p_oNewZA; } // ---------------------------------------------------------------------------- // Description : return POSITION of given zone // ---------------------------------------------------------------------------- POSITION CPA_ZonesActivating::mfn_xGetPosZoneActivation(unsigned short _usZoneIndex) { POSITION stPos = m_oListOfZDxNameIdx . GetHeadPosition(); while ( stPos && ( m_oListOfZDxNameIdx . GetAt ( stPos ) -> mfn_usGetIndex() != _usZoneIndex ) ) { m_oListOfZDxNameIdx . GetNext ( stPos ); } return stPos; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivating::mfn_vUsedByZAList(CPA_ZonesActivatingList *_p_oZAList, CPA_State *_p_oState) { if( _p_oZAList -> GetOwner() != GetOwner() ) return; if( fn_bIsValid() ) { POSITION xPos = mfn_xGetZAListPos( _p_oZAList, _p_oState ); if( xPos == NULL ) { // create new tdstZAUsed *p_stUsed = (tdstZAUsed*) malloc( sizeof(tdstZAUsed) ); p_stUsed -> p_oZAList = _p_oZAList; p_stUsed -> p_oState = _p_oState; m_oListOfZAListUsing . AddTail( p_stUsed ); } } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivating::mfn_vDontUsedByZAList(CPA_ZonesActivatingList *_p_oZAList, CPA_State *_p_oState) { if( _p_oZAList -> GetOwner() != GetOwner() ) return; if( fn_bIsValid() ) { POSITION xPos = mfn_xGetZAListPos( _p_oZAList, _p_oState ); if( xPos != NULL ) { // delete free( m_oListOfZAListUsing . GetAt( xPos ) ); m_oListOfZAListUsing . RemoveAt( xPos ); } } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- POSITION CPA_ZonesActivating::mfn_xGetZAListPos(CPA_ZonesActivatingList *_p_oZAList, CPA_State *_p_oState) { POSITION xPos = m_oListOfZAListUsing . GetHeadPosition(); while( xPos ) { tdstZAUsed *p_stUsed = m_oListOfZAListUsing . GetAt( xPos ); if( ( p_stUsed -> p_oZAList == _p_oZAList ) && ( p_stUsed -> p_oState == _p_oState ) ) break; m_oListOfZAListUsing . GetNext( xPos ); } return xPos; } /*=============================================================================* *=============================================================================* *=============================================================================* * * Description: description of CPA_ActivationState class * *=============================================================================* *=============================================================================* *=============================================================================*/ // ---------------------------------------------------------------------------- // Description : init engine functions // ---------------------------------------------------------------------------- void CPA_ActivationState::Init() { CPA_EdMot::Init(fn_p_stCreateZoneSetEncapsulation,NULL,fn_vFreeZoneSetEncapsulation); } // ---------------------------------------------------------------------------- // Description : constructor (new element) // ---------------------------------------------------------------------------- CPA_ActivationState::CPA_ActivationState(CPA_ZonesActivatingList *_p_oZAList, CPA_State *_p_oState, CPA_ZonesActivating *_p_oZA, BOOL _bSectionExists) :CPA_SectionObject("", fn_szGetFamiliesDataPath(), CPA_ActivationState::fn_vCallBackSave, NULL, _bSectionExists), CPA_EdMot() { ASSERT( _p_oZAList ); BOOL bCanDo = ( !_p_oZA || ( _p_oZAList -> GetOwner() == _p_oZA -> GetOwner() ) ); if( !bCanDo ) { CString csMessage1 = "Create a CPA_ActivationState (" + _p_oZAList -> GetName() + ", " + (_p_oZA ? _p_oZA -> GetName() : "NO ZA") + ", " + (_p_oState ? _p_oState -> GetName() : "NO STATE") + ")"; CString csMessage2 = "CPA_ActivationState::CPA_ActivationState"; CString csMessage3 = "ZAList and ZA haven\'t same NamesList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT(0); } else { // datas m_p_oZAList = _p_oZAList; m_p_oZA = _p_oZA; m_p_oState = _p_oState; // char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; // Referenced Section Name mfn_vComputeReferencedSectionName( szSectionName, _p_oState ); SetReferencedSectionName( szSectionName ); SetSectionData( this ); // m_p_oState -> mfn_vAddOnZAList( m_p_oZAList, m_p_oZA ); mfn_bUpdate( NULL ); } } // ---------------------------------------------------------------------------- // Description : constructor (existing element) // ---------------------------------------------------------------------------- CPA_ActivationState::CPA_ActivationState(CPA_ZonesActivatingList *_p_oZAList, ZDX_tdxHandleToZoneSetEncapsulation _hZoneSetEncapsulation /*=NULL*/) :CPA_SectionObject("", fn_szGetFamiliesDataPath(), CPA_ActivationState::fn_vCallBackSave, NULL, TRUE), CPA_EdMot(_hZoneSetEncapsulation) { ASSERT( _p_oZAList ); ASSERT( _hZoneSetEncapsulation ); // init datas m_p_oZAList = _p_oZAList; m_p_oZA = NULL; m_p_oState = NULL; // update datas mfn_vInitZA(); mfn_vInitState(); } // ---------------------------------------------------------------------------- // Description : copy constructor // ---------------------------------------------------------------------------- CPA_ActivationState::CPA_ActivationState(CPA_ActivationState &_r_oSource) :CPA_SectionObject(_r_oSource), CPA_EdMot(_r_oSource . GetStruct()) { SetExistingSection( FALSE ); SetSectionData( this ); // datas m_p_oZAList = _r_oSource . m_p_oZAList; m_p_oZA = _r_oSource . m_p_oZA; m_p_oState = _r_oSource . m_p_oState; // m_p_oState -> mfn_vAddOnZAList( m_p_oZAList, m_p_oZA ); } // ---------------------------------------------------------------------------- // Description : init editor ZA with engine Encapsulation ZA // ---------------------------------------------------------------------------- void CPA_ActivationState::mfn_vInitZA(void) { ASSERT( m_p_oZAList ); ASSERT( GetStruct() ); if( GetStruct() -> p_stZoneSetList ) { m_p_oZA = (CPA_ZonesActivating*)m_p_oZAList -> GetEditor() -> GetBaseObject( GetStruct() -> p_stZoneSetList, C_szZATypeName, m_p_oZAList -> GetOwner() ); if( m_p_oZA ) { if( m_p_oZA -> GetOwner() != m_p_oZAList -> GetOwner() ) { CString csMessage1 = "Try to Create a CPA_ActivationState"; CString csMessage2 = "CPA_ActivationState::mfn_vInitZA"; CString csMessage3 = "ZA hasn\'t same NamesList as ZAList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT(0); } } else { CString csMessage1 = "Try to Create a CPA_ActivationState"; CString csMessage2 = "CPA_ActivationState::mfn_vInitZA"; CString csMessage3 = "Can't find editor ZA corresponding to engine ZA"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT(0); } } else SetExistingSection( FALSE ); } // ---------------------------------------------------------------------------- // Description : init editor state with engine Encapsulation state // ---------------------------------------------------------------------------- void CPA_ActivationState::mfn_vInitState(void) { ASSERT( m_p_oZAList ); ASSERT( GetStruct() ); tdxHandleToState hState = NULL; CPA_Family *p_oFamily = (CPA_Family*)m_p_oZAList -> GetOwner() -> GetOwner(); unsigned short uwI; LST2_M_StaticGetElementNumber( & p_oFamily -> GetStruct() -> hForStateArray, hState, GetStruct() -> uwIndex, uwI ); if( hState ) { m_p_oState = (CPA_State*)m_p_oZAList -> GetEditor() -> GetBaseObject( hState, C_szStateTypeName, p_oFamily ); if( m_p_oState ) { // char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; // Referenced Section Name mfn_vComputeReferencedSectionName( szSectionName, m_p_oState ); SetReferencedSectionName( szSectionName ); SetSectionData( this ); // m_p_oState -> mfn_vAddOnZAList( m_p_oZAList, m_p_oZA ); if( m_p_oZA ) m_p_oZA -> mfn_vUsedByZAList( m_p_oZAList, m_p_oState ); } else { CString csMessage1 = "Try to Create a CPA_ActivationState"; CString csMessage2 = "CPA_ActivationState::mfn_vInitState"; CString csMessage3 = "Can't find editor state corresponding to engine state"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT(0); } } else { CString csMessage1 = "Try to Create a CPA_ActivationState"; CString csMessage2 = "CPA_ActivationState::mfn_vInitState"; CString csMessage3 = "tdstZoneSetEncapsulation has no state"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT(0); } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ActivationState::mfn_vComputeReferencedSectionName( char * _p_szSectionName, CPA_State *_p_oState ) { if( _p_oState != NULL) SCR_fn_v_RdL0_ComputeSectionName( _p_szSectionName, (char*)(LPCTSTR)m_p_oZAList -> fn_csComputeReferencedSectionName(m_p_oZAList -> GetName()), "AddActivation", _p_oState -> fn_p_szGetName() ); else SCR_fn_v_RdL0_ComputeSectionName( _p_szSectionName, (char*)(LPCTSTR)m_p_oZAList -> fn_csComputeReferencedSectionName(m_p_oZAList -> GetName()), "AddActivation", NULL ); } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ActivationState::mfn_vSetZA(CPA_ZonesActivating *_p_oZA) { BOOL bCanDo = ( !_p_oZA || ( m_p_oZAList -> GetOwner() == _p_oZA -> GetOwner() ) ); if( !bCanDo ) { CString csMessage1 = "Set ZA to CPA_ActivationState (" + m_p_oZAList -> GetName() + ", " + (_p_oZA ? _p_oZA -> GetName() : "NO ZA" ) + ", " + (m_p_oState ? m_p_oState -> GetName() : "NO STATE" ) + ")"; CString csMessage2 = "CPA_ActivationState::mfn_vSetZA"; CString csMessage3 = "ZA hasn\'t same NamesList as ZAList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3); ERROR_ASSERT(0); return ; } if( m_p_oZA ) { // previous ZA exists if( _p_oZA && ( m_p_oZA != _p_oZA ) ) { // ZA changed if( GetCurrentNotification() == SCR_EA_Ntfy_DeleteSection ) fn_vRestoreSection(); else fn_vWriteSection(); // update link m_p_oState -> mfn_vAddOnZAList( m_p_oZAList, _p_oZA ); } else { // ZA deleted fn_vDeleteSection(); // delete previous link m_p_oState -> mfn_vDelOnZAList( m_p_oZAList ); } } else { // no previous ZA if( _p_oZA ) { // new ZA if( GetCurrentNotification() == SCR_EA_Ntfy_DeleteSection ) fn_vRestoreSection(); // Shaitan => state list in the level else if (!m_p_oState->GetEditor()->GetInterface()->fn_bIsLoadingWorld()) // End Shaitan => state list in the level fn_vWriteSection(); // add link m_p_oState -> mfn_vAddOnZAList( m_p_oZAList, _p_oZA ); } } m_p_oZA = _p_oZA; mfn_bUpdate( NULL ); } // ---------------------------------------------------------------------------- // Description : update engine datas with editor datas // ---------------------------------------------------------------------------- BOOL CPA_ActivationState::mfn_bUpdate(CPA_ZonesActivating *_p_oDefaultZA) { BOOL bOK = FALSE; // update State Index if( m_p_oState ) { tdxHandleToState hState = (m_p_oState ? m_p_oState -> GetStruct() : NULL ); tdxHandleToState hStateTmp; unsigned short uwIndex; LST2_M_StaticWhatElementNumber(hState, hStateTmp, uwIndex); GetStruct() -> uwIndex = uwIndex; bOK = TRUE; } // update ZA if( m_p_oZA ) { GetStruct() -> p_stZoneSetList = m_p_oZA -> GetStruct(); } else if ( _p_oDefaultZA ) { GetStruct() -> p_stZoneSetList = _p_oDefaultZA -> GetStruct(); } return bOK; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- CPA_State* CPA_ActivationState::mfn_p_oGetState(void) { return m_p_oState; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- CPA_ZonesActivating* CPA_ActivationState::mfn_p_oGetZA(void) { return m_p_oZA; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- CPA_ZonesActivatingList* CPA_ActivationState::mfn_p_oGetZAList(void) { return m_p_oZAList; } /*----------------------------------------------------------------------------- * Description : save 'AddActivation' subsection *---------------------------------------------------------------------------*/ void CPA_ActivationState::fn_vCallBackSave( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_p_vData, SCR_tde_Ntfy_Action _eAction) { // HORROR HORROR if( _eAction == SCR_EA_Ntfy_DeleteSection ) return; // HORROR HORROR CPA_ActivationState *p_oActSt = (CPA_ActivationState*)_p_vData; CPA_State *p_oState = p_oActSt -> mfn_p_oGetState(); CPA_ZonesActivating *p_oZA = p_oActSt -> mfn_p_oGetZA(); CPA_ZonesActivatingList *p_oZAList = p_oActSt -> mfn_p_oGetZAList(); char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szIdName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; char szZARef[SCR_CV_ui_Cfg_MaxLenName]; char szBuffer[SCR_CV_ui_Cfg_MaxLenName]; switch ( _eAction ) { case SCR_EA_Ntfy_AddSection: case SCR_EA_Ntfy_RebuildSection: if ( p_oZAList && p_oState && p_oZA ) { BOOL bCanSave = ( p_oZAList -> GetOwner() == p_oZA -> GetOwner() ); if( !bCanSave ) { CString csMessage1 = "Save CPA_ActivationState (" + p_oZAList -> GetName() + ", " + p_oZA -> GetName() + ", " + p_oState -> GetName() + ")"; CString csMessage2 = "CPA_ActivationState::fn_vCallBackSave"; CString csMessage3 = "ZA hasn\'t same NamesList as ZAList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3); ERROR_ASSERT(0); return; } // construct section name SCR_fn_v_RdL0_SplitSectionName( _p_szSectionName, NULL, szActionName, szIdName ); //SCR_fn_v_RdL0_ComputeSectionName( szSectionName, NULL, szActionName, szIdName ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, NULL, szActionName, p_oState -> fn_p_szGetName() ); // indent subsection SCR_g_ui_SvL0_IndentationLevel+=2; // save begin section SCR_M_SvL0_SaveBeginSection(_p_stFile, szSectionName, SCR_CC_C_Cfg_EOL ); // save entry if( p_oState && p_oZA ) { SCR_M_SvL0_SaveEntry(_p_stFile, "ActivationZone", SCR_CC_C_Cfg_NoChar ); // construct ZA Reference SCR_fn_v_RdL0_ComputeSectionName( szBuffer, "*", "ActivationZone", NULL ); SCR_fn_v_RdL0_ComputeSectionName( szZARef, szBuffer, "NewActivationZone", p_oZA -> fn_p_szGetName() ); SCR_fn_v_SvL0_SaveParameters_MP(_p_stFile, SCR_EF_SvL0_Normal, 2, szZARef, M_CHAR( p_oState -> GetReferencedSectionName() ) ); } // save end section SCR_M_SvL0_SaveEndSection(_p_stFile, SCR_CC_C_Cfg_EOL ); // restore indent SCR_g_ui_SvL0_IndentationLevel-=2; // update 'Existing section' bool p_oActSt -> fn_vSectionSaved(); // SECURE if( strcmp( szIdName, p_oState -> fn_p_szGetName() ) ) { p_oActSt -> mfn_vComputeReferencedSectionName( szSectionName, p_oState ); p_oActSt -> SetReferencedSectionName( szSectionName ); } } else { BOOL bPreviousExistence = p_oActSt -> fn_bSectionExists(); p_oActSt -> fn_vSectionSaved(); p_oActSt -> SetExistingSection( bPreviousExistence ); } break; case SCR_EA_Ntfy_DeleteSection: p_oActSt -> fn_vSectionDeleted(); break; } } /*=============================================================================* *=============================================================================* *=============================================================================* * * Description: description of CPA_ZonesActivatingList class * *=============================================================================* *=============================================================================* *=============================================================================*/ void del(ZDX_tdxHandleToCsaList h) { if (M_GetMainApp()->m_bLeavingApplication) return; fn_vFreeCsaListElement(h); } // ---------------------------------------------------------------------------- // Description : init engine functions // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::Init() { CPA_EdMot::Init(fn_p_stCreateCsaListElement,NULL,del); } /*----------------------------------------------------------------------------- * Description : save 'CreateNewArrayOfZoneSet' section *---------------------------------------------------------------------------*/ void CPA_ZonesActivatingList::fn_vCallBackSave( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_p_vData, SCR_tde_Ntfy_Action _eAction) { CPA_ZonesActivatingList *p_oZAList = (CPA_ZonesActivatingList*)_p_vData; CPA_tdoNameList *p_oNmList = p_oZAList -> mfn_p_oGetZDxNameList(); char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szIdName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; CPA_tdoNameList *p_oNamesList = (CPA_tdoNameList*)p_oZAList -> GetOwner(); unsigned int uiLastIndent = SCR_g_ui_SvL0_IndentationLevel; CPA_Family *p_oFamily = (CPA_Family*) p_oNamesList -> GetOwner(); SCR_g_ui_SvL0_IndentationLevel = 1; switch ( _eAction ) { case SCR_EA_Ntfy_AddSection: case SCR_EA_Ntfy_RebuildSection: // construct section name SCR_fn_v_RdL0_SplitSectionName( _p_szSectionName, NULL, szActionName, szIdName ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, NULL, szActionName, szIdName ); // save begin section SCR_M_SvL0_SaveBeginSection(_p_stFile, szSectionName, SCR_CC_C_Cfg_EOL ); // save end section SCR_M_SvL0_SaveEndSection(_p_stFile, SCR_CC_C_Cfg_EOL ); SCR_M_SvL0_SaveBlankLine( _p_stFile ); // update 'Existing section' bool p_oZAList -> fn_vSectionSaved(); break; case SCR_EA_Ntfy_DeleteSection: p_oZAList -> fn_vSectionDeleted(); break; } SCR_g_ui_SvL0_IndentationLevel = uiLastIndent; } // ---------------------------------------------------------------------------- // Description : constructor // ---------------------------------------------------------------------------- CPA_ZonesActivatingList::CPA_ZonesActivatingList(CPA_EditorBase *_p_oEditor, CPA_BaseObject *_p_oOwnerNamesList, CString _csName /*=""*/, ZDX_tdxHandleToCsaList _hEngineCsaList /*=NULL*/) :CPA_SaveObject( _p_oEditor, C_szZAListTypeName, E_ss_Responsible, _p_oOwnerNamesList, TRUE, fn_szGetFamiliesDataPath(), CPA_ZonesActivatingList::fn_vCallBackSave), CPA_EdMot(_hEngineCsaList) { ASSERT( _p_oOwnerNamesList ); // Section and File Name char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; char szReferencedSectionName[SCR_CV_ui_Cfg_MaxLenName]; strcpy( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, "\\" ); strcat( szFileName, _p_oOwnerNamesList -> GetOwner() -> fn_p_szGetName() ); strcat( szFileName, ".acz" ); SCR_fn_v_RdL0_ComputeSectionName( szSectionName, szFileName, "ArrayOfZoneSet", NULL ); SCR_fn_v_RdL0_ComputeSectionName( szReferencedSectionName, szSectionName, "CreateNewArrayOfZoneSet", "" ); SetReferencedSectionName( szReferencedSectionName ); SetSectionData( this ); SetExistingSection( _hEngineCsaList != NULL ); // // create engine data if( GetStruct() == NULL ) { SetStruct(fn_p_stCreateCsaListElement()); } // // Name if( fn_eRename( _csName ) != E_mc_None ) SetDefaultValidName( _csName ); fn_vUpdateSectionName(); CPA_Family *p_oFamily = (CPA_Family*) _p_oOwnerNamesList -> GetOwner(); // update data m_oListOfZAState . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hZoneSetEncapsulationList : NULL ) ; m_oListOfUnusedZAState . RemoveAll(); if( !_hEngineCsaList ) { fn_vNotifySave(); // fill list with default ZA mfn_vUpdateEditorList(); } else { // existing object ASSERT( LST2_M_StaticGetNumberOfElements( & GetStruct() -> hZoneSetEncapsulationList ) <= LST2_M_StaticGetNumberOfElements( & p_oFamily -> GetStruct() -> hForStateArray ) ); } m_bMustBeUpdated = FALSE; } // ---------------------------------------------------------------------------- // Description : destructor // ---------------------------------------------------------------------------- CPA_ZonesActivatingList::~CPA_ZonesActivatingList() { if (M_GetMainApp()->m_bLeavingApplication == FALSE) { while( ! m_oListOfZAState . IsEmpty() ) { delete (m_oListOfZAState . RemoveHead()); } while( ! m_oListOfUnusedZAState . IsEmpty() ) { free( m_oListOfUnusedZAState . RemoveHead() ); } } } void CPA_ZonesActivatingList::SetStruct(ZDX_tdxHandleToCsaList hCsaList) { CPA_EdMot::SetStruct(hCsaList); m_oListOfZAState . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hZoneSetEncapsulationList : NULL ); } // ---------------------------------------------------------------------------- // Description : check unicity using family // ---------------------------------------------------------------------------- tdeMissingCriteria CPA_ZonesActivatingList::fn_eCheckUnicity( const CString csNewName ) { CPA_BaseObject *p_oFamily = GetOwner() -> GetOwner(); CPA_List oList; long lNbObjects; if (csNewName.IsEmpty()) return E_mc_NoName; // search ZAList with same name on invalid objects lNbObjects = GetInvalidObjectList() -> fn_lFindObjects( & oList, csNewName, GetType() ); if( lNbObjects > 0 ) { // find objects with same name // search object with same family POSITION xPos = oList . GetHeadPosition(); while( xPos ) { CPA_BaseObject* p_oZAList = oList . GetNext( xPos ); if( p_oZAList -> GetOwner() -> GetOwner() == p_oFamily ) { // find one object, invalid name return ( E_mc_OwnerUnicity ); } } } oList . RemoveAll(); // search ZAList with same name on valid objects lNbObjects = GetBaseObjectList() -> fn_lFindObjects( & oList, csNewName, GetType() ); if( lNbObjects > 0 ) { // find objects with same name // search object with same family POSITION xPos = oList . GetHeadPosition(); while( xPos ) { CPA_BaseObject* p_oZAList = oList . GetNext( xPos ); if( p_oZAList -> GetOwner() -> GetOwner() == p_oFamily ) { // find one object, invalid name return ( E_mc_OwnerUnicity ); } } } // ok return ( E_mc_None ); } // ---------------------------------------------------------------------------- // Description : overload fn_vNotify function // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::fn_vNotifySave() { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; CPA_SaveObject::fn_vNotifySave(); M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { p_oStZA -> fn_vWriteSection(); } } // ---------------------------------------------------------------------------- // Description : overload fn_vNotify function // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::fn_vNotifyUnSave() { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; CPA_SaveObject::fn_vNotifyUnSave(); M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { p_oStZA -> fn_vDeleteSection(); } } // ---------------------------------------------------------------------------- // Description : overload fn_vNotify function // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::fn_vNotifyRestore() { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; CPA_SaveObject::fn_vNotifyRestore(); M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { p_oStZA -> fn_vRestoreSection(); } } // ---------------------------------------------------------------------------- // Description : overload fn_vNotify function // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::fn_vNotifyRename() { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; char szSectionName[SCR_CV_ui_Cfg_MaxLenName]; M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { p_oStZA -> mfn_vComputeReferencedSectionName( szSectionName, p_oStZA -> mfn_p_oGetState() ); p_oStZA -> fn_vRenameSection( szSectionName ); } CPA_SaveObject::fn_vNotifyRename(); } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::fn_vUpdateReference ( CPA_SaveObject *_p_oObject ) { if ( _p_oObject -> fn_bIsOfType( C_szStateTypeName ) ) { CPA_ActivationState *p_StZA = mfn_p_oGetActivationStateFromState( (CPA_State*) _p_oObject ); p_StZA -> fn_vWriteSection(); } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vFillZAList(void) { CPA_Family *p_oFamily = (CPA_Family*)GetOwner() -> GetOwner(); // existing object ASSERT( LST2_M_StaticGetNumberOfElements( & GetStruct() -> hZoneSetEncapsulationList ) <= LST2_M_StaticGetNumberOfElements( & p_oFamily -> GetStruct() -> hForStateArray ) ); // fill List with existing tdstZoneSetEncapsulationList ZDX_tdxHandleToZoneSetEncapsulation hEncapsulation; int iIndex = 0; LST2_M_StaticForEachElementOf( & GetStruct() -> hZoneSetEncapsulationList, hEncapsulation, iIndex) { CPA_ActivationState *p_oActSt = new CPA_ActivationState( this, hEncapsulation ); m_oListOfZAState . AddTail( p_oActSt, FALSE ); // already on engine list } // fill list with default ZA mfn_vUpdateEditorList(); } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- int CPA_ZonesActivatingList::mfn_iGetNbZDxNames(void) { return mfn_p_oGetZDxNameList() -> GetCount(); } // ---------------------------------------------------------------------------- // Description : write all ActivationState using given ZA // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vZARenamed(CPA_ZonesActivating *_p_oZA) { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { if( p_oStZA -> mfn_p_oGetZA() == _p_oZA ) p_oStZA -> fn_vWriteSection(); } } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vStateRenamed(CPA_State *_p_oState) { CPA_ActivationState *p_oStZA = mfn_p_oGetActivationStateFromState( _p_oState ); if ( p_oStZA != NULL ) { char szReferencedSectionName[SCR_CV_ui_Cfg_MaxLenName]; p_oStZA -> mfn_vComputeReferencedSectionName( szReferencedSectionName, _p_oState ); p_oStZA -> fn_vRenameSection( szReferencedSectionName ); } } // ---------------------------------------------------------------------------- // Description : append ZA associated with given state // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vSetZAFromState(CPA_ZonesActivating *_p_oZA, CPA_State *_p_oState) { ASSERT( _p_oState ); BOOL bCanDo = ( !_p_oZA || ( GetOwner() == _p_oZA -> GetOwner() ) ); if( !bCanDo ) { CString csMessage1 = "Set ZA to State (" + GetName() + ", " + (_p_oZA ? _p_oZA -> GetName() : "NO ZA") + ", " + _p_oState -> GetName() + ")"; CString csMessage2 = "CPA_ZonesActivatingList::mfn_vSetZAFromState()"; CString csMessage3 = "ZA hasn\'t same NamesList as ZAList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_WARNING, csMessage3 ); ERROR_ASSERT(0); return ; } CPA_ActivationState *p_oStZA = mfn_p_oGetActivationStateFromState( _p_oState, TRUE ); CPA_ZonesActivating *p_oPreviousZA = p_oStZA -> mfn_p_oGetZA(); if ( p_oPreviousZA != _p_oZA ) { // delete previous ZA if( p_oPreviousZA ) p_oPreviousZA -> mfn_vDontUsedByZAList( this, _p_oState ); // add new za p_oStZA -> mfn_vSetZA( _p_oZA ); if( _p_oZA ) _p_oZA -> mfn_vUsedByZAList( this, _p_oState ); m_bMustBeUpdated = TRUE; } } // ---------------------------------------------------------------------------- // Description : remove State from ZAList // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vRemoveState(CPA_State *_p_oState) { POSITION xPos = mfn_xGetPosActivationStateFromState( _p_oState ); if( xPos ) { CPA_ActivationState *p_oStZA = m_oListOfZAState . GetAt( xPos ); p_oStZA -> fn_vDeleteSection(); m_oListOfZAState . RemoveAt( xPos ); m_oListOfUnusedZAState . AddTail( p_oStZA ); } } // ---------------------------------------------------------------------------- // Description : append ZA associated with given state // ---------------------------------------------------------------------------- CPA_ZonesActivating *CPA_ZonesActivatingList::mfn_p_oGetZAFromState(CPA_State *_p_oState) { CPA_ActivationState *p_oStZA = mfn_p_oGetActivationStateFromState( _p_oState ); return p_oStZA -> mfn_p_oGetZA(); } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- CPA_ActivationState *CPA_ZonesActivatingList::mfn_p_oGetActivationStateFromState(CPA_State *_p_oState, BOOL _bWithUnused /*=FALSE*/) { CPA_ActivationState *p_oStZA = NULL; POSITION xPos = mfn_xGetPosActivationStateFromState( _p_oState ); if( xPos ) return m_oListOfZAState . GetAt( xPos ); // if( _p_oState != NULL ) { if( _bWithUnused ) { // search on unused xPos = mfn_xGetPosUnusedActivationStateFromState( _p_oState ); if( xPos ) { p_oStZA = m_oListOfUnusedZAState . GetAt( xPos ); // swap from one list to another m_oListOfUnusedZAState . RemoveAt( xPos ); mfn_vInsertActivationState( p_oStZA ); // return p_oStZA; } } // create new StZA p_oStZA = new CPA_ActivationState( this, _p_oState, NULL, FALSE); mfn_vInsertActivationState( p_oStZA ); } return p_oStZA; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- POSITION CPA_ZonesActivatingList::mfn_xGetPosActivationStateFromState(CPA_State *_p_oState) { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; xPos = m_oListOfZAState . GetHeadPosition(); while ( xPos ) { p_oStZA = m_oListOfZAState . GetAt( xPos ); if( p_oStZA -> mfn_p_oGetState() == _p_oState ) return xPos; m_oListOfZAState . GetNext( xPos ); } return NULL; } // ---------------------------------------------------------------------------- // Description : construct Engine List with local Map // ---------------------------------------------------------------------------- BOOL CPA_ZonesActivatingList::mfn_bUpdate() { BOOL bOK = TRUE; CPA_ZonesActivating *p_oDefaultZA = (CPA_ZonesActivating*)((CPA_tdoNameList*)GetOwner()) -> m_fnp_oGetDefaultZA(); CPA_ActivationState *p_oStZA = NULL; POSITION xPos; M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { bOK &= p_oStZA -> mfn_bUpdate( p_oDefaultZA ); } return bOK; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CPA_ZonesActivatingList::mfn_vUpdateEditorList(void) { POSITION stPos; CPA_Family *p_oFamily = (CPA_Family*)GetOwner()->GetOwner(); CPA_ZonesActivating *p_oDefaultZA = (CPA_ZonesActivating*) ((CPA_tdoNameList*)GetOwner()) -> m_fnp_oGetDefaultZA(); /* if( p_oDefaultZA == NULL ) return; */ BOOL bCanDo = ( !p_oDefaultZA || ( GetOwner() == p_oDefaultZA -> GetOwner() ) ); if( !bCanDo ) { CString csMessage1 = "Fill Empty states with default ZA : default ZA error ( ZAList : " + GetName() + ", ZA : " + p_oDefaultZA -> GetName() + ")"; CString csMessage2 = "CPA_ZonesActivatingList::mfn_vSetZAFromState()"; CString csMessage3 = "ZA hasn\'t same NamesList as ZAList"; ERROR_PREPARE_M( C_szTACModuleNameErO, csMessage1, csMessage2, E_ERROR_GRAVITY_FATAL, csMessage3 ); ERROR_ASSERT( 0 ); return ; } // fill engine list of ZA stPos = p_oFamily -> m_oListOfStates . GetHeadPosition(); while ( stPos ) { CPA_State *p_oState = p_oFamily -> m_oListOfStates . GetNext( stPos ); CPA_ZonesActivating *p_oZA = mfn_p_oGetZAFromState( p_oState ); if( p_oZA == NULL ) mfn_vSetZAFromState( p_oDefaultZA, p_oState ); } } // ---------------------------------------------------------------------------- // Description : return a copy of ZA List // ---------------------------------------------------------------------------- CPA_ZonesActivatingList *CPA_ZonesActivatingList::mfn_p_oDuplicateZAList() { CPA_ZonesActivatingList *p_oNewZAList = new CPA_ZonesActivatingList( GetEditor(), GetOwner(), "CopyOf"+GetName() ); CPA_ActivationState *p_oStZA = NULL; POSITION xPos; M_ForEachElement( & m_oListOfZAState, p_oStZA, xPos ) { p_oNewZAList -> mfn_vSetZAFromState( p_oStZA -> mfn_p_oGetZA(), p_oStZA -> mfn_p_oGetState() ); } return p_oNewZAList; } // ---------------------------------------------------------------------------- // Description : find CPA_ZoneActivating using given ZdxIndexList // ---------------------------------------------------------------------------- CPA_ZonesActivating *CPA_ZonesActivatingList::mfn_p_oGetZAWithEngineZdxIndexList(LST2_M_StaticAnchorDeclaration(ZDX_tdxHandleToZdxIndexList) hEngineZdxIndexListList, BOOL _bUseOwner /*=TRUE*/) { CPA_List oList; if( _bUseOwner ) GetEditor() -> fn_lFindObjects( &oList, "", C_szZATypeName, GetOwner() ); else GetEditor() -> fn_lFindObjects( &oList, "", C_szZATypeName ); POSITION xPos = oList . GetHeadPosition(); while ( xPos ) { CPA_ZonesActivating *p_oZA = (CPA_ZonesActivating*) oList . GetNext( xPos ); if( p_oZA && !memcmp( & p_oZA -> GetStruct() -> hZdxIndexList, &hEngineZdxIndexListList, sizeof hEngineZdxIndexListList ) ) return p_oZA; } return NULL; } // ---------------------------------------------------------------------------- // Description : return existing Default ZA, or search next default ZA // ---------------------------------------------------------------------------- CPA_ZonesActivating *CPA_ZonesActivating::mfn_p_oGetDefaultZA(void) { CPA_ZonesActivating *p_oZAResult; CPA_List oList; p_oZAResult = (CPA_ZonesActivating*) ((CPA_tdoNameList*)GetOwner()) -> m_fnp_oGetDefaultZA() ; if( p_oZAResult != NULL ) return p_oZAResult; if( GetEditor() -> fn_lFindObjects(&oList, "", C_szZATypeName, GetOwner()) > 0 ) { return (CPA_ZonesActivating*) oList . GetHead(); } return NULL; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- POSITION CPA_ZonesActivatingList::mfn_xGetPosUnusedActivationStateFromState(CPA_State *_p_oState) { CPA_ActivationState *p_oStZA = NULL; POSITION xPos; xPos = m_oListOfUnusedZAState . GetHeadPosition(); while ( xPos ) { p_oStZA = m_oListOfUnusedZAState . GetAt( xPos ); if( p_oStZA -> mfn_p_oGetState() == _p_oState ) return xPos; m_oListOfUnusedZAState . GetNext( xPos ); } return NULL; } void CPA_ZonesActivatingList::mfn_vInsertActivationState(CPA_ActivationState *_p_oStZA, BOOL _bEngine /*=TRUE*/) { if( _p_oStZA ) { unsigned short uwIndex = _p_oStZA -> GetStruct() -> uwIndex; CPA_ActivationState *p_oCurrentStZA; POSITION xPos = m_oListOfZAState . GetTailPosition(); while( xPos ) { p_oCurrentStZA = m_oListOfZAState . GetAt( xPos ); if( p_oCurrentStZA -> GetStruct() -> uwIndex < uwIndex ) { m_oListOfZAState . InsertAfter( xPos , _p_oStZA , _bEngine ); break; } m_oListOfZAState . GetPrev( xPos ); } if( xPos == NULL ) { m_oListOfZAState . AddTail( _p_oStZA , _bEngine ); } } } #endif // ACTIVE_EDITORee