reman3/Rayman_X/cpa/tempgrp/OSC/Src/SEClDias.cpp

758 lines
21 KiB
C++

/*=========================================================================
*
* SEClDias.cpp : List Dialogs - Implementation file
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#include "acp_base.h"
#include "SECTint.hpp"
#include "SEClDias.hpp"
#include "SECmodif.hpp"
#include "..\Main\Inc\_EditID.h"
#include "TUT.h"
#define C_uiCopyEntry 1
#define C_uiPasteEntry 2
//#################################################################################
// DIALOGBASE
//#################################################################################
/*----------------------------------------
----------------------------------------*/
SECT_DialogBase::SECT_DialogBase(CWnd* pParent)
: CFormView(SECT_DialogBase::IDD)
{
//{{AFX_DATA_INIT(SECT_DialogBase)
//}}AFX_DATA_INIT
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogBase)
DDX_Control(pDX, SECT_IDC_SYMETRIC, m_cSymetric);
DDX_Control(pDX, SECT_IDC_LISTPARAMS, m_cListParams);
//}}AFX_DATA_MAP
}
/*----------------------------------------
----------------------------------------*/
BEGIN_MESSAGE_MAP(SECT_DialogBase, CFormView)
//{{AFX_MSG_MAP(SECT_DialogBase)
ON_LBN_SELCHANGE(SECT_IDC_SORTEDLISTBOX, OnSelchangeSectorList)
ON_LBN_DBLCLK(SECT_IDC_SORTEDLISTBOX, OnDblClkSectorList)
ON_BN_CLICKED(SECT_IDC_SYMETRIC, OnSymetric)
ON_WM_DRAWITEM()
ON_WM_SIZE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*===========================================================================
*=========================================================================*/
void SECT_DialogBase::fn_vInitDialog (Sector_Interface *p_oDLL, CWnd *pParent, const CString csTag, BOOL bShowListParams)
{
// create the dialog
m_bInitialised = FALSE;
m_pSectorInterface = p_oDLL;
CFormView::Create(NULL, "", AFX_WS_DEFAULT_VIEW, CRect(0,0,120,180), pParent, AFX_IDW_PANE_FIRST, NULL);
// init data for dialog
CFormView::UpdateData(FALSE);
// FOR TUTORIAL
TUT_M_vGetTutDll();
TUT_M_vRegisterControl (m_cSymetric.m_hWnd, "OSC_DLIST" + csTag + "_BUTTON_SYMETRIC", TUT_e_Button);
TUT_M_vRegisterControl (m_cListParams.m_hWnd, "OSC_DLIST" + csTag + "_LIST_PARAMS", TUT_e_ListBox);
TUT_M_vRegisterControlID(SECT_IDC_SORTEDLISTBOX, "OSC_DLIST" + csTag + "_LIST_SECTORS", TUT_e_ListBox);
// END TUTORIAL
m_pSectorList = NULL;
m_pSelectedElem = NULL;
// init list params
m_bShowListParams = bShowListParams;
m_cListParams.EnableWindow(m_bShowListParams);
m_cListParams.ShowWindow((m_bShowListParams) ? SW_SHOW : SW_HIDE);
m_bInitialised = TRUE;
}
/*===========================================================================
*=========================================================================*/
void SECT_DialogBase::fn_vReinitDialog (SECT_ListBase *pSectorList)
{
// init list
m_pSectorList = pSectorList;
// init sorted listbox
fn_vInitSectorList(pSectorList);
m_cListParams.EnableWindow(m_bShowListParams);
m_cListParams.ShowWindow(m_bShowListParams ? SW_SHOW : SW_HIDE);
}
/*===========================================================================
*=========================================================================*/
void SECT_DialogBase::fn_vInitSectorList (SECT_ListBase *pSectorList)
{
GetSectorList()->fn_vInitSectorList(pSectorList);
// init selection
m_pSelectedElem = NULL;
// update list params
fn_vReinitListParams();
}
/*===========================================================================
*=========================================================================*/
void SECT_DialogBase::fn_vUpdateSelection (CPA_SuperObject *pSector)
{
int iIndex;
// no list => no change
if (!m_pSectorList)
return;
// get coresponding element
m_pSelectedElem = m_pSectorList->GetElementWithSector(pSector);
// set selection
iIndex = GetSectorList()->GetCorrespondingIndex((DWORD) m_pSelectedElem);
GetSectorList()->SetCurSel(iIndex);
// update list params
fn_vReinitListParams();
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnSelchangeSectorList()
{
int iIndex;
// select the object corresponding to the choice in the list box
iIndex = GetSectorList()->GetCurSel();
if (iIndex > -1)
m_pSelectedElem = (SECT_ElementBase *) GetSectorList()->GetItemData(iIndex);
else
m_pSelectedElem = NULL;
// update editor
if ((m_pSelectedElem)&&(m_pSectorInterface->GetEditMode() == E_em_EditSector))
m_pSectorInterface->fn_vSelectNewSector(m_pSelectedElem->GetSector());
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnDblClkSectorList()
{
int iIndex;
// select the object corresponding to the choice in the list box
iIndex = GetSectorList()->GetCurSel();
if (iIndex > -1)
m_pSelectedElem = (SECT_ElementBase *) GetSectorList()->GetItemData(iIndex);
else
m_pSelectedElem = NULL;
// update selection in editor
if ((m_pSelectedElem)&&(m_pSectorInterface->GetEditMode() == E_em_EditSector))
m_pSectorInterface->fn_vSelectNewSector(m_pSelectedElem->GetSector());
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnSymetric()
{
SECT_ModifSymetricLinks *pModif;
pModif = new SECT_ModifSymetricLinks(m_pSectorInterface, E_tm_SymetricLinks,
m_pSectorInterface->GetEditedSector(), m_eType);
m_pSectorInterface->M_GetEditManager()->AskFor(pModif);
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnSize (UINT nFlags, int cx, int cy)
{
RECT WindowPosition;
int lcx, lcy;
if (!m_bInitialised)
return;
GetWindowRect(&WindowPosition);
// calculate list position
lcx = WindowPosition.right - WindowPosition.left - 10;
lcy = WindowPosition.bottom - WindowPosition.top - 25;
lcx = (lcx < 50) ? 50 : lcx;
lcy = (lcy < 0) ? 0 : lcy;
m_cSymetric.MoveWindow(lcx-40, 2, 45, 16);
if (m_bShowListParams)
{
lcx = lcx - 10;
GetSectorList()->MoveWindow(5, 20, lcx/2, lcy);
m_cListParams.MoveWindow(lcx/2+10, 20, lcx/2, lcy);
}
else
GetSectorList()->MoveWindow(5, 20, lcx, lcy);
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnDestroy (void)
{
// FOR TUTORIAL
TUT_M_vGetTutDll();
TUT_M_vUnregisterControl (m_cSymetric.m_hWnd);
TUT_M_vUnregisterControl (m_cListParams.m_hWnd);
TUT_M_vUnregisterControlID (SECT_IDC_SORTEDLISTBOX);
// END TUTORIAL
CFormView::OnDestroy();
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogBase::OnDrawItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
// not interested => default handling
if (lpDIS->itemID == LB_ERR)
return;
if (nIDCtl == SECT_IDC_SORTEDLISTBOX)
{
if ((!GetSectorList())||(!GetSectorList()->IsWindowEnabled()))
return;
// draw item
GetSectorList()->fn_vDrawListItem(nIDCtl, lpDIS);
}
}
//#################################################################################
// SORTED LIST BOX
//#################################################################################
BEGIN_MESSAGE_MAP(SECT_CustomListBox, CListBox)
ON_WM_RBUTTONDOWN()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
/*----------------------------------------
----------------------------------------*/
SECT_CustomListBox::SECT_CustomListBox (void)
{
// init dialog parameters
m_pDialog = NULL;
m_pSectorInterface = NULL;
}
/*----------------------------------------
----------------------------------------*/
void SECT_CustomListBox::fn_vInitDialogParameters (SECT_DialogBase *pDialog)
{
m_pDialog = pDialog;
m_pSectorInterface = m_pDialog->GetSectorInterface();
}
/*----------------------------------------
----------------------------------------*/
void SECT_CustomListBox::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
{
m_pSectorInterface->fn_vOnKeyDownInSectorList(m_pDialog, nChar);
}
/*----------------------------------------
----------------------------------------*/
void SECT_CustomListBox::OnRButtonDown (UINT nFlags, CPoint point)
{
BOOL bCopy;
ClientToScreen( &point );
// create popup menu
CMenu oMenu;
oMenu.CreatePopupMenu();
// check if there is already a copy
bCopy = (m_pSectorInterface->GetCopyOfSectorList()->GetCount() > 0);
// Add Entry
oMenu.AppendMenu(MF_STRING | MF_ENABLED, C_uiCopyEntry, "Copy List");
oMenu.AppendMenu(MF_STRING | (bCopy) ? MF_ENABLED : MF_GRAYED, C_uiPasteEntry, "Paste List");
oMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
// destroy menus
oMenu.DestroyMenu();
}
/*----------------------------------------
----------------------------------------*/
BOOL SECT_CustomListBox::OnCommand (WPARAM wParam, LPARAM lParam)
{
// command from a menu ?
if (HIWORD(wParam) == 0)
{
// ID of menu item ?
switch (LOWORD(wParam))
{
// column headers
case C_uiCopyEntry:
m_pSectorInterface->fn_vCopySectorList(m_pSectorInterface->GetEditedSector(), m_pDialog->GetListType());
break;
case C_uiPasteEntry:
m_pSectorInterface->fn_vPasteSectorList(m_pSectorInterface->GetEditedSector(), m_pDialog->GetListType());
break;
}
}
return CListBox::OnCommand(wParam, lParam);
}
/*----------------------------------------
----------------------------------------*/
void SECT_CustomListBox::fn_vInitSectorList (SECT_ListBase *pSectorList)
{
SECT_ElementBase *pElem;
POSITION pos;
CString csText;
int iPos;
// RAZ
ResetContent();
if (!pSectorList)
return;
// add items to list
for (pElem = pSectorList->GetHeadElementBase(pos); pElem;
pElem = pSectorList->GetNextElementBase(pos))
{
csText = (pElem->GetSector() != NULL) ? pElem->GetSector()->GetName() : "All Sectors";
iPos = AddString(csText);
SetItemData(iPos, (DWORD)pElem);
}
}
/*----------------------------------------
----------------------------------------*/
int SECT_CustomListBox::GetCorrespondingIndex (DWORD pElem)
{
DWORD pData;
int iIndex;
for (iIndex = 0; iIndex < GetCount(); iIndex++)
{
pData = GetItemData(iIndex);
if (pData == pElem)
return iIndex;
}
return -1;
}
//#################################################################################
// ACTIVITY
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void SECT_ActivityListBox::fn_vDrawListItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
SECT_ActivityElement *pElem;
COLORREF cTextColor;
COLORREF cRectColor;
BOOL bSelected;
CDC *pDC;
if (!m_pDialog)
return;
// init parameters
pElem = (SECT_ActivityElement *) GetItemData(lpDIS->itemID);
bSelected = (lpDIS->itemState & ODS_SELECTED);
// drawing rect
pDC = CDC::FromHandle(lpDIS->hDC);
// selected sector => blue
if (bSelected)
{
cRectColor = RGB (0, 0, 200);
cTextColor = RGB (254, 254, 254);
}
// normal sector => black
else
{
cRectColor = GetSysColor(COLOR_WINDOW);
cTextColor = RGB (0, 0, 0);
}
// draw item
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
lpDIS->rcItem.left += 2;
pDC->SetTextColor(cTextColor);
pDC->DrawText(pElem->GetSector()->GetNameToDraw(), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
/*===========================================================================
*=========================================================================*/
SECT_DialogActiv::SECT_DialogActiv (CWnd* pParent)
{
m_eType = E_Activity;
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogActiv::DoDataExchange(CDataExchange* pDX)
{
SECT_DialogBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogList)
DDX_Control(pDX, SECT_IDC_SORTEDLISTBOX, m_cSectorList);
//}}AFX_DATA_MAP
m_cSectorList.fn_vInitDialogParameters(this);
}
//#################################################################################
// COLLISION
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void SECT_CollisionListBox::fn_vDrawListItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
SECT_CollisionElement *pElem;
COLORREF cTextColor;
COLORREF cRectColor;
BOOL bSelected;
CDC *pDC;
if (!m_pDialog)
return;
// init parameters
pElem = (SECT_CollisionElement *) GetItemData(lpDIS->itemID);
bSelected = (lpDIS->itemState & ODS_SELECTED);
// drawing rect
pDC = CDC::FromHandle(lpDIS->hDC);
// selected sector => blue
if (bSelected)
{
cRectColor = RGB (0, 0, 200);
cTextColor = RGB (254, 254, 254);
}
// normal sector => black
else
{
cRectColor = GetSysColor(COLOR_WINDOW);
cTextColor = RGB (0, 0, 0);
}
// draw item
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
lpDIS->rcItem.left += 2;
pDC->SetTextColor(cTextColor);
pDC->DrawText(pElem->GetSector()->GetNameToDraw(), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
/*===========================================================================
*=========================================================================*/
SECT_DialogColls::SECT_DialogColls (CWnd* pParent)
{
m_eType = E_Collision;
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogColls::DoDataExchange(CDataExchange* pDX)
{
SECT_DialogBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogList)
DDX_Control(pDX, SECT_IDC_SORTEDLISTBOX, m_cSectorList);
//}}AFX_DATA_MAP
m_cSectorList.fn_vInitDialogParameters(this);
}
//#################################################################################
// GRAPHIC
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void SECT_GraphicListBox::fn_vDrawListItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
SECT_GraphicElement *pGraphicElem;
COLORREF cTextColor;
COLORREF cRectColor;
CString csText;
BOOL bSelected;
CDC *pDC;
long lWidth;
if (!m_pDialog)
return;
// init parameters
pGraphicElem = (SECT_GraphicElement *) GetItemData(lpDIS->itemID);
bSelected = (lpDIS->itemState & ODS_SELECTED);
lWidth = (lpDIS->rcItem.right < lpDIS->rcItem.left + 24) ? 0 : 22;
// drawing rect
pDC = CDC::FromHandle(lpDIS->hDC);
// selected sector => blue
if (bSelected)
{
cRectColor = RGB (0, 0, 200);
cTextColor = RGB (254, 254, 254);
}
// normal sector => black
else
{
cRectColor = GetSysColor(COLOR_WINDOW);
cTextColor = RGB (0, 0, 0);
}
// draw rect
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(cTextColor);
// draw sector name
lpDIS->rcItem.left += 1;
lpDIS->rcItem.right -= lWidth;
pDC->DrawText(pGraphicElem->GetSector()->GetNameToDraw(), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// draw level
lpDIS->rcItem.left = lpDIS->rcItem.right + 1;
lpDIS->rcItem.right = lpDIS->rcItem.left + lWidth / 2;
csText.Format("%d", pGraphicElem->GetGraphicLevel());
pDC->DrawText(csText, &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// draw mode
lpDIS->rcItem.left = lpDIS->rcItem.right + 1;
lpDIS->rcItem.right = lpDIS->rcItem.left + lWidth / 2;
csText = (pGraphicElem->GetGraphicMode() == C_SECT_ModeLookOnly) ? "L" : " ";
pDC->DrawText(csText, &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
/*===========================================================================
*=========================================================================*/
SECT_DialogGraph::SECT_DialogGraph (CWnd* pParent)
{
m_eType = E_Graphic;
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogGraph::DoDataExchange(CDataExchange* pDX)
{
SECT_DialogBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogList)
DDX_Control(pDX, SECT_IDC_SORTEDLISTBOX, m_cSectorList);
//}}AFX_DATA_MAP
m_cSectorList.fn_vInitDialogParameters(this);
}
//#################################################################################
// SOUND
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void SECT_SoundListBox::fn_vDrawListItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
SECT_SoundElement *pSoundElem;
COLORREF cTextColor;
COLORREF cRectColor;
CString csText;
BOOL bSelected;
CDC *pDC;
long lWidth;
if (!m_pDialog)
return;
// init parameters
pSoundElem = (SECT_SoundElement *) GetItemData(lpDIS->itemID);
bSelected = (lpDIS->itemState & ODS_SELECTED);
lWidth = (lpDIS->rcItem.right < lpDIS->rcItem.left + 22) ? 0 : 21;
// drawing rect
pDC = CDC::FromHandle(lpDIS->hDC);
// selected sector => blue
if (bSelected)
{
cRectColor = RGB (0, 0, 200);
cTextColor = RGB (254, 254, 254);
}
// normal sector => black
else
{
cRectColor = GetSysColor(COLOR_WINDOW);
cTextColor = RGB (0, 0, 0);
}
// draw item
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(cTextColor);
// draw sector name
lpDIS->rcItem.left += 1;
lpDIS->rcItem.right -= lWidth;
pDC->DrawText(pSoundElem->GetSector()->GetNameToDraw(), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// draw level
lpDIS->rcItem.left = lpDIS->rcItem.right + 1;
lpDIS->rcItem.right = lpDIS->rcItem.left + lWidth;
csText.Format("%d", pSoundElem->GetSoundLevel());
pDC->DrawText(csText, &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
/*===========================================================================
*=========================================================================*/
SECT_DialogSound::SECT_DialogSound (CWnd* pParent)
{
m_eType = E_Sound;
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogSound::DoDataExchange(CDataExchange* pDX)
{
SECT_DialogBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogList)
DDX_Control(pDX, SECT_IDC_SORTEDLISTBOX, m_cSectorList);
//}}AFX_DATA_MAP
m_cSectorList.fn_vInitDialogParameters(this);
}
//#################################################################################
// SOUND EVENT
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void SECT_SoundEventListBox::fn_vDrawListItem (int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
SECT_SoundEventElement *pElem;
COLORREF cTextColor;
COLORREF cRectColor;
CString csText;
BOOL bSelected;
CDC *pDC;
if (!m_pDialog)
return;
// init parameters
pElem = (SECT_SoundEventElement *) GetItemData(lpDIS->itemID);
bSelected = (lpDIS->itemState & ODS_SELECTED);
// drawing rect
pDC = CDC::FromHandle(lpDIS->hDC);
// selected sector => blue
if (bSelected)
{
cRectColor = RGB (0, 0, 200);
cTextColor = RGB (254, 254, 254);
}
// normal sector => black
else
{
cRectColor = GetSysColor(COLOR_WINDOW);
cTextColor = RGB (0, 0, 0);
}
// draw item
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
lpDIS->rcItem.left += 2;
pDC->SetTextColor(cTextColor);
csText = (pElem->GetSector() != NULL) ? pElem->GetSector()->GetNameToDraw() : "All Sectors";
pDC->DrawText(csText, &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
/*===========================================================================
*=========================================================================*/
SECT_DialogSoundEvent::SECT_DialogSoundEvent (CWnd* pParent)
{
m_eType = E_SoundEvent;
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogSoundEvent::DoDataExchange(CDataExchange* pDX)
{
SECT_DialogBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SECT_DialogList)
DDX_Control(pDX, SECT_IDC_SORTEDLISTBOX, m_cSectorList);
//}}AFX_DATA_MAP
m_cSectorList.fn_vInitDialogParameters(this);
}
/*----------------------------------------
----------------------------------------*/
void SECT_DialogSoundEvent::fn_vReinitListParams (void)
{
SECT_SoundEventElement *pSoundEventElem;
SECT_SndEvtEngineElem *pElem;
SECT_SoundEvent *pSoundEvent;
POSITION pos;
int iInd;
// RAZ
m_cListParams.ResetContent();
if (!m_pSelectedElem)
return;
pSoundEventElem = (SECT_SoundEventElement *) m_pSelectedElem;
// fill list with sector sound events
for (pElem = pSoundEventElem->GetSndEvtList()->GetHeadElement(pos); pElem;
pElem = pSoundEventElem->GetSndEvtList()->GetNextElement(pos))
{
pSoundEvent = pElem->GetSoundEvent();
if (pSoundEvent)
iInd = m_cListParams.AddString(pSoundEvent->GetName());
else
iInd = m_cListParams.AddString("Unknown");
m_cListParams.SetItemData(iInd, (DWORD) pSoundEvent);
}
// current selection => none
m_cListParams.SetCurSel(-1);
}