// CPAMVwMS.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#define HieFriend

#include "IADVwRst.hpp"

#include "IADFmMn.hpp"
#include "IADDoc.hpp"
#include "IADCnst.hpp"
#include "_IADItrf.hpp"
#include "IADEdtTr.hpp"
#include "IADLnkMt.hpp"
#include "IADDgFnd.hpp"
#include "IADTrCtl.hpp"
#include "IADVwMn.hpp"

#include "help_def.h"	//for Context Help

//External modules
#include "OAc.h"
#include "ErO.h"
#include "GAM.h"
//End of External modules

//BEGIN ROMTEAM Cristi Petrescu 98-05-
#include "IADVrVw.hpp"
#include "x:/cpa/tempgrp/tia/inc/showflag.hpp"
#include "x:/cpa/tempgrp/tia/inc/ai_intf.hpp"
#include "x:/cpa/main/inc/_EditId.h"
//END ROMTEAM Cristi Petrescu 98-05-

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// IAD_ResultView

IMPLEMENT_DYNCREATE(IAD_ResultView, CFormView)

BEGIN_MESSAGE_MAP(IAD_ResultView, CFormView)
	//{{AFX_MSG_MAP(IAD_ResultView)
	ON_WM_HELPINFO()
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_CHECK_SYNCHRONIZE, OnCheckSynchronize)
	ON_EN_CHANGE(IDC_EDIT_LEVELS, OnChangeEditLevels)
	ON_BN_CLICKED(IDC_BUTTON_FIND_NEXT_IN_TREE, OnButtonFindNextInTree)
	ON_BN_CLICKED(IDC_BUTTON_FIND_IN_TREE, OnButtonFindInTree)
	ON_BN_CLICKED(IDC_BUTTON_FIND_PREVIOUS_IN_TREE, OnButtonFindPreviousInTree)
	ON_BN_CLICKED(IDC_CHECK_VIEW_REFLEX, OnCheckViewReflex)
	ON_BN_CLICKED(IDC_CHECK_VIEW_AI, OnCheckViewAI)
	ON_BN_CLICKED(IDC_CHECK_SHOW_TESTS, OnCheckShowTests)
	ON_BN_CLICKED(IDC_CHECK_SHOW_MARKS, OnCheckShowMarks)
	ON_BN_CLICKED(IDC_BUTTON_NEXT_LINE, OnButtonNextLine)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//***************************************************************************
IAD_ResultView::IAD_ResultView()
								: CFormView(IAD_ResultView::IDD)
{
	//{{AFX_DATA_INIT(IAD_ResultView)
	m_lLevelToExpand = 0;
	m_bMustSynchronize = TRUE;
	m_bViewAI = TRUE;
	m_bViewReflex = TRUE;
	m_bShowMarks = TRUE;
	m_bShowTests = TRUE;
	//}}AFX_DATA_INIT

	m_pri_pclTreeControl = NULL;
	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	m_p_stInternalActor = NULL;
	//END ROMTEAM Cristi Petrescu 98-05-
}

//***************************************************************************
IAD_ResultView::~IAD_ResultView()
{
	if ( m_pri_pclTreeControl != NULL )
		delete m_pri_pclTreeControl;
}

//***************************************************************************
void IAD_ResultView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(IAD_ResultView)
	DDX_Text(pDX, IDC_EDIT_LEVELS, m_lLevelToExpand);
	DDX_Check(pDX, IDC_CHECK_SYNCHRONIZE, m_bMustSynchronize);
	//}}AFX_DATA_MAP
}

//Member Functions
////////////////////////////

//***************************************************************************
void IAD_ResultView::OnInitialUpdate() 
{
	//Creates the TreeControl
	m_pri_pclTreeControl = new IAD_TreeControl;
	m_pri_pclTreeControl->m_pub_fn_bCreate(this);

	CFormView::OnInitialUpdate();
	
	m_fn_pclGetDocument()->m_pclResultView = this;

	//Sets icon on buttons
	HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON_FIND_NEXT);
	((CButton *)GetDlgItem(IDC_BUTTON_FIND_NEXT_IN_TREE))->SetIcon(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_ICON_FIND_PREVIOUS);
	((CButton *)GetDlgItem(IDC_BUTTON_FIND_PREVIOUS_IN_TREE))->SetIcon(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_ICON_FIND);
	((CButton *)GetDlgItem(IDC_BUTTON_FIND_IN_TREE))->SetIcon(hIcon);
	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	hIcon = AfxGetApp()->LoadIcon(IDI_ICON_NEXT_LINE);
	((CButton *)GetDlgItem(IDC_BUTTON_NEXT_LINE))->SetIcon(hIcon);
	// END ROMTEAM Cristi Petrescu 98-08-

	CRect crClientRect;
	GetClientRect(crClientRect);
	
	m_pub_fn_vSetEditedActorName("<< Nothing edited >>");

	CSpinButtonCtrl *pclSpin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_LEVELS);
	if ( pclSpin != NULL )
		pclSpin->SetRange(0, 50);

	if ( m_pri_pclTreeControl != NULL )
		m_pri_pclTreeControl->SetIndent(3);

	CProgressCtrl *pclProgress = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS_STATUS);
	if ( pclProgress != NULL )
		pclProgress->SetRange(0, 100);

	m_pub_fn_vSetStatusText("Ready !");
	m_pub_fn_vSetFindStatusText("Nothing has been searched");

	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	m_bMustSynchronize = TRUE;
	((CButton *) GetDlgItem (IDC_CHECK_SYNCHRONIZE)) -> SetCheck (m_bMustSynchronize);
	// END ROMTEAM Cristi Petrescu 98-08-
	((CButton *) GetDlgItem (IDC_CHECK_VIEW_AI)) -> SetCheck (m_bViewAI);
	((CButton *) GetDlgItem (IDC_CHECK_VIEW_REFLEX)) -> SetCheck (m_bViewReflex);
	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	((CButton *) GetDlgItem (IDC_CHECK_SHOW_MARKS)) -> SetCheck (! m_bShowMarks);
	// END ROMTEAM Cristi Petrescu 98-08-
	((CButton *) GetDlgItem (IDC_CHECK_SHOW_TESTS)) -> SetCheck (m_bShowTests);
	((CButton *) GetDlgItem (IDC_CHECK_SHOW_TESTS)) -> EnableWindow (! m_bShowMarks);

	CPA_DLLBase *p_clDll = g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLAIEditorName);
	if ( p_clDll != NULL )
		p_clDll -> OnQueryAction (g_pclInterface, C_uiAI_ShowFlags, m_fn_lShowFlags ());
	//END ROMTEAM Cristi Petrescu 98-05-
}

//*******************************************************************************
void IAD_ResultView::m_pub_fn_vRefreshTree()
{
	m_pri_pclTreeControl->InvalidateRect(NULL);
}

//*******************************************************************************
void IAD_ResultView::m_pub_fn_vDeleteAllInTreeControl()
{
	m_fn_pclGetDocument()->m_pub_bIsDeletingTree = TRUE;
	m_pri_pclTreeControl->DeleteAllItems();
	m_fn_pclGetDocument()->m_pub_bIsDeletingTree = FALSE;
}

//*******************************************************************************
IAD_MyDocument* IAD_ResultView::m_fn_pclGetDocument()
{
	return g_pclInterface->m_fn_pclGetDocument();
}

//***************************************************************************
void IAD_ResultView::m_pub_fn_vSetStatusText(CString _csNewStatus,
																						 char _cPercentage /*= -1*/)
{
	GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(_csNewStatus);

	if ( _cPercentage != -1 )
	{
		//Re-centers
		_cPercentage = max (0, _cPercentage);
		_cPercentage = min (100, _cPercentage);

		//Displays in progress control
		CProgressCtrl *pclProgress = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS_STATUS);

		if ( pclProgress != NULL )
			pclProgress->SetPos(_cPercentage);
	}
}

//***************************************************************************
void IAD_ResultView::m_pub_fn_vSetFindStatusText(CString _csNewStatus)
{
	GetDlgItem(IDC_STATIC_FIND_STATUS)->SetWindowText(_csNewStatus);
}

//***************************************************************************
void IAD_ResultView::m_pub_fn_vSetEditedActorName(CString _csName)
{
	GetDlgItem(IDC_STATIC_ACTOR_NAME)->SetWindowText(_csName);
}

//***************************************************************************
BOOL IAD_ResultView::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	::WinHelp(m_hWnd,
						LPCTSTR(g_pclInterface->m_clDocument.m_csHelpFileNameAndPath),
						HELP_CONTEXT,
						IDH_GENERAL);
	
	return FALSE;
}

#define IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING		3

//***************************************************************************
void IAD_ResultView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);

	CRect crNameStaticDestRect;
	CRect crTreeStaticDestRect;
	CRect crStatusStaticDestRect;
	CRect crButtonDestRect;
	CRect crProgressDestRect;
	CRect crButtonFindNextDestRect;
	CRect crButtonFindPrevDestRect;
	CRect crButtonFindDestRect;
	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	CRect crVariableRect;
	LONG  lLeft;
	//END ROMTEAM Cristi Petrescu 98-05-

	
	//Re-sizes Static for Actor's name
	CStatic *pclStatic = (CStatic *)GetDlgItem(IDC_STATIC_ACTOR_NAME);
	if ( pclStatic != NULL )
	{
		CRect crStaticRect;
		pclStatic->GetWindowRect(crStaticRect);
		ScreenToClient(crStaticRect);
		
		crNameStaticDestRect.top = IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crNameStaticDestRect.bottom = crNameStaticDestRect.top + crStaticRect.Height();
		crNameStaticDestRect.left = crStaticRect.left;
		crNameStaticDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		pclStatic->MoveWindow(crNameStaticDestRect);
	}

	//Moves "Synchro" button
	CButton *pclButton = (CButton *)GetDlgItem(IDC_CHECK_SYNCHRONIZE);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonDestRect.top = crNameStaticDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonDestRect.bottom = crButtonDestRect.top + crButtonRect.Height();
		crButtonDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		//BEGIN ROMTEAM Cristi Petrescu 98-05-
		lLeft = crButtonDestRect.left = crButtonDestRect.right - crButtonRect.Width();
		//END ROMTEAM Cristi Petrescu 98-05-

		pclButton->MoveWindow(crButtonDestRect);
	}

	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	// moves check ai button
	pclButton = (CButton *) GetDlgItem (IDC_CHECK_VIEW_AI);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		CRect crButtonFinalRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFinalRect.top = crNameStaticDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFinalRect.bottom = crButtonFinalRect.top + crButtonRect.Height();
		crButtonFinalRect.right = lLeft - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		lLeft = crButtonFinalRect.left = crButtonFinalRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFinalRect);
	}

	// moves check reflex button
	pclButton = (CButton *) GetDlgItem (IDC_CHECK_VIEW_REFLEX);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		CRect crButtonFinalRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFinalRect.top = crNameStaticDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFinalRect.bottom = crButtonFinalRect.top + crButtonRect.Height();
		crButtonFinalRect.right = lLeft - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		lLeft = crButtonFinalRect.left = crButtonFinalRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFinalRect);
	}

	// moves Tests button
	pclButton = (CButton *) GetDlgItem (IDC_CHECK_SHOW_TESTS);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFindNextDestRect.top = crButtonDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindNextDestRect.bottom = crButtonFindNextDestRect.top + crButtonRect.Height();
		crButtonFindNextDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindNextDestRect.left = crButtonFindNextDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFindNextDestRect);
	}

	// moves Marks button
	pclButton = (CButton *) GetDlgItem (IDC_CHECK_SHOW_MARKS);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonDestRect.top = crButtonFindNextDestRect.top;
		crButtonDestRect.bottom = crButtonDestRect.top + crButtonRect.Height();
		crButtonDestRect.right = crButtonFindNextDestRect.left - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonDestRect.left = crButtonDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonDestRect);
	}
	//END ROMTEAM Cristi Petrescu 98-05-

	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	//Moves "Find" button
	pclButton = (CButton *)GetDlgItem(IDC_BUTTON_NEXT_LINE);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonDestRect.top = crButtonDestRect.top;
		crButtonDestRect.bottom = crButtonDestRect.top + crButtonRect.Height();
		crButtonDestRect.right = crButtonDestRect.left - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonDestRect.left = crButtonDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonDestRect);
	}
	// END ROMTEAM Cristi Petrescu 98-08-

	//Moves "Find Next" button
	pclButton = (CButton *)GetDlgItem(IDC_BUTTON_FIND_NEXT_IN_TREE);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFindNextDestRect.top = crButtonDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindNextDestRect.bottom = crButtonFindNextDestRect.top + crButtonRect.Height();
		crButtonFindNextDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindNextDestRect.left = crButtonFindNextDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFindNextDestRect);
	}

	//Moves "Find Prev" button
	pclButton = (CButton *)GetDlgItem(IDC_BUTTON_FIND_PREVIOUS_IN_TREE);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFindPrevDestRect.top = crButtonFindNextDestRect.top;
		crButtonFindPrevDestRect.bottom = crButtonFindPrevDestRect.top + crButtonRect.Height();
		crButtonFindPrevDestRect.right = crButtonFindNextDestRect.left - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindPrevDestRect.left = crButtonFindPrevDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFindPrevDestRect);
	}

	//Moves "Find" button
	pclButton = (CButton *)GetDlgItem(IDC_BUTTON_FIND_IN_TREE);
	if ( pclButton != NULL )
	{
		CRect crButtonRect;
		pclButton->GetWindowRect(crButtonRect);
		ScreenToClient(crButtonRect);
		
		crButtonFindDestRect.top = crButtonFindNextDestRect.top;
		crButtonFindDestRect.bottom = crButtonFindDestRect.top + crButtonRect.Height();
		crButtonFindDestRect.right = crButtonFindPrevDestRect.left - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crButtonFindDestRect.left = crButtonFindDestRect.right - crButtonRect.Width();

		pclButton->MoveWindow(crButtonFindDestRect);
	}

	//Moves Find Status static
	pclStatic = (CStatic *)GetDlgItem(IDC_STATIC_FIND_STATUS);
	if ( pclStatic != NULL )
	{
		CRect crStaticRect;
		pclStatic->GetWindowRect(crStaticRect);
		ScreenToClient(crStaticRect);
	
		CRect crDestRect;
		crDestRect.top = crButtonFindDestRect.top;
		crDestRect.bottom = crDestRect.top + crStaticRect.Height();
		crDestRect.left = IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crDestRect.right = crButtonFindDestRect.left - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		pclStatic->MoveWindow(crDestRect);
	}

	//Re-sizes Static for Actor's name
	pclStatic = (CStatic *)GetDlgItem(IDC_STATIC_IA_TREE);
	if ( pclStatic != NULL )
	{
		CRect crStaticRect;
		pclStatic->GetWindowRect(crStaticRect);
		ScreenToClient(crStaticRect);
		
		crTreeStaticDestRect.top = crButtonFindNextDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crTreeStaticDestRect.bottom = crTreeStaticDestRect.top + crStaticRect.Height();
		crTreeStaticDestRect.left = crStaticRect.left;
		crTreeStaticDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		pclStatic->MoveWindow(crTreeStaticDestRect);
	}

	//Re-sizes Static for status progress
	CWnd *pclProgress = GetDlgItem(IDC_PROGRESS_STATUS);
	if ( pclProgress != NULL )
	{
		CRect crStaticRect;
		pclProgress->GetWindowRect(crStaticRect);
		
		crProgressDestRect.bottom = cy - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crProgressDestRect.top = crProgressDestRect.bottom - crStaticRect.Height();
		crProgressDestRect.left = IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crProgressDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		pclProgress->MoveWindow(crProgressDestRect);
	}

	//Re-sizes Static for status
	pclStatic = (CStatic *)GetDlgItem(IDC_STATIC_STATUS);
	if ( pclStatic != NULL )
	{
		CRect crStaticRect;
		pclStatic->GetWindowRect(crStaticRect);
		
		crStatusStaticDestRect.bottom = crProgressDestRect.top - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crStatusStaticDestRect.top = crStatusStaticDestRect.bottom - crStaticRect.Height();
		crStatusStaticDestRect.left = IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crStatusStaticDestRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		pclStatic->MoveWindow(crStatusStaticDestRect);
	}

	//Re-sizes Tree Ctrl
	if ( m_pri_pclTreeControl != NULL )
	{
		CRect crTreeRect;
		crTreeRect.top = crTreeStaticDestRect.bottom + IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crTreeRect.bottom = crStatusStaticDestRect.top - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crTreeRect.left = IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;
		crTreeRect.right = cx - IA_DEBUGGER_TREE_VIEW_CONTROL_SPACING;

		m_pri_pclTreeControl->MoveWindow(crTreeRect);
	}
}

//***************************************************************************
void IAD_ResultView::m_pub_fn_vDisplayTraceForActor(struct IAD_stInternalActorDescription *_p_stInternalActor)
{
	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	m_p_stInternalActor = _p_stInternalActor;
	//END ROMTEAM Cristi Petrescu 98-05-

	if ( _p_stInternalActor != NULL )
	{
		if ( _p_stInternalActor != g_pclInterface->m_clDocument.m_pub_fn_p_stGetSelectedActor() )
		{
			AfxGetApp()->DoWaitCursor(1);

			//Frees all needed for last selected Actor
			g_pclInterface->m_clDocument.m_pub_fn_vFreeEditorTraceForEditedActor();
			g_pclInterface->m_clDocument.m_pub_fn_vSetSelectedActor(_p_stInternalActor);

			//Sets Actor's Name
			m_pub_fn_vSetEditedActorName(_p_stInternalActor->pclActor->GetName());

			m_fn_vEnableFindNextButton(FALSE);

			CString csText("Computing Editor Tree for Actor '");
			csText += _p_stInternalActor->pclActor->GetName() + "' ... Please wait !";
			m_pub_fn_vSetStatusText(csText);

			m_pri_fn_vComputeEditorTreeFromMotorTrace(_p_stInternalActor);

			m_pub_fn_vSetStatusText("Filling Tree", 0);

			m_pri_fn_vFillTreeControl(_p_stInternalActor);

			CString csReadyText;
			csReadyText.Format("Ready !   [ %s -> %ld entry(ies) ]", _p_stInternalActor->pclActor->GetName(), m_pri_ulTotalNumberOfNodes);
			m_pub_fn_vSetStatusText(csReadyText, 0);

			g_pclInterface->m_clDocument.m_pub_fn_vSetSelectedActor(_p_stInternalActor);

			AfxGetApp()->DoWaitCursor(-1);
		}
	}
}

//***************************************************************************
void IAD_ResultView::OnCheckSynchronize() 
{
	UpdateData(TRUE);
}

//***************************************************************************
void IAD_ResultView::OnChangeEditLevels() 
{
	if ( GetDlgItem(IDC_EDIT_LEVELS)->m_hWnd != NULL )	//To avoid construction
	{
		UpdateData(TRUE);

		if ( m_pri_pclTreeControl != NULL )
		{
			HTREEITEM hCurrentRootTreeItem = m_pri_pclTreeControl->GetNextItem(NULL, TVGN_ROOT);

			while ( hCurrentRootTreeItem != NULL )
			{
				//Tries to expand childs of this root Item, at the right level
				m_pri_pclTreeControl->Expand(hCurrentRootTreeItem, (m_lLevelToExpand > 0) ? TVE_EXPAND : TVE_COLLAPSE);
				m_pri_fn_lLookInChildsToExpand(hCurrentRootTreeItem, 0);

				hCurrentRootTreeItem = m_pri_pclTreeControl->GetNextItem(hCurrentRootTreeItem, TVGN_NEXT);
			}
		}
	}
}

//***************************************************************************
void IAD_ResultView::OnButtonFindInTree() 
{
	if ( m_fn_pclGetDocument()->m_pub_fn_p_stGetSelectedActor() != NULL )
	{
		IAD_Dialog_FindInTree dial(AfxGetMainWnd());

		if ( dial.DoModal() == IDOK )
		{
			AfxGetApp()->DoWaitCursor(1);

			HTREEITEM hFoundTreeItem = m_fn_pclGetDocument()->m_pub_fn_hFindInTree(	m_fn_pclGetDocument()->m_pub_fn_p_stGetSelectedActor()->pclRoot,
																																							m_fn_pclGetDocument()->m_pub_p_tdstGetFindInfo());

			if ( hFoundTreeItem != NULL )
				m_pri_pclTreeControl->m_pub_fn_vSelectAndShowItem(hFoundTreeItem);	

			AfxGetApp()->DoWaitCursor(-1);
		}
	}
}

//***************************************************************************
void IAD_ResultView::OnButtonFindNextInTree() 
{
	HTREEITEM hFoundTreeItem = m_fn_pclGetDocument()->m_pub_fn_hFindNextInTree();
	if ( hFoundTreeItem != NULL )
		m_pri_pclTreeControl->m_pub_fn_vSelectAndShowItem(hFoundTreeItem);	
}

//***************************************************************************
void IAD_ResultView::OnButtonFindPreviousInTree() 
{
	HTREEITEM hFoundTreeItem = m_fn_pclGetDocument()->m_pub_fn_hFindPreviousInTree();
	if ( hFoundTreeItem != NULL )
		m_pri_pclTreeControl->m_pub_fn_vSelectAndShowItem(hFoundTreeItem);	
}

//***************************************************************************
void IAD_ResultView::m_fn_vEnableFindNextButton(BOOL _bEnable /*= TRUE*/)
{
	GetDlgItem(IDC_BUTTON_FIND_NEXT_IN_TREE)->EnableWindow(_bEnable);
}

//***************************************************************************
void IAD_ResultView::m_fn_vEnableFindPrevButton(BOOL _bEnable /*= TRUE*/)
{
	GetDlgItem(IDC_BUTTON_FIND_PREVIOUS_IN_TREE)->EnableWindow(_bEnable);
}

//BEGIN ROMTEAM Cristi Petrescu 98-05-
//***************************************************************************
void IAD_ResultView::OnCheckViewAI() 
{
	//UpdateData (TRUE);
	m_bViewAI = !m_bViewAI;
	
	if (!m_bViewAI && !m_bViewReflex)
	{
		m_bViewAI = TRUE;
	}
	else
	{
		((CButton *) GetDlgItem (IDC_CHECK_VIEW_AI)) -> SetCheck (m_bViewAI);

		if (m_p_stInternalActor != NULL)
		{	
			m_pri_pclTreeControl -> m_fn_vSetViewAI (m_bViewAI);
			m_pri_fn_vFillTreeControl (m_p_stInternalActor);
		}
	}
}

//***************************************************************************
void IAD_ResultView::OnCheckViewReflex() 
{
	m_bViewReflex = !m_bViewReflex;
	
	if (!m_bViewAI && !m_bViewReflex)
	{
		m_bViewReflex = TRUE;
	}
	else
	{
		((CButton *) GetDlgItem (IDC_CHECK_VIEW_REFLEX)) -> SetCheck (m_bViewReflex);

		if (m_p_stInternalActor != NULL)
		{
			m_pri_pclTreeControl -> m_fn_vSetViewReflex (m_bViewReflex);
			m_pri_fn_vFillTreeControl (m_p_stInternalActor);
		}
	}
}

//***************************************************************************
void IAD_ResultView::OnCheckShowTests() 
{
	m_bShowTests = ! m_bShowTests;

	((CButton *) GetDlgItem (IDC_CHECK_SHOW_TESTS)) -> SetCheck (m_bShowTests);

	CPA_DLLBase *p_clDll = g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLAIEditorName);
	if ( p_clDll != NULL )
		p_clDll -> OnQueryAction (g_pclInterface, C_uiAI_ShowFlags, m_fn_lShowFlags ());
}

//***************************************************************************
void IAD_ResultView::OnCheckShowMarks() 
{
	m_bShowMarks = ! m_bShowMarks;

	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	((CButton *) GetDlgItem (IDC_CHECK_SHOW_MARKS)) -> SetCheck (! m_bShowMarks);
	// END ROMTEAM Cristi Petrescu 98-08-

	((CButton *) GetDlgItem (IDC_CHECK_SHOW_TESTS)) -> EnableWindow (! m_bShowMarks);

	CPA_DLLBase *p_clDll = g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLAIEditorName);
	if ( p_clDll != NULL )
		p_clDll -> OnQueryAction (g_pclInterface, C_uiAI_ShowFlags, m_fn_lShowFlags ());
}

//***************************************************************************
long IAD_ResultView::m_fn_lShowFlags (void) 
{
	if (m_bShowMarks)
		return E_MarkExecutedLines;
	if (m_bShowTests)
		return E_ShowTestsAndActions;
	return E_ShowActions;
}
//END ROMTEAM Cristi Petrescu 98-05-

// BEGIN ROMTEAM Cristi Petrescu 98-08-
void IAD_ResultView::OnButtonNextLine() 
{
	IAD_EditorTreeNode *pclNextLine = NULL;

	// find the current node
	IAD_EditorTreeNode *pclCurrentNode = m_fn_pclGetSelectedEditorNode ();
	if (! pclCurrentNode)
		return;

	// get the current behaviour and the current line
	IAD_EditorTreeNode *pclBehaviourNode = pclCurrentNode;
	IAD_EditorTreeNode *pclCurrentLineNode = NULL;

	while (pclBehaviourNode && pclBehaviourNode -> m_pub_fn_tdeGetNodeType () != AIDebug_E_SecTyp_ReflexOrAI)
	{
		pclCurrentLineNode = pclBehaviourNode;
		pclBehaviourNode = pclBehaviourNode -> m_pub_fn_pclGetParentNode ();
	}

	if (! pclBehaviourNode)
		return;

	if (! pclCurrentLineNode)
	{
		// first line of the behaviour
		pclNextLine = pclBehaviourNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetHead ();	
	}
	else
	{
		POSITION pos = pclBehaviourNode -> m_pub_fn_ptdGetListOfChildNodes () -> Find (pclCurrentLineNode);
		pclBehaviourNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
		if (! pos)
		{
			CString csBehaviourName = pclBehaviourNode -> m_pub_fn_csGetNodeName ();
			//should find the next loop
			IAD_EditorTreeNode *pclCurrentLoop = pclBehaviourNode -> m_fn_pclGetEngineLoopParentNode ();
			IAD_EditorTreeNode *pclRoot = pclCurrentLoop -> m_pub_fn_pclGetParentNode ();
			IAD_EditorTreeNode *pclNextLoop;
			
			pos = pclRoot -> m_pub_fn_ptdGetListOfChildNodes () -> Find (pclCurrentLoop);
			pclRoot -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
			if (! pos)
			{
				// last loop; acquire data from engine
				M_GetMainApp () -> fn_vAppliAskToStopEditors ();
				M_GetMainApp () -> fn_vAppliAskOneStep ();
				M_GetMainApp () -> fn_vAppliAskToStartEditors ();
				//rebuild all
				m_pub_fn_vDisplayTraceForActor (m_p_stInternalActor);
				// select last loop (the only ?!)
				pclNextLoop = m_p_stInternalActor -> pclRoot -> m_pub_fn_ptdGetListOfChildNodes () -> GetTail ();
				if (! pclNextLoop)
					return;
			}
			else
			{
				pclNextLoop = pclRoot -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
			}	

			// build the subtree for this node (select that node!)
			m_pri_pclTreeControl -> m_pub_fn_vSelectAndShowItem (pclNextLoop -> m_pub_fn_hGetTreeItem ());
			
			// now get the new behaviour node
			pos = pclNextLoop -> m_pub_fn_ptdGetListOfChildNodes () -> GetHeadPosition ();
			while (pos)
			{
				pclBehaviourNode = pclNextLoop -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
				if (csBehaviourName == pclBehaviourNode -> m_pub_fn_csGetNodeName ())
				{
					pclNextLine = pclBehaviourNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetHead ();
					break;
				}
			}
		}
		else
		{
			pclNextLine = pclBehaviourNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
		}
	}

	if (pclNextLine)
	{
		// select the line
		m_pri_pclTreeControl -> m_pub_fn_vSelectAndShowItem (pclNextLine -> m_pub_fn_hGetTreeItem ());
	}
}
// END ROMTEAM Cristi Petrescu 98-08-

//***************************************************************************
//***************************************************************************
//***************************************************************************
//***************************************************************************

///////////////////////
// Private functions //
///////////////////////

//***************************************************************************
void IAD_ResultView::m_pri_fn_vComputeEditorTreeFromMotorTrace(struct IAD_stInternalActorDescription *_p_stInternalActor)
{
	//Gets motor trace
	if ( ((tdstEngineObject *)_p_stInternalActor->pclActor->GetStruct())->h_Brain != NULL )
	{
		AI_tdstMind *p_stMind = M_pstGetMindOfBrain( ((tdstEngineObject *)_p_stInternalActor->pclActor->GetStruct())->h_Brain );

		//Building Tree Root
		if ( _p_stInternalActor->pclRoot == NULL )
			_p_stInternalActor->pclRoot = new IAD_EditorTreeNode;

		m_pri_ulTotalNumberOfNodes = 0;

		//Inits motor trace reading
		unsigned char ucDepth;
// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
		BOOL bMustGoOn = ( AIDebug_fn_bInitExploitation(p_stMind,
																										&m_pri_tdeSectionType,
																										&m_pri_lID,
																										&m_pri_stGetSetParam,
																										&ucDepth,
																										&m_pri_p_stNode) == 1 );
#else
		BOOL bMustGoOn = FALSE;
#endif 
// CG PB DEBUGGER
		if ( bMustGoOn )
		{
			m_pri_bMustStopTreeConstruction = FALSE;

			//Will be called recursively
			m_pri_fn_lAddChildNodesToOneNode(_p_stInternalActor->pclRoot, p_stMind, ucDepth, _p_stInternalActor);
			//BEGIN ROMTEAM Cristi Petrescu 98-05-
			//cleanup unneeded nodes (Reflex/AI), mark changements)
			m_fn_vPostProcessEditorTree (_p_stInternalActor->pclRoot);
			//END ROMTEAM Cristi Petrescu 98-05-
		}
		else
		{
			CString csMessage = "Nothing in Trace for the Actor '" + _p_stInternalActor->pclActor->GetName() + "' !";
			m_pub_fn_vSetStatusText(csMessage, 0);
		}
	}
	else
	{
		CString csMessage = "No Brain for the Actor '" + _p_stInternalActor->pclActor->GetName() + "' ! This should not occur...";
		m_pub_fn_vSetStatusText(csMessage, 0);
	}
}

//***************************************************************************
long IAD_ResultView::m_pri_fn_lAddChildNodesToOneNode(IAD_EditorTreeNode *_pclParentNode,
																											struct AI_tdstMind_ *_p_tdstMind,
																											long _lPreviousDepth,
																											struct IAD_stInternalActorDescription *_p_stInternalActor)
{
	long lOffsetIndex = 0;
	unsigned char ucCurrentDepth = (unsigned char)_lPreviousDepth;

	CString csNewElementType;
	CString csNewElementName;
	CString csNewElementValue;
	CString csNewElemenReturnValue;
	BOOL bMustGoOn = TRUE;
	BOOL bReadNextElement = TRUE;
	IAD_EditorTreeNode *pclLastAddedNode = NULL;
	//BEGIN ROMTEAM Cristi Petrescu 98-05-
	CString csBehaviourName;
	//END ROMTEAM Cristi Petrescu 98-05-

	
// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
	while ( bMustGoOn )
	{
		// BEGIN ROMTEAM Cristi Petrescu 98-06-
		// I'll keep this node since it seems it replaces a normal node. Is very strange...
		// this was already added in the first pass
		// Further tests shows tis is not true. So, KILL this node without remorse
		//while (m_pri_tdeSectionType == AIDebug_E_SecTyp_CurrentComport)
		//{
			//skip it
		//	m_pri_bMustStopTreeConstruction = (AIDebug_fn_bGetNextEntry (_p_tdstMind, & m_pri_tdeSectionType, & m_pri_lID, & m_pri_stGetSetParam, & ucCurrentDepth, & m_pri_p_stNode) == 0);
		//	if (! m_pri_bMustStopTreeConstruction)
		//		return ucCurrentDepth;
		//}
		// END ROMTEAM Cristi Petrescu 98-06-
		
		//Adds node to current Father
		if ( ucCurrentDepth == _lPreviousDepth )
		{
			//Computes strings
			if ( g_a_p_fnArrayOfGetTypeCallBacks[m_pri_tdeSectionType] != NULL )
				csNewElementType = g_a_p_fnArrayOfGetTypeCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
			else
				csNewElementType = "Unknown";

			if ( g_a_p_fnArrayOfGetNameCallBacks[m_pri_tdeSectionType] != NULL )
				csNewElementName = g_a_p_fnArrayOfGetNameCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
			else
				csNewElementName = "";

			if ( g_a_p_fnArrayOfGetValueCallBacks[m_pri_tdeSectionType] != NULL )
				csNewElementValue = g_a_p_fnArrayOfGetValueCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
			else
				csNewElementValue = "";

			if ( g_a_p_fnArrayOfGetReturnValueCallBacks[m_pri_tdeSectionType] != NULL )
				csNewElemenReturnValue = g_a_p_fnArrayOfGetReturnValueCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
			else
				csNewElemenReturnValue = "";

			//BEGIN ROMTEAM Cristi Petrescu 98-05-
			if (_pclParentNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_ReflexOrAI)
			{
				if (m_pri_tdeSectionType == AIDebug_E_SecTyp_CurrentComport)
				{
					char szName[SCR_CV_ui_Cfg_MaxLenName];
					SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csNewElementValue, NULL, NULL, szName);
					csBehaviourName = CString (szName);

					// BEGIN ROMTEAM Cristi Petrescu 98-08-
					csNewElementValue = csBehaviourName;
					// END ROMTEAM Cristi Petrescu 98-08-
				}
				else
				{
					csBehaviourName = _p_stInternalActor -> pclActor -> m_fn_csGetBehaviourName (m_pri_p_stNode);
				}

				BOOL bBehaviourNodeExists = FALSE;
				POSITION pos = _pclParentNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetHeadPosition ();
				IAD_EditorTreeNode *pclBehaviourNode;

				while (pos)
				{
					pclBehaviourNode = _pclParentNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);
	
					if (csBehaviourName == pclBehaviourNode -> m_pub_fn_csGetNodeName ())
					{
						bBehaviourNodeExists = TRUE;
						break;
					}
			
				}

				if (! bBehaviourNodeExists)
				{
					CString csBehaviourType;
					// BEGIN ROMTEAM Cristi Petrescu 98-08-
					if (m_pri_tdeSectionType == AIDebug_E_SecTyp_CurrentComport)
						csBehaviourType = "C ";

					if (_pclParentNode -> m_pub_fn_csGetNodeType () == "Reflex")
						csBehaviourType += "R:";
					else
						csBehaviourType += "I:";
					// END ROMTEAM Cristi Petrescu 98-08-
					//create a the behaviour name in the parent
					pclBehaviourNode = _pclParentNode -> m_pub_fn_pclAddChildNode ( AIDebug_E_SecTyp_ReflexOrAI, NULL, _p_stInternalActor->pclActor, csBehaviourType, csBehaviourName, "", "", "");
				}
				// add the node to the behaviour node child list
				//if (m_pri_tdeSectionType != AIDebug_E_SecTyp_CurrentComport)
				pclLastAddedNode = pclBehaviourNode->m_pub_fn_pclAddChildNode(m_pri_tdeSectionType, m_pri_p_stNode, _p_stInternalActor->pclActor, csNewElementType, csNewElementName, csNewElementValue, csNewElemenReturnValue, "");
			}
			else
			{
				// as usual
				pclLastAddedNode = _pclParentNode->m_pub_fn_pclAddChildNode(m_pri_tdeSectionType, m_pri_p_stNode, _p_stInternalActor->pclActor, csNewElementType, csNewElementName, csNewElementValue, csNewElemenReturnValue, "");
			}

			//END ROMTEAM Cristi Petrescu 98-05-

			m_pri_ulTotalNumberOfNodes ++;
			bReadNextElement = TRUE;
		}
		//returns
		else if ( ucCurrentDepth < _lPreviousDepth )
		{
			bMustGoOn = FALSE;
		}
		//Adds childs nodes
		else if ( ucCurrentDepth > _lPreviousDepth )
		{
			ucCurrentDepth = (unsigned char)m_pri_fn_lAddChildNodesToOneNode(	pclLastAddedNode,
																																			_p_tdstMind,
																																				ucCurrentDepth,
																																				_p_stInternalActor);
			bReadNextElement = FALSE;

			bMustGoOn = !m_pri_bMustStopTreeConstruction;
		}

		if ( bMustGoOn && bReadNextElement )
		{
			// BEGIN ROMTEAM Cristi Petrescu 98-06-
			if (m_pri_tdeSectionType == AIDebug_E_SecTyp_EngineLoop)
			{
				// force abort tree computation
				AIDebug_tdstTrace *p_stTrace = AI_M_p_stGetTrace(_p_tdstMind);
				pclLastAddedNode -> m_uwSubtreeTraceIndex = AIDebug_M_uwGetExplIndex( p_stTrace );
				pclLastAddedNode -> m_bSubtreeBuilded = FALSE;

				// get all engine loops
				// + get the variables snapshot
				while (1)
				{
					m_pri_bMustStopTreeConstruction = ( AIDebug_fn_bGetNextEntry (_p_tdstMind,
																				  & m_pri_tdeSectionType,
																				  & m_pri_lID,
																				  & m_pri_stGetSetParam,
																				  & ucCurrentDepth,
																				  & m_pri_p_stNode) == 0);

					if (m_pri_bMustStopTreeConstruction)
						break;

					// look for variables snapshot
					if (m_pri_tdeSectionType == AIDebug_E_SecTyp_DsgVar && m_pri_p_stNode == NULL)
					{
						// TODO get the variable
						pclLastAddedNode -> m_fn_vAddVariableValue (& m_pri_stGetSetParam);

						// for the subtree computation, just skip those nodes
						pclLastAddedNode -> m_uwSubtreeTraceIndex = AIDebug_M_uwGetExplIndex( p_stTrace );
						continue;
					}

					// look for change behaviour nodes
					if (m_pri_tdeSectionType == AIDebug_E_SecTyp_CurrentComport)
					{
						// get the values for the node.
						csNewElementType = "Changed Behaviour";
						//if ( g_a_p_fnArrayOfGetTypeCallBacks[m_pri_tdeSectionType] != NULL )
						//	csNewElementType = g_a_p_fnArrayOfGetTypeCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
						//else
						//	csNewElementType = "Unknown";

						if ( g_a_p_fnArrayOfGetNameCallBacks[m_pri_tdeSectionType] != NULL )
							csNewElementName = g_a_p_fnArrayOfGetNameCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
						else
							csNewElementName = "";

						if ( g_a_p_fnArrayOfGetValueCallBacks[m_pri_tdeSectionType] != NULL )
							csNewElementValue = g_a_p_fnArrayOfGetValueCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
						else
							csNewElementValue = "";

						if ( g_a_p_fnArrayOfGetReturnValueCallBacks[m_pri_tdeSectionType] != NULL )
							csNewElemenReturnValue = g_a_p_fnArrayOfGetReturnValueCallBacks[m_pri_tdeSectionType](m_pri_lID, &m_pri_stGetSetParam);
						else
							csNewElemenReturnValue = "";

						// build change comport node
						pclLastAddedNode -> m_pub_fn_pclAddChildNode(m_pri_tdeSectionType, m_pri_p_stNode, _p_stInternalActor->pclActor, csNewElementType, csNewElementName, csNewElementValue, csNewElemenReturnValue, "");						

						continue;
					}
					
					if (m_pri_tdeSectionType == AIDebug_E_SecTyp_EngineLoop)
					{
						// the next engine loop, add it to the same node
						m_pri_fn_lAddChildNodesToOneNode (_pclParentNode, _p_tdstMind, _lPreviousDepth, _p_stInternalActor);
					}
				}
			}
			else
			{
				//Gets the next trace element
				m_pri_bMustStopTreeConstruction = ( AIDebug_fn_bGetNextEntry(	_p_tdstMind,
																																		&m_pri_tdeSectionType,
																																		&m_pri_lID,
																																		&m_pri_stGetSetParam,
																																		&ucCurrentDepth,
																																		&m_pri_p_stNode) == 0 );
			}
			// END ROMTEAM Cristi Petrescu 98-06-

			bMustGoOn = !m_pri_bMustStopTreeConstruction;
		}
	}
#endif 
// CG PB DEBUGGER

	return ucCurrentDepth;
}

//BEGIN ROMTEAM Cristi Petrescu 98-05-
//***************************************************************************
void IAD_ResultView::m_fn_vPostProcessEditorTree (IAD_EditorTreeNode *_pclParentNode)
{
	IAD_tdListOfNodes clListOfNodes;
	IAD_EditorTreeNode *_pclCurrentNode;
	POSITION pos = _pclParentNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetHeadPosition ();
	while ( pos != NULL ) 
	{
		_pclCurrentNode = _pclParentNode -> m_pub_fn_ptdGetListOfChildNodes () -> GetNext (pos);

// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
		//cleanup, eliminates the "Reflex" and "AI" nodes
		// but keep all others
		if (_pclParentNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_EngineLoop)
		{
			if (_pclCurrentNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_ReflexOrAI)
			{
				IAD_EditorTreeNode *_pclNode;
				POSITION cleanpos = _pclCurrentNode->m_pub_fn_ptdGetListOfChildNodes()->GetHeadPosition();
				IAD_tdListOfNodes clListOfAllNodes;
				while (cleanpos != NULL)
				{
					_pclNode = _pclCurrentNode->m_pub_fn_ptdGetListOfChildNodes()->GetNext(cleanpos);
					clListOfNodes . AddTail (_pclNode);
					// and set the parent pointer properly
					_pclNode -> m_fn_vSetParentNode (_pclParentNode);
				}
			}
			else
			{
				clListOfNodes . AddTail (_pclCurrentNode);
			}
		}

#endif 
// CG PB DEBUGGER

		//Calls recursively to build childs level
		m_fn_vPostProcessEditorTree(_pclCurrentNode);
	}

// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
	if (_pclParentNode -> m_pub_fn_tdeGetNodeType () == AIDebug_E_SecTyp_EngineLoop)
	{
		_pclParentNode -> m_fn_vSetListOfChildNodes (& clListOfNodes);
	}
#endif 
// CG PB DEBUGGER
}

//END ROMTEAM Cristi Petrescu 98-05-

// BEGIN ROMTEAM Cristi Petrescu 98-06-
//***************************************************************************
void IAD_ResultView::m_fn_vBuildSubtree (IAD_EditorTreeNode *pclParentNode)//, HTREEITEM hTreeParentItem)
{
	// BEGIN ROMTEAM Cristi Petrescu 98-08-
	HTREEITEM hTreeParentItem = pclParentNode -> m_pub_fn_hGetTreeItem ();
	// END ROMTEAM Cristi Petrescu 98-08-
	m_pri_bMustStopTreeConstruction = FALSE;
	AI_tdstMind *p_stMind = M_pstGetMindOfBrain(((tdstEngineObject *) m_p_stInternalActor -> pclActor -> GetStruct ()) -> h_Brain);
	unsigned char ucCurrentDepth;

// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
	m_pri_bMustStopTreeConstruction = (AIDebug_fn_bGetNextEntry (p_stMind,
																	 & m_pri_tdeSectionType,
																	 & m_pri_lID,
																	 & m_pri_stGetSetParam,
																	 & ucCurrentDepth,
																	 & m_pri_p_stNode) == 0);

#else
	m_pri_bMustStopTreeConstruction = TRUE;
#endif 
// CG PB DEBUGGER

	while (! m_pri_bMustStopTreeConstruction)
	{
		m_pri_fn_lAddChildNodesToOneNode (pclParentNode, 
										  p_stMind,
										  ucCurrentDepth, // the depth of the Loop is 1
										  m_p_stInternalActor);

// CG PB DEBUGGER 23/06/98 {
#ifdef ACTIVE_AIDEBUG
		if (m_pri_tdeSectionType == AIDebug_E_SecTyp_EngineLoop)
			m_pri_bMustStopTreeConstruction = TRUE;
#endif 
// CG PB DEBUGGER
	}

	m_fn_vPostProcessEditorTree (pclParentNode);

	// synchro new data with tree control
	m_pri_fn_vFillOneLevelOfTree (pclParentNode, hTreeParentItem, TRUE);
}

IAD_EditorTreeNode *IAD_ResultView::m_fn_pclGetSelectedEditorNode (void)
{
	// first, which is the selected tree control node?
	HTREEITEM hItem = m_pri_pclTreeControl -> GetSelectedItem ();
	if (! hItem)
		return NULL;
	// now, get the coresponding editor node
	return (IAD_EditorTreeNode *) m_pri_pclTreeControl -> GetItemData (hItem);
}
// END ROMTEAM Cristi Petrescu 98-06-

//***************************************************************************
void IAD_ResultView::m_pri_fn_vFillTreeControl(struct IAD_stInternalActorDescription *_p_stInternalActor)
{
	ERROR_ASSERT( m_pri_pclTreeControl != NULL );
	
	if	(		( _p_stInternalActor != NULL )
			&&	( _p_stInternalActor->pclRoot != NULL )
			)
	{
		// BEGIN ROMTEAM Cristi Petrescu 98-06-
		m_fn_pclGetDocument()->m_pub_bIsDeletingTree = TRUE;
		m_pri_pclTreeControl->DeleteAllItems();
		m_fn_pclGetDocument()->m_pub_bIsDeletingTree = FALSE;
		// END ROMTEAM Cristi Petrescu 98-06-
		m_pri_ulCurrentNode = 0;
		m_pri_pclTreeControl -> m_pclSelectedBehaviourNode = NULL;

		m_pri_fn_vFillOneLevelOfTree(_p_stInternalActor->pclRoot, TVI_ROOT);

		// BEGIN ROMTEAM Cristi Petrescu 98-08-
		if (_p_stInternalActor->pclRoot->m_pub_fn_ptdGetListOfChildNodes()->GetCount())
		{
			// Find last loop
			IAD_EditorTreeNode * pclLastEngineLoopNode = _p_stInternalActor -> pclRoot -> m_pub_fn_ptdGetListOfChildNodes () -> GetTail ();
			if (pclLastEngineLoopNode)
			{
				HTREEITEM hTree = pclLastEngineLoopNode -> m_pub_fn_hGetTreeItem ();
				if (hTree)
				{
					// Selects it -> this will build the subtree
					m_pri_pclTreeControl -> SelectItem (hTree);
					// Open it one level
					m_pri_pclTreeControl -> Expand (hTree, TVE_EXPAND);
				}
			}
		}
		// END ROMTEAM Cristi Petrescu 98-08-
	}
}

//***************************************************************************
// BEGIN ROMTEAM Cristi Petrescu 98-06-
void IAD_ResultView::m_pri_fn_vFillOneLevelOfTree(IAD_EditorTreeNode *_pclParentNode, HTREEITEM _hTreeParentItem, BOOL bSkipChangeComport /* == FALSE*/)
// END ROMTEAM Cristi Petrescu 98-06-
{
	IAD_EditorTreeNode *_pclCurrentNode;
	HTREEITEM hTreeCurrentItem;
	unsigned char ucPercentage;
	CString csProgressionString;
	POSITION pos = _pclParentNode->m_pub_fn_ptdGetListOfChildNodes()->GetHeadPosition();
	while ( pos != NULL ) 
	{
		_pclCurrentNode = _pclParentNode->m_pub_fn_ptdGetListOfChildNodes()->GetNext(pos);

		//BEGIN ROMTEAM Cristi Petrescu 98-05-
		//Adds in Tree, if needed
		if (!((_pclCurrentNode -> m_pub_fn_csGetNodeType () == "R:" && m_bViewReflex == FALSE) ||
			  (_pclCurrentNode -> m_pub_fn_csGetNodeType () == "I:" && m_bViewAI == FALSE)) &&
			!(bSkipChangeComport && _pclCurrentNode -> m_pub_fn_csGetNodeType () == "Changed Behaviour"))
		{
		//END ROMTEAM Cristi Petrescu 98-05-
			hTreeCurrentItem = m_pri_pclTreeControl->InsertItem(_pclCurrentNode->m_pub_fn_csGetCompleteString(), _hTreeParentItem);
			m_pri_pclTreeControl->SetItemData(hTreeCurrentItem, DWORD(_pclCurrentNode));
			_pclCurrentNode->m_pub_fn_vSetTreeItem(hTreeCurrentItem);

			//Displays infos
			m_pri_ulCurrentNode ++;
			ucPercentage = (unsigned char)((m_pri_ulCurrentNode * 100) / m_pri_ulTotalNumberOfNodes );
			csProgressionString.Format("Filling Tree : node %ld on %ld", m_pri_ulCurrentNode, m_pri_ulTotalNumberOfNodes);
			m_pub_fn_vSetStatusText(csProgressionString, ucPercentage);

			//Calls recursively to build childs level
			m_pri_fn_vFillOneLevelOfTree(_pclCurrentNode, hTreeCurrentItem);
		//BEGIN ROMTEAM Cristi Petrescu 98-05-
		}
		//END ROMTEAM Cristi Petrescu 98-05-
	}
}

//***************************************************************************
long IAD_ResultView::m_pri_fn_lLookInChildsToExpand(HTREEITEM _hParentItem,
																										long _lCurrentLevel)
{
	long lCurrentLevel = _lCurrentLevel + 1;

	HTREEITEM hCurrentChildItem = m_pri_pclTreeControl->GetNextItem(_hParentItem, TVGN_CHILD);

	while ( hCurrentChildItem != NULL )
	{
		//Tries to expand childs of this root Item, at the right level
		m_pri_pclTreeControl->Expand(hCurrentChildItem, (lCurrentLevel < m_lLevelToExpand) ? TVE_EXPAND : TVE_COLLAPSE);
		m_pri_fn_lLookInChildsToExpand(hCurrentChildItem, lCurrentLevel);

		hCurrentChildItem = m_pri_pclTreeControl->GetNextItem(hCurrentChildItem, TVGN_NEXT);
	}

	return -1;
}

/////////////////////////////////////////////////////////////////////////////
// IAD_ResultView diagnostics
//***************************************************************************
//***************************************************************************
//***************************************************************************

#ifdef _DEBUG
void IAD_ResultView::AssertValid() const
{
	CFormView::AssertValid();
}

void IAD_ResultView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

// BEGIN ROMTEAM Cristi Petrescu 98-08-
/*
void IAD_ResultView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch (nChar)
	{
	case VK_F10:
		OnButtonNextLine ();
		break;

	default:
		break;
	}

	CFormView::OnKeyDown(nChar, nRepCnt, nFlags);
}
*/

/*
BOOL IAD_ResultView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	NMHDR * pNMHDR = (NMHDR *) lParam;
	TV_KEYDOWN * pTV_KEYDOWN;

	switch (pNMHDR -> code)
	{
	case TVN_KEYDOWN: // for tree
	case TCN_KEYDOWN: // for tabs
	//case HDN_KEYDOWN: // for header (?)
	//case TTN_KEYDOWN: // for tool tip
	case LVN_KEYDOWN: // for list
		pTV_KEYDOWN = (TV_KEYDOWN *) lParam;

		switch (pTV_KEYDOWN -> wVKey)
		{
		case VK_F10:
			OnButtonNextLine ();
			return TRUE;
		default:
			break;
		}
		break;
	default:
		break;
	}
	
	return CFormView::OnNotify(wParam, lParam, pResult);
}

void IAD_ResultView::OnAccNextLine() 
{
	OnButtonNextLine ();
}

*/
// END ROMTEAM Cristi Petrescu 98-08-

#endif //_DEBUG
