reman3/Rayman_X/cpa/tempgrp/Edt/src/edtdupdt.cpp

242 lines
6.6 KiB
C++

/*=========================================================================
*
* EDTdUpdt.cpp : Hierarchy update - Implementation file
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "EDTdUpdt.hpp"
#include "EDTBase.Hpp"
#include "EDTSObj.hpp"
#include "EDTSpec.hpp"
//#################################################################################
// EDT_DialogUpdate dialog
//#################################################################################
/*----------------------------------------
----------------------------------------*/
EDT_DialogUpdate::EDT_DialogUpdate(CWnd* pParent /*=NULL*/)
: CDialog(EDT_DialogUpdate::IDD, &g_oBaseFrame)
{
//{{AFX_DATA_INIT(EDT_DialogUpdate)
//}}AFX_DATA_INIT
POS_fn_vSetIdentityMatrix(&m_stRefMatrix);
}
/*----------------------------------------
----------------------------------------*/
void EDT_DialogUpdate::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(EDT_DialogUpdate)
DDX_Control(pDX, EDT_IDC_LISTREINSERT1, m_cListInsert1);
DDX_Control(pDX, EDT_IDC_LISTDESTROY1, m_cListDestroy1);
DDX_Control(pDX, EDT_IDC_LISTREINSERT, m_cListInsert);
DDX_Control(pDX, EDT_IDC_LISTDESTROY, m_cListDestroy);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(EDT_DialogUpdate, CDialog)
//{{AFX_MSG_MAP(EDT_DialogUpdate)
ON_LBN_SELCHANGE(EDT_IDC_LISTDESTROY, OnSelchangeListDestroy)
ON_LBN_SELCHANGE(EDT_IDC_LISTREINSERT, OnSelchangeListReinsert)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//#################################################################################
// EDT_DialogUpdate message handler
//#################################################################################
/*----------------------------------------
----------------------------------------*/
CPA_Interface * EDT_DialogUpdate::GetInterface (void)
{
return m_pEditor->GetInterface();
}
/*----------------------------------------
----------------------------------------*/
void EDT_DialogUpdate::OnSelchangeListDestroy()
{
EDT_SuperObject *pObjectToInsert;
POSITION pos;
char szName[30];
char szType[30];
int iObjectToInsert = -1;
// get object to insert
iObjectToInsert = m_cListDestroy.GetCurSel();
if (iObjectToInsert != -1)
pObjectToInsert = m_stListDestroy.FindElementFromIndex(iObjectToInsert);
// reinsert object
if (pObjectToInsert)
{
// update the lists
pos = m_stListDestroy.Find(pObjectToInsert, NULL);
if (pos)
m_stListDestroy.RemoveAt(pos);
m_stListInsert.AddTail(pObjectToInsert);
// update the dialog
m_cListDestroy.GetText(iObjectToInsert, szName);
m_cListDestroy1.GetText(iObjectToInsert, szType);
m_cListDestroy.DeleteString(iObjectToInsert);
m_cListDestroy1.DeleteString(iObjectToInsert);
m_cListInsert.AddString(szName);
m_cListInsert1.AddString(szType);
}
}
/*----------------------------------------
----------------------------------------*/
void EDT_DialogUpdate::OnSelchangeListReinsert()
{
EDT_SuperObject *pObjectToDestroy;
POSITION pos;
char szName[30];
char szType[30];
int iObjectToDestroy = -1;
// get object to insert
iObjectToDestroy = m_cListInsert.GetCurSel();
if (iObjectToDestroy != -1)
pObjectToDestroy = m_stListInsert.FindElementFromIndex(iObjectToDestroy);
// destroy object
if (pObjectToDestroy)
{
// update the lists
pos = m_stListInsert.Find(pObjectToDestroy, NULL);
if (pos)
m_stListInsert.RemoveAt(pos);
m_stListDestroy.AddTail(pObjectToDestroy);
// update the dialog
m_cListInsert.GetText(iObjectToDestroy, szName);
m_cListInsert1.GetText(iObjectToDestroy, szType);
m_cListInsert.DeleteString(iObjectToDestroy);
m_cListInsert1.DeleteString(iObjectToDestroy);
m_cListDestroy.AddString(szName);
m_cListDestroy1.AddString(szType);
}
}
/*----------------------------------------
----------------------------------------*/
void EDT_DialogUpdate::OnOK()
{
EDT_SuperObject *pParent;
EDT_SuperObject *pElem;
POSITION pos;
// re-insert all the selected objects
for (pElem = m_stListInsert.GetHeadElement(pos); pElem;
pElem = m_stListInsert.GetNextElement(pos))
{
pParent = (EDT_SuperObject *) pElem->GetSuperObjectFather();
if (!fn_bIsInHierarchy(pParent))
pParent = m_pEditor->GetSpecificEditor()->GetDefaultParentForPaste(pElem);
if (pParent)
{
pElem->SetList(NULL, FALSE);
pElem->fn_vInsertUnderParent(pParent, NULL, TRUE);
}
else
m_pEditor->fn_vDestroySuperObject(pElem, FALSE);
}
// remove all the elements in the lists
m_stListInsert.RemoveAll();
// destroy all removed elements
while (m_stListDestroy.GetCount() > 0)
{
pElem = m_stListDestroy.RemoveTail();
m_pEditor->fn_vDestroySuperObject(pElem, FALSE);
}
// destroy the dialog
EndDialog(0);
}
/*----------------------------------------
----------------------------------------*/
void EDT_DialogUpdate::fn_vInitDialog (EDT_HierarchyEditor *pEditor)
{
// init parent editor
m_pEditor = pEditor;
// this dialog is modal
DoModal();
}
/*----------------------------------------
----------------------------------------*/
BOOL EDT_DialogUpdate::OnInitDialog ()
{
CPA_SuperObject *pElem;
POSITION pos;
char szName[30];
char szType[30];
// Create the dialog
CDialog::OnInitDialog();
// init list destroy
for (pElem = m_stListDestroy.GetHeadElement(pos); pElem; pElem = m_stListDestroy.GetNextElement(pos))
{
sprintf(szName, "%s", pElem->GetNameToDraw());
sprintf(szType, " %1s-%s", pElem->GetRealTypeName(), pElem->GetModelName());
m_cListDestroy.AddString(szName);
m_cListDestroy1.AddString(szType);
}
return TRUE;
}
/*===========================================================================
* Description: Check if an object is still in the hierarchy
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL EDT_DialogUpdate::fn_bIsInHierarchy (EDT_SuperObject *pParent)
{
EDT_SuperObject *pElem;
POSITION pos, pos1;
if (!pParent)
return FALSE;
// check if pParent was destroyed
pos1 = M_GetListAllObjects()->Find(pParent);
if (pos1)
{
// check if pParent is reinserted
for (pElem = m_stListInsert.GetHeadElement(pos); pElem;
pElem = m_stListInsert.GetNextElement(pos))
{
if (pParent->fn_bIsUnderObject(pElem))
return TRUE;
}
// pParent is destroyed
return FALSE;
}
// pParent was not destroyed
else
return TRUE;
}
#endif // ACTIVE_EDITOR