/*========================================================================= * * EDTSpec.cpp : EDT_SpecificEditor : Implementation file. * * * Version 1.0 * Creation date * Revision date * * Shaitan *=======================================================================*/ #include "stdafx.h" #include "itf/customid.h" #ifdef ACTIVE_EDITOR #include "acp_base.h" #include "geo.h" #include "gli.h" #include "col.h" #define HieFriend #include "spo.h" #include "lst.hpp" #undef HieFriend #include "IncMEC.h" // Shaitan Clean Env { //#include "ENV.h" //End Shaitan Clean Env } #include "snd.h" #include "incSCT.h" #include "ITF.h" #include "EDTSpec.hpp" #include "EDTBase.hpp" #include "EDTSObj.hpp" #include #define C_lNbSpecificEntries 0 #define M_GetSpecificInterface() (GetEditor()->GetInterface()->GetSpecificInterface()) //CPA2 Stegaru Cristian 98-02 #include "EDTModif.hpp" //End CPA2 Stegaru Cristian 98-02 //################################################################################# // CONSTRUCT //################################################################################# EDT_SpecificEditor::EDT_SpecificEditor (EDT_HierarchyEditor *pEditor) { m_bIsLoadingWorld = FALSE; m_pEditor = pEditor; } EDT_SpecificEditor::~EDT_SpecificEditor (void) { } //################################################################################# // INITS //################################################################################# void EDT_SpecificEditor::fn_vSpecificInit (void) { // init parameters m_bIsLoadingWorld = FALSE; } //################################################################################# // SUBMENU //################################################################################# /*=========================================================================== * Description: Fill Submenu with specific commands * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ long EDT_SpecificEditor::fn_lDefineSubmenu (EDT_SubMenu *p_oSubMenu, UINT uiStartID) { return C_lNbSpecificEntries; } /*=========================================================================== * Description: answer to submenu specific commands * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ void EDT_SpecificEditor::fn_vOnSubmenuCommand (UINT uiCmdMsg) { /* switch (uiCmdMsg) { case C_ui_DisplayWorldAction: SetDisplayMode(E_dm_DrawWorld); break; case C_ui_DisplaySectorAction: SetDisplayMode(E_dm_DrawOnlyCurrentSector); break; } */ } //################################################################################# // SUPER OBJECT TYPE AND LEVEL //################################################################################# /*=========================================================================== * Description: check if new type is valid * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bCanChangeTypeSO (EDT_SuperObject *pEdObj, tdeTypeSO eType) { CPA_SuperObject *pParent; if (!M_GetSpecificInterface()->fn_bHasValidWorld(!m_bIsLoadingWorld)) return TRUE; // check parent pParent = pEdObj->GetSuperObjectFather(); if (!pParent) return TRUE; // protected objects are free if ((eType == C_Protected)&&(pEdObj->GetSuperObjectOwner())) return TRUE; // else type must be coherent with hierarchy return (pParent->GetTypeSO() == eType); } //################################################################################# // DEFAULT PARENT //################################################################################# //ANNECY Shaitan EmptySectors 25/02/98 /*=========================================================================== * Description: find parent from pos * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ /* EDT_SuperObject * EDT_SpecificEditor::GetDefaultParentFromPos (tdstPosition *p_stPosition, tdeTypeSO eTypeInsert) { // invalid world => no default parent return (EDT_SuperObject *) M_GetSpecificInterface()->GetDefaultParentFromPos(p_stPosition, eTypeInsert); } */ //ENDANNECY Shaitan EmptySectors /*=========================================================================== * Description: get parent for copy / paste. * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ EDT_SuperObject * EDT_SpecificEditor::GetDefaultParentForPaste (EDT_SuperObject *pEdObj) { //ANNECY Shaitan EmptySectors 25/02/98 // CPA_SuperObject *pSector; //ENDANNECY Shaitan EmptySectors // invalid world => no default parent if (!M_GetSpecificInterface()->fn_bHasValidWorld(!m_bIsLoadingWorld)) return NULL; // protected objects have no default parent if (pEdObj->GetTypeSO() == C_Protected) return NULL; // dynamic objects => dynamic root if (pEdObj->GetTypeSO() == C_Dynamic) return (EDT_SuperObject *) M_GetSpecificInterface()->GetDynamicRoot(); // static object => current sector if (pEdObj->GetTypeSO() == C_Static) { //ANNECY Shaitan EmptySectors 25/02/98 return (EDT_SuperObject *) M_GetSpecificInterface()->GetSuperObjectCurrentSector(pEdObj); // pSector = M_GetSpecificInterface()->GetSuperObjectCurrentSector(pEdObj); // if (pSector) // return (EDT_SuperObject *) pSector->GetSuperObjectFirstChild(); //ENDANNECY Shaitan EmptySectors } // others => invalid return NULL; } //################################################################################# // PERMISSIONS //################################################################################# /*========================================================================== * Description: check if parent is available * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bCanBeParent (EDT_SuperObject *pNewParent, EDT_SuperObject *pChild) { return fn_bCheckParentAndType(pChild, pNewParent); } /*========================================================================== ==========================================================================*/ BOOL EDT_SpecificEditor::fn_bCanBeParent (EDT_SuperObject *pNewParent, CPA_List *pListOfChilds) { CPA_SuperObject *pElem; POSITION pos; // check all element in the list for (pElem = pListOfChilds->GetHeadElement(pos); pElem; pElem = pListOfChilds->GetNextElement(pos)) { if (!fn_bCheckParentAndType((EDT_SuperObject *) pElem, pNewParent)) return FALSE; } // no objection return TRUE; } /*========================================================================== * Description: check if move is available * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ long EDT_SpecificEditor::fn_lCanMoveObjects (CPA_List *pObjectsToMove) { CPA_SuperObject *pElem; POSITION pos; long lNbBreak = 0; // invalid world => only protected are free if (!M_GetSpecificInterface()->fn_bHasValidWorld(!m_bIsLoadingWorld)) { // only protected objects are free for (pElem = pObjectsToMove->GetHeadElement(pos); pElem; pElem = pObjectsToMove->GetNextElement(pos)) { if (pElem->GetTypeSO() != C_Protected) return -1; } // no condition return 0; } // reinit list modifs while (m_pEditor->GetListOfModifParent()->GetCount()) delete (m_pEditor->GetListOfModifParent()->RemoveTail()); // check all moved objects for (pElem = pObjectsToMove->GetHeadElement(pos); pElem; pElem = pObjectsToMove->GetNextElement(pos)) { if (!fn_bCheckSectorMove((EDT_SuperObject *) pElem, &lNbBreak, TRUE)) return -1; } // number of broken links return lNbBreak; } //################################################################################# // SECTORS //################################################################################# //ANNECY Shaitan EmptySectors 25/02/98 /*=========================================================================== * Description: init protection for sectors * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ /* void EDT_SpecificEditor::fn_vInitSectorsParameters (EDT_SuperObject *pSRoot) { CPA_SuperObject *pSector, *pChild; // check all sectors for (pSector = pSRoot->GetSuperObjectFirstChild(); pSector; pSector = pSRoot->GetSuperObjectNextChild(pSector)) { // first levels of sectors => protected childs for (pChild = pSector->GetSuperObjectFirstChild(); pChild; pChild = pSector->GetSuperObjectNextChild(pChild)) { pChild->SetEditProtected(TRUE); pChild->SetSuperObjectOwner(pSector); } } } */ //ENDANNECY Shaitan EmptySectors //################################################################################# // PERMISSIONS //################################################################################# /*========================================================================== * Description: check if move is available (recursive function) * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bCheckSectorMove (EDT_SuperObject *pEdObj, long *p_lNbBreak, BOOL bSelected) { CPA_SuperObject *pSector; CPA_SuperObject *pParent; CPA_SuperObject *pChild; // object must stay in a sector pSector = M_GetSpecificInterface()->GetSuperObjectCurrentSector(pEdObj); if ((pEdObj->GetTypeSO() != C_Protected)&&(!pSector)) return FALSE; // check for Univers Sector if (pSector == M_GetSpecificInterface()->GetStaticRoot()->GetSuperObjectLastChild()) { CString csName = pEdObj->GetObject() ? pEdObj->GetObject()->GetName() : pEdObj->GetName(); if (MessageBox( NULL, " Object " + csName + " is in Univers sector\n" " Are you sure you want to move it here ?\n", "Object In Univers Sector", MB_YESNO | MB_ICONEXCLAMATION | MB_TASKMODAL | MB_TOPMOST) == IDNO) return FALSE; } // only static objects require special handling if (pEdObj->GetTypeSO() == C_Static) { pParent = pEdObj->GetSuperObjectFather(); // if sector is invalid, create modif parent if (pSector != M_GetSpecificInterface()->GetSuperObjectCurrentSector(pParent)) { m_pEditor->GetListOfModifParent()->AddTail( new EDT_SaveParents //ANNECY Shaitan EmptySectors 25/02/98 // (pEdObj, (EDT_SuperObject *) pParent, (EDT_SuperObject *) pSector->GetSuperObjectFirstChild())); (pEdObj, (EDT_SuperObject *) pParent, (EDT_SuperObject *) pSector)); //ENDANNECY Shaitan EmptySectors if (!bSelected) *p_lNbBreak++; } } // next level of hierarchy for (pChild = pEdObj->GetSuperObjectFirstChild(); pChild; pChild = pEdObj->GetSuperObjectNextChild(pChild)) { if (!fn_bCheckSectorMove((EDT_SuperObject *) pChild, p_lNbBreak, FALSE)) return FALSE; } // no objection return TRUE; } /*=========================================================================== * Description: check type * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bCheckParentAndType (EDT_SuperObject *pEdObj, EDT_SuperObject *pParent) { // invalid world => only protected are free if (!M_GetSpecificInterface()->fn_bHasValidWorld(!m_bIsLoadingWorld)) return ((pParent)&&(pEdObj->GetTypeSO() == C_Protected)); // root or NULL are not available if ((!pParent)||(pParent == m_pEditor->GetInterface()->GetCurrentWorld()->GetRoot())) return FALSE; switch (pEdObj->GetTypeSO()) { // protected objects are free, except for roots and sectors case C_Protected: if ((pParent == M_GetSpecificInterface()->GetDynamicRoot())||(pParent == M_GetSpecificInterface()->GetStaticRoot())) return FALSE; //ANNECY Shaitan NewBorder 13/02/98 // if (pParent->GetRealTypeName() == C_szSectorTypeName) // return FALSE; //ENDANNECY Shaitan NewBorder return TRUE; // dynamic => only dynamic root case C_Dynamic: return (pParent == M_GetSpecificInterface()->GetDynamicRoot()); // static => same sector case C_Static: // parent must be static if (pParent->GetTypeSO() != C_Static) return FALSE; //ANNECY Shaitan EmptySectors 25/02/98 // root is not a valid parent if (pParent == M_GetSpecificInterface()->GetStaticRoot()) return FALSE; // // root or sector itself are not valid parent // if ((pParent == M_GetSpecificInterface()->GetStaticRoot())||(pParent->GetRealTypeName() == C_szSectorTypeName)) //ENDANNECY Shaitan EmptySectors // child must be in the same sector if (M_GetSpecificInterface()->GetSuperObjectCurrentSector(pEdObj) != M_GetSpecificInterface()->GetSuperObjectCurrentSector(pParent)) return FALSE; //ANNECY Shaitan EmptySectors 25/02/98 // check super-object status if (!fn_bCheckSaveStatus(pEdObj->GetSaveStatus(), pParent)) return FALSE; // // Designer mode => under sector first child // if (M_GetSpecificInterface()->GetUserStatus() == E_us_StatusDesign) // return (GetDefaultParentForPaste(pEdObj) == pParent); //ENDANNECY Shaitan EmptySectors // no objection return TRUE; } return FALSE; } //ANNECY Shaitan EmptySectors 25/02/98 /*=========================================================================== * Description: check status * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bCheckSaveStatus (tdeSaveStatus eStatus, EDT_SuperObject *pParent) { tdeSaveStatus eParentStatus = pParent->GetSaveStatus(); switch (eStatus) { case E_ss_Responsible: case E_ss_Modify: return (eParentStatus != E_ss_NoSave); } return TRUE; } //ENDANNECY Shaitan EmptySectors //################################################################################# // LOAD //################################################################################# /*=========================================================================== * Description: Load editor infos corresponding to engine current map * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ EDT_SuperObject * EDT_SpecificEditor::fn_pInitEditorMap (HIE_tdxHandleToSuperObject hRoot) { HIE_tdxHandleToSuperObject hDRoot, hSRoot, hDInactiveRoot; CPA_SuperObject *pRoot, *pDRoot, *pDInactiveRoot, *pSRoot; CString csSectionName; char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szName[SCR_CV_ui_Cfg_MaxLenName]; int iPos; // set load mode m_bIsLoadingWorld = TRUE; // get roots hDRoot = HIE_fn_hGetSuperObjectFirstChild(hRoot); hDInactiveRoot = HIE_fn_hGetSuperObjectNextBrother(hDRoot); hSRoot = HIE_fn_hGetSuperObjectLastChild(hRoot); // init static file name csSectionName = m_pEditor->GetEngineSectionName(hSRoot); SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName); m_csStaticFileName = szFileName; // init dynamic file name iPos = m_csStaticFileName.ReverseFind('.'); m_csDynamicFileName = m_csStaticFileName.Left(iPos) + ".lvl"; // create root pRoot = m_pEditor->GetNewSuperObject(hRoot, E_ss_NoSave, C_NoType, "SO_Root", ""); pRoot->SetEditProtected(TRUE); // create Dynamic Root pDRoot = m_pEditor->GetNewSuperObject(hDRoot, E_ss_NoSave, C_Dynamic, "SO_DynamicRoot", ""); pDRoot->SetEditProtected(TRUE); pRoot->AddANewChild(pDRoot, FALSE); // create Inactivate Dynamic Root pDInactiveRoot = m_pEditor->GetNewSuperObject(hDInactiveRoot, E_ss_NoSave, C_Dynamic, "SO_InactiveDynamicRoot", ""); pDInactiveRoot->SetEditProtected(TRUE); pRoot->AddANewChild(pDInactiveRoot, FALSE); // create Static Root pSRoot = m_pEditor->GetNewSuperObject(hSRoot, E_ss_NoSave, C_Static, "SO_StaticRoot", m_csStaticFileName); pSRoot->SetEditProtected(TRUE); pRoot->AddANewChild(pSRoot, FALSE); // build dynamic hierarchy g_oBaseFrame.mfnv_UpdateTitle("Loading Editor Dynamic Hierarchy"); // M_GetMainWnd()->UpdateStatus("Loading Editor Dynamic Hierarchy", C_STATUSPANE_INFOS, C_STATUS_NORMAL); m_pEditor->fn_vBuildEditorHierarchy(pDRoot, hDRoot); // build static hierarchy g_oBaseFrame.mfnv_UpdateTitle("Loading Editor Static Hierarchy"); // M_GetMainWnd()->UpdateStatus("Loading Editor Static Hierarchy", C_STATUSPANE_INFOS, C_STATUS_NORMAL); m_pEditor->fn_vBuildEditorHierarchy(pSRoot, hSRoot); //ANNECY Shaitan EmptySectors 25/02/98 // // update for sectors // M_GetMainWnd()->UpdateStatus("Initializing Sectors", C_STATUSPANE_INFOS, C_STATUS_NORMAL); // fn_vInitSectorsParameters((EDT_SuperObject *) pSRoot); //ENDANNECY Shaitan EmptySectors // load all modifs //CPA2 Stegaru Cristian 98-02 csSectionName = m_pEditor->GetSOReferencePath() + GetModifSectionName(); if (SCR_fn_c_RdL0_IsSectionExists((char *)(LPCTSTR) csSectionName)) { g_oBaseFrame.mfnv_UpdateTitle("Loading temporary modifications"); //M_GetMainWnd()->UpdateStatus("Loading temporary modifications", C_STATUSPANE_INFOS, C_STATUS_NORMAL); SCR_M_RdL0_SetContextLong(1, 0, (long) m_pEditor); SCR_fnp_st_RdL0_AnalyseSection((char *)(LPCTSTR) csSectionName, SCR_CDF_uw_Anl_Normal); } //End CPA2 Stegaru Cristian 98-02 // new editor root // g_oBaseFrame.mfnv_UpdateTitle("Editor Hierarchy Load >> 100%"); // M_GetMainWnd()->UpdateStatus("Editor Hierarchy Load >> 100%", C_STATUSPANE_INFOS, C_STATUS_NORMAL); m_bIsLoadingWorld = FALSE; return (EDT_SuperObject *) pRoot; } /*=========================================================================== * Description: Get modifications section name * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ CString EDT_SpecificEditor::GetModifSectionName (void) { CString csSectionName; char szModifName[SCR_CV_ui_Cfg_MaxLenName]; //CPA2 Stegaru Cristian 98-02 CString csFileName; int iPos = m_csStaticFileName.ReverseFind ('.'); ASSERT (-1 != iPos); csFileName = m_csStaticFileName.Left (iPos) + szModifExt; //End CPA2 Stegaru Cristian 98-02 SCR_fn_v_RdL0_ComputeSectionName(szModifName, (char*)(LPCSTR)csFileName, "Edit-Modifications", NULL); csSectionName = szModifName; return csSectionName; } /*=========================================================================== * Description: init parameters for load * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ void EDT_SpecificEditor::fn_vInitTypeSO (EDT_SuperObject *pEdObj, EDT_SuperObject *pParent) { // init type from hierarchy position if (pEdObj->GetTypeSO() == C_NoType) { if (pEdObj->GetSuperObjectOwner()) pEdObj->SetTypeSO(C_Protected); else pEdObj->SetTypeSO(pParent->GetTypeSO()); } } //################################################################################# // SUPER OBJECT TYPE //################################################################################# /*=========================================================================== * Description: check if object's type correspond to user status * Creation date: * Author: Shaitan *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ BOOL EDT_SpecificEditor::fn_bIsValidType (tdeTypeSO eTypeSO) { // invalid world => no condition if (!M_GetSpecificInterface()->fn_bHasValidWorld(!m_bIsLoadingWorld)) return TRUE; //chbani :desactive le test de USER Statut return TRUE; switch (eTypeSO) { // static objects => always temporary modifs case C_Static: return (M_GetSpecificInterface()->GetUserStatus() != E_us_StatusDesign); // dynamic objects => temporary for graphist case C_Dynamic: return (M_GetSpecificInterface()->GetUserStatus() != E_us_StatusGraphic); // protected objets => always free case C_Protected: return TRUE; default: return FALSE; } } #endif // ACTIVE_EDITOR