reman3/Rayman_X/cpa/public/ITF/cohemngr.hpp

231 lines
8.3 KiB
C++

/*=============================================================================
*
* Filename: CoheMngr.hpp
* Version: 1.0
* Date: 16/01/97
* Author: V.L.
*
* Description: class to manage a list of couple of object to try to
* maintain coherence when an object is deleted
*
*===========================================================================*/
#ifndef __COHEMNGR_HPP__
#define __COHEMNGR_HPP__
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifdef ACTIVE_EDITOR
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include <afxtempl.h>
#include "acp_base.h"
#include "CPABaseO.hpp"
#include "CPAEditB.hpp"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
class CCoherenceManagerDlg;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifndef CPA_EXPORT
#if defined(CPA_WANTS_IMPORT)
#define CPA_EXPORT __declspec(dllimport)
#elif defined(CPA_WANTS_EXPORT)
#define CPA_EXPORT __declspec(dllexport)
#else
#define CPA_EXPORT
#endif
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
internal structures to store link information
=======================================================================================
*/
struct tdstFather_;
/*
* structure that describe an object as a child
*/
typedef struct tdstChild_
{
CPA_BaseObject *m_p_oChild;
CList<struct tdstFather_ *, struct tdstFather_ *> m_oFatherList;
}tdstChild;
/*
* structure that describe a linked child (it's a child with a counter)
*/
typedef struct tdstLinkedChild_
{
tdstChild *m_p_stChild;
unsigned long m_ulLinkWeight;
}tdstLinkedChild;
/*
* structure that describe an object as a father
*/
typedef struct tdstFather_
{
CPA_BaseObject *m_p_oFather;
CList<tdstLinkedChild *, tdstLinkedChild *> m_oChildList;
CList<char *, char *> m_oDestroyedChildList;
} tdstFather;
/*
=======================================================================================
TYPEDEF
=======================================================================================
*/
/*
* Maps
*/
typedef CMap<CPA_BaseObject *, CPA_BaseObject *, tdstChild *, tdstChild *> CChildMap;
typedef CMap<CPA_BaseObject *, CPA_BaseObject *, tdstFather *, tdstFather *> CFatherMap;
/*
* List
*/
typedef CList< tdstChild *, tdstChild *> CChildList;
typedef CList< tdstFather *, tdstFather *> CFatherList;
typedef CList< tdstLinkedChild *, tdstLinkedChild *> CLinkedChildList;
/*
=======================================================================================
DEFINES
=======================================================================================
*/
/*
* For child state when we call DetachFather function
*/
#define C_cChildIsRestored 0
#define C_cChildIsDeleted 1
#define C_cChildIsDestroyed 2
/*
* for links type
*/
#define C_cLinkedAsValidChild 0x01
#define C_cLinkedAsDeletedChild 0x02
#define C_cLinkedAsChild 0x03 /*(C_cLinkedAsValidChild || C_cLinkedAsDeletedChild)*/
#define C_cLinkedAsValidFather 0x04
#define C_cLinkedAsIncoherentFather 0x08
#define C_cLinkedAsFather 0x0C /*(C_cLinkedAsValidFather || C_cLinkedAsIncoherentFather)*/
#define C_cLinkedAsChildAndFather 0x0F /*(C_cLinkedAsChild || C_cLinkedAsFather)*/
/*
=======================================================================================
coherence manager class
=======================================================================================
*/
class CPA_EXPORT CCoherenceManager
{
/*
* private data members
*/
private:
CChildMap m_oChildMap; /* map of all object who are child*/
CFatherMap m_oFatherMap; /* map of all object who are father*/
CChildMap m_oDeletedChildMap; /* map of all deleted child*/
CFatherMap m_oIncoherenceMap; /* map of all object who are father and have a child that*/
/* have been destroyed*/
CCoherenceManagerDlg *m_p_oCMDlg; /* dialog box to show incoherence*/
BOOL m_bShowAlwaysDlg;
/*
* private functions
*/
private:
/* ==> find object in a map as father or child */
tdstFather *m_fnp_stFindFather( CFatherMap *_p_oMap, CPA_BaseObject *_p_oFather );
tdstChild *m_fnp_stFindChild( CChildMap *_p_oMap, CPA_BaseObject *_p_oChild );
/* ==> find object in a list as father or child */
tdstFather *m_fnp_stFindFather( CFatherList *_p_oList, CPA_BaseObject *_p_oFather );
tdstChild *m_fnp_stFindChild( CChildList *_p_oList, CPA_BaseObject *_p_oChild );
/* ==> find child in a linked child list */
tdstLinkedChild *m_fnp_stFindLinkedChild( CLinkedChildList *_p_oList, tdstChild *_p_stChild);
tdstLinkedChild *m_fnp_stFindLinkedChild( CLinkedChildList *_p_oList, CPA_BaseObject *_p_oChild);
/* ==> is object membership of a list */
BOOL m_fn_bIsFather( CFatherList *_p_oList, tdstFather *_p_stFather );
BOOL m_fn_bIsChild ( CChildList *_p_oList, tdstChild *_p_stChild );
BOOL m_fn_bIsChild ( CLinkedChildList *_p_oList, tdstChild *_p_stChild );
/* ==> remove objects */
void m_fn_vRemoveAllFather( CFatherMap *_p_oMap );
void m_fn_vRemoveAllChild( CChildMap *_p_oMap );
/* ==> remove links */
void m_fn_vDetachAllChild( tdstFather *_p_stFather, CChildMap *_p_oChildMap );
BOOL m_fn_bDetachAllFather( tdstChild *_p_stChild, char _cChildState );
/*
* public functions
*/
public:
/* ==> constructor / destructor */
CCoherenceManager();
~CCoherenceManager();
/* ==> option setting */
void m_fn_vSetAutomaticCoherenceManagerDialog( BOOL bIsAuto ) { m_bShowAlwaysDlg = bIsAuto; }
BOOL m_fn_bIsCoherenceManagerDialogAutomatic( void ) { return m_bShowAlwaysDlg; }
/* ==> getting pointer on map */
CChildMap *m_fnp_oGetChildMap( void ) { return &m_oChildMap; }
CFatherMap *m_fnp_oGetFatherMap( void ) { return &m_oFatherMap; }
CChildMap *m_fnp_oGetDeletedChildMap( void ) { return &m_oDeletedChildMap; }
CFatherMap *m_fnp_oGetIncoherenceMap( void ) { return &m_oIncoherenceMap; }
/* ==> getting pointer on internal structures */
tdstFather *m_fnp_stGetFather( CPA_BaseObject *_p_oFather ) { return m_fnp_stFindFather( &m_oFatherMap, _p_oFather ); }
tdstChild *m_fnp_stGetChild( CPA_BaseObject *_p_oChild ) { return m_fnp_stFindChild( &m_oChildMap, _p_oChild); }
/* ==> dump a list */
void m_fn_vDumpListsInFile( char *_szFile );
/* ==> link management */
void m_fn_vAddALink( CPA_BaseObject *_p_oFather, CPA_BaseObject *_p_oChild );
void m_fn_vRemoveLinks( CPA_BaseObject *_p_oFather, CPA_BaseObject *_p_oChild, unsigned long _ulNbLinkRemoved );
void m_fn_vRemoveALink( CPA_BaseObject *_p_oFather, CPA_BaseObject *_p_oChild );
void m_fn_vRemoveAllLinks( CPA_BaseObject *_p_oFather, CPA_BaseObject *_p_oChild );
void m_fn_vRemoveAllLinks( CPA_BaseObject *_p_oObject, char _cLinkType );
unsigned long m_fn_ulGetLinkWeight( CPA_BaseObject *_p_oFather, CPA_BaseObject *_p_oChild);
/* ==> object state */
BOOL m_fn_bIsFather( CPA_BaseObject *_p_oFather );
BOOL m_fn_bIsChild( CPA_BaseObject *_p_oChild );
BOOL m_fn_bIsIncoherent( CPA_BaseObject *_p_oFather );
/* ==> getting list of father/child for an object */
int m_fn_iGetChildList( CPA_BaseObject *_p_oFather, CList< CPA_BaseObject *, CPA_BaseObject *> *_p_oChildList );
int m_fn_iGetChildCount( CPA_BaseObject *_p_oFather );
int m_fn_iGetDeletedChildList( CPA_BaseObject *_p_oFather, CList< CPA_BaseObject *, CPA_BaseObject *> *_p_oDeletedChildList );
int m_fn_iGetDestroyedChildNameList( CPA_BaseObject *_p_oFather, CList< char *, char *> *_p_oDestroyedChildNameList );
int m_fn_iGetFatherCount( CPA_BaseObject *_p_oChild );
int m_fn_iGetFatherList( CPA_BaseObject *_p_oChild, CList< CPA_BaseObject *, CPA_BaseObject *> *_p_oFatherList );
int m_fn_iGetInvalidFatherList( CPA_BaseObject *_p_oChild, CList< CPA_BaseObject *, CPA_BaseObject *> *_p_oInvalidFatherList );
/* ==> modification of an object */
void m_fn_vDeleteObject( CPA_BaseObject *_p_oObject );
void m_fn_vRestoreObject( CPA_BaseObject *_p_oObject );
void m_fn_vDestroyObject( CPA_BaseObject *_p_oObject );
void m_fn_vNotifyObjectModification( CPA_BaseObject *_p_oObject, unsigned long _ulData );
/* ==> Incoherence list status */
BOOL m_fn_bThereIsIncoherence( void );
/* ==> Incoherence dialog */
void m_fn_vShowIncoherence( void );
};
extern CPA_EXPORT CCoherenceManager g_oCoherenceManager;
#endif /* ACTIVE_EDITOR*/
#endif /*__COHEMNGR_HPP__*/