487 lines
14 KiB
C++
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-
|