reman3/Rayman_X/cpa/tempgrp/TID/Src/IADTrCtl.cpp

487 lines
14 KiB
C++

// IADTrCtl.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#define HieFriend
#include "IADTrCtl.hpp"
#include "IADEdtTr.hpp"
#include "IADLnkMt.hpp"
#include "_IADItrf.hpp"
#include "IADVwRst.hpp"
#include "IAD_Res.h"
#include "x:/cpa/tempgrp/tia/inc/ai_intf.hpp"
#include "x:/cpa/main/inc/_EditId.h"
// BEGIN ROMTEAM Cristi Petrescu 98-06-
#include "iadvrvw.hpp"
// END ROMTEAM Cristi Petrescu 98-06-
//External Modules
#include "OAc.h"
//End of External Modules
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IAD_C_PLUS_MINUS_BITMAP_SIZE 9
#define IAD_C_STATIC_TEXT_COLOR RGB(255,255,255)
/////////////////////////////////////////////////////////////////////////////
// IAD_TreeControl
BEGIN_MESSAGE_MAP(IAD_TreeControl, CTreeCtrl)
//{{AFX_MSG_MAP(IAD_TreeControl)
ON_WM_PAINT()
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_CTLCOLOR_REFLECT()
ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//***************************************************************************
IAD_TreeControl::IAD_TreeControl()
{
m_pri_clBrush.CreateSolidBrush(RGB(50,50,50));
m_pri_clPen.CreatePen(PS_SOLID, 1, RGB(230,230,230));
//m_pri_clPen.CreatePen(PS_DOT, 1, RGB(230,230,230));
m_pri_cbBitmapPlus.LoadBitmap(IDB_BITMAP_PLUS);
m_pri_cbBitmapMinus.LoadBitmap(IDB_BITMAP_MINUS);
//BEGIN ROMTEAM Cristi Petrescu 98-05-
m_bViewReflex = TRUE;
m_bViewAI = TRUE;
m_pclSelectedBehaviourNode = NULL;
//END ROMTEAM Cristi Petrescu 98-05-
}
//***************************************************************************
IAD_TreeControl::~IAD_TreeControl()
{
}
/////////////////////////////////////////////////////////////////////////////
// IAD_TreeControl message handlers
//***************************************************************************
BOOL IAD_TreeControl::m_pub_fn_bCreate(CWnd *_pclParentWnd)
{
BOOL bReturn = CTreeCtrl::Create( WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP,
CRect(0,0,0,0),
_pclParentWnd,
10069);
return bReturn;
}
//***************************************************************************
void IAD_TreeControl::m_pub_fn_vSelectAndShowItem(HTREEITEM _hTreeItem)
{
if ( _hTreeItem != NULL )
{
//Closes all
m_pri_fn_vCollapseAllButNotThis(_hTreeItem);
//Shows
EnsureVisible(_hTreeItem);
//Selects
SelectItem(_hTreeItem);
}
}
//***************************************************************************
void IAD_TreeControl::m_pri_fn_vCollapseAllButNotThis(HTREEITEM _hTreeItemToKeepExpanded)
{
//Gets first parent of given Item
HTREEITEM hFirsParent = GetParentItem(_hTreeItemToKeepExpanded);
HTREEITEM hParentOfParent = GetParentItem(hFirsParent);
while ( hParentOfParent != NULL )
{
hFirsParent = hParentOfParent;
hParentOfParent = GetParentItem(hFirsParent);
}
HTREEITEM hCurrenItem = GetNextItem(NULL, TVGN_ROOT);
while ( hCurrenItem != NULL )
{
if ( hCurrenItem != hFirsParent )
Expand(hCurrenItem, TVE_COLLAPSE);
hCurrenItem = GetNextItem(hCurrenItem, TVGN_NEXT);
}
}
//***************************************************************************
void IAD_TreeControl::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.SetTextColor(RGB(255,0,0));
dc.SetBkMode(TRANSPARENT);
dc.SelectObject(GetFont());
CDC memDC;
memDC.CreateCompatibleDC(&dc);
//Gets current visible Rectangle for the View
CRect crVisibleRect;
GetClientRect(crVisibleRect);
//Re-draws visible Items lines
HTREEITEM hCurrentTreeItem = GetFirstVisibleItem();
CRect crCurrentRect;
IAD_EditorTreeNode *pclCurrentNode;
BOOL bItemIsSelected;
BOOL bItemIsDevelopped;
short wX, wY;
BOOL bMustGoOn = TRUE;
while ( (hCurrentTreeItem != NULL) && (bMustGoOn) )
{
bItemIsSelected = ( (GetItemState(hCurrentTreeItem, TVIF_STATE) & TVIS_SELECTED) != 0 );
//Gets Data
pclCurrentNode = (IAD_EditorTreeNode *)GetItemData(hCurrentTreeItem);
//Gets rectangle
GetItemRect(hCurrentTreeItem, &crCurrentRect, TRUE);
//If item is really visible
if ( (crCurrentRect.top >= crVisibleRect.top) && (crCurrentRect.top <= crVisibleRect.bottom) )
{
HTREEITEM hParentItem = GetParentItem(hCurrentTreeItem);
if ( hParentItem != NULL )
{
//Displays horizontal lines
CRect crParentItemRect;
GetItemRect(hParentItem, &crParentItemRect, TRUE);
dc.SelectObject(&m_pri_clPen);
wY = crCurrentRect.top + crCurrentRect.Height() / 2;
dc.MoveTo(crCurrentRect.left - 1,
wY);
dc.LineTo(crParentItemRect.left + 3,
wY);
//Displays vertical line
wX = crParentItemRect.left + 3;
dc.MoveTo(wX,
crCurrentRect.top + crCurrentRect.Height() / 2);
dc.LineTo(wX,
(short)crParentItemRect.bottom - 2);
}
// if ( bMustGoOn )
// {
//If Item is selected
if ( bItemIsSelected )
dc.FillSolidRect(&crCurrentRect, RGB(0,0,255));
//Sets item's text
m_pri_fn_vDisplayText(pclCurrentNode, &dc, crCurrentRect);
// }
}
else
bMustGoOn = FALSE;
hCurrentTreeItem = GetNextVisibleItem(hCurrentTreeItem);
}
//Re-draws visible Items
hCurrentTreeItem = GetFirstVisibleItem();
bMustGoOn = TRUE;
while ( (hCurrentTreeItem != NULL) && (bMustGoOn) )
{
bItemIsDevelopped = ( (GetItemState(hCurrentTreeItem, TVIF_STATE) & TVIS_EXPANDED) != 0 );
//Gets Data
pclCurrentNode = (IAD_EditorTreeNode *)GetItemData(hCurrentTreeItem);
//Gets rectangle
GetItemRect(hCurrentTreeItem, &crCurrentRect, TRUE);
//If item is really visible
if ( (crCurrentRect.top >= crVisibleRect.top) && (crCurrentRect.top <= crVisibleRect.bottom) )
{
//Set's item's button
//If Item has at least one child
if ( GetChildItem(hCurrentTreeItem) != NULL )
{
//Draws a bitmap to represent '+' or '-' buttons
if ( bItemIsDevelopped )
memDC.SelectObject(&m_pri_cbBitmapMinus);
else
memDC.SelectObject(&m_pri_cbBitmapPlus);
wX = crCurrentRect.left - GetIndent() + 3 - IAD_C_PLUS_MINUS_BITMAP_SIZE/2;
wY = crCurrentRect.top + (crCurrentRect.Height() - IAD_C_PLUS_MINUS_BITMAP_SIZE) / 2;
dc.BitBlt(wX,
wY,
IAD_C_PLUS_MINUS_BITMAP_SIZE, //Width
IAD_C_PLUS_MINUS_BITMAP_SIZE, //Height
&memDC,
0,
0,
SRCCOPY);
}
}
else
bMustGoOn = FALSE;
hCurrentTreeItem = GetNextVisibleItem(hCurrentTreeItem);
}
// Do not call CTreeCtrl::OnPaint() for painting messages
}
//***************************************************************************
void IAD_TreeControl::m_pri_fn_vDisplayText(IAD_EditorTreeNode *_pclNode,
CDC *_pclDC,
CRect crRect)
{
//Name
// _pclDC->SetTextColor(RGB(255,0,0));
long lCurrentXPos = crRect.left + 1;
CString csName = _pclNode->m_pub_fn_csGetNodeType();
//BEGIN ROMTEAM Cristi Petrescu 98-05-
// do not dispaly type if shouldn't be both displayed
if (!((csName == "R:" && m_bViewReflex == TRUE && m_bViewAI == FALSE) ||
(csName == "I:" && m_bViewAI == TRUE && m_bViewReflex == FALSE)))
{
// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
_pclDC->SetTextColor( g_a_colrefTypeColor[_pclNode->m_pub_fn_tdeGetNodeType()] );
#endif // CG PB DEBUGGER }
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, csName);
csName += " ";
lCurrentXPos += _pclDC->GetTextExtent(csName).cx;
}
//END ROMTEAM Cristi Petrescu 98-05-
if ( !_pclNode->m_pub_fn_csGetNodeName().IsEmpty() )
{
_pclDC->SetTextColor(RGB(230,255,30));
csName = _pclNode->m_pub_fn_csGetNodeName();
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, csName);
csName += " ";
lCurrentXPos += _pclDC->GetTextExtent(csName).cx;
}
if ( !_pclNode->m_pub_fn_csGetNodeValue().IsEmpty() )
{
_pclDC->SetTextColor(IAD_C_STATIC_TEXT_COLOR);
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, "= ");
lCurrentXPos += _pclDC->GetTextExtent("= ").cx;
_pclDC->SetTextColor(RGB(80,250,155));
csName = _pclNode->m_pub_fn_csGetNodeValue();
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, csName);
csName += " ";
lCurrentXPos += _pclDC->GetTextExtent(csName).cx;
}
if ( !_pclNode->m_pub_fn_csGetNodeReturnValue().IsEmpty() )
{
_pclDC->SetTextColor(IAD_C_STATIC_TEXT_COLOR);
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, "[ returns ");
lCurrentXPos += _pclDC->GetTextExtent("[ returns ").cx;
_pclDC->SetTextColor(RGB(0,250,215));
csName = _pclNode->m_pub_fn_csGetNodeReturnValue();
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, csName);
csName += " ";
lCurrentXPos += _pclDC->GetTextExtent(csName).cx;
_pclDC->SetTextColor(IAD_C_STATIC_TEXT_COLOR);
_pclDC->TextOut(lCurrentXPos, crRect.top + 1, "]");
}
}
//***************************************************************************
void IAD_TreeControl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
if ( !g_pclInterface->m_clDocument.m_pub_bIsDeletingTree )
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
//Re-draws unselected and newly selected Items
CRect crRectToInvalidate;
GetItemRect(pNMTreeView->itemOld.hItem, &crRectToInvalidate, TRUE);
InvalidateRect(crRectToInvalidate);
GetItemRect(pNMTreeView->itemNew.hItem, &crRectToInvalidate, TRUE);
InvalidateRect(crRectToInvalidate);
if ( ( GetItemState(pNMTreeView->itemNew.hItem, TVIF_STATE) & LVIS_SELECTED) != 0 )
{
// BEGIN ROMTEAM Cristi Petrescu 98-06-
//Gets corresponding Editor Node
IAD_EditorTreeNode *pclSelectedNode = (IAD_EditorTreeNode *)GetItemData(pNMTreeView->itemNew.hItem);
// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
if (pclSelectedNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_EngineLoop &&
! pclSelectedNode -> m_bSubtreeBuilded)
{
// build subtree
// get the brain
AI_tdstMind *p_stMind = M_pstGetMindOfBrain (((tdstEngineObject *) pclSelectedNode -> m_pub_fn_pclGetParentActor () -> GetStruct ()) -> h_Brain);
// get the trace
AIDebug_tdstTrace *p_stTrace = AI_M_p_stGetTrace (p_stMind);
if (pclSelectedNode -> m_uwSubtreeTraceIndex >=0)
{
// use the the Engine Trace from the proper place
AIDebug_M_uwGetExplIndex (p_stTrace) = pclSelectedNode -> m_uwSubtreeTraceIndex;
// preparations done, so go for the subtree
((IAD_ResultView *) GetParent ()) -> m_fn_vBuildSubtree (pclSelectedNode);//, pNMTreeView->itemNew.hItem);
pclSelectedNode -> m_bSubtreeBuilded = TRUE;
pclSelectedNode -> m_uwSubtreeTraceIndex = -1;
}
}
#endif
// CG PB DEBUGGER
// END ROMTEAM Cristi Petrescu 98-06-
if ( g_pclInterface->m_clDocument.m_pclResultView->m_bMustSynchronize )
{
//BEGIN ROMTEAM Cristi Petrescu 98-05-
// send info to the IA editor
if (pclSelectedNode)
{
IAD_EditorTreeNode *pclBehaviourSelectedNode = pclSelectedNode -> m_fn_pclGetBehaviourParentNode ();
if (pclBehaviourSelectedNode)
{
if (!(pclBehaviourSelectedNode == m_pclSelectedBehaviourNode &&
pclBehaviourSelectedNode -> m_pub_fn_pclGetParentActor () == m_pclSelectedBehaviourNode -> m_pub_fn_pclGetParentActor ()))
{
CString csBehaviourName;
// clear the old executed nodes
if (m_pclSelectedBehaviourNode)
{
csBehaviourName = m_pclSelectedBehaviourNode -> m_pub_fn_csGetNodeName ();
m_pclSelectedBehaviourNode -> m_pub_fn_pclGetParentActor() -> m_fn_vClearExecutedNodes (csBehaviourName);
}
// add the new ones
pclBehaviourSelectedNode -> m_fn_vAddExecutedNodes ();
// remind the current selected behaviour
m_pclSelectedBehaviourNode = pclBehaviourSelectedNode;
}
// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
// show the proper IA behaviour
if (pclSelectedNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_ReflexOrAI)
{
// behaviour node
pclSelectedNode -> m_pub_fn_pclGetParentActor() -> m_fn_vShowBehaviour (pclSelectedNode -> m_pub_fn_csGetNodeName ());
}
else
{
// regular node
pclSelectedNode -> m_pub_fn_pclGetParentActor() -> m_fn_vShowBehaviour (pclSelectedNode -> m_pub_fn_p_stGetMotorNode());
}
#endif // CG PB DEBUGGER }
}
}
//END ROMTEAM Cristi Petrescu 98-05-
/*
//Gets IA DLL
CPA_DLLBase *p_clDll = g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLAIEditorName);
if ( p_clDll != NULL )
{
tdstActorsIACom tdstCom;
tdstCom.pvThis = (void *)pclSelectedNode->m_pub_fn_pclGetParentActor();
tdstCom.pvData = (void *)pclSelectedNode->m_pub_fn_p_stGetMotorNode();
p_clDll->OnQueryAction(g_pclInterface, C_uiAI_ShowBehaviour, (long)(&tdstCom));
}
*/
}
// BEGIN ROMTEAM Cristi Petrescu 98-06-
// Update the variable view
IAD_EditorTreeNode *pclEngineLoop = pclSelectedNode -> m_fn_pclGetEngineLoopParentNode ();
g_pclInterface -> m_clDocument . m_pclVariableView -> m_fn_vUpdateVariables (pclEngineLoop);
// END ROMTEAM Cristi Petrescu 98-06-
}
}
*pResult = 0;
}
//***************************************************************************
HBRUSH IAD_TreeControl::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
// TODO: Return a non-NULL brush if the parent's handler should not be called
return HBRUSH(m_pri_clBrush);
//return NULL;
}
//BEGIN ROMTEAM Cristi Petrescu 98-05-
//***************************************************************************
void IAD_TreeControl::m_fn_vSetViewAI (BOOL bViewAI)
{
m_bViewAI = bViewAI;
}
//***************************************************************************
void IAD_TreeControl::m_fn_vSetViewReflex (BOOL bViewReflex)
{
m_bViewReflex = bViewReflex;
}
//END ROMTEAM Cristi Petrescu 98-05-
// BEGIN ROMTEAM Cristi Petrescu 98-08-
void IAD_TreeControl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
switch (pTVKeyDown -> wVKey)
{
case VK_F10:
((IAD_ResultView *) GetParent ()) -> OnButtonNextLine ();
// and regain the focus, yet is lost afterwards...
//m_pri_pclTreeControl -> SetFocus ();
*pResult = 0;
break;
default:
*pResult = 0;
}
}
// END ROMTEAM Cristi Petrescu 98-08-