/*========================================================================= * * EDTModif.cpp : Class Modif* - Implementation file * * * Version 1.0 * Creation date * Revision date * * Shaitan *=======================================================================*/ #include "stdafx.h" #ifdef ACTIVE_EDITOR #include "acp_base.h" #include "ITF.h" #include "EDTModif.hpp" #include "EDTBase.hpp" #include "EDTSObj.hpp" #include "EDTTemp.hpp" #include "EDTdedit.hpp" #define M_GetToolDLLs() m_pEditor->GetMainWorld()->GetToolDLLReceivingEvtEditorMsg() inline POS_tdxHandleToPosition M_EDT_AllocMatrix() { POS_tdxHandleToPosition hPos = (POS_tdxHandleToPosition) malloc (sizeof (POS_tdstCompletePosition) ); POS_fn_vSetIdentityMatrix(hPos); return hPos; } //################################################################################# // class ModifInsert //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifInsert::EDT_ModifInsert(EDT_HierarchyEditor *pEditor, EDT_SuperObject *pEdObj, EDT_SuperObject *pParent, tdstPosition *p_stPosition, EDT_SuperObject *pBrother, BOOL bUpdateDrawing, BOOL bSelect, BOOL pBlock, BOOL bUpdatePosition, BOOL bCutSpecial)// Silviu Simen 18 August 1998 Cut/Paste Mechanism : CPA_Modif(TYPE_INSERT, "Insert", pBlock) { ACP_tdxIndex xInd; if (bSelect) m_bSelect = 1; // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; // Init parameters m_pParent = pParent; m_pBrother = pBrother; m_csType = pEdObj->GetRealTypeName(); m_bUpdate = bUpdateDrawing; m_bSelect = bSelect; // Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism m_bCutSpecial = bCutSpecial; // save position m_bUpdatePosition = bUpdatePosition; if (bUpdatePosition) { POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct()), &m_stTranslation); POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(pEdObj->GetStruct()), &m_stLocale); } // End Silviu Simen 18 August 1998 Cut/Paste Mechanism // init save for DLL if (p_stPosition) { for (xInd = 0; xInd < p_stPosition->xIndex; xInd++) m_stPosition.a_stPickInfo[xInd] = p_stPosition->a_stPickInfo[xInd]; m_stPosition.xIndex = p_stPosition->xIndex; m_stPosition.stPos = p_stPosition->stPos; } else m_stPosition.xIndex = -1; // Create the new object m_pInsertedObject = pEdObj; m_stListInsert.RemoveAll(); fn_vFillListForInsertion(m_pInsertedObject, m_pParent); } EDT_ModifInsert::~EDT_ModifInsert (void) { // if insertion was canceled (UNDO), delete object /* if (m_pInsertedObject->GetSuperObjectFather() == NULL) delete m_pInsertedObject;*/ } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifInsert::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifInsert::Do (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj; POSITION posElem; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // update position if (m_bUpdatePosition) { POS_tdstCompletePosition *pParentMatrix, *pInstanceMatrix, *pGlobalMatrix; POS_tdstCompletePosition stMatrix; MTH3D_tdstVector stTranslation; // get position pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(m_pParent->GetStruct()); pInstanceMatrix = HIE_fn_hGetSuperObjectMatrix(m_pInsertedObject->GetStruct()); pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(m_pInsertedObject->GetStruct()); // correct position according to pParent's matrix POS_fn_vSetIdentityMatrix(&stMatrix); POS_fn_vInvertMatrix(&stMatrix, pParentMatrix); POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &m_stPosition.stPos.stPos3D); POS_fn_vSetTranslationVector(pInstanceMatrix,&stTranslation); POS_fn_vSetTranslationVector(pGlobalMatrix,&m_stPosition.stPos.stPos3D); } // insert object in the hierarchy m_pInsertedObject->fn_vInsertUnderParent(m_pParent, m_pBrother); m_pInsertedObject->fn_vUpdateValidity(TRUE); if (m_pInsertedObject->fn_bCanBeNotified()) m_pParent->fn_vNotifySave(); // update matrix POS_fn_vNormalizeMatrix(HIE_fn_hGetSuperObjectMatrix(m_pInsertedObject->GetStruct())); // update the corresponding list M_GetWorld()->fn_vUpdateListObjects(m_pInsertedObject, E_lum_Insert); // update absolute position HIE_fn_vInvalidateAllGlobalMatrices(); if (m_pParent) HIE_fn_vRefreshHierarchy(m_pParent->GetStruct()); // GetInterface()->fn_vUpdatePositions(); // if necessary, register as temporary for (pElem = m_stListInsert.GetHeadElement(posElem); pElem; pElem = m_stListInsert.GetNextElement(posElem)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; // temporary modif pEdObj->fn_bInitTemporarySO(); pEdObj->fn_vUpdateTemporaryModif(C_szCreation, TRUE); // check notify pEdObj->fn_vNotifySave(); } // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { MTH3D_tdstVector stObjectPosition; CPA_SuperObject * pSector; stObjectPosition = HIE_fn_hGetSuperObjectMatrix (m_pInsertedObject->GetStruct()) -> stTranslationVector; pSector = GetInterface()->GetSpecificInterface()-> GetCurrentSectorFromPos(&stObjectPosition); M_GetMainWorld()->m_stListObjectsInSectors.AddElement(m_pInsertedObject,pSector); } // End Silviu Simen 01 september 1998 List of Objects in Sectors // tell DLLs if (m_stPosition.xIndex != -1) fn_vSendMessageInsert((m_bFirstTime) ? C_EDTDo : C_EDTRedo, &m_stPosition); else fn_vSendMessageInsert((m_bFirstTime) ? C_EDTDo : C_EDTRedo, NULL); // update current selection if (m_bSelect) { GetInterface()->fn_vCancelCurrentSelection(FALSE); GetInterface()->fn_vAddSelectedObject(m_pInsertedObject, FALSE); // update type if (M_GetSelectMode() != "All Types") GetInterface()->SetSelectMode(m_pInsertedObject->GetRealTypeName()); } // update all if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Insertion Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifInsert::Undo (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj; POSITION posElem; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism if (m_bCutSpecial) // we have removed a special object... { GetParentEditor()->SetRegisteredCuttedObject(m_pInsertedObject); GetParentEditor()->SetSpecialObject(TRUE); } // End Silviu Simen 18 August 1998 Cut/Paste Mechanism // update position if (m_bUpdatePosition) { // restore position POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(m_pInsertedObject->GetStruct()),&m_stLocale); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(m_pInsertedObject->GetStruct()),&m_stTranslation); } // update current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // delete object in the hierarchy m_pInsertedObject->IsolateChild(); m_pInsertedObject->fn_vUpdateValidity(FALSE); // update the corresponding lists M_GetWorld()->fn_vUpdateListObjects(m_pInsertedObject, E_lum_Delete); // cancel temporary modif for (pElem = m_stListInsert.GetHeadElement(posElem); pElem; pElem = m_stListInsert.GetNextElement(posElem)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pEdObj->fn_vUpdateTemporaryModif(C_szCreation, FALSE); // check notify pEdObj->fn_vNotifyUnSave(); } // tell DLLs if (m_stPosition.xIndex != -1) fn_vSendMessageInsert(C_EDTUndo, &m_stPosition); else fn_vSendMessageInsert(C_EDTUndo, NULL); // update all but select mode if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); M_GetMainWnd()->UpdateStatus("Insertion Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { M_GetMainWorld()->m_stListObjectsInSectors.RemoveElement(m_pInsertedObject); } // End Silviu Simen 01 september 1998 List of Objects in Sectors return TRUE; } /*=========================================================================== fill List for DLLs =========================================================================*/ void EDT_ModifInsert::fn_vFillListForInsertion (EDT_SuperObject *pEdObj, EDT_SuperObject *pParent) { EDT_SaveParents *pNewElem; EDT_SuperObject *pEdChild; // create and save elem pNewElem = new EDT_SaveParents(pEdObj, NULL, pParent); m_stListInsert.AddTail(pNewElem); // for each child pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectFirstChild(); while (pEdChild) { fn_vFillListForInsertion(pEdChild, pEdObj); pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectNextChild(pEdChild); } } /*=========================================================================== Message =========================================================================*/ void EDT_ModifInsert::fn_vSendMessageInsert (tdeTypeModif eType, tdstPosition *pPosition) { CPA_ObjectDLLBase *pDLLObject; CPA_ToolDLLBase *pDLLTool; EDT_SuperObject *pInsertedObject, *pParent; EDT_SaveParents *pElem; POSITION pos, posElem; for (pElem = m_stListInsert.GetHeadElement(posElem); pElem; pElem = m_stListInsert.GetNextElement(posElem)) { pInsertedObject = (EDT_SuperObject *) pElem->m_pChild; pParent = (EDT_SuperObject *) pElem->m_pFinalParent; // Current Editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifInsert(pInsertedObject, pParent, pPosition, eType, C_AsCurrentEditor); // corresponding DLL if (pInsertedObject->GetObjectDLL()) pInsertedObject->GetObjectDLL()->fn_vOnModifInsert(pInsertedObject, pParent, pPosition, eType, C_AsConcernedDLL); // if necessary, owner DLL if (pInsertedObject->GetSuperObjectOwner()) { pDLLObject = pInsertedObject->GetSuperObjectOwner()->GetObjectDLL(); pDLLObject->fn_vOnModifInsert(pInsertedObject, pParent, pPosition, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifInsert(pInsertedObject, pParent, pPosition, eType, C_AsToolDLL); } } } //################################################################################# // class ModifDelete //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifDelete::EDT_ModifDelete (EDT_HierarchyEditor *pEditor, CPA_List *pSelectByType, CString csType, BOOL bUpdateDrawing, BOOL bDestroy, BOOL bSelect, BOOL pBlock, BOOL bCutSpecial) : CPA_Modif(TYPE_DELETE, "Delete", pBlock) { EDT_ListByDLL *pListSelect; EDT_ParentByType *pNewList; EDT_SaveParents *pNewElem; EDT_SuperObject *pEdObj; EDT_SuperObject *pParent; CPA_SuperObject *pSupObj; POSITION pos, pos1; // Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism m_bCutSpecial = bCutSpecial; // End Silviu Simen 18 August 1998 Cut/Paste Mechanism // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = bUpdateDrawing; m_bDestroy = bDestroy; m_bSelect = bSelect; // init the lists m_stListObjects.RemoveAll(); // fill the lists for DLLs for (pListSelect = pSelectByType->GetHeadElement(pos); pListSelect; pListSelect = pSelectByType->GetNextElement(pos)) { // save only if there are elements if ((pListSelect->m_stListConcerned.GetCount()) ||(pListSelect->m_stListProtectSelected.GetCount())) { // create the corresponding list pNewList = new EDT_ParentByType(pListSelect->GetDLL()); if (pListSelect->GetDLL()) m_lstModifByType.AddTail(pNewList); // copy the list of objects for (pSupObj = pListSelect->m_stListConcerned.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListConcerned.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; pParent = (EDT_SuperObject *) pEdObj->GetSuperObjectFather(); // if this is a top object, add it to the list if (pListSelect->m_stListSelected.Find(pEdObj, NULL) != NULL) { pNewElem = new EDT_SaveParents(pEdObj, pParent, NULL); m_stListObjects.AddTail(pNewElem); } // else only DLLs need this info else pNewElem = new EDT_SaveParents(pEdObj, pParent, pParent); // add it to DLL list pNewList->m_stListObjects.AddTail(pNewElem); m_stListForTools.AddTail(pNewElem); } // copy the list of protected childs for (pSupObj = pListSelect->m_stListProtectSelected.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListProtectSelected.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; // find new parent pNewElem = new EDT_SaveParents(pEdObj, (EDT_SuperObject *) pEdObj->GetSuperObjectFather(), NULL); // add it to DLL list pNewList->m_stListProtected.AddTail(pNewElem); } } } // init parameters m_csType = csType; m_bDeleted = FALSE; } /*=========================================================================== Constructor =========================================================================*/ EDT_ModifDelete::EDT_ModifDelete (EDT_HierarchyEditor *pEditor, EDT_SuperObject *pObjectToDelete, CString csType, BOOL bUpdateDrawing, BOOL bDestroy, BOOL bSelect, BOOL pBlock, BOOL bCutSpecial) : CPA_Modif(TYPE_DELETE, "Delete", pBlock) { EDT_ParentByType *pNewList; EDT_SaveParents *pNewElem; EDT_SuperObject *pParent; // Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism m_bCutSpecial = bCutSpecial; // End Silviu Simen 18 August 1998 Cut/Paste Mechanism // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = bUpdateDrawing; m_bDestroy = bDestroy; m_bSelect = bSelect; // init the lists m_stListObjects.RemoveAll(); // fill the lists for DLLs pNewList = new EDT_ParentByType(pObjectToDelete->GetObjectDLL()); if (pObjectToDelete->GetObjectDLL()) m_lstModifByType.AddTail(pNewList); // copy object pParent = (EDT_SuperObject *) pObjectToDelete->GetSuperObjectFather(); pNewElem = new EDT_SaveParents(pObjectToDelete, pParent, NULL); m_stListObjects.AddTail(pNewElem); // add it to DLL list pNewList->m_stListObjects.AddTail(pNewElem); m_stListForTools.AddTail(pNewElem); // protected objet ? if (pObjectToDelete->GetSuperObjectOwner()) { // find new parent pNewElem = new EDT_SaveParents(pObjectToDelete, (EDT_SuperObject *) pObjectToDelete->GetSuperObjectFather(), NULL); // add it to DLL list pNewList->m_stListProtected.AddTail(pNewElem); } // fill list for DLLs fn_vFillListForDLLs(pObjectToDelete); // init parameters m_csType = csType; m_bDeleted = FALSE; } /*=========================================================================== Destructor =========================================================================*/ EDT_ModifDelete::~EDT_ModifDelete (void) { // CPA_SuperObject *pEdObj; // EDT_SaveParents *pElem; // POSITION pos; // if objects were removed from hierarchy (DONE), delete them /* if ((m_bDeleted)&&(m_bDestroy)) { for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) { // delete only if object is not temporary pEdObj = pElem->m_pChild; if (!m_pEditor->GetListOfTemporarySO()->Find(pEdObj)) delete pEdObj; } } */ m_stListObjects.RemoveAll(); // free the ModifList while (m_lstModifByType.GetCount() > 0) delete m_lstModifByType.RemoveTail(); } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifDelete::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifDelete::Do (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj; POSITION pos; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // if necessary, register temporary modif for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; // check modif pEdObj->fn_bInitTemporarySO(); pEdObj->fn_vUpdateTemporaryModif(C_szSuppression, TRUE); // temporary SO => keep section in file if (!pEdObj->fn_bIsTemporary()) pEdObj->fn_vNotifyUnSave(); } //ANNECY Shaitan Correction 20/02/98 // // cancel current selection // GetInterface()->fn_vCancelCurrentSelection(FALSE); //ENDANNECY Shaitan Correction // delete all objects in the list for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; //ANNECY Shaitan Correction 20/02/98 // update selection if (M_GetWorld()->GetListSelected()->Find(pEdObj)) GetInterface()->fn_vRemoveSelectedObject(pEdObj, FALSE); //ENDANNECY Shaitan Correction // delete object in the hierarchy pEdObj->IsolateChild(); pEdObj->fn_vUpdateValidity(FALSE); if (pEdObj->fn_bCanBeNotified()) pElem->m_pInitialParent->fn_vNotifySave(); // update the corresponding lists M_GetWorld()->fn_vUpdateListObjects(pEdObj, E_lum_Delete); // update current selection GetInterface()->fn_vSetLocalColor(pEdObj, E_lm_ShowNormal); // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { M_GetMainWorld()->m_stListObjectsInSectors.RemoveElement(pEdObj); } // End Silviu Simen 01 september 1998 List of Objects in Sectors } // tell DLLs fn_vSendMessageDelete((m_bFirstTime) ? C_EDTDo : C_EDTRedo) ; // update all if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Suppression Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } // Objects were deleted m_bDeleted = TRUE; m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifDelete::Undo (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj, *pParent; POSITION pos; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism if (m_bCutSpecial) // we have inserted special object... { GetParentEditor()->SetRegisteredCuttedObject(NULL); GetParentEditor()->SetSpecialObject(TRUE); } // End Silviu Simen 18 August 1998 Cut/Paste Mechanism // cancel current selection if (m_bSelect) GetInterface()->fn_vCancelCurrentSelection(FALSE); // delete all objects in the list for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pParent = (EDT_SuperObject *) pElem->m_pInitialParent; // re-insert the object in the hierarchy pEdObj->fn_vInsertUnderParent(pParent); pEdObj->fn_vUpdateValidity(TRUE); // update the corresponding lists // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { MTH3D_tdstVector stObjectPosition; CPA_SuperObject * pSector; stObjectPosition = HIE_fn_hGetSuperObjectMatrix (pEdObj->GetStruct()) -> stTranslationVector; pSector = GetInterface()->GetSpecificInterface()-> GetCurrentSectorFromPos(&stObjectPosition); M_GetMainWorld()->m_stListObjectsInSectors.AddElement(pEdObj,pSector); } // End Silviu Simen 01 september 1998 List of Objects in Sectors M_GetWorld()->fn_vUpdateListObjects(pEdObj, E_lum_ReInsert); } // if necessary, register temporary modif for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; // temporary SO => section was not removed if (!pEdObj->fn_bIsTemporary()) pEdObj->fn_vNotifyRestore(); // update temporary modif pEdObj->fn_vUpdateTemporaryModif(C_szSuppression, FALSE); } // update select type if ((m_bSelect)&&(M_GetSelectMode() != "All Types")) GetInterface()->SetSelectMode(m_csType); // delete was canceled m_bDeleted = FALSE; // tell DLLs GetInterface()->fn_vUpdatePositions(); fn_vSendMessageDelete(C_EDTUndo); // update current selection if (m_bSelect) { for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) GetInterface()->fn_vAddSelectedObject(pElem->m_pChild, FALSE); } // update all if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); M_GetMainWnd()->UpdateStatus("Suppression Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } return TRUE; } /*=========================================================================== Message =========================================================================*/ void EDT_ModifDelete::fn_vSendMessageDelete (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_ParentByType *pList; POSITION pos; // current editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifDelete(&m_stListForTools, eType, C_AsCurrentEditor); // corresponding DLLs for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_stListObjects.GetCount()) pList->m_poDLL->fn_vOnModifDelete(&pList->m_stListObjects, eType, C_AsConcernedDLL); } // owner DLLs for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_stListProtected.GetCount()) pList->m_poDLL->fn_vOnModifDelete(&pList->m_stListProtected, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifDelete(&m_stListForTools, eType, C_AsToolDLL); } } /*=========================================================================== Find corresponding list =========================================================================*/ EDT_ParentByType * EDT_ModifDelete::fn_pstFindParentListFromObj (EDT_SuperObject *pEdObj) { CPA_ObjectDLLBase *p_oDLL; EDT_ParentByType *pList; POSITION pos; // find object DLL p_oDLL = pEdObj->GetObjectDLL(); if (!p_oDLL) return NULL; // find the corresponding list for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_poDLL == p_oDLL) return pList; } // List was not found -> create it pList = new EDT_ParentByType(p_oDLL); m_lstModifByType.AddTail(pList); return pList; } /*=========================================================================== fill List for DLLs =========================================================================*/ void EDT_ModifDelete::fn_vFillListForDLLs (EDT_SuperObject *pEdObj) { EDT_ParentByType *pList; EDT_SaveParents *pNewElem; EDT_SuperObject *pEdChild; // for each child pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectFirstChild(); while (pEdChild) { pNewElem = new EDT_SaveParents(pEdChild, pEdObj, pEdObj); // find corresponding list pList = fn_pstFindParentListFromObj(pEdChild); // add new elem if (pList) pList->m_stListObjects.AddTail(pNewElem); m_stListForTools.AddTail(pNewElem); // next level of the hierarchy fn_vFillListForDLLs(pEdChild); // next brother pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectNextChild(pEdChild); } } //################################################################################# // Class ModifPaste //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifPaste::EDT_ModifPaste (EDT_HierarchyEditor *pEditor, CPA_List *pListObjects, CString csType, long lNbCopy, BOOL bUpdateDrawing) : CPA_Modif(TYPE_PASTE, "Paste", FALSE) { EDT_ParentByType *pNewList; EDT_SaveParents *pSaveParent, *pNewSaveParent; EDT_SuperObject *pElem, *pNewElem, *pParent, *pInitParent; POSITION pos; // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = bUpdateDrawing; // init the lists m_stListObjects.RemoveAll(); // fill the list of objects to paste for (pSaveParent = pListObjects->GetHeadElement(pos); pSaveParent; pSaveParent = pListObjects->GetNextElement(pos)) { // find new object and parent pElem = (EDT_SuperObject *) pSaveParent->m_pChild; pInitParent = (EDT_SuperObject *) pSaveParent->m_pInitialParent; pParent = (EDT_SuperObject *) pSaveParent->m_pFinalParent; // create new elem pNewElem = m_pEditor->GetACopy(pElem, FALSE, FALSE); // add element in the list pNewSaveParent = new EDT_SaveParents(pNewElem, pInitParent, pParent); m_stListObjects.AddTail(pNewSaveParent); // update the lists for DLLs pNewList = fn_pstFindParentListFromObj(pNewElem); pNewList->m_stListObjects.AddTail(pNewSaveParent); m_stListForTools.AddTail(pNewSaveParent); fn_vFillListForDLLs(pNewElem); // if necessary, update list for protected if (pNewElem->GetSuperObjectOwner()) { pNewSaveParent = new EDT_SaveParents(pNewElem, pParent, NULL); pNewList = fn_pstFindParentListFromObj((EDT_SuperObject *) pNewElem->GetSuperObjectOwner()); pNewList->m_stListProtected.AddTail(pNewSaveParent); } } m_csType = csType; m_bDone = FALSE; } /*=========================================================================== Destructor =========================================================================*/ EDT_ModifPaste::~EDT_ModifPaste (void) { // EDT_SaveParents *pElem; // POSITION pos; // if modif was canceled (UNDONE), delete objects /* if (!m_bDone) { for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) delete pElem->m_pChild; } */ m_stListObjects.RemoveAll(); // free the ModifList while (m_lstModifByType.GetCount() > 0) delete m_lstModifByType.RemoveTail(); } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifPaste::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifPaste::Do (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj, *pParent; POSITION pos; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // paste all objects in the list for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pParent = (EDT_SuperObject *) pElem->m_pFinalParent; // re-insert the object in the hierarchy pEdObj->fn_vInsertUnderParent(pParent, NULL, TRUE); pEdObj->fn_vUpdateValidity(TRUE); if (pEdObj->fn_bCanBeNotified()) pParent->fn_vNotifySave(); // update the corresponding lists // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { MTH3D_tdstVector stObjectPosition; CPA_SuperObject * pSector; stObjectPosition = HIE_fn_hGetSuperObjectMatrix (pEdObj->GetStruct()) -> stTranslationVector; pSector = GetInterface()->GetSpecificInterface()-> GetCurrentSectorFromPos(&stObjectPosition); M_GetMainWorld()->m_stListObjectsInSectors.AddElement(pEdObj,pSector); } // End Silviu Simen 01 september 1998 List of Objects in Sectors M_GetWorld()->fn_vUpdateListObjects(pEdObj, E_lum_Insert); } // update matrices GetInterface()->fn_vUpdatePositions(); // if necessary, register temporary modif for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) { // check modif pEdObj = (EDT_SuperObject *) pElem->m_pChild; //CPA2 Stegaru Cristian 98-03 if (E_ss_Responsible == pEdObj->GetSaveStatus ()) pEdObj->SetSaveStatus (E_ss_Modify); if (E_ss_Modify == pEdObj->GetSaveStatus ()) { pEdObj->fn_bInitTemporarySO(); EDT_TempModif *pTempModif = pEdObj->GetTemporaryModif (); ASSERT (pTempModif); pTempModif->mfn_vSetInitialSPOName (pEdObj->mfn_csGetInitialSPOName ()); pEdObj->fn_vUpdateTemporaryModif(C_szCreation, TRUE); } //End CPA2 Stegaru Cristian 98-03 // update notify pEdObj->fn_vNotifySave(); } // update select type if (M_GetSelectMode() != "All Types") GetInterface()->SetSelectMode(m_csType); // tell DLLs fn_vSendMessageCopy((m_bFirstTime) ? C_EDTDo : C_EDTRedo); m_bFirstTime = FALSE; // update current selection for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) GetInterface()->fn_vAddSelectedObject(pElem->m_pChild, FALSE); // update all if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Paste Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } m_bDone = TRUE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifPaste::Undo (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj; POSITION pos; // world must be valid if (!M_HasCurrentWorld()) return FALSE; GetInterface()->fn_vCancelCurrentSelection(FALSE); // delete all objects in the list for (pElem = m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListObjects.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; // delete object in the hierarchy pEdObj->IsolateChild(); pEdObj->fn_vUpdateValidity(FALSE); // update the corresponding lists // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { M_GetMainWorld()->m_stListObjectsInSectors.RemoveElement(pEdObj); } // End Silviu Simen 01 september 1998 List of Objects in Sectors M_GetWorld()->fn_vUpdateListObjects(pEdObj, E_lum_Delete); // update current selection GetInterface()->fn_vSetLocalColor(pEdObj, E_lm_ShowNormal); } // if necessary, register temporary modif for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pEdObj->fn_vUpdateTemporaryModif(C_szCreation, FALSE); // update notify pEdObj->fn_vNotifyUnSave(); } // update all but select mode if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); M_GetMainWnd()->UpdateStatus("Paste Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } // tell DLLs fn_vSendMessageCopy(C_EDTUndo); m_bDone = FALSE; return TRUE; } /*=========================================================================== Find corresponding list =========================================================================*/ EDT_ParentByType * EDT_ModifPaste::fn_pstFindParentListFromObj (EDT_SuperObject *pEdObj) { CPA_ObjectDLLBase *p_oDLL; EDT_ParentByType *pList; POSITION pos; // find object DLL p_oDLL = pEdObj->GetObjectDLL(); if (!p_oDLL) return NULL; // find the corresponding list for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_poDLL == p_oDLL) return pList; } // List was not found -> create it pList = new EDT_ParentByType(p_oDLL); m_lstModifByType.AddTail(pList); return pList; } /*=========================================================================== fill List for DLLs =========================================================================*/ void EDT_ModifPaste::fn_vFillListForDLLs (EDT_SuperObject *pEdObj) { EDT_ParentByType *pList; EDT_SaveParents *pNewElem; EDT_SuperObject *pEdChild; // for each child pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectFirstChild(); while (pEdChild) { pNewElem = new EDT_SaveParents(pEdChild, pEdObj, pEdObj); // find corresponding list pList = fn_pstFindParentListFromObj(pEdChild); // add new elem if (pList) pList->m_stListObjects.AddTail(pNewElem); m_stListForTools.AddTail(pNewElem); // next level of the hierarchy fn_vFillListForDLLs(pEdChild); // next brother pEdChild = (EDT_SuperObject *) pEdObj->GetSuperObjectNextChild(pEdChild); } } /*=========================================================================== Message =========================================================================*/ void EDT_ModifPaste::fn_vSendMessageCopy (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_ParentByType *pList; POSITION pos; // current editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifCopy(&m_stListForTools, eType, C_AsCurrentEditor); // corresponding DLLs for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_stListObjects.GetCount()) pList->m_poDLL->fn_vOnModifCopy(&pList->m_stListObjects, eType, C_AsConcernedDLL); } // owner DLLs for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_stListProtected.GetCount()) pList->m_poDLL->fn_vOnModifCopy(&pList->m_stListProtected, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifCopy(&m_stListForTools, eType, C_AsToolDLL); } } //################################################################################# // Class ModifMove //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifMove::EDT_ModifMove (EDT_HierarchyEditor *pEditor, CPA_List *pSelectByType, CString csType, BOOL bUpdateDrawing) : CPA_Modif(TYPE_MOVE, "Move", FALSE) { EDT_SaveGlobalPos *pNewSaveGlobalPos; EDT_ListByDLL *pListSelect; EDT_SavePos *pNewSavePos; EDT_SuperObject *pEdObj; CPA_SuperObject *pSupObj; EDT_PosByType *pNewList; POSITION pos, pos1; // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = bUpdateDrawing; // fill the lists for DLLs for (pListSelect = pSelectByType->GetHeadElement(pos); pListSelect; pListSelect = pSelectByType->GetNextElement(pos)) { // save only if there are elements if (pListSelect->m_stListConcerned.GetCount()) { // create the corresponding list pNewList = new EDT_PosByType(pListSelect->GetDLL()); if (pListSelect->GetDLL()) m_lstModifByType.AddTail(pNewList); // copy the list of selected objects for (pSupObj = pListSelect->m_stListSelected.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListSelected.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; // update list of selected objets pNewSavePos = new EDT_SavePos(pEdObj, HIE_fn_hGetSuperObjectMatrix(pEdObj->GetStruct())); pNewList->m_stListObjects.AddTail(pNewSavePos); m_stListForTools.m_stListObjects.AddTail(pNewSavePos); } // copy the list of concerned objects for (pSupObj = pListSelect->m_stListConcerned.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListConcerned.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; // update list of concerned objets pNewSaveGlobalPos = new EDT_SaveGlobalPos(pEdObj, HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct())); pNewList->m_stListConcerned.AddTail(pNewSaveGlobalPos); m_stListForTools.m_stListConcerned.AddTail(pNewSaveGlobalPos); } // copy the list of protected childs for (pSupObj = pListSelect->m_stListProtectSelected.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListProtectSelected.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; pNewSavePos = new EDT_SavePos(pEdObj, HIE_fn_hGetSuperObjectMatrix(pEdObj->GetStruct())); pNewList->m_stListProtected.AddTail(pNewSavePos); } // copy the list of protected childs for (pSupObj = pListSelect->m_stListProtectConcerned.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListProtectConcerned.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; pNewSaveGlobalPos = new EDT_SaveGlobalPos(pEdObj, HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct())); pNewList->m_stListProtectConcerned.AddTail(pNewSaveGlobalPos); } } } // init parameters m_csType = csType; // init modif parent m_pModifParent = NULL; } /*=========================================================================== Constructor =========================================================================*/ EDT_ModifMove::~EDT_ModifMove (void) { // raz list for tools m_stListForTools.m_stListObjects.RemoveAll(); m_stListForTools.m_stListConcerned.RemoveAll(); // free select list while (m_lstModifByType.GetCount() > 0) delete m_lstModifByType.RemoveTail(); } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifMove::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifMove::Do (void) { EDT_SaveGlobalPos *pElem1; EDT_SavePos *pElem; tdeTypeModif eType; POSITION pos, pos1; // world must be valid if (!M_HasCurrentWorld()) return FALSE; eType = (m_bFirstTime) ? C_EDTDo : C_EDTRedo ; // first call : register the move and update parents if (m_bFirstTime) { GetInterface()->fn_vUpdatePositions(); fn_vRegisterPositions(); } // cancel the current selection if (!m_bFirstTime) GetInterface()->fn_vCancelCurrentSelection(FALSE); // init the modif for (pElem1 = m_stListForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stListForTools.m_stListConcerned.GetNextElement(pos1)) ((EDT_SuperObject *) pElem1->m_pObject)->fn_bInitTemporarySO(); // do the modif for (pElem = m_stListForTools.m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListForTools.m_stListObjects.GetNextElement(pos)) { // select the current object if (!m_bFirstTime) GetInterface()->fn_vAddSelectedObject(pElem->m_pObject, FALSE); // set the final position GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct()), pElem->m_hFinalMatrix); // notify section pElem->m_pObject->fn_vNotifySave(); // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { MTH3D_tdstVector stObjectPosition; CPA_SuperObject * pSector; stObjectPosition = pElem -> m_hFinalMatrix -> stTranslationVector; pSector = GetInterface() -> GetSpecificInterface()-> GetCurrentSectorFromPos(&stObjectPosition); M_GetMainWorld()->m_stListObjectsInSectors.UpdateElement(pElem->m_pObject,pSector); } // End Silviu Simen 01 september 1998 List of Objects in Sectors } // update file names for (pElem1 = m_stListForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stListForTools.m_stListConcerned.GetNextElement(pos1)) { // set the final position GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct()), pElem1->m_hFinalGlobalMatrix); // if necessary, register the modif ((EDT_SuperObject *) pElem1->m_pObject)->fn_vUpdateTemporaryModif(C_szChangePosition, TRUE); } // tell DLLs fn_vSendMessageMove(eType); // update parents if (m_pModifParent) m_pModifParent->Do(); // set select mode if (strcmp(M_GetSelectMode(), "All Types")) GetInterface()->SetSelectMode(m_csType); // for autotarget if (m_stListForTools.m_stListObjects.GetCount() == 1) { CPA_SuperObject *pEdObj = m_stListForTools.m_stListObjects.GetHeadElement(pos1)->m_pObject; BOOL bAutoTarget = GetInterface()->fn_bAutoTarget(); BOOL bAutoZoom = GetInterface()->fn_bAutoZoom(); if (bAutoTarget || bAutoZoom) GetInterface()->fn_vCenterOnObject(pEdObj, bAutoZoom, bAutoTarget); } if (m_bUpdate) { // Begin Silviu Simen 01 september 1998 List of Objects in Sectors // GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // m_pEditor->GetDialogEdit()->fn_vUpdateDialog(); GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); // End Silviu Simen 01 september 1998 List of Objects in Sectors if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Move Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } // update parameters m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifMove::Undo (void) { EDT_SaveGlobalPos *pElem1; EDT_SavePos *pElem; POSITION pos, pos1; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // cancel the current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // undo the modif for (pElem = m_stListForTools.m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListForTools.m_stListObjects.GetNextElement(pos)) { // select the current object GetInterface()->fn_vAddSelectedObject(pElem->m_pObject, FALSE); // set the initial matrix GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct()), pElem->m_hInitialMatrix); // Begin Silviu Simen 01 september 1998 List of Objects in Sectors if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld()) { MTH3D_tdstVector stObjectPosition; CPA_SuperObject * pSector; stObjectPosition = pElem -> m_hInitialMatrix -> stTranslationVector; pSector = GetInterface() -> GetSpecificInterface() -> GetCurrentSectorFromPos(&stObjectPosition); M_GetMainWorld()->m_stListObjectsInSectors.UpdateElement(pElem->m_pObject,pSector); } // End Silviu Simen 01 september 1998 List of Objects in Sectors } // update file names for (pElem1 = m_stListForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stListForTools.m_stListConcerned.GetNextElement(pos1)) { // set the final position GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct()), pElem1->m_hInitialGlobalMatrix); // if necessary, register the modif ((EDT_SuperObject *) pElem1->m_pObject)->fn_vUpdateTemporaryModif(C_szChangePosition, FALSE); } // tell DLLs fn_vSendMessageMove(C_EDTUndo); // update parents if (m_pModifParent) m_pModifParent->Undo(); // set select mode if (strcmp(M_GetSelectMode(), "All Types")) GetInterface()->SetSelectMode(m_csType); // for autotarget if (m_stListForTools.m_stListObjects.GetCount() == 1) { CPA_SuperObject *pEdObj = m_stListForTools.m_stListObjects.GetHeadElement(pos1)->m_pObject; BOOL bAutoTarget = GetInterface()->fn_bAutoTarget(); BOOL bAutoZoom = GetInterface()->fn_bAutoZoom(); if (bAutoTarget || bAutoZoom) GetInterface()->fn_vCenterOnObject(pEdObj, bAutoZoom, bAutoTarget); } // update all if (m_bUpdate) { // Begin Silviu Simen 01 september 1998 List of Objects in Sectors // GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // m_pEditor->GetDialogEdit()->fn_vUpdateDialog(); GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); // End Silviu Simen 01 september 1998 List of Objects in Sectors M_GetMainWnd()->UpdateStatus("Move Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } return TRUE; } /*=========================================================================== Cancel =========================================================================*/ BOOL EDT_ModifMove::Cancel (void) { EDT_SavePos *pElem; POSITION pos1; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // undo the modif for (pElem = m_stListForTools.m_stListObjects.GetHeadElement(pos1); pElem; pElem = m_stListForTools.m_stListObjects.GetNextElement(pos1)) GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct()), pElem->m_hInitialMatrix); // tell DLLs fn_vSendMessageMove(C_EDTCancel); // update all GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); return TRUE; } /*=========================================================================== Init Modif Parent =========================================================================*/ void EDT_ModifMove::fn_vInitListModif (CPA_List *pListModif) { if (pListModif->GetCount()) m_pModifParent = new EDT_ModifParent(m_pEditor, pListModif, m_csType); } /*=========================================================================== Init Modif Move =========================================================================*/ void EDT_ModifMove::fn_vRegisterPositions (void) { EDT_PosByType *pListPos; EDT_SaveGlobalPos *pElem1; EDT_SavePos *pElem; POSITION pos, pos1; // update the list of selected objects for (pElem = m_stListForTools.m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListForTools.m_stListObjects.GetNextElement(pos)) { // register final position pElem->m_hFinalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem->m_hFinalMatrix, HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct())); } // update the list of concerned objects for (pElem1 = m_stListForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stListForTools.m_stListConcerned.GetNextElement(pos1)) { // register final position pElem1->m_hFinalGlobalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem1->m_hFinalGlobalMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct())); } // protected objects for (pListPos = m_lstModifByType.GetHeadElement(pos); pListPos; pListPos = m_lstModifByType.GetNextElement(pos)) { // update the list of selected objects for (pElem = pListPos->m_stListProtected.GetHeadElement(pos1); pElem1; pElem = pListPos->m_stListProtected.GetNextElement(pos1)) { // register final position pElem->m_hFinalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem1->m_hFinalGlobalMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct())); } // update the list of concerned objects for (pElem1 = pListPos->m_stListProtectConcerned.GetHeadElement(pos1); pElem1; pElem1 = pListPos->m_stListProtectConcerned.GetNextElement(pos1)) { // register final position pElem1->m_hFinalGlobalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem1->m_hFinalGlobalMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct())); } } // reinit selected objects for (pElem = m_stListForTools.m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stListForTools.m_stListObjects.GetNextElement(pos)) GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct()), pElem->m_hInitialMatrix); // reinit concerned objects for (pElem1 = m_stListForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stListForTools.m_stListConcerned.GetNextElement(pos1)) GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct()), pElem1->m_hInitialGlobalMatrix); } /*=========================================================================== Message =========================================================================*/ void EDT_ModifMove::fn_vSendMessageMove (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_PosByType *pListPos; POSITION pos; if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifMove(&m_stListForTools.m_stListObjects, &m_stListForTools.m_stListConcerned, eType, C_AsCurrentEditor); // object DLLs for (pListPos = m_lstModifByType.GetHeadElement(pos); pListPos; pListPos = m_lstModifByType.GetNextElement(pos)) { if (pListPos->m_stListConcerned.GetCount()) pListPos->m_poDLL->fn_vOnModifMove(&pListPos->m_stListObjects, &pListPos->m_stListConcerned, eType, C_AsConcernedDLL); } // owner DLLs for (pListPos = m_lstModifByType.GetHeadElement(pos); pListPos; pListPos = m_lstModifByType.GetNextElement(pos)) { if (pListPos->m_stListProtectConcerned.GetCount()) pListPos->m_poDLL->fn_vOnModifMove(&pListPos->m_stListProtected, &pListPos->m_stListProtectConcerned, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifMove(&m_stListForTools.m_stListObjects, &m_stListForTools.m_stListConcerned, eType, C_AsToolDLL); } } //################################################################################# // Class ModifParent //################################################################################# /*=========================================================================== Constructor (EDT_HierarchyEditor) =========================================================================*/ EDT_ModifParent::EDT_ModifParent (EDT_HierarchyEditor *pEditor, CPA_List *pSelectByType, EDT_SuperObject *pNewParent, CString csType, BOOL bUpdateDrawing) : CPA_Modif(TYPE_PARENT, "ModifParent", FALSE) { EDT_ListByDLL *pListSelect; EDT_SaveParents *pNewSaveParent; EDT_ParentByType *pNewList; EDT_SuperObject *pEdObj, *pParent; CPA_SuperObject *pSupObj; POSITION pos, pos1; // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = bUpdateDrawing; // fill the lists for DLLs for (pListSelect = pSelectByType->GetHeadElement(pos); pListSelect; pListSelect = pSelectByType->GetNextElement(pos)) { // save only if there are elements if ((pListSelect->m_stListSelected.GetCount()) ||(pListSelect->m_stListProtectSelected.GetCount())) { // create the corresponding list pNewList = new EDT_ParentByType(pListSelect->GetDLL()); if (pListSelect->GetDLL()) m_lstModifByType.AddTail(pNewList); // copy the list of objects for (pSupObj = pListSelect->m_stListSelected.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListSelected.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; // init parameters pParent = (EDT_SuperObject *) pEdObj->GetSuperObjectFather(); // create element pNewSaveParent = new EDT_SaveParents(pEdObj, pParent, pNewParent); // update lists pNewList->m_stListObjects.AddTail(pNewSaveParent); m_stListForTools.AddTail(pNewSaveParent); } // copy the list of protected for (pSupObj = pListSelect->m_stListProtectSelected.GetHeadElement(pos1); pSupObj; pSupObj = pListSelect->m_stListProtectSelected.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pSupObj; pNewSaveParent = new EDT_SaveParents(pEdObj, (EDT_SuperObject *) pEdObj->GetSuperObjectFather(), pNewParent); pNewList->m_stListProtected.AddTail(pNewSaveParent); } } } // save select mode m_csType = csType; } /*=========================================================================== Constructor (from ModifMove) =========================================================================*/ EDT_ModifParent::EDT_ModifParent (EDT_HierarchyEditor *pEditor, CPA_List *pListModif, CString csType) : CPA_Modif(TYPE_PARENT, "ModifParent", FALSE) { EDT_ParentByType *pListSelect; EDT_ParentByType *pListProtect; EDT_SaveParents *pNewSaveParent; EDT_SaveParents *pElem; POSITION pos; // init parent editor m_pEditor = pEditor; m_bFirstTime = TRUE; m_bUpdate = FALSE; m_lstModifByType.RemoveAll(); // fill the lists for (pElem = pListModif->GetHeadElement(pos); pElem; pElem = pListModif->GetNextElement(pos)) { // create new element pNewSaveParent = new EDT_SaveParents(pElem->m_pChild, pElem->m_pInitialParent, pElem->m_pFinalParent); // fill list for tools m_stListForTools.AddTail(pNewSaveParent); // find corresponding list pListSelect = GetOrCreateListByDLL(pElem->m_pChild->GetObjectDLL()); // add element to the list pListSelect->m_stListObjects.AddTail(pNewSaveParent); // protected childs => add to protect list if (pElem->m_pChild->GetSuperObjectOwner()) { // create new element pNewSaveParent = new EDT_SaveParents(pElem->m_pChild, pElem->m_pInitialParent, pElem->m_pFinalParent); // get protect list pListProtect = GetOrCreateListByDLL(pElem->m_pChild->GetSuperObjectOwner()->GetObjectDLL()); // add element to protect list pListProtect->m_stListProtected.AddTail(pNewSaveParent); } } // save select mode m_csType = csType; } /*=========================================================================== Destructor =========================================================================*/ EDT_ModifParent::~EDT_ModifParent (void) { // free Select List while (m_lstModifByType.GetCount() > 0) delete m_lstModifByType.RemoveTail(); } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifParent::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifParent::Do (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj, *pParent; POSITION pos, pos1; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // change parent for all objects in the list for (pElem = m_stListForTools.GetHeadElement(pos1); pElem; pElem = m_stListForTools.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pParent = (EDT_SuperObject *) pElem->m_pFinalParent; // update object status pEdObj->fn_bInitTemporarySO(); // move the object in the hierarchy pEdObj->fn_vInsertUnderParent(pParent, NULL, TRUE); // if necessary, register the modif pEdObj->fn_vUpdateTemporaryModif(C_szChangeFather, TRUE); // register notify if (pEdObj->fn_bCanBeNotified()) { pElem->m_pInitialParent->fn_vNotifySave(); pElem->m_pFinalParent->fn_vNotifySave(); pEdObj->fn_vNotifySave(); } // show new parent if (M_GetWorld()->GetRoot() != pParent) GetInterface()->fn_vSetLocalColor(pParent, E_lm_ShowParent); } // tell DLLs fn_vSendMessageParent((m_bFirstTime) ? C_EDTDo : C_EDTRedo); // update current selection for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) GetInterface()->fn_vAddSelectedObject(pElem->m_pChild, FALSE); // update all GetInterface()->SetSelectMode("All Types"); if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Modif Parent Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifParent::Undo (void) { EDT_SaveParents *pElem; EDT_SuperObject *pEdObj, *pParent; POSITION pos, pos1; // world must be valid if (!M_HasCurrentWorld()) return FALSE; // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // delete all objects in the list for (pElem = m_stListForTools.GetHeadElement(pos1); pElem; pElem = m_stListForTools.GetNextElement(pos1)) { pEdObj = (EDT_SuperObject *) pElem->m_pChild; pParent = (EDT_SuperObject *) pElem->m_pInitialParent; // move the object in the hierarchy pEdObj->fn_vInsertUnderParent(pParent, NULL, TRUE); // update object status pEdObj->fn_vUpdateTemporaryModif(C_szChangeFather, FALSE); // show new parent if (M_GetWorld()->GetRoot() != pParent) GetInterface()->fn_vSetLocalColor(pParent, E_lm_ShowParent); } // tell DLLs fn_vSendMessageParent(C_EDTUndo); // update current selection for (pElem = m_stListForTools.GetHeadElement(pos); pElem; pElem = m_stListForTools.GetNextElement(pos)) GetInterface()->fn_vAddSelectedObject(pElem->m_pChild, FALSE); // update select type if (M_GetSelectMode() != "All Types") GetInterface()->SetSelectMode(m_csType); // update all if (m_bUpdate) { GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); M_GetMainWnd()->UpdateStatus("Modif Parent Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); } return TRUE; } /*=========================================================================== Functions =========================================================================*/ EDT_ParentByType * EDT_ModifParent::GetOrCreateListByDLL (CPA_ObjectDLLBase *p_oDLL) { EDT_ParentByType *pList; POSITION pos; // check the existing lists for (pList = m_lstModifByType.GetHeadElement(pos); pList; pList = m_lstModifByType.GetNextElement(pos)) { if (pList->m_poDLL == p_oDLL) return pList; } // list was not found => create it pList = new EDT_ParentByType(p_oDLL); if (p_oDLL) m_lstModifByType.AddTail(pList); return pList; } /*=========================================================================== Message =========================================================================*/ void EDT_ModifParent::fn_vSendMessageParent (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_ParentByType *pListParent; POSITION pos; // Current Editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifParent(&m_stListForTools, eType, C_AsCurrentEditor); // concerned DLLs for (pListParent = m_lstModifByType.GetHeadElement(pos); pListParent; pListParent = m_lstModifByType.GetNextElement(pos)) { if (pListParent->m_stListObjects.GetCount()) pListParent->m_poDLL->fn_vOnModifParent(&pListParent->m_stListObjects, eType, C_AsConcernedDLL); } // owner DLLs for (pListParent = m_lstModifByType.GetHeadElement(pos); pListParent; pListParent = m_lstModifByType.GetNextElement(pos)) { if (pListParent->m_stListProtected.GetCount()) pListParent->m_poDLL->fn_vOnModifParent(&pListParent->m_stListProtected, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifParent(&m_stListForTools, eType, C_AsToolDLL); } } //################################################################################# // class ModifName //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifName::EDT_ModifName(EDT_HierarchyEditor *pEditor, EDT_SuperObject *pModifiedObject, CString csFinalName, BOOL bRenameObject) : CPA_Modif(TYPE_RENAME, "Rename", FALSE) { // init parent editor m_pEditor = pEditor; // Init parameters m_pModifiedObject = pModifiedObject; m_bRenameObject = bRenameObject; if (!m_bRenameObject) m_csInitialName = pModifiedObject->GetName(); else m_csInitialName = pModifiedObject->GetObject()->GetName(); m_csFinalName = csFinalName; m_csType = pModifiedObject->GetRealTypeName(); // init modif m_bFirstTime = TRUE; } EDT_ModifName::~EDT_ModifName (void) { } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifName::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifName::Do (void) { // update current selection if (!m_bFirstTime) { GetInterface()->fn_vCancelCurrentSelection(FALSE); GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); } // if necessary, register as temporary if (!m_bRenameObject) m_pModifiedObject->fn_bInitTemporarySO(); // update name if (!m_bRenameObject) m_pModifiedObject->fn_eRename(m_csFinalName); else m_pModifiedObject->GetObject()->fn_eRename(m_csFinalName); // if necessary, update modif if (!m_bRenameObject) m_pModifiedObject->fn_vUpdateTemporaryModif(C_szChangeName, TRUE); // tell DLLs fn_vSendMessageName((m_bFirstTime) ? C_EDTDo : C_EDTRedo); // update all GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); if (!m_bFirstTime) M_GetMainWnd()->UpdateStatus("Rename Done", C_STATUSPANE_INFOS, C_STATUS_NORMAL); m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifName::Undo (void) { BOOL bIsLoadingWorld; // update current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // undo => no prefix added !! bIsLoadingWorld = GetInterface()->fn_bIsLoadingWorld(); GetInterface()->SetLoadingWorld(TRUE); // update name if (!m_bRenameObject) m_pModifiedObject->fn_eRename(m_csInitialName); else m_pModifiedObject->GetObject()->fn_eRename(m_csInitialName); // undo => no prefix added !! GetInterface()->SetLoadingWorld(bIsLoadingWorld); // if necessary, update modif if (!m_bRenameObject) m_pModifiedObject->fn_vUpdateTemporaryModif(C_szChangeName, FALSE); // tell DLLs fn_vSendMessageName(C_EDTUndo); // update all GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); M_GetMainWnd()->UpdateStatus("Rename Undone", C_STATUSPANE_INFOS, C_STATUS_NORMAL); return TRUE; } /*=========================================================================== Message =========================================================================*/ void EDT_ModifName::fn_vSendMessageName (tdeTypeModif eType) { CPA_ObjectDLLBase *pDLLObject; CPA_ToolDLLBase *pDLLTool; POSITION pos; // for current editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsCurrentEditor); // tell the corresponding DLL if (m_pModifiedObject->GetObjectDLL()) m_pModifiedObject->GetObjectDLL()->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsConcernedDLL); // if necessary, tell owner if (m_pModifiedObject->GetSuperObjectOwner()) { pDLLObject = m_pModifiedObject->GetSuperObjectOwner()->GetObjectDLL(); pDLLObject->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsToolDLL); } } //################################################################################# // Class ModifState //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifState::EDT_ModifState (EDT_HierarchyEditor *pEditor, EDT_SuperObject *pModifiedObject, CString csTypeModif, BOOL bInitialState) : CPA_Modif(TYPE_STATE, "State", FALSE) { // init parameters m_pEditor = pEditor; m_pModifiedObject = pModifiedObject; m_csTypeModif = csTypeModif; m_bInitialState = bInitialState; m_bFirstTime = TRUE; // creation => register parent and lists if (csTypeModif == C_szCreation) { if (bInitialState) { m_pInitialParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); m_pFinalParent = NULL; fn_vFillListForDelete(m_pModifiedObject, m_pInitialParent, m_pFinalParent); } else { m_pInitialParent = NULL; m_pFinalParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); } } // suppression => register parent and lists if (csTypeModif == C_szSuppression) { if (bInitialState) { m_pInitialParent = NULL; m_pFinalParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); } else { m_pInitialParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); m_pFinalParent = NULL; fn_vFillListForDelete(m_pModifiedObject, m_pInitialParent, m_pFinalParent); } } // change parent => simply register parent if (csTypeModif == C_szChangeFather) { if (bInitialState) { m_pInitialParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); //CPA2 Stegaru Cristian 98-02 // m_pFinalParent = pModifiedObject->GetTemporaryModif()->GetOriginalFather(); } else { //CPA2 Stegaru Cristian 98-02 //m_pInitialParent = pModifiedObject->GetTemporaryModif()->GetOriginalFather(); m_pFinalParent = pModifiedObject->GetTemporaryModif()->GetFinalFather(); } m_stParentForTools.RemoveAll(); m_stParentForTools.AddTail(new EDT_SaveParents(m_pModifiedObject, m_pInitialParent, m_pFinalParent)); } // change position => register position and init lists if (csTypeModif == C_szChangePosition) { m_hInitialMatrix = M_EDT_AllocMatrix(); m_hFinalMatrix = M_EDT_AllocMatrix(); if (bInitialState) { GEO_M_vCopyMatrix(m_hInitialMatrix, pModifiedObject->GetTemporaryModif()->GetFinalPosition()); //CPA2 Stegaru Cristian 98-02 //GEO_M_vCopyMatrix(m_hFinalMatrix, pModifiedObject->GetTemporaryModif()->GetOriginalPosition()); } else { //CPA2 Stegaru Cristian 98-02 //GEO_M_vCopyMatrix(m_hInitialMatrix, pModifiedObject->GetTemporaryModif()->GetOriginalPosition()); GEO_M_vCopyMatrix(m_hFinalMatrix, pModifiedObject->GetTemporaryModif()->GetFinalPosition()); } // lists fn_vFillListForMove(m_pModifiedObject); } // init name if (csTypeModif == C_szChangeName) { if (bInitialState) { m_csInitialName = pModifiedObject->GetTemporaryModif()->GetFinalName(); //CPA2 Stegaru Cristian 98-02 //m_csFinalName = pModifiedObject->GetTemporaryModif()->GetOriginalName(); } else { //CPA2 Stegaru Cristian 98-02 //m_csInitialName = pModifiedObject->GetTemporaryModif()->GetOriginalName(); m_csFinalName = pModifiedObject->GetTemporaryModif()->GetFinalName(); } } } /*=========================================================================== Destructor =========================================================================*/ EDT_ModifState::~EDT_ModifState (void) { } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifState::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifState::Do (void) { BOOL bIsLoadingWorld; // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // creation if (m_csTypeModif == C_szCreation) { if (m_bInitialState) { // remove in hierarchy fn_vRemoveFromHierarchy(); // tell DLLs fn_vSendMessageDelete((m_bFirstTime) ? C_EDTDo : C_EDTRedo); } else { // insert in hierarchy fn_vInsertInHierarchy(); // tell DLLs fn_vSendMessageCreate((m_bFirstTime) ? C_EDTDo : C_EDTRedo); // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); } } // suppression else if (m_csTypeModif == C_szSuppression) { if (m_bInitialState) { // insert in hierarchy fn_vInsertInHierarchy(); // tell DLLs fn_vSendMessageCreate((m_bFirstTime) ? C_EDTDo : C_EDTRedo); // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); } else { // remove in hierarchy fn_vRemoveFromHierarchy(); // tell DLLs fn_vSendMessageDelete((m_bFirstTime) ? C_EDTDo : C_EDTRedo); } } // father else if (m_csTypeModif == C_szChangeFather) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change parent m_pModifiedObject->fn_vInsertUnderParent(m_pFinalParent, NULL, TRUE); // show new parent if (M_GetWorld()->GetRoot() != m_pFinalParent) GetInterface()->fn_vSetLocalColor(m_pFinalParent, E_lm_ShowParent); // update absolute position GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // tell DLLs fn_vSendMessageParent((m_bFirstTime) ? C_EDTDo : C_EDTRedo); } // position else if (m_csTypeModif == C_szChangePosition) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change matrix GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(m_pModifiedObject->GetStruct()), m_hFinalMatrix); // update absolute position GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // if necessary, register position if (m_bFirstTime) fn_vRegisterPositions(); // Tell DLLs fn_vSendMessageMove((m_bFirstTime) ? C_EDTDo : C_EDTRedo); } // name else if (m_csTypeModif == C_szChangeName) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change name bIsLoadingWorld = GetInterface()->fn_bIsLoadingWorld(); GetInterface()->SetLoadingWorld(TRUE); m_pModifiedObject->fn_eRename(m_csFinalName); GetInterface()->SetLoadingWorld(bIsLoadingWorld); // Tell DLLs fn_vSendMessageName((m_bFirstTime) ? C_EDTDo : C_EDTRedo); } // update state if (!m_bFirstTime) m_pModifiedObject->fn_vUpdateModification(m_csTypeModif, TRUE, m_bInitialState); // update drawing & dialogs GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); // update parameters m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifState::Undo (void) { BOOL bIsLoadingWorld; // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // creation if (m_csTypeModif == C_szCreation) { if (m_bInitialState) { // insert in hierarchy fn_vInsertInHierarchy(); // tell DLLs fn_vSendMessageDelete(C_EDTUndo); // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); } else { // remove in hierarchy fn_vRemoveFromHierarchy(); // tell DLLs fn_vSendMessageCreate(C_EDTUndo); } } // suppression else if (m_csTypeModif == C_szSuppression) { if (m_bInitialState) { // remove in hierarchy fn_vRemoveFromHierarchy(); // tell DLLs fn_vSendMessageCreate(C_EDTUndo); } else { // insert in hierarchy fn_vInsertInHierarchy(); // tell DLLs fn_vSendMessageDelete(C_EDTUndo); // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); } } // father else if (m_csTypeModif == C_szChangeFather) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change parent m_pModifiedObject->fn_vInsertUnderParent(m_pInitialParent, NULL, TRUE); // show new parent if (M_GetWorld()->GetRoot() != m_pInitialParent) GetInterface()->fn_vSetLocalColor(m_pInitialParent, E_lm_ShowParent); // update absolute position GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // tell DLLs fn_vSendMessageParent(C_EDTUndo); } // position else if (m_csTypeModif == C_szChangePosition) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change matrix GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectMatrix(m_pModifiedObject->GetStruct()), m_hInitialMatrix); // update absolute position GetInterface()->fn_vUpdateAll(E_mc_JustDraw); // tell DLLs fn_vSendMessageMove(C_EDTUndo); } // name else if (m_csTypeModif == C_szChangeName) { // select object GetInterface()->fn_vAddSelectedObject(m_pModifiedObject, FALSE); // change name bIsLoadingWorld = GetInterface()->fn_bIsLoadingWorld(); GetInterface()->SetLoadingWorld(TRUE); m_pModifiedObject->fn_eRename(m_csInitialName); GetInterface()->SetLoadingWorld(bIsLoadingWorld); // tell DLLs fn_vSendMessageName(C_EDTUndo); } m_pModifiedObject->fn_vUpdateModification(m_csTypeModif, TRUE, !m_bInitialState); // update drawing & dialogs GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); return TRUE; } /*=========================================================================== Creation =========================================================================*/ void EDT_ModifState::fn_vInsertInHierarchy (void) { // insert object in the hierarchy m_pModifiedObject->fn_vInsertUnderParent(m_pFinalParent); // update matrix POS_fn_vNormalizeMatrix(HIE_fn_hGetSuperObjectMatrix(m_pModifiedObject->GetStruct())); // update the corresponding list M_GetWorld()->fn_vUpdateListObjects(m_pModifiedObject, E_lum_Insert); GetInterface()->fn_vUpdatePositions(); } /*=========================================================================== Suppression =========================================================================*/ void EDT_ModifState::fn_vRemoveFromHierarchy (void) { // remove object from hierarchy m_pModifiedObject->IsolateChild(); // update the corresponding lists M_GetWorld()->fn_vUpdateListObjects(m_pModifiedObject, E_lum_Delete); // update current selection GetInterface()->fn_vSetLocalColor(m_pModifiedObject, E_lm_ShowNormal); } /*=========================================================================== Find corresponding list =========================================================================*/ EDT_ParentByType * EDT_ModifState::fn_pstFindParentListFromObj (EDT_SuperObject *pEdObj) { CPA_ObjectDLLBase *p_oDLL; EDT_ParentByType *pList; POSITION pos; // find object DLL p_oDLL = pEdObj->GetObjectDLL(); if (!p_oDLL) return NULL; // find the corresponding list for (pList = m_lstParentByType.GetHeadElement(pos); pList; pList = m_lstParentByType.GetNextElement(pos)) { if (pList->m_poDLL == p_oDLL) return pList; } // List was not found -> create it pList = new EDT_ParentByType(p_oDLL); m_lstParentByType.AddTail(pList); return pList; } /*=========================================================================== fill List for DLLs =========================================================================*/ void EDT_ModifState::fn_vFillListForDelete (EDT_SuperObject *pEdObj, EDT_SuperObject *pInitialFather, EDT_SuperObject *pFinalFather) { EDT_ParentByType *pList; EDT_SaveParents *pNewElem; CPA_SuperObject *pEdChild; // create new elem pNewElem = new EDT_SaveParents(pEdObj, pInitialFather, pFinalFather); // find corresponding list pList = fn_pstFindParentListFromObj(pEdObj); // add new elem if (pList) pList->m_stListObjects.AddTail(pNewElem); m_stParentForTools.AddTail(pNewElem); // for each child pEdChild = pEdObj->GetSuperObjectFirstChild(); while (pEdChild) { // next level of the hierarchy fn_vFillListForDelete((EDT_SuperObject *) pEdChild, pEdObj, pEdObj); // next brother pEdChild = pEdObj->GetSuperObjectNextChild(pEdChild); } } /*=========================================================================== Find corresponding list =========================================================================*/ EDT_PosByType * EDT_ModifState::fn_pstFindPosListFromObj (EDT_SuperObject *pEdObj) { CPA_ObjectDLLBase *p_oDLL; EDT_PosByType *pList; POSITION pos; // find object DLL p_oDLL = pEdObj->GetObjectDLL(); if (!p_oDLL) return NULL; // find the corresponding list for (pList = m_lstPosByType.GetHeadElement(pos); pList; pList = m_lstPosByType.GetNextElement(pos)) { if (pList->m_poDLL == p_oDLL) return pList; } // List was not found -> create it pList = new EDT_PosByType(p_oDLL); m_lstPosByType.AddTail(pList); return pList; } /*=========================================================================== fill List for DLLs =========================================================================*/ void EDT_ModifState::fn_vFillListForMove (EDT_SuperObject *pEdObj) { EDT_SaveGlobalPos *pNewSaveGlobalPos; CPA_SuperObject *pEdChild; EDT_PosByType *pList; EDT_SavePos *pNewSavePos; // create new save pos pNewSavePos = new EDT_SavePos(pEdObj, HIE_fn_hGetSuperObjectMatrix(pEdObj->GetStruct())); pList = fn_pstFindPosListFromObj(pEdObj); if (pList) pList->m_stListObjects.AddTail(pNewSavePos); m_stPosForTools.m_stListObjects.AddTail(pNewSavePos); // create new save global pos pNewSaveGlobalPos = new EDT_SaveGlobalPos(pEdObj, HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct())); pList = fn_pstFindPosListFromObj(pEdObj); if (pList) pList->m_stListConcerned.AddTail(pNewSaveGlobalPos); m_stPosForTools.m_stListConcerned.AddTail(pNewSaveGlobalPos); // for each child pEdChild = pEdObj->GetSuperObjectFirstChild(); while (pEdChild) { // next level of the hierarchy fn_vFillListForMove((EDT_SuperObject *)pEdChild); // next brother pEdChild = pEdObj->GetSuperObjectNextChild(pEdChild); } } /*=========================================================================== Init Modif Move =========================================================================*/ void EDT_ModifState::fn_vRegisterPositions (void) { EDT_SaveGlobalPos *pElem1; EDT_SavePos *pElem; POSITION pos, pos1; // update the list of selected objects for (pElem = m_stPosForTools.m_stListObjects.GetHeadElement(pos); pElem; pElem = m_stPosForTools.m_stListObjects.GetNextElement(pos)) { // register final position pElem->m_hFinalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem->m_hFinalMatrix, HIE_fn_hGetSuperObjectMatrix(pElem->m_pObject->GetStruct())); } // update the list of concerned objects for (pElem1 = m_stPosForTools.m_stListConcerned.GetHeadElement(pos1); pElem1; pElem1 = m_stPosForTools.m_stListConcerned.GetNextElement(pos1)) { // register final position pElem1->m_hFinalGlobalMatrix = M_EDT_AllocMatrix(); GEO_M_vCopyMatrix(pElem1->m_hFinalGlobalMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pElem1->m_pObject->GetStruct())); } } /*=========================================================================== Message Create =========================================================================*/ void EDT_ModifState::fn_vSendMessageCreate (tdeTypeModif eType) { CPA_ObjectDLLBase *pDLLObject; CPA_ToolDLLBase *pDLLTool; POSITION pos; // Current Editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifInsert(m_pModifiedObject, m_pFinalParent, NULL, eType, C_AsCurrentEditor); // corresponding DLL if (m_pModifiedObject->GetObjectDLL()) m_pModifiedObject->GetObjectDLL()->fn_vOnModifInsert(m_pModifiedObject, m_pFinalParent, NULL, eType, C_AsConcernedDLL); // if necessary, owner DLL if (m_pModifiedObject->GetSuperObjectOwner()) { pDLLObject = m_pModifiedObject->GetSuperObjectOwner()->GetObjectDLL(); pDLLObject->fn_vOnModifInsert(m_pModifiedObject, m_pFinalParent, NULL, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifInsert(m_pModifiedObject, m_pFinalParent, NULL, eType, C_AsToolDLL); } } /*=========================================================================== Message Remove =========================================================================*/ void EDT_ModifState::fn_vSendMessageDelete (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_ParentByType *pList; POSITION pos; // current editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifDelete(&m_stParentForTools, eType, C_AsCurrentEditor); // corresponding DLLs for (pList = m_lstParentByType.GetHeadElement(pos); pList; pList = m_lstParentByType.GetNextElement(pos)) { if (pList->m_stListObjects.GetCount()) pList->m_poDLL->fn_vOnModifDelete(&pList->m_stListObjects, eType, C_AsConcernedDLL); } // owner DLLs for (pList = m_lstParentByType.GetHeadElement(pos); pList; pList = m_lstParentByType.GetNextElement(pos)) { if (pList->m_stListProtected.GetCount()) pList->m_poDLL->fn_vOnModifDelete(&pList->m_stListProtected, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifDelete(&m_stParentForTools, eType, C_AsToolDLL); } } /*=========================================================================== Message =========================================================================*/ void EDT_ModifState::fn_vSendMessageParent (tdeTypeModif eType) { CPA_ObjectDLLBase *pDLLObject; CPA_ToolDLLBase *pDLLTool; POSITION pos; // Current Editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifParent(&m_stParentForTools, eType, C_AsCurrentEditor); // tell the corresponding DLL if (m_pModifiedObject->GetObjectDLL()) m_pModifiedObject->GetObjectDLL()->fn_vOnModifParent(&m_stParentForTools, eType, C_AsConcernedDLL); // if necessary, tell owner if (m_pModifiedObject->GetSuperObjectOwner()) { pDLLObject = m_pModifiedObject->GetSuperObjectOwner()->GetObjectDLL(); pDLLObject->fn_vOnModifParent(&m_stParentForTools, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifParent(&m_stParentForTools, eType, C_AsToolDLL); } } /*=========================================================================== Message =========================================================================*/ void EDT_ModifState::fn_vSendMessageMove (tdeTypeModif eType) { CPA_ToolDLLBase *pDLLTool; EDT_PosByType *pListPos; POSITION pos; if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifMove(&m_stPosForTools.m_stListObjects, &m_stPosForTools.m_stListConcerned, eType, C_AsCurrentEditor); // object DLLs for (pListPos = m_lstPosByType.GetHeadElement(pos); pListPos; pListPos = m_lstPosByType.GetNextElement(pos)) { if (pListPos->m_stListConcerned.GetCount()) pListPos->m_poDLL->fn_vOnModifMove(&pListPos->m_stListObjects, &pListPos->m_stListConcerned, eType, C_AsConcernedDLL); } // owner DLLs for (pListPos = m_lstPosByType.GetHeadElement(pos); pListPos; pListPos = m_lstPosByType.GetNextElement(pos)) { if (pListPos->m_stListProtectConcerned.GetCount()) pListPos->m_poDLL->fn_vOnModifMove(&pListPos->m_stListProtected, &pListPos->m_stListProtectConcerned, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifMove(&m_stPosForTools.m_stListObjects, &m_stPosForTools.m_stListConcerned, eType, C_AsToolDLL); } } /*=========================================================================== Message Name =========================================================================*/ void EDT_ModifState::fn_vSendMessageName (tdeTypeModif eType) { CPA_ObjectDLLBase *pDLLObject; CPA_ToolDLLBase *pDLLTool; POSITION pos; // for current editor if (!M_IsCurrentEditor()) M_GetCurrentEditor()->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsCurrentEditor); // tell the corresponding DLL if (m_pModifiedObject->GetObjectDLL()) m_pModifiedObject->GetObjectDLL()->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsConcernedDLL); // if necessary, tell owner if (m_pModifiedObject->GetSuperObjectOwner()) { pDLLObject = m_pModifiedObject->GetSuperObjectOwner()->GetObjectDLL(); pDLLObject->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsChildOwner); } // Tool DLLs for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool; pDLLTool = M_GetToolDLLs()->GetNextElement(pos)) { if (pDLLTool != M_GetCurrentEditor()) pDLLTool->fn_vOnModifName(m_pModifiedObject, m_csInitialName, m_csFinalName, eType, C_AsToolDLL); } } //################################################################################# // Class ModifValidate //################################################################################# /*=========================================================================== Constructor =========================================================================*/ EDT_ModifValidate::EDT_ModifValidate (EDT_HierarchyEditor *pEditor, EDT_SuperObject *pModifiedObject, CString csTypeModif, BOOL bInitialState) : CPA_Modif(TYPE_VALIDATE, "Validate", FALSE) { // init parameters m_pEditor = pEditor; m_pModifiedObject = pModifiedObject; m_csTypeModif = csTypeModif; m_bInitialState = bInitialState; m_bFirstTime = TRUE; m_pModifState = new EDT_ModifState(pEditor, pModifiedObject, csTypeModif, bInitialState); m_pTempModif = m_pModifiedObject->GetTemporaryModif(); m_bCreated = m_pTempModif->fn_bWasCreated(); m_bDeleted = m_pTempModif->fn_bWasDeleted(); //CPA2 Stegaru Cristian 98-02 //m_csOriginalName = m_pTempModif->GetOriginalName(); //m_pOriginalFather = m_pTempModif->GetOriginalFather(); //m_hOriginalPosition = m_pTempModif->GetOriginalPosition(); } /*=========================================================================== Destructor =========================================================================*/ EDT_ModifValidate::~EDT_ModifValidate (void) { } /*=========================================================================== Interface =========================================================================*/ CPA_Interface * EDT_ModifValidate::GetInterface (void) { return GetParentEditor()->GetInterface(); } /*=========================================================================== Do =========================================================================*/ BOOL EDT_ModifValidate::Do (void) { // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // do modif m_pModifState->Do(); // validate final result if (m_csTypeModif == C_szCreation) m_pTempModif->SetCreated(FALSE); // suppression else if (m_csTypeModif == C_szSuppression) m_pTempModif->SetDeleted(FALSE); // father else if (m_csTypeModif == C_szChangeFather) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalFather((EDT_SuperObject *) m_pModifiedObject->GetSuperObjectFather()); // position else if (m_csTypeModif == C_szChangePosition) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalPosition(HIE_fn_hGetSuperObjectMatrix(m_pModifiedObject->GetStruct())); // name else if (m_csTypeModif == C_szChangeName) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalName(m_pModifiedObject->GetName()); // test modification if (!m_pTempModif->fn_bIsModified("")) { m_pModifiedObject->SetTemporaryModif(NULL); m_pModifiedObject->fn_vUpdateModification(m_csTypeModif, FALSE, m_bInitialState); GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); } // update parameters m_bFirstTime = FALSE; return TRUE; } /*=========================================================================== Undo =========================================================================*/ BOOL EDT_ModifValidate::Undo (void) { // cancel current selection GetInterface()->fn_vCancelCurrentSelection(FALSE); // validate final result if (m_csTypeModif == C_szCreation) m_pTempModif->SetCreated(m_bCreated); // suppression else if (m_csTypeModif == C_szSuppression) m_pTempModif->SetDeleted(m_bDeleted); // father else if (m_csTypeModif == C_szChangeFather) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalFather(m_pOriginalFather); // position else if (m_csTypeModif == C_szChangePosition) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalPosition(m_hOriginalPosition); // name else if (m_csTypeModif == C_szChangeName) //CPA2 Stegaru Cristian 98-02 ;//m_pTempModif->SetOriginalName(m_csOriginalName); // test modification m_pModifiedObject->SetTemporaryModif(m_pTempModif); m_pModifiedObject->fn_vUpdateModification(m_csTypeModif, TRUE, m_bInitialState); // undo modif m_pModifState->Undo(); // update temporary modif GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog); return TRUE; } #endif