khanat-code-old/code/nel/tools/logic/logic_editor_dll/StatePage.cpp
2010-05-08 15:32:03 +02:00

452 lines
12 KiB
C++

// StatePage.cpp : implementation file
//
#include "stdafx.h"
#include "logic_editor.h"
#include "StatePage.h"
#include "ChildFrm.h"
#include "MainFrm.h"
#include "LogicTreeView.h"
#include "StatesView.h"
#include "EditorFormView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStatePage property page
IMPLEMENT_DYNCREATE(CStatePage, CPropertyPage)
CStatePage::CStatePage() : CPropertyPage(CStatePage::IDD)
{
//{{AFX_DATA_INIT(CStatePage)
m_nEventMessage = 0;
m_sConditionName = _T("");
m_sNextStateName = _T("");
m_sStateName = _T("");
m_sMessageID = _T("");
m_sArgument = _T("");
m_sDestination = _T("");
//}}AFX_DATA_INIT
}
CStatePage::~CStatePage()
{
}
void CStatePage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStatePage)
DDX_Radio(pDX, IDC_RADIO_STATE_EVENT_MSG, m_nEventMessage);
DDX_CBString(pDX, IDC_COMBO_STATE_COND_NAMES, m_sConditionName);
DDX_CBString(pDX, IDC_COMBO_STATE_CHANGE, m_sNextStateName);
DDX_Text(pDX, IDC_EDIT_STATE_NAME, m_sStateName);
DDX_CBString(pDX, IDC_COMBO_STATE_MSG_ID, m_sMessageID);
DDX_Text(pDX, IDC_EDIT_STATE_ARGUMENT, m_sArgument);
DDX_Text(pDX, IDC_EDIT_STATE_MSG_DEST, m_sDestination);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStatePage, CPropertyPage)
//{{AFX_MSG_MAP(CStatePage)
ON_BN_CLICKED(IDC_RADIO_STATE_CHANGE, OnRadioStateChange)
ON_BN_CLICKED(IDC_RADIO_STATE_EVENT_MSG, OnRadioStateEventMsg)
ON_BN_CLICKED(IDC_BUTTON_ADD_STATE, OnButtonAddState)
ON_BN_CLICKED(IDC_BUTTON_ADD_EVENT, OnButtonAddEvent)
ON_BN_CLICKED(IDC_BUTTON_STATE_REMOVE, OnButtonStateRemove)
ON_BN_CLICKED(IDC_BUTTON_STATE_APPLY, OnButtonStateApply)
ON_BN_CLICKED(IDC_BUTTON_EVENT_APPLY, OnButtonEventApply)
ON_BN_CLICKED(IDC_BUTTON_EVENT_REMOVE, OnButtonEventRemove)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CStatePage::Update()
{
if (m_pSelectedState != NULL)
{
m_sStateName = m_pSelectedState->m_sName;
if (m_pSelectedEvent != NULL)
{
this->m_sConditionName = m_pSelectedEvent->m_sConditionName;
if (m_pSelectedEvent->m_bActionIsMessage == TRUE)
{
OnRadioStateEventMsg();
this->m_nEventMessage = 0;
this->m_sArgument = m_pSelectedEvent->m_sArguments;
this->m_sDestination = m_pSelectedEvent->m_sMessageDestination;
this->m_sMessageID = m_pSelectedEvent->m_sMessageID;
this->m_sNextStateName.Empty();
}
else
{
OnRadioStateChange();
this->m_nEventMessage = 1;
this->m_sArgument.Empty();
this->m_sDestination.Empty();
this->m_sMessageID.Empty();
this->m_sNextStateName = m_pSelectedEvent->m_sStateChange;
}
}
else
{
m_sConditionName.Empty();
m_sArgument.Empty();
m_sDestination.Empty();
m_sMessageID.Empty();
m_sNextStateName.Empty();
}
}
else
{
m_sStateName.Empty();
}
// get the document
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 conditions
CComboBox *comboBox = static_cast<CComboBox *> (GetDlgItem(IDC_COMBO_STATE_COND_NAMES) );
comboBox->ResetContent();
POSITION pos = pDoc->m_conditions.GetStartPosition();
void *pointer;
CString name;
while (pos != NULL)
{
pDoc->m_conditions.GetNextAssoc( pos, name, pointer);
comboBox->AddString( name );
}
// list of states
comboBox = static_cast<CComboBox *> (GetDlgItem(IDC_COMBO_STATE_CHANGE) );
comboBox->ResetContent();
pos = pDoc->m_states.GetStartPosition();
while (pos != NULL)
{
pDoc->m_states.GetNextAssoc( pos, name, pointer);
comboBox->AddString( name );
}
//
UpdateData(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// CStatePage message handlers
BOOL CStatePage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_pSelectedState = NULL;
m_pSelectedEvent = NULL;
// select the State Change radio button
if ( m_nEventMessage == 0)
OnRadioStateEventMsg();
else if ( m_nEventMessage == 1)
OnRadioStateChange();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CStatePage::OnRadioStateChange()
{
GetDlgItem(IDC_STATIC_STATE_CHANGE)->EnableWindow();
GetDlgItem(IDC_COMBO_STATE_CHANGE)->EnableWindow();
GetDlgItem(IDC_STATIC_STATE_MSG1)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_STATE_MSG2)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_STATE_MSG3)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_STATE_MSG_ID)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_STATE_ARGUMENT)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_STATE_MSG_DEST)->EnableWindow(FALSE);
}
void CStatePage::OnRadioStateEventMsg()
{
GetDlgItem(IDC_STATIC_STATE_CHANGE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_STATE_CHANGE)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_STATE_MSG1)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_STATE_MSG2)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_STATE_MSG3)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_STATE_MSG_ID)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_STATE_ARGUMENT)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_STATE_MSG_DEST)->EnableWindow(TRUE);
}
//---------------------------------------------------------
// addState
//
//---------------------------------------------------------
void CStatePage::addState( CLogic_editorDoc *pDoc, CState * state)
{
// check whether this state is already in the combo box
CComboBox *comboBox = static_cast<CComboBox *> (GetDlgItem(IDC_COMBO_STATE_CHANGE) );
if( comboBox->FindStringExact(0, state->m_sName) == LB_ERR )
{
// add the state in the combo box
comboBox->AddString( state->m_sName );
}
// check whether this state already exists
void *pState;
if( pDoc->m_states.Lookup(state->m_sName, pState) == FALSE )
{
// add the new state to the states tree, and to the vector of states in the document
pDoc->m_states.SetAt( state->m_sName, state );
}
// update views
pDoc->UpdateAllViews( (CView*)this->GetParent() );
UpdateData(FALSE);
} // addState //
//---------------------------------------------------------
// OnButtonAddState
//
//---------------------------------------------------------
void CStatePage::OnButtonAddState()
{
UpdateData();
if (m_sStateName.IsEmpty())
{
AfxMessageBox("State name cannot be empty, please enter a valid name");
return;
}
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
// Get the active MDI child window.
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
/// \toto Malkav : check if a state with this name does not already exist in the document
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
// create the new state
CState *state = new CState(m_sStateName);
// add the state
addState( pDoc, state );
} // OnButtonAddState //
void CStatePage::OnButtonAddEvent()
{
UpdateData();
// do nothing is no state is selected
if (m_pSelectedState == NULL)
return;
CEvent *pEvent = new CEvent();
pEvent->m_sConditionName = this->m_sConditionName;
if (this->m_nEventMessage == 0)
{
pEvent->m_bActionIsMessage = TRUE;
pEvent->m_sStateChange.Empty();
pEvent->m_sArguments = this->m_sArgument;
pEvent->m_sMessageDestination = this->m_sDestination;
pEvent->m_sMessageID = this->m_sMessageID;
}
else // state change
{
pEvent->m_bActionIsMessage = FALSE;
pEvent->m_sStateChange = this->m_sNextStateName;
pEvent->m_sArguments.Empty();
pEvent->m_sMessageDestination.Empty();
pEvent->m_sMessageID.Empty();
}
// add the event to the selected state
m_pSelectedState->addEvent( pEvent );
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() );
}
//---------------------------------------------------------
// OnSetActive
//
//---------------------------------------------------------
BOOL CStatePage::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->InitStatePage )
{
// init the states
POSITION pos;
CString eltName;
for( pos = pDoc->m_states.GetStartPosition(); pos != NULL; )
{
CState * pState = new CState();
pDoc->m_states.GetNextAssoc( pos, eltName, (void*&)pState );
addState( pDoc, pState );
}
}
pDoc->InitStatePage = FALSE;
*/
Update();
return CPropertyPage::OnSetActive();
} // OnSetActive //
void CStatePage::OnButtonStateRemove()
{
// get selected state
if (m_pSelectedState != NULL)
{
if (AfxMessageBox("Your are about to permanently delete this state.\nDoing so will invalidate all references to this state.\nDo you want to continue anyway ?" ,MB_OKCANCEL|MB_DEFBUTTON2) == IDOK)
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->deleteState( m_pSelectedState->m_sName );
m_pSelectedState = NULL;
m_pSelectedEvent = NULL;
Update();
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
}
else
{
AfxMessageBox( "No state selected ! Choose a state first" );
}
}
void CStatePage::OnButtonStateApply()
{
UpdateData();
if (m_pSelectedState != NULL)
{
if (m_sStateName.IsEmpty())
{
AfxMessageBox("State name cannot be empty, please enter a valid name");
return;
}
if (AfxMessageBox("Your are about to change this state name.\nDoing so will change all occurence of the old name to the new one.\nDo you want to continue anyway ?" ,MB_OKCANCEL|MB_DEFBUTTON2) == IDOK)
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
pDoc->changeStateName( m_pSelectedState->m_sName, m_sStateName );
Update();
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
}
else
{
AfxMessageBox( "No state selected ! Choose a state first" );
}
}
void CStatePage::OnButtonEventApply()
{
// TODO: Add your control notification handler code here
AfxMessageBox( "Features not implemented" );
}
void CStatePage::OnButtonEventRemove()
{
// get selected state
if (m_pSelectedEvent != NULL && m_pSelectedState != NULL)
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CChildFrame *pChild = (CChildFrame *) pFrame->GetActiveFrame();
CLogic_editorDoc *pDoc = static_cast<CLogic_editorDoc *> (pChild->GetActiveDocument());
ASSERT_VALID(pDoc);
m_pSelectedState->removeEvent( m_pSelectedEvent );
m_pSelectedEvent = NULL;
// Update();
pDoc->UpdateAllViews( (CView*)this->GetParent() );
}
else
{
AfxMessageBox( "No event selected ! Choose a event first" );
}
}