417 lines
13 KiB
C++
417 lines
13 KiB
C++
/*=========================================================================
|
|
*
|
|
* CPABaseO.cpp - CPA_BaseObject : implementation
|
|
*
|
|
*
|
|
* Version 1.0
|
|
* Creation date 20.06.97
|
|
* Revision date
|
|
*
|
|
* Shaitan
|
|
*=======================================================================*/
|
|
#include "stdafx.h"
|
|
|
|
#ifdef ACTIVE_EDITOR
|
|
|
|
#include "itf/CPABaseO.hpp"
|
|
|
|
#include "acp_base.h"
|
|
|
|
#include "itf/CPAEditB.hpp"
|
|
|
|
#include "itf/NameMngr.hpp"
|
|
#include "itf/CPAInter.hpp"
|
|
|
|
//#################################################################################
|
|
// INITS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
Constructor
|
|
=========================================================================*/
|
|
CPA_BaseObject::CPA_BaseObject (CPA_EditorBase *pEditor, const CString csType, CPA_BaseObject *pOwner, BOOL bAvailable)
|
|
{
|
|
// init parameters
|
|
m_p_oEditor = pEditor;
|
|
m_p_oOwner = pOwner;
|
|
m_p_oBaseObjectList = pEditor->GetBaseObjectList(csType);
|
|
m_p_oInvalidObjectList = pEditor->GetInvalidObjectList(csType);
|
|
|
|
m_bIsAvailable = bAvailable;
|
|
|
|
// NAME IS NOT VALID
|
|
m_csName.Empty();
|
|
m_p_szName = NULL;
|
|
m_bIsValid = FALSE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Copy-Constructor
|
|
=========================================================================*/
|
|
CPA_BaseObject::CPA_BaseObject (CPA_BaseObject &r_oSource)
|
|
{
|
|
// init parameters
|
|
m_p_oEditor = r_oSource.m_p_oEditor;
|
|
m_p_oOwner = r_oSource.m_p_oOwner;
|
|
m_p_oBaseObjectList = r_oSource.m_p_oBaseObjectList;
|
|
m_p_oInvalidObjectList = r_oSource.m_p_oInvalidObjectList;
|
|
|
|
m_bIsAvailable = r_oSource.m_bIsAvailable;
|
|
|
|
// NAME IS NOT VALID
|
|
m_csName.Empty();
|
|
m_p_szName = NULL;
|
|
m_bIsValid = FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Destructor
|
|
=========================================================================*/
|
|
CPA_BaseObject::~CPA_BaseObject (void)
|
|
{
|
|
// remove object from corresponding BaseObjectList
|
|
fn_bUnRegister();
|
|
}
|
|
|
|
/*===========================================================================
|
|
Owner
|
|
=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bSetOwner (CPA_BaseObject *pNewOwner)
|
|
{
|
|
// can only be initialised once
|
|
if (m_p_oOwner != NULL)
|
|
return FALSE;
|
|
|
|
// update BaseObjectList if the object is into the list
|
|
if (! m_csName.IsEmpty())
|
|
{
|
|
if (m_bIsValid)
|
|
m_p_oBaseObjectList->fn_vBeforeChangingObjectOwner(this, pNewOwner);
|
|
else
|
|
m_p_oInvalidObjectList->fn_vBeforeChangingObjectOwner(this, pNewOwner);
|
|
}
|
|
|
|
// update owner
|
|
m_p_oOwner = pNewOwner;
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Data
|
|
=========================================================================*/
|
|
void CPA_BaseObject::fn_vUpdateData (void *pNewData)
|
|
{
|
|
// update BaseObjectList if the object is into the list
|
|
if (! m_csName.IsEmpty())
|
|
{
|
|
if (m_bIsValid)
|
|
m_p_oBaseObjectList->fn_vBeforeChangingObjectData(this, pNewData);
|
|
else
|
|
m_p_oInvalidObjectList->fn_vBeforeChangingObjectData(this, pNewData);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
MainWorld
|
|
=========================================================================*/
|
|
CPA_MainWorld * CPA_BaseObject::GetMainWorld (void)
|
|
{
|
|
return GetEditor()->GetMainWorld();
|
|
}
|
|
|
|
/*===========================================================================
|
|
Type
|
|
=========================================================================*/
|
|
CString CPA_BaseObject::GetType (void)
|
|
{
|
|
if (m_p_oBaseObjectList == NULL)
|
|
return ("");
|
|
return m_p_oBaseObjectList->fn_csGetTypeName();
|
|
}
|
|
|
|
char * CPA_BaseObject::fn_p_szGetType (void)
|
|
{
|
|
return m_p_oBaseObjectList->fn_szGetTypeName();
|
|
}
|
|
|
|
//#################################################################################
|
|
// PRIVATE FUNCTIONS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: register object in corresponding BaseObjectList
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bRegister (void)
|
|
{
|
|
// default => is valid
|
|
m_bIsValid = TRUE;
|
|
// register in list
|
|
return m_p_oBaseObjectList->fn_bAddObject(this);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: unregister object from corresponding BaseObjectList
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bUnRegister (void)
|
|
{
|
|
// valid => remove from base list
|
|
if (m_bIsValid)
|
|
return m_p_oBaseObjectList->fn_bRemoveObject(this);
|
|
// invalid => remove from invalid list
|
|
else
|
|
return m_p_oInvalidObjectList->fn_bRemoveObject(this);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: rename object and register it if necessary
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void CPA_BaseObject::fn_vDoRename (const CString csNewName)
|
|
{
|
|
BOOL bFirstRegister;
|
|
|
|
bFirstRegister = m_csName.IsEmpty();
|
|
|
|
// update BaseObjectList
|
|
if (!bFirstRegister)
|
|
{
|
|
if (m_bIsValid)
|
|
m_p_oBaseObjectList->fn_vBeforeChangingObjectName(this, (char*)(LPCTSTR) csNewName);
|
|
else
|
|
m_p_oInvalidObjectList->fn_vBeforeChangingObjectName(this, (char*)(LPCTSTR) csNewName);
|
|
}
|
|
// update name
|
|
m_csName = csNewName;
|
|
m_p_szName = (char*)(LPCTSTR) m_csName;
|
|
|
|
// if necessary, register object
|
|
if (bFirstRegister)
|
|
fn_bRegister();
|
|
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// VALIDITY
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: validate object (if initialised) and update corresponding list
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bValidate (void)
|
|
{
|
|
BOOL bResult;
|
|
|
|
// cannot validate an object without name
|
|
if (m_csName.IsEmpty())
|
|
return FALSE;
|
|
|
|
// update flag
|
|
m_bIsValid = TRUE;
|
|
|
|
// switch from invalid list to base list
|
|
bResult = m_p_oInvalidObjectList->fn_bRemoveObject(this);
|
|
bResult = m_p_oBaseObjectList->fn_bAddObject(this);
|
|
|
|
return bResult;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: invalidate object and update corresponding list
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bUnValidate (void)
|
|
{
|
|
BOOL bResult;
|
|
|
|
// update flag
|
|
m_bIsValid = FALSE;
|
|
|
|
// switch from invalid list to base list
|
|
bResult = m_p_oBaseObjectList->fn_bRemoveObject(this);
|
|
bResult = m_p_oInvalidObjectList->fn_bAddObject(this);
|
|
|
|
return bResult;
|
|
}
|
|
|
|
//#################################################################################
|
|
// DEFAULT NAME
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: ask the list for a default name, and check unicity criteria
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CString CPA_BaseObject::GetDefaultUniqueName (const CString csDefaultBaseName /*=""*/)
|
|
{
|
|
CString csNewName;
|
|
CPA_Interface *pInterface;
|
|
|
|
pInterface = GetEditor()->GetInterface();
|
|
|
|
do {
|
|
csNewName = pInterface->GetPrefixedName( GetBaseObjectList() -> GetNewName(csDefaultBaseName) );
|
|
} while( fn_eCheckUnicity(csNewName) != E_mc_None );
|
|
|
|
return csNewName;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: rename object with default name, according to unicity criteria
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void CPA_BaseObject::SetDefaultUniqueName (const CString csDefaultBaseName /*= ""*/)
|
|
{
|
|
CString csNewName;
|
|
|
|
csNewName = GetDefaultUniqueName(csDefaultBaseName);
|
|
fn_vDoRename(csNewName);
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// UNICITY
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: check type
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL CPA_BaseObject::fn_bIsOfType (const CString csTypeName)
|
|
{
|
|
return ((csTypeName.IsEmpty()) || (csTypeName.CompareNoCase(GetType()) == 0));
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: default unicity criteria => Type + Name
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
tdeMissingCriteria CPA_BaseObject::fn_eCheckDefaultUnicity (const CString csNewName)
|
|
{
|
|
CPA_List<CPA_BaseObject> oListObjects;
|
|
long lNbObjects;
|
|
|
|
if (csNewName.IsEmpty())
|
|
return E_mc_NoName;
|
|
|
|
// check BaseObjectList => unicity Name + Type
|
|
lNbObjects = m_p_oBaseObjectList->fn_lFindObjects(NULL, csNewName, GetType());
|
|
if (lNbObjects > 0)
|
|
return E_mc_TypeUnicity;
|
|
|
|
// check InvalidObjectList => unicity Name + Type
|
|
lNbObjects = m_p_oInvalidObjectList->fn_lFindObjects(NULL, csNewName, GetType());
|
|
if (lNbObjects > 0)
|
|
return E_mc_TypeUnicity;
|
|
|
|
// no objection
|
|
return E_mc_None;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: current unicity criteria => Type + Name + Owner
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
tdeMissingCriteria CPA_BaseObject::fn_eCheckUnicityWithOwner (const CString csNewName)
|
|
{
|
|
long lNbObjects;
|
|
|
|
if (csNewName.IsEmpty())
|
|
return E_mc_NoName;
|
|
|
|
// check ReachableObjectList => unicity Name + Type
|
|
lNbObjects = m_p_oBaseObjectList->fn_lFindObjects(NULL, csNewName, GetType(), m_p_oOwner);
|
|
if (lNbObjects > 0)
|
|
return E_mc_OwnerUnicity;
|
|
|
|
// check InvalidObjectList => unicity Name + Type
|
|
lNbObjects = m_p_oInvalidObjectList->fn_lFindObjects(NULL, csNewName, GetType(), m_p_oOwner);
|
|
if (lNbObjects > 0)
|
|
return E_mc_OwnerUnicity;
|
|
|
|
// no objection
|
|
return E_mc_None;
|
|
}
|
|
|
|
//#################################################################################
|
|
// RENAME
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: check unicity criteria and rename object
|
|
* Creation date: 20.06.97
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
tdeMissingCriteria CPA_BaseObject::fn_eRename (const CString csNewName)
|
|
{
|
|
tdeMissingCriteria eResult;
|
|
CPA_Interface *pInterface;
|
|
CString csName;
|
|
|
|
pInterface = m_p_oEditor->GetInterface();
|
|
|
|
// not loading => check prefix
|
|
if ((!pInterface->fn_bIsLoadingWorld())&&(!csNewName.IsEmpty()))
|
|
csName = pInterface->GetPrefixedName(csNewName);
|
|
else
|
|
csName = csNewName;
|
|
|
|
// check unicity
|
|
eResult = fn_eCheckUnicity(csName);
|
|
|
|
// rename object
|
|
if (eResult == E_mc_None)
|
|
fn_vDoRename(csName);
|
|
|
|
// loading => register conflict
|
|
else if ((eResult != E_mc_NoName)&&(pInterface->fn_bIsLoadingWorld()))
|
|
{
|
|
pInterface->fn_vAddRenamedObject();
|
|
g_oNameManager.fn_vRegisterConflict(this, csName, eResult);
|
|
}
|
|
|
|
return eResult;
|
|
}
|
|
|
|
#endif // ACTIVE_EDITOR
|