reman3/Rayman_X/cpa/tempgrp/ITF/cpadins.cpp

684 lines
20 KiB
C++

/*=========================================================================
*
* CPAdIns.cpp : Insertion - Implementation file
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "itf/CPAdIns.hpp"
#include "itf/CPADD.hpp"
#include "itf/DEVVp3D.hpp"
#include "itf/DEVMul3D.hpp"
#include "itf/CPAProj.hpp"
#include "itf/CPAInter.hpp"
#include "itf/CPAMWorl.hpp"
#include "x:\cpa\main\inc\_EditID.h"
#include "TUT.h"
#include <direct.h>
//#################################################################################
// CPA_DialogInsert dialog
//#################################################################################
/*----------------------------------------
----------------------------------------*/
CPA_DialogInsert::CPA_DialogInsert(CWnd* pParent)
: CFormView(CPA_DialogInsert::IDD)
{
//{{AFX_DATA_INIT(CPA_DialogInsert)
//}}AFX_DATA_INIT
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPA_DialogInsert)
DDX_Control(pDX, CPA_IDC_NEWMODEL, m_cNewModel);
DDX_Control(pDX, CPA_IDC_DELMODEL, m_cDelModel);
DDX_Control(pDX, CPA_IDC_CHANGEICON, m_cModelIcon);
DDX_Control(pDX, CPA_IDC_SAVELIST, m_cSaveList);
DDX_Control(pDX, CPA_IDC_LOADLIST, m_cLoadList);
DDX_Control(pDX, CPA_IDC_COMBOTYPE, m_cComboType);
//}}AFX_DATA_MAP
}
/*----------------------------------------
----------------------------------------*/
BEGIN_MESSAGE_MAP(CPA_DialogInsert, CFormView)
//{{AFX_MSG_MAP(CPA_DialogInsert)
ON_CBN_SELCHANGE(CPA_IDC_COMBOTYPE, OnSelchangeCombotype)
ON_BN_CLICKED(CPA_IDC_NEWMODEL, OnNewModel)
ON_BN_CLICKED(CPA_IDC_DELMODEL, OnDelModel)
ON_BN_CLICKED(CPA_IDC_CHANGEICON, OnModelIcon)
ON_BN_CLICKED(CPA_IDC_SAVELIST, OnSaveList)
ON_BN_CLICKED(CPA_IDC_LOADLIST, OnLoadList)
ON_WM_SIZE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//#################################################################################
// CPA_DialogInsert dialog
//#################################################################################
/*===========================================================================
* Description: Init the dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vInitDialog (CPA_Interface *pInterface, FRMBase *pFrame)
{
// create the dialog
m_bInitialised = FALSE;
m_p_oInterface = pInterface;
CFormView::Create(NULL, "", WS_VISIBLE|WS_CHILD/*AFX_WS_DEFAULT_VIEW*/, CRect(0,0,0,0), pFrame, AFX_IDW_PANE_FIRST, NULL);
// update data
CFormView::UpdateData(FALSE);
// init the combo box
GetInterface()->SetCurrentModel(NULL);
m_csTypeInsert = "All Types";
// init the list box
m_iNumDesc = -1;
m_pListModels = NULL;
m_lNbValidNew = 0;
m_lNbValidLoad = 0;
m_ePopupMode = E_pm_NoMode;
m_bInitialised = TRUE;
// register controls
TUT_M_vGetTutDll();
TUT_M_vRegisterControlID( CPA_IDC_NEWMODEL, "ITF_MODEL_BTNEW", TUT_e_Button );
TUT_M_vRegisterControlID( CPA_IDC_DELMODEL, "ITF_MODEL_BTDEL", TUT_e_Button );
TUT_M_vRegisterControlID( CPA_IDC_CHANGEICON, "ITF_MODEL_BTICON", TUT_e_Button );
TUT_M_vRegisterControlID( CPA_IDC_SAVELIST, "ITF_MODEL_BTSAVE", TUT_e_Button );
TUT_M_vRegisterControlID( CPA_IDC_LOADLIST, "ITF_MODEL_BTLOAD", TUT_e_Button );
TUT_M_vRegisterControlID( CPA_IDC_COMBOTYPE, "ITF_MODEL_CBTYPE", TUT_e_ComboBox );
}
/*===========================================================================
* Description: init the combo box
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vInitComboType (CString csListName)
{
CPA_ObjectDLLBase *p_oDLL;
EDT_ModelsByType *pListType;
POSITION pos;
int iInd;
// RAZ
m_cComboType.ResetContent();
m_lNbValidNew = 0;
m_lNbValidLoad = 0;
m_cComboType.AddString("All Types");
// fill the list of the combo with the available types
for (pListType = GetInterface()->GetListOfModelsByType()->GetHeadElement(pos); pListType;
pListType = GetInterface()->GetListOfModelsByType()->GetNextElement(pos))
m_cComboType.AddString(pListType->GetTypeName());
// set the current selection (Select Mode)
if (csListName.IsEmpty())
{
m_csTypeInsert = "All Types";
m_cComboType.SetCurSel(0);
}
else
{
m_csTypeInsert = csListName;
iInd = m_cComboType.FindStringExact(-1, csListName);
m_cComboType.SetCurSel(iInd);
}
// update flags
iInd = 0;
do
{
p_oDLL = M_GetMainWorld()->GetListOfObjectDLLBase()->FindElementFromIndex(iInd);
if ((p_oDLL)&&(p_oDLL->fn_bCanLoadNewModel("All Types")))
m_lNbValidNew++;
if ((p_oDLL)&&(p_oDLL->fn_bCanLoadListModels()))
m_lNbValidLoad++;
iInd++;
}
while (p_oDLL);
// update the list
fn_vUpdateListModel();
}
/*===========================================================================
* Description: init the combo box
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vSetCurrentListModel (CString csListName)
{
int iInd;
// set the current selection (Select Mode)
iInd = m_cComboType.FindStringExact(-1, csListName);
if (iInd != -1)
{
m_csTypeInsert = csListName;
m_cComboType.SetCurSel(iInd);
}
else
{
m_csTypeInsert = "All Types";
m_cComboType.SetCurSel(0);
}
// update the list
fn_vUpdateListModel();
}
/*===========================================================================
* Description: init the list box
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vReinitListModel (void)
{
RECT AbsolutePosition, WindowPosition;
int px, py, cx, cy;
// Calculate the position of the dialog
GetDlgItem(CPA_IDC_NEWDIALOG)->GetWindowRect(&AbsolutePosition);
GetWindowRect(&WindowPosition);
px = AbsolutePosition.left - WindowPosition.left;
py = AbsolutePosition.top - WindowPosition.top;
cx = WindowPosition.right - WindowPosition.left - 2*px;
cy = WindowPosition.bottom - WindowPosition.top - py - 10;
// move the new dialog
if (m_pListModels)
{
m_pListModels->MoveWindow(px, py , cx, cy);
m_pListModels->ShowWindow(SW_SHOW);
m_pListModels->EnableWindow(TRUE);
m_pListModels->Invalidate();
}
}
/*===========================================================================
* Description: update the list of models
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vUpdateListModel (void)
{
EDT_ModelsByType *pListType;
// get list by type
pListType = GetInterface()->GetModelsWithTypeName(m_csTypeInsert);
if (!pListType)
pListType = GetInterface()->GetListAllModels();
// get model view
if (m_pListModels)
{
m_pListModels->ShowWindow(SW_HIDE);
m_pListModels->EnableWindow(FALSE);
}
m_pListModels = pListType->m_pModelView;
fn_vReinitListModel();
GetInterface()->SetCurrentModel(NULL);
// reinit controls
if (pListType != GetInterface()->GetListAllModels())
{
// init button "Del"
m_cDelModel.EnableWindow(pListType->CanDeleteModel());
// init button "New"
m_cNewModel.EnableWindow(pListType->CanLoadNewModel());
// init button "Icon"
m_cModelIcon.EnableWindow(pListType->CanChangeModelIcon());
// init button "Save"
m_cSaveList.EnableWindow(pListType->CanSaveList());
}
else
{
m_cDelModel.EnableWindow(FALSE);
m_cModelIcon.EnableWindow(FALSE);
m_cNewModel.EnableWindow((m_lNbValidNew > 0));
m_cSaveList.EnableWindow(FALSE);
}
// init button "Load"
m_cLoadList.EnableWindow((m_lNbValidLoad > 0));
// Update the current object to insert
if (m_pListModels->m_fn_lGetCount())
m_iNumDesc = 0;
else
m_iNumDesc = -1;
}
/*===========================================================================
* Description: load new model
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vLoadNewModel (CPA_ObjectDLLBase *p_oDLL)
{
EDT_Model *pNewModel;
BOOL bRes;
if (!p_oDLL)
return;
// call the corresponding load function
pNewModel = p_oDLL->GetNewModel(m_csTypeInsert);
// test the type
if (pNewModel)
{
bRes = GetInterface()->fn_bAddANewModel(pNewModel, m_csTypeInsert, p_oDLL);
// test unicity
if (!bRes)
{
M_GetMainWnd()->MessageBox("This descriptor is already loaded",
"Sorry...", MB_ICONSTOP|MB_OK);
delete pNewModel;
return;
}
// update the list box
m_pListModels->Invalidate();
// update selection
GetInterface()->SetCurrentModel(pNewModel);
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
}
}
/*===========================================================================
* Description: load model list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogInsert::fn_vLoadListModels (CPA_ObjectDLLBase *p_oDLL)
{
CString csNewList;
if (p_oDLL)
csNewList = p_oDLL->fn_csLoadListModels();
// if there's a new list, update dialog
if (!csNewList.IsEmpty())
fn_vInitComboType(csNewList);
}
/*===========================================================================
* Description: load model list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CPA_ObjectDLLBase * CPA_DialogInsert::GetSingleDllForNew (void)
{
CPA_ObjectDLLBase *p_oDLL;
long lIndex = 0;
do
{
p_oDLL = M_GetMainWorld()->GetListOfObjectDLLBase()->FindElementFromIndex(lIndex);
if ((p_oDLL)&&(p_oDLL->fn_bCanLoadNewModel(m_csTypeInsert)))
return p_oDLL;
lIndex++;
}
while (p_oDLL);
return NULL;
}
/*===========================================================================
* Description: load model list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CPA_ObjectDLLBase * CPA_DialogInsert::GetSingleDllForLoad (void)
{
CPA_ObjectDLLBase *p_oDLL;
long lIndex = 0;
do
{
p_oDLL = M_GetMainWorld()->GetListOfObjectDLLBase()->FindElementFromIndex(lIndex);
if ((p_oDLL)&&(p_oDLL->fn_bCanLoadListModels()))
return p_oDLL;
lIndex++;
}
while (p_oDLL);
return NULL;
}
//#################################################################################
// CPA_DialogInsert message handlers
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnDestroy()
{
// register controls
TUT_M_vGetTutDll();
TUT_M_vUnregisterControlID( CPA_IDC_NEWMODEL );
TUT_M_vUnregisterControlID( CPA_IDC_DELMODEL );
TUT_M_vUnregisterControlID( CPA_IDC_SAVELIST );
TUT_M_vUnregisterControlID( CPA_IDC_LOADLIST );
TUT_M_vUnregisterControlID( CPA_IDC_COMBOTYPE );
//
CFormView::OnDestroy();
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnSelchangeCombotype()
{
// find the type of object to insert
m_cComboType.GetLBText(m_cComboType.GetCurSel(), m_csTypeInsert);
// update the list of descriptors
fn_vUpdateListModel();
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnNewModel()
{
CPA_ObjectDLLBase *p_oDLLInterface = NULL;
EDT_ModelsByType *pListType;
CPA_MainWorld *pMainWorld;
CMenu oMenu;
RECT WindowPosition;
long lIndex = 0;
int px, py;
// find the DLL interface corresponding to the choice in Combo Box
pListType = GetInterface()->GetModelsWithTypeName(m_csTypeInsert);
if (pListType)
p_oDLLInterface = pListType->GetDLL();
if ((m_csTypeInsert == "All Types")&&(m_lNbValidNew == 1))
p_oDLLInterface = GetSingleDllForNew();
if (p_oDLLInterface)
{
fn_vLoadNewModel(p_oDLLInterface);
return;
}
if (m_lNbValidNew == 0)
return;
// init mode
m_ePopupMode = E_pm_NewModel;
// create popup menu
oMenu.CreatePopupMenu();
// entries for DLLs
pMainWorld = M_GetMainWorld();
do
{
p_oDLLInterface = pMainWorld->GetListOfObjectDLLBase()->FindElementFromIndex(lIndex);
if ((p_oDLLInterface)&&(p_oDLLInterface->fn_bCanLoadNewModel(m_csTypeInsert)))
oMenu.AppendMenu(MF_STRING, lIndex, p_oDLLInterface->GetName());
lIndex++;
}
while (p_oDLLInterface);
if (!oMenu.GetMenuItemCount())
oMenu.AppendMenu(MF_STRING, lIndex, "No New Available");
// get position
m_cNewModel.GetWindowRect(&WindowPosition);
px = WindowPosition.right;
py = WindowPosition.top;
// register the popup menu for the tutorial module
TUT_M_vGetTutDll ();
TUT_M_vRegisterMenu (this -> m_hWnd , oMenu . m_hMenu , px , py);
// display & track popup menu
oMenu.TrackPopupMenu(TPM_RIGHTALIGN | TPM_LEFTBUTTON, px, py, this);
// destroy menus
oMenu.DestroyMenu();
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnDelModel (void)
{
EDT_Model *pModel;
BOOL bRes;
// all types => cannot remove
if (m_csTypeInsert == "All Types")
return;
// get current model
pModel = GetInterface()->GetCurrentModel();
// remove it from the list
if (pModel)
bRes = GetInterface()->fn_bRemoveAModel(pModel->m_csName, m_csTypeInsert);
// update list
if (bRes)
{
GetInterface()->SetCurrentModel(NULL);
fn_vUpdateListModel();
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
}
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnModelIcon (void)
{
EDT_Model *pModel;
CString csBitmapName;
BOOL bRes = FALSE;
// all types => cannot remove
if (m_csTypeInsert == "All Types")
return;
// get current model
pModel = GetInterface()->GetCurrentModel();
// remove it from the list
if (pModel && pModel->m_pObjectDLL)
{
// get name for new icon
csBitmapName = pModel->m_pObjectDLL->fn_csChangeModelIcon(m_csTypeInsert, pModel->m_csName);
// load new icon
bRes = pModel->fn_bChangeBitmap(GetInterface(), csBitmapName);
}
// update list
if (bRes)
{
EDT_ModelsByType *pListType;
// update model in local list
pListType = GetInterface()->GetModelsWithTypeName(m_csTypeInsert);
pListType->fn_vRemoveAModel(pModel);
pListType->fn_vAddANewModel(pModel);
// update model in global list
GetInterface()->GetListAllModels()->fn_vRemoveAModel(pModel);
GetInterface()->GetListAllModels()->fn_vAddANewModel(pModel);
// update drawing
fn_vUpdateListModel();
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
}
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnSaveList()
{
CPA_ObjectDLLBase *p_oDLLInterface;
EDT_ModelsByType *pListType;
// find the DLL interface corresponding to the choice in Combo Box
pListType = GetInterface()->GetModelsWithTypeName(m_csTypeInsert);
if (pListType)
p_oDLLInterface = pListType->GetDLL();
else
return;
// call the corresponding save function
p_oDLLInterface->fn_vSaveListModels(pListType->GetTypeName(), &pListType->m_stListModels);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnLoadList()
{
CPA_ObjectDLLBase *p_oDLL;
CPA_MainWorld *pMainWorld;
CMenu oMenu;
RECT WindowPosition;
long lIndex = 0;
int px, py;
if (m_lNbValidLoad == 0)
return;
if (m_lNbValidLoad == 1)
{
p_oDLL = GetSingleDllForLoad();
fn_vLoadListModels(p_oDLL);
return;
}
// init mode
m_ePopupMode = E_pm_LoadList;
// create popup menu
oMenu.CreatePopupMenu();
// entries for DLLs
pMainWorld = M_GetMainWorld();
do
{
p_oDLL = pMainWorld->GetListOfObjectDLLBase()->FindElementFromIndex(lIndex);
if ((p_oDLL)&&(p_oDLL->fn_bCanLoadListModels()))
oMenu.AppendMenu(MF_STRING, lIndex, p_oDLL->GetName());
lIndex++;
}
while (p_oDLL);
if (!oMenu.GetMenuItemCount())
oMenu.AppendMenu(MF_STRING, lIndex, "No Load Available");
// get position
m_cLoadList.GetWindowRect(&WindowPosition);
px = WindowPosition.right;
py = WindowPosition.top;
// register the popup menu for the tutorial module
TUT_M_vGetTutDll ();
TUT_M_vRegisterMenu (this -> m_hWnd , oMenu . m_hMenu , px , py);
// display & track popup menu
oMenu.TrackPopupMenu(TPM_RIGHTALIGN | TPM_LEFTBUTTON, px, py, this);
// destroy menus
oMenu.DestroyMenu();
}
/*----------------------------------------
----------------------------------------*/
BOOL CPA_DialogInsert::OnCommand (WPARAM wParam, LPARAM lParam)
{
CPA_ObjectDLLBase *p_oDLL;
CPA_MainWorld *pMainWorld;
long lIndex = 0;
// entries for DLLs
pMainWorld = M_GetMainWorld();
// command from a menu
if (HIWORD(wParam) == 0)
{
// get ID of menu item
lIndex = LOWORD(wParam);
// get corresponding DLL
p_oDLL = pMainWorld->GetListOfObjectDLLBase()->FindElementFromIndex(lIndex);
// do corresponding action
if (m_ePopupMode == E_pm_NewModel)
fn_vLoadNewModel(p_oDLL);
else if (m_ePopupMode == E_pm_LoadList)
fn_vLoadListModels(p_oDLL);
// update popup mode
m_ePopupMode = E_pm_NoMode;
}
return CFormView::OnCommand(wParam, lParam);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogInsert::OnSize(UINT nType, int cx, int cy)
{
RECT AbsolutePosition, WindowPosition;
int px, py, cwx, cwy, crx, cx1, cry;
if (m_bInitialised)
{
GetWindowRect(&WindowPosition);
GetDlgItem(CPA_IDC_POSINSERT)->GetWindowRect(&AbsolutePosition);
// calculate relative position
cwx = WindowPosition.right - WindowPosition.left;
cwy = WindowPosition.bottom - WindowPosition.top;
crx = AbsolutePosition.right - AbsolutePosition.left;
cry = AbsolutePosition.bottom - AbsolutePosition.top;
py = AbsolutePosition.top - WindowPosition.top;
crx = (crx < cwx) ? crx : cwx - 10;
cx1 = (crx < 40) ? 40 : crx - 20;
px = (cwx - crx) / 2;
// move button "Del" and "New"
m_cNewModel.MoveWindow(px, py, cx1/11, cry-2);
m_cDelModel.MoveWindow(px + crx/11 , py, cx1/11, cry-2);
m_cModelIcon.MoveWindow(px + 2*crx/11 , py, cx1/11, cry-2);
// move Static and Combo
GetDlgItem(CPA_IDC_TEXT)->MoveWindow(px + 7*crx/22, py+4, cx1/11, cry);
m_cComboType.MoveWindow(px + 9*crx/22, py, 4*cx1/11, cry);
// move buttons "Save" and "Load"
m_cSaveList.MoveWindow(px + 9*crx/11, py, cx1/11, cry);
m_cLoadList.MoveWindow(px + 10*crx/11, py, cx1/11, cry);
// Move the list
fn_vReinitListModel();
}
return;
}
#endif // ACTIVE_EDITOR