reman3/Rayman_X/cpa/tempgrp/Ctl/Src/Dialogs/CTL_DgA.cpp

601 lines
17 KiB
C++

// ctl_Dga.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "scr.h"
#include "ai/aibase/gsparam.h"
#define ACTIVE_EDITOR /* we don't want optimized arrays in editors, but defining ACTIVE_EDITOR in the project's settings doesn't work... */
#include "ai/aibase/array.h"
#undef ACTIVE_EDITOR
#include "ai/aigame/enumVar.h"
#include "CTL_Dga.hpp"
#include "Controls\CTL_Ctl.hpp"
#include "Controls\Ctl_Ctla.hpp"
#include "Controls\Ctl_Cnst.hpp"
//#include "Others\CTL_Mask.hpp"
#include "Data\CTL_Data.hpp"
#include "Others\CTL_Pri.hpp"
#include "WControls\Ctl_vBas.hpp"
#include "WControls\Ctl_wsta.hpp"
#include "dialogs\ctl_aevw.hpp"
#include "Main\Inc\_EditID.h"
//External Modules
#include "CTL_ErO.hpp"
//End of External Modules
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define EdActors_C_FirstIDForListBoxCheckButtons 1000
#define C_COLOR_UNSEL RGB( 50,200, 50)
#define C_COLOR_SEL RGB(200, 70, 30)
#define C_ARRAY_DIALOG "Array"
/////////////////////////////////////////////////////////////////////////////
// CTL_DialogArrayDataEdition dialog
BEGIN_MESSAGE_MAP(CTL_DialogArrayDataEdition, CDialog)
//{{AFX_MSG_MAP(CTL_DialogArrayDataEdition)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTON_INSERT, OnButtonInsert)
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
ON_BN_CLICKED(IDC_BUTTON_UP, OnButtonUp)
ON_BN_CLICKED(IDC_BUTTON_DOWN, OnButtonDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//***************************************************************************
CTL_DialogArrayDataEdition::CTL_DialogArrayDataEdition(CTL_Editor_ArrayControl *_pclParentControl,
CWnd* _pParent /*= NULL*/)
: CDialog(CTL_DialogArrayDataEdition::IDD, _pParent)
{
hOldInstance = AfxGetResourceHandle();
AfxSetResourceHandle(CTL_g_hModule);
//{{AFX_DATA_INIT(CTL_DialogArrayDataEdition)
//}}AFX_DATA_INIT
m_pclParentControl = _pclParentControl;
m_csDataName = m_pclParentControl->m_fn_pclGetEditedData()->m_pub_fn_csGetDataName();
m_pclSelectedControl = NULL;
}
//***************************************************************************
CTL_DialogArrayDataEdition::~CTL_DialogArrayDataEdition()
{
AfxSetResourceHandle(hOldInstance);
}
//***************************************************************************
void CTL_DialogArrayDataEdition::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTL_DialogArrayDataEdition)
//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
// CTL_DialogArrayDataEdition message handlers
#define M_ADD_ONE_DSG_VAR(Name,TypeControl,TypeData,ParmsData,EngineStruct) \
//***************************************************************************
BOOL CTL_DialogArrayDataEdition::OnInitDialog()
{
CDialog::OnInitDialog();
m_pclFrameControl = new CFrameWnd ();
CRect rect = CRect (0,0, 200, 150);
BOOL bRes = m_pclFrameControl -> Create (NULL,
"Titlu",
WS_CHILD | WS_VISIBLE,
rect,
this,
0,
NULL);
CCreateContext CreateContext;
CreateContext . m_pNewViewClass = RUNTIME_CLASS (CArrayElementsView);
CreateContext . m_pCurrentDoc = NULL;
CreateContext . m_pNewDocTemplate = NULL;
CreateContext . m_pLastView = NULL;
CreateContext . m_pCurrentFrame = NULL;
CWnd *pView = m_pclFrameControl -> CreateView (& CreateContext, AFX_IDW_PANE_FIRST);
pView->ShowWindow(TRUE);
pView->ModifyStyle(WS_BORDER, 0);
m_pclFrameControl -> SetActiveView ((CView *) pView, TRUE);
m_pclView = (CTL_Editor_BaseFormView *) m_pclFrameControl -> GetActiveView ();
// the array
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
// save
M_ARRAY_COPY (& m_stSavedArray, pstArray);
// for all elements
for (int i = 0; i < pstArray -> ucMaxSize; i ++)
m_fn_vCreateElementControl (pstArray, i);
m_pclSelectedControl = m_clControlList . GetHead ();
//update
m_fn_vResize ();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//***************************************************************************
void CTL_DialogArrayDataEdition::OnOK()
{
// We are fine ;-)
// cleanup
m_fn_vCleanup ();
CDialog::OnOK ();
}
//***************************************************************************
void CTL_DialogArrayDataEdition::OnCancel()
{
//cleanup
m_fn_vCleanup ();
// restore
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
M_ARRAY_COPY (pstArray, & m_stSavedArray);
CDialog::OnCancel();
}
//***************************************************************************
#define SPACING 8
void CTL_DialogArrayDataEdition::m_fn_vResize()
{
// Move Buttons
CRect rect;
GetClientRect (& rect);
CRect rectNew = rect;
CRect rectSize;
CWnd *pButton = GetDlgItem (IDOK);
if (! pButton)
return;
pButton -> GetClientRect (& rectSize);
rectNew . left = rectNew . right - rectSize . right;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton -> MoveWindow (rectNew);
rectNew . top = rectNew . bottom + C_SPACE_BETWEEN_CONTROLS;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton = GetDlgItem (IDCANCEL);
pButton -> MoveWindow (rectNew);
rectNew . top = rectNew . bottom + 2 * C_SPACE_BETWEEN_CONTROLS;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton = GetDlgItem (IDC_BUTTON_INSERT);
pButton -> MoveWindow (rectNew);
rectNew . top = rectNew . bottom + C_SPACE_BETWEEN_CONTROLS;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton = GetDlgItem (IDC_BUTTON_DELETE);
pButton -> MoveWindow (rectNew);
rectNew . top = rectNew . bottom + C_SPACE_BETWEEN_CONTROLS;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton = GetDlgItem (IDC_BUTTON_UP);
pButton -> MoveWindow (rectNew);
rectNew . top = rectNew . bottom + C_SPACE_BETWEEN_CONTROLS;
rectNew . bottom = rectNew . top + rectSize . bottom;
pButton = GetDlgItem (IDC_BUTTON_DOWN);
pButton -> MoveWindow (rectNew);
// Resize frame
rectNew = rect;
rectNew . right = rectNew . right - rectSize . right - C_SPACE_BETWEEN_CONTROLS;
m_pclFrameControl -> MoveWindow (rectNew);
// Resize view
m_fn_vUpdateView ();
}
//***************************************************************************
void CTL_DialogArrayDataEdition::m_fn_vUpdateView (void)
{
/*
CPoint cpTopLeft = rect . TopLeft ();
CPoint cpTopRight;
cpTopRight . x = rect . right;
cpTopRight . y = cpTopLeft . y;
*/
CPoint cpOffset=m_pclView->GetScrollPosition();
CPoint cpTopLeft(0,-cpOffset.y);
CRect rect ;
m_pclFrameControl -> GetClientRect (& rect);
CPoint cpTopRight(rect.Width() + 20,-cpOffset.y);
m_clControlList. m_pub_fn_vDisplayControlsInZone(cpTopLeft, cpTopRight);
m_clControlList. m_pub_fn_vUpdateControlsWithListOfData(& m_clDataList);
m_pclView -> m_fn_vSetViewHeight ((unsigned short) (cpTopLeft . y + m_pclView -> GetScrollPosition () . y));
m_fn_vUpdateColors ();
}
void CTL_DialogArrayDataEdition::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
m_fn_vResize ();
}
void CTL_DialogArrayDataEdition::OnButtonInsert()
{
// the array
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
if (pstArray -> ucMaxSize == 255)
{
AfxMessageBox ("Maximum 255 elements");
return;
}
if (pstArray -> ucMaxSize == 0)
{
AfxMessageBox ("Minimum 1 element");
return;
}
POSITION pos = m_clControlList . GetHeadPosition ();
POSITION posCtrl = pos;
POSITION posData = m_clDataList . GetHeadPosition ();
int i = 0;
int lSelectedControlIndex = -1;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
if (pclCtrl == m_pclSelectedControl)
{
lSelectedControlIndex = i;
break;
}
posCtrl = pos;
m_clDataList . GetNext (posData);
i ++;
}
if (lSelectedControlIndex < 0)
return;
// move elements
pos = m_clDataList . GetTailPosition ();
for (i = pstArray -> ucMaxSize - 1; i > lSelectedControlIndex; i --)
{
CTL_Editor_Data *pclData = m_clDataList . GetPrev (pos);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, i));
* M_ARRAY_ELEMENT (pstArray, i) = * M_ARRAY_ELEMENT (pstArray, i - 1);
}
// BEGIN ROMTEAM Cristi Petrescu 98-12-
// Do not increase size, last element will be lost
//pstArray -> ucMaxSize ++;
// clear
memset (M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex), 0, C_SizeOfArrayElement);
// create control
m_fn_vCreateElementControl (pstArray, lSelectedControlIndex);
// move it into place
CTL_Editor_Control *pclCtrl = m_clControlList . RemoveTail ();
m_clControlList . InsertBefore (posCtrl, pclCtrl);
m_pclSelectedControl = pclCtrl;
// remove last element
pclCtrl = m_clControlList . RemoveTail ();
delete pclCtrl;
CTL_Editor_Data *pclData = m_clDataList . RemoveTail ();
m_clDataList . InsertBefore (posData, pclData);
// remove last element
pclData = m_clDataList . RemoveTail ();
delete pclData;
// END ROMTEAM Cristi Petrescu 98-12-
m_fn_vUpdateView ();
}
void CTL_DialogArrayDataEdition::OnButtonDelete()
{
// the array
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
if (pstArray -> ucMaxSize == 1)
{
AfxMessageBox ("Minimim 1 element");
return;
}
POSITION pos = m_clControlList . GetHeadPosition ();
POSITION posCtrl = pos;
POSITION posData = m_clDataList . GetHeadPosition ();
int i = 0;
int lSelectedControlIndex = -1;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
if (pclCtrl == m_pclSelectedControl)
{
lSelectedControlIndex = i;
break;
}
posCtrl = pos;
m_clDataList . GetNext (posData);
i ++;
}
if (lSelectedControlIndex < 0)
return;
// BEGIN ROMTEAM Cristi Petrescu 98-12-
// Do not decrease size, last element will be cleared
//pstArray -> ucMaxSize --;
// move elements
pos = posData;
m_clDataList . GetNext (pos);
for (i = lSelectedControlIndex; i < pstArray -> ucMaxSize - 1; i ++)
{
CTL_Editor_Data *pclData = m_clDataList . GetNext (pos);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, i));
* M_ARRAY_ELEMENT (pstArray, i) = * M_ARRAY_ELEMENT (pstArray, i + 1);
}
// clear
memset (M_ARRAY_ELEMENT (pstArray, pstArray -> ucMaxSize - 1), 0, C_SizeOfArrayElement);
// delete controls
pos = posCtrl;
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (posCtrl);
if (! posCtrl)
{
posCtrl = pos;
m_clControlList . GetPrev (posCtrl);
}
m_pclSelectedControl = m_clControlList . GetAt (posCtrl);
m_clControlList . RemoveAt (pos);
//delete pclCtrl;
// add at last position
m_clControlList . AddTail (pclCtrl);
CTL_Editor_Data *pclData = m_clDataList . GetAt (posData);
m_clDataList . RemoveAt (posData);
//delete pclData;
// add at last position
m_clDataList . AddTail (pclData);
// the engine pointer
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, pstArray -> ucMaxSize - 1));
// END ROMTEAM Cristi Petrescu 98-12-
m_fn_vUpdateView ();
}
void CTL_DialogArrayDataEdition::OnButtonUp()
{
// the array
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
POSITION pos = m_clControlList . GetHeadPosition ();
POSITION posCtrl = pos;
POSITION posData = m_clDataList . GetHeadPosition ();
int i = 0;
int lSelectedControlIndex = -1;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
if (pclCtrl == m_pclSelectedControl)
{
lSelectedControlIndex = i;
break;
}
posCtrl = pos;
m_clDataList . GetNext (posData);
i ++;
}
if (lSelectedControlIndex < 0)
return;
if (lSelectedControlIndex == 0)
return;
// switch engine
tduGetSetParam stTemp = * M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex);
* M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex) = * M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex - 1);
* M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex - 1) = stTemp;
// switch ctrl
pos = posCtrl;
CTL_Editor_Control *pclCtrl = m_clControlList . GetAt (posCtrl);
m_clControlList . GetPrev (posCtrl);
m_clControlList . InsertBefore (posCtrl, pclCtrl);
m_clControlList . RemoveAt (pos);
// switch data
pos = posData;
CTL_Editor_Data *pclData = m_clDataList . GetAt (posData);
m_clDataList . GetPrev (posData);
posData = m_clDataList . InsertBefore (posData, pclData);
m_clDataList . RemoveAt (pos);
// set engine pointers
pclData = m_clDataList . GetNext (posData);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex - 1));
pclData = m_clDataList . GetNext (posData);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex ));
m_fn_vUpdateView ();
}
void CTL_DialogArrayDataEdition::OnButtonDown()
{
// the array
CTL_Editor_Data *pclParentData= m_pclParentControl -> m_fn_pclGetEditedData ();
tdstArray *pstArray = (tdstArray *) pclParentData -> m_pub_fn_pvGetMotorData ();
POSITION pos = m_clControlList . GetHeadPosition ();
POSITION posCtrl = pos;
POSITION posData = m_clDataList . GetHeadPosition ();
int i = 0;
int lSelectedControlIndex = -1;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
if (pclCtrl == m_pclSelectedControl)
{
lSelectedControlIndex = i;
break;
}
posCtrl = pos;
m_clDataList . GetNext (posData);
i ++;
}
if (lSelectedControlIndex < 0)
return;
if (lSelectedControlIndex == pstArray -> ucMaxSize - 1)
return;
// switch engine
tduGetSetParam stTemp = * M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex);
* M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex) = * M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex + 1);
* M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex + 1) = stTemp;
// switch ctrl
pos = posCtrl;
CTL_Editor_Control *pclCtrl = m_clControlList . GetAt (posCtrl);
m_clControlList . GetNext (posCtrl);
m_clControlList . InsertAfter (posCtrl, pclCtrl);
m_clControlList . RemoveAt (pos);
// switch data
pos = posData;
CTL_Editor_Data *pclData = m_clDataList . GetAt (posData);
m_clDataList . GetNext (posData);
posData = m_clDataList . InsertAfter (posData, pclData);
m_clDataList . RemoveAt (pos);
// set engine pointers
pclData = m_clDataList . GetPrev (posData);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex + 1));
pclData = m_clDataList . GetPrev (posData);
pclData -> m_fn_vSetMotorDataPtr (M_ARRAY_ELEMENT (pstArray, lSelectedControlIndex ));
m_fn_vUpdateView ();
}
void fn_vNameClicked (CTL_Editor_Static *pclSender, enum CTL_eClickType tdeClickType)
{
CTL_Editor_Control *pclElement = pclSender -> m_pub_fn_pclGetParentControl ();
CTL_DialogArrayDataEdition *pclDlg = (CTL_DialogArrayDataEdition *) (pclElement -> m_pub_fn_pclGetOwnerDataWithName (C_ARRAY_DIALOG) -> m_pub_fn_pvGetDataPtr ());
pclDlg -> m_fn_vSetSelectedControl (pclElement);
pclDlg -> m_fn_vUpdateColors ();
//pclDlg -> RedrawWindow ();
}
void CTL_DialogArrayDataEdition::m_fn_vCreateElementControl (tdstArray *pstArray, int i)
{
CTL_Editor_Control *pclCtrl = m_pclParentControl -> m_fn_pctrlCreateElementControl (& m_clControlList);
m_clControlList . AddTail (pclCtrl);
pclCtrl -> m_fn_bCreateControl (m_pclView);
CTL_Editor_Data *pclData = m_pclParentControl -> m_fn_pdataCreateElementData (& m_clDataList, pclCtrl);
void *pvElem = M_ARRAY_ELEMENT (pstArray, i);
tduGetSetParam *pvTElem = (tduGetSetParam *)pvElem;
pclData -> m_fn_vSetMotorDataPtr (pvElem);
m_clDataList . AddTail (pclData);
pclCtrl->m_fn_vSetEditedData(pclData);
pclData->m_fn_vGetMotorData();
pclCtrl -> m_pub_fn_pclGetNameStatic () -> m_pub_fn_vSetStaticHasBeenClicked_CallBack (fn_vNameClicked);
pclCtrl -> m_pub_fn_pclAddOwnerData (this, C_ARRAY_DIALOG);
pclCtrl->m_fn_vUpdate ();
}
void CTL_DialogArrayDataEdition::m_fn_vUpdateColors (void)
{
POSITION pos = m_clControlList . GetHeadPosition ();
int i = 0;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
static char szName[100];
itoa (i, szName,10);
if (pclCtrl == m_pclSelectedControl)
pclCtrl -> m_pub_fn_pclGetNameStatic () -> m_pub_fn_vSetBackGroundColor (C_COLOR_SEL);
else
pclCtrl -> m_pub_fn_pclGetNameStatic () -> m_pub_fn_vSetBackGroundColor (C_COLOR_UNSEL);
pclCtrl -> m_pub_fn_pclGetNameStatic () -> m_fn_vSetTextToDisplay (szName, TRUE);
i ++;
}
}
int CTL_DialogArrayDataEdition::m_fn_lGetIndexOfControl (CTL_Editor_Control *pclSeekCtrl)
{
POSITION pos = m_clControlList . GetHeadPosition ();
int i = 0;
while (pos)
{
CTL_Editor_Control *pclCtrl = m_clControlList . GetNext (pos);
if (pclCtrl == pclSeekCtrl)
return i;
i ++;
}
return -1;
}