khanat-opennel-code/code/nel/tools/logic/logic_editor_dll/ConditionPage.cpp
2011-04-27 19:42:44 +03:00

558 lines
15 KiB
C++

// ConditionPage.cpp : implementation file
//
#include "stdafx.h"
#include "logic_editor.h"
#include "ConditionPage.h"
#include "Condition.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "logic_editorDoc.h"
#include "EditorFormView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CConditionPage property page
IMPLEMENT_DYNCREATE(CConditionPage, CPropertyPage)
CConditionPage::CConditionPage() : CPropertyPage(CConditionPage::IDD)
{
//{{AFX_DATA_INIT(CConditionPage)
m_sType = _T("Comparison");
m_sOperator = _T("<");
m_sVarName = _T("");
m_sSubCondName = _T("");
m_sConditionName = _T("");
m_dComparand = 0.0;
//}}AFX_DATA_INIT
}
CConditionPage::~CConditionPage()
{
}
void CConditionPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CConditionPage)
DDX_Control(pDX, IDC_EDIT_NODE_COMPARAND, m_ctrlComparand);
DDX_CBString(pDX, IDC_COMBO_NODE_TYPE, m_sType);
DDX_CBString(pDX, IDC_COMBO_NODE_OPERATOR, m_sOperator);
DDX_CBString(pDX, IDC_COMBO_NODE_VAR_NAME, m_sVarName);
DDX_CBString(pDX, IDC_COMBO_NODE_COND_NAME, m_sSubCondName);
DDX_Text(pDX, IDC_EDIT_CONDITION_NAME, m_sConditionName);
DDX_Text(pDX, IDC_EDIT_NODE_COMPARAND, m_dComparand);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CConditionPage, CPropertyPage)
//{{AFX_MSG_MAP(CConditionPage)
ON_CBN_SELCHANGE(IDC_COMBO_NODE_TYPE, OnSelchangeComboNodeType)
ON_BN_CLICKED(IDC_BUTTON_ADD_CONDITION, OnButtonAddCondition)
ON_BN_CLICKED(IDC_BUTTON_ADD_NODE, OnButtonAddNode)
ON_BN_CLICKED(IDC_BUTTON_COND_APPLY, OnButtonCondApply)
ON_BN_CLICKED(IDC_BUTTON_DELETE_CONDITION, OnButtonDeleteCondition)
ON_BN_CLICKED(IDC_BUTTON_NODE_APPLY, OnButtonNodeApply)
ON_BN_CLICKED(IDC_BUTTON_DELETE_NODE, OnButtonDeleteNode)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CConditionPage::Update()
{
// get the variables existing in the doc
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
// list of variables
CComboBox *comboBox = static_cast<CComboBox *> (GetDlgItem(IDC_COMBO_NODE_VAR_NAME) );
comboBox->ResetContent();
POSITION pos = pDoc->m_variables.GetHeadPosition();
while (pos != NULL)
{
comboBox->AddString( pDoc->m_variables.GetNext(pos) );
}
// counters are variables too
pos = pDoc->m_counters.GetStartPosition();
void *pointer;
CString name;
while (pos != NULL)
{
pDoc->m_counters.GetNextAssoc( pos, name, pointer);
comboBox->AddString( name );
}
// list of conditions
comboBox = static_cast<CComboBox *> (GetDlgItem(IDC_COMBO_NODE_COND_NAME) );
comboBox->ResetContent();
pos = pDoc->m_conditions.GetStartPosition();
while (pos != NULL)
{
pDoc->m_conditions.GetNextAssoc( pos, name, pointer);
comboBox->AddString( name );
}
/////
if ( m_pSelectedCondition != NULL)
{
m_sConditionName = m_pSelectedCondition->m_sName;
const CString tempStr = m_sType;
if ( m_pSelectedConditionNode != NULL)
{
switch( m_pSelectedConditionNode->m_type )
{
case CConditionNode::NOT:
m_sType = "NOT";
break;
case CConditionNode::TERMINATOR:
m_sType = "Terminator";
break;
case CConditionNode::SUB_CONDITION:
m_sType = "Sub-condition";
break;
case CConditionNode::COMPARISON:
m_sType = "Comparison";
break;
}
m_dComparand = m_pSelectedConditionNode->m_dComparand;
m_sSubCondName = m_pSelectedConditionNode->m_sConditionName;
m_sOperator = m_pSelectedConditionNode->m_sOperator;
m_sVarName = m_pSelectedConditionNode->m_sVariableName;
}
UpdateData(FALSE);
if (tempStr != m_sType)
OnSelchangeComboNodeType();
}
}
BOOL CConditionPage::checkNodeValidity()
{
UpdateData();
if ( m_sType == "NOT" )
{
// always valid
return TRUE;
}
else if ( m_sType == "Terminator" )
{
// always valid
return TRUE;
}
else if ( m_sType == "Sub-condition" )
{
if ( m_sConditionName.IsEmpty() )
return FALSE;
}
else if ( m_sType == "Comparison" )
{
if ( m_sOperator.IsEmpty() || m_sVarName.IsEmpty() )
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CConditionPage message handlers
BOOL CConditionPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_pSelectedCondition = NULL;
m_pSelectedConditionNode = NULL;
//disable all optionnal controls
/*
GetDlgItem(IDC_COMBO_NODE_VAR_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_NODE_OPERATOR)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NODE_COMPARAND)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COMPARISON)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COMPARAND)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_OPERATOR)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_VAR_NAME)->EnableWindow(FALSE);
*/
GetDlgItem(IDC_COMBO_NODE_COND_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COND_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_SUB_COND)->EnableWindow(FALSE);
Update();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CConditionPage::OnSelchangeComboNodeType()
{
UpdateData();
//disable all optionnal controls
GetDlgItem(IDC_COMBO_NODE_VAR_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_NODE_OPERATOR)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NODE_COMPARAND)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COMPARISON)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COMPARAND)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_OPERATOR)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_VAR_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_NODE_COND_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_COND_NAME)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_SUB_COND)->EnableWindow(FALSE);
if ( m_sType == _T("Comparison") )
{
//enable comparison related controls
GetDlgItem(IDC_COMBO_NODE_VAR_NAME)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_NODE_OPERATOR)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_NODE_COMPARAND)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_COMPARISON)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_COMPARAND)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_OPERATOR)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_VAR_NAME)->EnableWindow(TRUE);
}
else if ( m_sType == _T("Sub-condition") )
{
GetDlgItem(IDC_COMBO_NODE_COND_NAME)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_COND_NAME)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_SUB_COND)->EnableWindow(TRUE);
}
/* else if ( m_sType == _T("NOT") )
{
}
else // terminator
{
}
*/
// UpdateData(FALSE);
}
//--------------------------------------------------------
// addCondition
//
//--------------------------------------------------------
void CConditionPage::addCondition( CLogic_editorDoc *pDoc, CCondition * condition )
{
// check if a condition with the same name already exist
CCondition *pCondition;
if (pDoc->m_conditions.Lookup( condition->m_sName, (void*&)pCondition))
{
AfxMessageBox("A condition with this name already exist...");
return;
}
// add the condition
pDoc->m_conditions.SetAt( condition->m_sName, condition );
// update Views
pDoc->UpdateAllViews( (CView*)this->GetParent() );
} // addCondition //
//--------------------------------------------------------
// OnButtonAddCondition
//
//--------------------------------------------------------
void CConditionPage::OnButtonAddCondition()
{
UpdateData();
if (m_sConditionName.IsEmpty())
{
AfxMessageBox("Condition Name cannot be empty, please choose a name");
return;
}
// if a counter with this name already exist, do nothing
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
// Get the active MDI child window.
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
// get the document
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
// create condition
CCondition * pCondition = new CCondition();
pCondition->m_sName = m_sConditionName;
// add the condition
addCondition( pDoc, pCondition );
} // OnButtonAddCondition //
void CConditionPage::OnButtonAddNode()
{
// check that data are valid
if ( checkNodeValidity() == FALSE)
{
AfxMessageBox("Invalid node datas - cannot add node");
return;
}
//
if (m_pSelectedCondition == NULL)
return;
CConditionNode *newNode = new CConditionNode( m_pSelectedConditionNode );
if (this->m_sType == "NOT")
{
newNode->m_type = CConditionNode::NOT;
}
else if (this->m_sType == "Terminator")
{
newNode->m_type = CConditionNode::TERMINATOR;
}
else if (this->m_sType == "Sub-condition")
{
newNode->m_type = CConditionNode::SUB_CONDITION;
newNode->m_sConditionName = this->m_sSubCondName;
}
else if (this->m_sType == "Comparison")
{
newNode->m_type = CConditionNode::COMPARISON;
newNode->m_dComparand = this->m_dComparand;
newNode->m_sOperator = this->m_sOperator;
newNode->m_sVariableName =this->m_sVarName;
}
if (m_pSelectedConditionNode != NULL)
{
m_pSelectedConditionNode->m_ctSubTree.AddTail( newNode );
}
else
{
m_pSelectedCondition->m_ctConditionTree.AddTail( newNode );
}
//
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
// update views
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
//---------------------------------------------------------
// OnSetActive
//
//---------------------------------------------------------
BOOL CConditionPage::OnSetActive()
{
// get the child frame
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
// get the form view
CEditorFormView *pFormView = static_cast<CEditorFormView *> ( pChild->m_wndSplitter.GetPane(0,1) );
ASSERT_VALID(pFormView);
// get the document
CLogic_editorDoc * pDoc = (CLogic_editorDoc*)pFormView->GetDocument();
/*
if( pDoc->InitConditionPage )
{
// init the conditions
POSITION pos;
CString eltName;
for( pos = pDoc->m_conditions.GetStartPosition(); pos != NULL; )
{
CCondition * pCondition = new CCondition();
pDoc->m_conditions.GetNextAssoc( pos, eltName, (void*&)pCondition );
addCondition( pDoc, pCondition );
}
}
pDoc->InitConditionPage = FALSE;
*/
Update();
return CPropertyPage::OnSetActive();
} // OnSetActive //
void CConditionPage::OnButtonCondApply()
{
if (m_pSelectedCondition != NULL)
{
UpdateData();
if (m_sConditionName.IsEmpty())
{
AfxMessageBox("Condition Name cannot be empty, please choose a name");
return;
}
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->changeConditionName( m_pSelectedCondition->m_sName, m_sConditionName );
Update();
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
else
{
AfxMessageBox( "No condition selected ! Choose a condition first" );
}
}
void CConditionPage::OnButtonDeleteCondition()
{
if (m_pSelectedCondition != NULL)
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->deleteCondition(m_pSelectedCondition->m_sName );
m_pSelectedCondition = NULL;
m_pSelectedConditionNode = NULL;
Update();
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
else
{
AfxMessageBox( "No condition selected ! Choose a condition first" );
}
}
void CConditionPage::OnButtonNodeApply()
{
if (this->m_pSelectedConditionNode != NULL)
{
// check that data are valid
if ( checkNodeValidity() == FALSE)
{
AfxMessageBox("Invalid node datas - cancel node modification");
return;
}
m_pSelectedConditionNode->m_sConditionName.Empty();
m_pSelectedConditionNode->m_sOperator.Empty();
m_pSelectedConditionNode->m_sVariableName.Empty();
m_pSelectedConditionNode->m_dComparand = 0;
if (this->m_sType == "NOT")
{
m_pSelectedConditionNode->m_type = CConditionNode::NOT;
}
if (this->m_sType == "Terminator")
{
m_pSelectedConditionNode->m_type = CConditionNode::TERMINATOR;
}
if (this->m_sType == "Sub-condition")
{
m_pSelectedConditionNode->m_type = CConditionNode::SUB_CONDITION;
m_pSelectedConditionNode->m_sConditionName = this->m_sSubCondName;
}
if (this->m_sType == "Comparison")
{
m_pSelectedConditionNode->m_type = CConditionNode::COMPARISON;
m_pSelectedConditionNode->m_dComparand = this->m_dComparand;
m_pSelectedConditionNode->m_sOperator = this->m_sOperator;
m_pSelectedConditionNode->m_sVariableName =this->m_sVarName;
}
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
else
{
AfxMessageBox( "No condition node selected ! Choose a node first" );
}
}
void CConditionPage::OnButtonDeleteNode()
{
if ( m_pSelectedConditionNode != NULL)
{
CConditionNode *parentNode = m_pSelectedConditionNode->getParentNode();
if ( parentNode != NULL)
{
POSITION pos = parentNode->m_ctSubTree.Find( m_pSelectedConditionNode );
parentNode->m_ctSubTree.RemoveAt( pos );
}
else
{
ASSERT( m_pSelectedCondition );
POSITION pos = m_pSelectedCondition->m_ctConditionTree.Find( m_pSelectedConditionNode );
m_pSelectedCondition->m_ctConditionTree.RemoveAt( pos );
}
delete m_pSelectedConditionNode;
m_pSelectedConditionNode = NULL;
Update();
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
else
{
AfxMessageBox( "No condition node selected ! Choose a node first" );
}
}