/*============================================================================= * * Filename: DlgActCt.cpp : implementation file * Version: 1.0 * Date: 02/01/97 * Author: V.L. * * Description: implementation of a FormView Dialog class for action contents * *===========================================================================*/ #include "stdafx.h" #include "acp_base.h" #include "ITF.h" #include "TAC.h" #include "TAn.h" #include "DlgActCt.hpp" #include "ACInterf.hpp" #include "DlgNwSt.hpp" #include "DlgInput.hpp" #include "STModif.hpp" #include "ACModif.hpp" #include "..\Main\Inc\_EditID.h" #include "TUT.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /*============================================================================= MACROS =============================================================================*/ #define M_GetListFromID(nIDList) ((CListBox *)GetDlgItem( nIDList )) #define M_GetCurSel(nIDList) (M_GetListFromID(nIDList)->GetCurSel()) #define M_GetItemData(nIDList,iItem) (M_GetListFromID(nIDList)->GetItemData(iItem)) #define M_GetCurrentFamily() (m_p_oParentDLL -> mfn_p_oGetCurrentFamily()) #define M_GetCurrentAction() (m_p_oParentDLL -> mfn_p_oGetCurrentAction()) #define M_GetCurrentState() (m_p_oParentDLL -> mfn_p_oGetCurrentState()) #define M_Enable( bEnable) ( (bEnable) ? MF_ENABLED : MF_GRAYED ) #define M_IsDefaultState(p_oAction,p_oState) ( (p_oAction) && ( (p_oAction)->mfn_p_oGetDefaultState () == (p_oState) ) ) #define M_GetClientRect( pWnd, poRect ) (pWnd) -> GetWindowRect( poRect );ScreenToClient( poRect ) #define M_GetClientRectId( Id, poRect ) M_GetClientRect( GetDlgItem( Id ), poRect ) #define M_SetClientRect( pWnd, poRect ) (pWnd) -> MoveWindow( poRect ) #define M_SetClientRectId( Id, poRect ) M_SetClientRect( GetDlgItem( Id ), poRect ) #define M_MakeDo( p_oModif ) m_p_oParentDLL -> M_GetEditManager() -> AskFor ( p_oModif ) /*============================================================================= CONSTANTS =============================================================================*/ // Popup Menu ID #define C_uiPMDefault 2000 #define C_uiPMRename (C_uiPMDefault + 1) #define C_uiPMCopy (C_uiPMDefault + 2) #define C_uiPMDel (C_uiPMDefault + 3) #define C_uiPMDelAll (C_uiPMDefault + 4) #define C_uiPMNext (C_uiPMDefault + 5) #define C_uiPMCreateNormal (C_uiPMDefault + 6) #define C_uiPMCreateTransitional (C_uiPMDefault + 7) #define C_uiPMList (C_uiPMDefault + 10) #define C_iBorderSize 2 // /*============================================================================= * CDlgActionContents class =============================================================================*/ IMPLEMENT_DYNCREATE(CDlgActionContents, CFormView) /*----------------------------------------------------------------------------- * Description : constructor *---------------------------------------------------------------------------*/ CDlgActionContents::CDlgActionContents() : CFormView(CDlgActionContents::IDD) { // CPA_Ed_1 Mihaela Tancu begin m_bStateDrag = 0; m_iIndexListBox = LB_ERR; // CPA_Ed_1 Mihaela Tancu end m_bFirstShow = TRUE; m_p_oStateUnderCursor = NULL; m_p_oParentDLL = NULL; //{{AFX_DATA_INIT(CDlgActionContents) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // create bold font PLOGFONT plfBold = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plfBold->lfFaceName, "MS Sans Serif"); plfBold->lfWeight = FW_BOLD ; plfBold->lfHeight = 8; plfBold->lfEscapement = 0; m_oBoldFont.CreateFontIndirect(plfBold); // create italic font PLOGFONT plfItalic = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plfItalic->lfFaceName, "MS Sans Serif"); plfItalic->lfItalic = TRUE; plfItalic->lfWeight = FW_NORMAL ; plfItalic->lfHeight = 8; plfItalic->lfEscapement = 0; m_oItalicFont.CreateFontIndirect(plfItalic); } /*----------------------------------------------------------------------------- * Description : destructor *---------------------------------------------------------------------------*/ CDlgActionContents::~CDlgActionContents() { // delete bold font m_oBoldFont.DeleteObject(); m_oItalicFont.DeleteObject(); } /*----------------------------------------------------------------------------- * Description : data exchange *---------------------------------------------------------------------------*/ void CDlgActionContents::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgActionContents) //}}AFX_DATA_MAP } /*----------------------------------------------------------------------------- * Description : create & register controls for TUT module *---------------------------------------------------------------------------*/ BOOL CDlgActionContents::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { BOOL bResult = CFormView::Create( lpszClassName, lpszWindowName, dwRequestedStyle, rect, pParentWnd, nID, pContext ); // register controls TUT_M_vGetTutDll(); TUT_M_vRegisterControlID( IDC_LIST_STATES, "TAC_STM_STATESLIST_LIST", TUT_e_ListBox ); TUT_M_vRegisterControlID( IDC_BT_NEWSTATE, "TAC_STM_STATESLIST_BTNEW", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BT_DEFAULTSTATE, "TAC_STM_STATESLIST_BTDEFAULT", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BT_DELSTATE, "TAC_STM_STATESLIST_BTDELETE", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BT_DELALLSTATES, "TAC_STM_STATESLIST_BTDELALL", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BT_COPYSTATE, "TAC_STM_STATESLIST_BTCOPY", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BT_RENSTATE, "TAC_STM_STATESLIST_BTRENAME", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BUTTON_UP, "TAC_STM_STATESLIST_BTUP", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_BUTTON_DOWN, "TAC_STM_STATESLIST_BTDOWN", TUT_e_Button ); // return bResult; } /*----------------------------------------------------------------------------- * Description : message map *---------------------------------------------------------------------------*/ BEGIN_MESSAGE_MAP(CDlgActionContents, CFormView) //{{AFX_MSG_MAP(CDlgActionContents) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BT_DELSTATE, OnBtDelstate) ON_LBN_SELCHANGE(IDC_LIST_STATES, OnSelchangeListStates) ON_BN_CLICKED(IDC_BT_NEWSTATE, OnBtNewstate) ON_BN_CLICKED(IDC_BT_COPYSTATE, OnBtCopystate) ON_BN_CLICKED(IDC_BT_DEFAULTSTATE, OnBtDefaultstate) ON_BN_CLICKED(IDC_BT_DELALLSTATES, OnBtDelallstates) ON_BN_CLICKED(IDC_BT_RENSTATE, OnBtRenstate) // CPA_Ed_1 Mihaela Tancu begin ON_BN_CLICKED(IDC_BUTTON_UP, OnBtUp) ON_BN_CLICKED(IDC_BUTTON_DOWN, OnBtDown) // CPA_Ed_1 Mihaela Tancu end ON_WM_DRAWITEM() ON_WM_SIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP() /****************************************************************************** * CDlgActionContents diagnostics ******************************************************************************/ #ifdef _DEBUG void CDlgActionContents::AssertValid() const { CFormView::AssertValid(); } void CDlgActionContents::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG /****************************************************************************** * CDlgActionContents message handlers ******************************************************************************/ /*----------------------------------------------------------------------------- * Description : unregister control from TUT *---------------------------------------------------------------------------*/ void CDlgActionContents::OnDestroy() { TUT_M_vGetTutDll(); TUT_M_vUnregisterControlID( IDC_LIST_STATES ); TUT_M_vUnregisterControlID( IDC_BT_NEWSTATE ); TUT_M_vUnregisterControlID( IDC_BT_DEFAULTSTATE ); TUT_M_vUnregisterControlID( IDC_BT_DELSTATE ); TUT_M_vUnregisterControlID( IDC_BT_DELALLSTATES ); TUT_M_vUnregisterControlID( IDC_BT_COPYSTATE ); TUT_M_vUnregisterControlID( IDC_BT_RENSTATE ); TUT_M_vUnregisterControlID( IDC_BUTTON_UP ); TUT_M_vUnregisterControlID( IDC_BUTTON_DOWN ); CFormView::OnDestroy(); } /*----------------------------------------------------------------------------- * Description : intercept the Rbutton Click on listbox *---------------------------------------------------------------------------*/ BOOL CDlgActionContents::PreTranslateMessage(MSG* pMsg) { if( (M_GetCurSel(IDC_LIST_STATES) != LB_ERR) && (pMsg->hwnd == GetDlgItem(IDC_LIST_STATES)->m_hWnd) ) { if(pMsg->message == WM_RBUTTONDOWN) { // create and display the context popmenu OnRButtonDownStatesList(pMsg); } else if(pMsg->message == WM_KEYDOWN) { OnKeyDownStatesList(pMsg); } // CPA_Ed_1 Mihaela Tancu begin else if(pMsg->message == WM_LBUTTONDOWN) { OnLButtonDownStatesList(pMsg); } else if(pMsg->message == WM_LBUTTONUP) { OnLButtonUpStatesList(pMsg); } else if(pMsg->message == WM_MOUSEMOVE) { OnMouseMoveStatesList(pMsg); } // CPA_Ed_1 Mihaela Tancu end } return CFormView::PreTranslateMessage(pMsg); } /*----------------------------------------------------------------------------- * Description : intercept the popup menu entry *---------------------------------------------------------------------------*/ BOOL CDlgActionContents::OnCommand(WPARAM wParam, LPARAM lParam) { switch(LOWORD(wParam)) { case C_uiPMDefault: OnBtDefaultstate(); break; case C_uiPMRename: OnBtRenstate(); break; case C_uiPMCopy: OnBtCopystate(); break; case C_uiPMDel: OnBtDelstate(); break; case C_uiPMDelAll: OnBtDelallstates(); break; case C_uiPMNext: fn_vSetAsNextState(m_p_oStateUnderCursor); break; case C_uiPMCreateNormal: OnBtCreateState( TRUE ); break; case C_uiPMCreateTransitional: OnBtCreateState( FALSE ); break; default : return CFormView::OnCommand(wParam, lParam); } return TRUE; } /*----------------------------------------------------------------------------- * Description : handle function for message WM_DRAWITEM *---------------------------------------------------------------------------*/ void CDlgActionContents::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) { if ( (lpDIS->itemID != LB_ERR) && (nIDCtl == IDC_LIST_STATES) && (M_GetListFromID(IDC_LIST_STATES)->IsWindowEnabled() ) ) { char szText[100]; CListBox *pLB = M_GetListFromID(IDC_LIST_STATES); CBrush oBrush; COLORREF xTextColor; BOOL bSelected = (lpDIS->itemState & ODS_SELECTED ); CFont *xFntPrev; CDC *pDC = CDC::FromHandle(lpDIS->hDC); CString oCst; BOOL bFontChanged = FALSE; oBrush.CreateSolidBrush( GetSysColor( bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW) ); xTextColor = GetSysColor( bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT); pDC->FillRect( &lpDIS->rcItem, &oBrush ); pLB->GetText( lpDIS->itemID, szText ); // CPA_Ed_1 Mihaela Tancu begin CPA_State* p_oState=(CPA_State*)M_GetItemData(IDC_LIST_STATES,lpDIS->itemID); // CPA_Ed_1 Mihaela Tancu end // change font if ( p_oState == M_GetCurrentAction()->mfn_p_oGetDefaultState() ) { xFntPrev = pDC->SelectObject( &m_oBoldFont ); bFontChanged = TRUE; oCst . Format ( "%s" , szText ); } else if ( p_oState->mfn_bGetTransitional() ) { //xFntPrev = pDC->SelectObject(&m_oItalicFont); //bFontChanged = TRUE; xTextColor = bSelected ? GetSysColor( COLOR_HIGHLIGHTTEXT ) : RGB(255,0,0); // CPA_Ed_1 Mihaela Tancu begin p_oState->mfn_vObtainSpaceNumbers(); // get the number //of spaces to put before a transitional state, 0 if it points to the default state int iNb = p_oState->mfn_iGetSpaceNumbers(); CString szSpaces = CString(' ', iNb); p_oState->mfn_vSetSpaceNumbers(0); //reset the number of spaces // CPA_Ed_1 Mihaela Tancu end oCst . Format ( "[ %s ]" , szText ); // CPA_Ed_1 Mihaela Tancu begin oCst = szSpaces+oCst; // CPA_Ed_1 Mihaela Tancu end } else oCst . Format ( "%s" , szText ); pDC->SetBkMode( TRANSPARENT); pDC->SetTextColor( xTextColor ); lpDIS->rcItem.left += 2; pDC->DrawText( oCst, &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER ); // restore font if ( bFontChanged ) pDC->SelectObject( xFntPrev ); oBrush.DeleteObject(); } else CFormView::OnDrawItem(nIDCtl, lpDIS); } /*----------------------------------------------------------------------------- * Description : handle function for message WM_SIZE *---------------------------------------------------------------------------*/ void CDlgActionContents::OnSize(UINT nType, int cx, int cy) { if(GetDlgItem(IDC_LIST_STATES)) { CRect oRectDlg, oRectList, oRectBTDefault, oRectBTNew, oRectBTCopy, oRectBTDel, oRectBTRen, oRectBTDelAll ; int iSize; CRect oRectUp, oRectDown; // get pos M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_BT_DEFAULTSTATE, &oRectBTDefault ); M_GetClientRectId( IDC_BT_NEWSTATE, &oRectBTNew ); M_GetClientRectId( IDC_BT_COPYSTATE, &oRectBTCopy ); M_GetClientRectId( IDC_BT_DELSTATE, &oRectBTDel ); M_GetClientRectId( IDC_BT_RENSTATE, &oRectBTRen ); M_GetClientRectId( IDC_BT_DELALLSTATES, &oRectBTDelAll ); M_GetClientRectId( IDC_LIST_STATES, &oRectList ); // CPA_Ed_1 Mihaela Tancu begin M_GetClientRectId( IDC_BUTTON_UP, &oRectUp ); M_GetClientRectId( IDC_BUTTON_DOWN, &oRectDown ); // CPA_Ed_1 Mihaela Tancu end // Left Align oRectBTNew . left = oRectBTDefault . left = oRectList . left = oRectDlg . left + C_iBorderSize; // Right Align // oRectBTDel . right = oRectBTDelAll . right = oRectList . right = oRectDlg . right - C_iBorderSize; // CPA_Ed_1 Mihaela Tancu begin oRectUp . right = oRectDown . right = oRectList . right = oRectDlg . right - C_iBorderSize; // CPA_Ed_1 Mihaela Tancu end // Bottom Align oRectList . bottom = max( oRectList . top, oRectDlg . bottom - C_iBorderSize ); // BTs // CPA_Ed_1 Mihaela Tancu begin iSize = (oRectDlg . Width() - (C_iBorderSize<<2)) / 4; // CPA_Ed_1 Mihaela Tancu end oRectBTDefault . right = oRectBTNew . right = oRectBTNew . left + iSize; // CPA_Ed_1 Mihaela Tancu begin oRectUp . left = oRectDown . left = oRectUp . right - iSize ; oRectBTRen . left = oRectBTCopy . left = oRectBTNew . right + C_iBorderSize; oRectBTRen . right = oRectBTCopy . right = oRectBTCopy . left + iSize; oRectBTDelAll . left = oRectBTDel . left = oRectBTCopy . right + C_iBorderSize; oRectBTDelAll . right = oRectBTDel . right = oRectBTDel . left + iSize; // CPA_Ed_1 Mihaela Tancu end // set pos M_SetClientRectId( IDC_BT_DEFAULTSTATE, &oRectBTDefault ); M_SetClientRectId( IDC_BT_NEWSTATE, &oRectBTNew ); M_SetClientRectId( IDC_BT_COPYSTATE, &oRectBTCopy ); M_SetClientRectId( IDC_BT_DELSTATE, &oRectBTDel ); M_SetClientRectId( IDC_BT_RENSTATE, &oRectBTRen ); M_SetClientRectId( IDC_BT_DELALLSTATES, &oRectBTDelAll ); // CPA_Ed_1 Mihaela Tancu begin M_SetClientRectId( IDC_BUTTON_UP, &oRectUp ); M_SetClientRectId( IDC_BUTTON_DOWN, &oRectDown ); // CPA_Ed_1 Mihaela Tancu end M_SetClientRectId( IDC_LIST_STATES, &oRectList ); } } /*----------------------------------------------------------------------------- * Description : handle function for message LBN_SELCHANGE in State list *---------------------------------------------------------------------------*/ void CDlgActionContents::OnSelchangeListStates() { int iItem = M_GetCurSel(IDC_LIST_STATES); if (iItem != LB_ERR) { m_p_oParentDLL->mfn_vChangeState( ((CPA_State *) M_GetItemData(IDC_LIST_STATES,iItem)) ); } else { m_p_oParentDLL->mfn_vChangeState( NULL ); } } /*----------------------------------------------------------------------------- * Description : *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtNewstate() { /* CDlgNewState *pDlgNewState = new CDlgNewState(); RECT xRect; GetDlgItem(IDC_LIST_STATES)->GetWindowRect( &xRect ) ; CPoint oPoint( xRect.left , xRect.top ) ; // ask for type of state pDlgNewState -> SetPos ( &oPoint ); if( pDlgNewState -> DoModal() == IDOK ) { if( ! pDlgNewState -> csName . IsEmpty() ) { State_New *p_oStateNew = new State_New ( m_p_oParentDLL, M_GetCurrentAction() , NULL, (char*)(LPCTSTR)(pDlgNewState -> csName), pDlgNewState -> bNormal, NULL ) ; M_MakeDo( p_oStateNew ) ; } } delete pDlgNewState; */ CMenu oPopMenu; CRect oRect; GetDlgItem( IDC_BT_NEWSTATE ) -> GetWindowRect( oRect ); // create popup oPopMenu . CreatePopupMenu () ; // fill menu oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateNormal, "Normal States"); // CPA_Ed_1 Mihaela Tancu begin if (!M_GetCurrentAction()->m_oListOfStates.IsEmpty()) // CPA_Ed_1 Mihaela Tancu end oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateTransitional, "Transitional States"); // ALX TUT_M_vGetTutDll (); TUT_M_vRegisterMenu (this -> m_hWnd , oPopMenu . m_hMenu , oRect . left , oRect . bottom); // ALX oPopMenu . TrackPopupMenu ( TPM_LEFTALIGN|TPM_RIGHTBUTTON, oRect . left, oRect.bottom , this); oPopMenu . DestroyMenu (); } /*----------------------------------------------------------------------------- * Description : Create normal state *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtCreateState( BOOL _bNormal /*=TRUE*/) { HINSTANCE hOldInst = AfxGetResourceHandle(); AfxSetResourceHandle( m_p_oParentDLL -> GetDLLIdentity() -> hModule ); CDlgInputText *p_oDlgInput = new CDlgInputText(); CRect oRect; GetDlgItem(IDC_LIST_STATES)->GetWindowRect(&oRect); CPoint oPoint(oRect.left, oRect.top); p_oDlgInput->SetTitle( "Create normal state" ); p_oDlgInput->SetMessage("New State Name :"); p_oDlgInput->SetPos(&oPoint); p_oDlgInput->SetDefaultValue( C_szStateTypeName ); p_oDlgInput->SetSelect( TRUE ); if(p_oDlgInput->DoModal() == IDOK) { State_New *p_oStateNew = new State_New ( m_p_oParentDLL, M_GetCurrentAction() , NULL, p_oDlgInput -> GetInputText(), _bNormal, NULL ) ; M_MakeDo( p_oStateNew ) ; } delete p_oDlgInput; AfxSetResourceHandle( hOldInst ); } // CPA_Ed_1 Mihaela Tancu begin /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on UpButton * Author: Mihaela Tancu *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtUp() { CPA_Action * p_oAction = M_GetCurrentAction(); CPA_State *p_oPreviousState, *p_oPrevPrevState = NULL; CPA_List* p_oListOfStates = &p_oAction->m_oListOfStates; POSITION stPos = p_oListOfStates->Find(M_GetCurrentState()); if (stPos) // the state have to be in the list with states { p_oListOfStates->GetPrev(stPos); if (stPos) // before the current state is a state { //determine the previous state (used for move the state) and its previous (in the list) p_oPreviousState = p_oListOfStates->GetAt(stPos); p_oListOfStates->GetPrev(stPos); if (stPos) p_oPrevPrevState = p_oListOfStates->GetAt(stPos); } else p_oPreviousState = NULL; } //determine the parameters for moving up a transitional or normal state State_Move *p_oStateMove = new State_Move ( m_p_oParentDLL, M_GetCurrentAction(), p_oPreviousState, M_GetCurrentState(), p_oPrevPrevState, p_oPreviousState, NULL, NULL, NULL, FALSE, FALSE) ; M_MakeDo( p_oStateMove ) ; } /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on DownButton * Author: Mihaela Tancu *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtDown() { CPA_Action * p_oAction = M_GetCurrentAction(); CPA_State *p_oPreviousState; CPA_List* p_oListOfStates = &p_oAction->m_oListOfStates; POSITION stPos = p_oListOfStates->Find(M_GetCurrentState()); POSITION stPosNext = stPos; if (stPos) // the state have to be in the list with states { p_oListOfStates->GetPrev(stPos); if (stPos) // before the current state is a state p_oPreviousState = p_oListOfStates->GetAt(stPos); else p_oPreviousState = NULL; } CPA_State *p_oPreviousNextState, *p_oNextState=NULL; if (stPosNext) { p_oListOfStates->GetNext(stPosNext); if (stPosNext) // before the current state is a state { p_oPreviousNextState = p_oListOfStates->GetAt(stPosNext); p_oListOfStates->GetNext(stPosNext); if (stPosNext) // get the next of the next of the state in the list p_oNextState = p_oListOfStates->GetAt(stPosNext); } else p_oPreviousNextState = NULL; } //determine the parameters for moving down a transitional or normal state State_Move *p_oStateMove = new State_Move ( m_p_oParentDLL, M_GetCurrentAction(), p_oPreviousState, M_GetCurrentState(), p_oPreviousNextState, p_oNextState, NULL, NULL, NULL, FALSE, FALSE) ; M_MakeDo( p_oStateMove ) ; } // CPA_Ed_1 Mihaela Tancu end /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on Copystate button *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtCopystate() { State_Copy *p_oStateCopy = new State_Copy ( m_p_oParentDLL, M_GetCurrentAction(), M_GetCurrentState() ) ; M_MakeDo( p_oStateCopy ) ; } /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on Defaultstate button *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtDefaultstate() { CPA_Action * p_oAction = M_GetCurrentAction(); CPA_State * p_oState = M_GetCurrentState(); if( p_oAction && p_oState ) { State_Default *p_oDefault = new State_Default ( m_p_oParentDLL, M_GetCurrentAction(), M_GetCurrentState() ) ; M_MakeDo( p_oDefault ) ; } } /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on Delstate button *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtDelstate() { CPA_Action * p_oAction = M_GetCurrentAction(); CPA_State * p_oState = M_GetCurrentState(); if(p_oAction && p_oState) { char szText[100]; sprintf(szText,"Do you really want to delete state \"%s\" ?",p_oState -> GetName() ); if( MessageBox(szText,"WARNING", MB_ICONQUESTION+MB_YESNO) == IDYES ) { State_Delete *p_oStateDelete = new State_Delete ( m_p_oParentDLL, M_GetCurrentAction(), M_GetCurrentState() ) ; M_MakeDo( p_oStateDelete ) ; } } } /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on DelAllstates button *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtDelallstates() { CPA_Action * p_oAction = M_GetCurrentAction(); if( (M_GetCurrentAction()) && (MessageBox("Do you really want to delete all states ?", "WARNING", MB_ICONQUESTION+MB_YESNO) == IDYES ) ) { Action_DelAllStates *p_oDelAllStates = new Action_DelAllStates ( m_p_oParentDLL, M_GetCurrentFamily(), M_GetCurrentAction() ) ; M_MakeDo( p_oDelAllStates ) ; } } /*----------------------------------------------------------------------------- * Description : handle function for message BN_CLICKED on Renstate button *---------------------------------------------------------------------------*/ void CDlgActionContents::OnBtRenstate() { int iItem = M_GetCurSel(IDC_LIST_STATES); if (iItem != LB_ERR) { HINSTANCE hOldInst = AfxGetResourceHandle(); AfxSetResourceHandle( m_p_oParentDLL -> GetDLLIdentity() -> hModule ); CDlgInputText *p_oDlgInput = new CDlgInputText(); CRect oRect; char szTitle[200]; char *szStateName = ((CPA_State *) M_GetItemData(IDC_LIST_STATES,iItem))->fn_p_szGetName(); GetDlgItem(IDC_LIST_STATES)->GetWindowRect(&oRect); CPoint oPoint(oRect.left, oRect.top); sprintf(szTitle,"Rename state \"%s\"", szStateName ); p_oDlgInput->SetTitle(szTitle); p_oDlgInput->SetMessage("New Name :"); p_oDlgInput->SetPos(&oPoint); p_oDlgInput->SetDefaultValue( szStateName ); p_oDlgInput->SetSelect( TRUE ); if(p_oDlgInput->DoModal() == IDOK) { State_Rename *p_oStateRename = new State_Rename ( m_p_oParentDLL, M_GetCurrentAction() , M_GetCurrentState(), p_oDlgInput->GetInputText() ) ; M_MakeDo( p_oStateRename ) ; } delete p_oDlgInput; AfxSetResourceHandle( hOldInst ); } } // CPA_Ed_1 Mihaela Tancu begin // ---------------------------------------------------------------------------- // Description : OnLButtonDownStatesList(MSG *pMsg) // Handle function for message WM_LBUTTONDOWN on ListBox Action Contents // Author : Mihaela Tancu // ---------------------------------------------------------------------------- BOOL CDlgActionContents::OnLButtonDownStatesList(MSG *pMsg) { CListBox *pLB = M_GetListFromID(IDC_LIST_STATES); m_p_oStateUnderCursor = NULL; m_iIndexListBox = LB_ERR; m_bStateDrag = 0; if( pLB->GetCount() >0) { // find the State Under Cursor CPoint xPos; GetCursorPos(&xPos); pLB->ScreenToClient( &xPos); BOOL bOutside; int iIndex = pLB->ItemFromPoint(xPos, bOutside ) ; // the nearest state CRect oRect; pLB->GetItemRect(iIndex,&oRect); if(oRect.PtInRect(xPos)) { // the cursor is indeed over this item... SetCapture(); m_iIndexListBox = iIndex; m_p_oStateUnderCursor = (CPA_State*)pLB->GetItemData(iIndex); m_bStateDrag = 1;// ...and the item is draggable } } return 1; } // ---------------------------------------------------------------------------- // Description : OnMouseMoveStatesList(MSG *pMsg) // Handle function for message WM_MOUSEMOVE on ListBox Action Contents // Author : Mihaela Tancu // ---------------------------------------------------------------------------- BOOL CDlgActionContents::OnMouseMoveStatesList(MSG *pMsg) { if (pMsg->wParam & MK_LBUTTON) //if the mouse is moving and the left button is down { CListBox *pLB = (CListBox *)GetDlgItem( IDC_LIST_STATES); pLB->SetRedraw(FALSE); if(m_bStateDrag) { m_bStateDrag = 1; // we are dragging something CPoint xPos; GetCursorPos(&xPos); CRect oRect; pLB -> GetClientRect( oRect ); pLB -> ScreenToClient( &xPos); if(oRect.PtInRect(xPos)) { BOOL bOutside; int iIndex = pLB->ItemFromPoint(xPos, bOutside ) ; // the nearest state //we can drag if is a normal state and is moving over a normal state if(!(m_p_oStateUnderCursor->mfn_bGetTransitional()) && (!((CPA_State*)pLB->GetItemData(iIndex))->mfn_bGetTransitional())) // ...the item is not a transitional state m_bStateDrag = 2; // we can drop (a normal state to a normal state) ! //we can drag if is a transitional state and is moving over a transitional state if(m_p_oStateUnderCursor->mfn_bGetTransitional() && (((CPA_State*)pLB->GetItemData(iIndex))->mfn_bGetTransitional())) // ...the item is not a transitional state m_bStateDrag = 2; // we can drop! (a transitional state to a transitional state) //we can drag if is a transitional state and is moving over the default state if ( m_p_oStateUnderCursor->mfn_bGetTransitional() && (!((CPA_State*)pLB->GetItemData(iIndex))->mfn_bGetTransitional()) && ((CPA_State*)pLB->GetItemData(iIndex) == M_GetCurrentAction()->mfn_p_oGetDefaultState())) // ...the item is not a transitional state m_bStateDrag = 2; // we can drop! (a transitional state to the default state) } } if(m_bStateDrag == 2) SetCursor(M_GetMainApp()->LoadCursor(IDC_POINTER_CURSOR)); //modify the mouse cursor else SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_NO)); //no dropping possible } return 1; } // ---------------------------------------------------------------------------- // Description : OnLButtonUpStatesList(MSG *pMsg) // Handle function for message WM_LBUTTONUP on ListBox Action Contents // Author : Mihaela Tancu // ----------------------------------------------------------- BOOL CDlgActionContents::OnLButtonUpStatesList(MSG *pMsg) { ReleaseCapture(); // Release the mouse capture established at // the beginning of the mouse drag. SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); //OnSelchangeListStates(); // TODO: Add your message handler code here and/or call default CListBox *pLB = M_GetListFromID(IDC_LIST_STATES); if(m_iIndexListBox != LB_ERR) pLB->SetCurSel(m_iIndexListBox); // keep the previous selection pLB->SetRedraw(TRUE); // allow drawing if(m_bStateDrag == 2) { m_bStateDrag = FALSE; // the dragging operation is possible BOOL bOutside; CPoint xPos; GetCursorPos(&xPos); pLB -> ScreenToClient( &xPos); int iIndex = pLB->ItemFromPoint(xPos, bOutside ) ; // the nearest state if(iIndex == m_iIndexListBox) { OnSelchangeListStates(); return 1; } CRect oRect; pLB->GetItemRect(iIndex,&oRect); BOOL b_Before = oRect.PtInRect(xPos); // insert before an existing item if(b_Before && iIndex == m_iIndexListBox+1) { OnSelchangeListStates(); return 1; // no need to move anything } CPA_State *p_oStateUnderCursor = (CPA_State*)pLB->GetItemData(iIndex); // obtain the target state CPA_State *p_oPrevStateToMove; CPA_State *p_oPrevStateTarget; if (m_iIndexListBox > 0) //if the state to move is at least the second in the list box p_oPrevStateToMove = (CPA_State*)pLB->GetItemData(m_iIndexListBox-1); else p_oPrevStateToMove = NULL; if(b_Before) // inserting before an item in the list box { if (iIndex > 0) p_oPrevStateTarget=(CPA_State*)pLB->GetItemData(iIndex-1); else p_oPrevStateTarget=NULL; } else // adding at the end of the list box { p_oStateUnderCursor=NULL; p_oPrevStateTarget=(CPA_State*)pLB->GetItemData(pLB->GetCount()-1); } // move the normal or transitional state State_Move *p_oStateMove = new State_Move ( m_p_oParentDLL, M_GetCurrentAction(), p_oPrevStateToMove, m_p_oStateUnderCursor, p_oPrevStateTarget, p_oStateUnderCursor, NULL, NULL, NULL, FALSE, FALSE) ; M_MakeDo( p_oStateMove ) ; m_p_oParentDLL->mfn_vChangeState( m_p_oStateUnderCursor); } else OnSelchangeListStates(); m_bStateDrag = FALSE; return 1; // the cursor is outside the window - abort dragging } // CPA_Ed_1 Mihaela Tancu end /****************************************************************************** * CDlgActionContents specific functions ******************************************************************************/ /*----------------------------------------------------------------------------- * Description : enable/disable buttons *---------------------------------------------------------------------------*/ void CDlgActionContents::fn_vUpdateButtons(CPA_State *_p_oState) { CListBox *pLB = M_GetListFromID( IDC_LIST_STATES ); if(_p_oState) { GetDlgItem(IDC_BT_COPYSTATE)->EnableWindow( TRUE ); // CPA_Ed_1 Mihaela Tancu begin GetDlgItem(IDC_BT_DELSTATE)->EnableWindow( TRUE ); if (_p_oState==M_GetCurrentAction()->mfn_p_oGetDefaultState()) { CPA_List* p_oListOfStates = &M_GetCurrentAction()->m_oListOfStates; POSITION stPosIni; CPA_State *p_oPreviousState; POSITION stPos = p_oListOfStates->Find(_p_oState); stPosIni = stPos; if (stPos) // the state have to be in the list with states { p_oListOfStates->GetNext(stPosIni); if (stPosIni==NULL) { //if in the list are no other normal states p_oListOfStates->GetPrev(stPos); if (stPos) // before the current state is a state transitional { p_oPreviousState = p_oListOfStates->GetAt(stPos); if (p_oPreviousState->mfn_bGetTransitional()) // if it is a transitional state put it in front of its previous GetDlgItem(IDC_BT_DELSTATE)->EnableWindow( FALSE ); } } } } // CPA_Ed_1 Mihaela Tancu end GetDlgItem(IDC_BT_DEFAULTSTATE)->EnableWindow( !_p_oState->mfn_bGetTransitional() && !M_IsDefaultState( M_GetCurrentAction(), _p_oState ) ); GetDlgItem(IDC_BT_RENSTATE)->EnableWindow( TRUE ); // CPA_Ed_1 Mihaela Tancu begin CPA_Action * p_oAction = M_GetCurrentAction(); CPA_State *p_oPreviousState, *p_oNextState; CPA_List* p_oListOfStates = &p_oAction->m_oListOfStates; POSITION stPosIni; POSITION stPos = p_oListOfStates->Find(_p_oState); stPosIni = stPos; if (stPos) // the state have to be in the list with states { p_oListOfStates->GetPrev(stPos); if (stPos) // before the current state is a state { p_oPreviousState = p_oListOfStates->GetAt(stPos); if (_p_oState->mfn_bGetTransitional()) // if it is a transitional state put it in front of its previous GetDlgItem(IDC_BUTTON_UP)->EnableWindow( TRUE ); else if (p_oPreviousState->mfn_bGetTransitional()) //disable the Up button if the previous state is a transitional state GetDlgItem(IDC_BUTTON_UP)->EnableWindow( FALSE ); else //enable the button if the previous state is also a normal state GetDlgItem(IDC_BUTTON_UP)->EnableWindow( TRUE ); } else // the current state is the first state in the list box GetDlgItem(IDC_BUTTON_UP)->EnableWindow( FALSE ); } if (stPosIni) { p_oListOfStates->GetNext(stPosIni); // test if after the current state is a state if (stPosIni) { p_oNextState = p_oListOfStates->GetAt(stPosIni); if (!_p_oState->mfn_bGetTransitional()) // if after is a normal state, the current state can be moved GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow( TRUE ); else { // if after the transitional state is also a transitional state this can be moved if (p_oNextState->mfn_bGetTransitional()) GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow( TRUE ); else // cannot be moved if after the transitional state is a normal state GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow( FALSE ); } } else GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow( FALSE ); } // CPA_Ed_1 Mihaela Tancu end } else { GetDlgItem(IDC_BT_COPYSTATE)->EnableWindow( FALSE ); GetDlgItem(IDC_BT_DELSTATE)->EnableWindow( FALSE ); GetDlgItem(IDC_BT_DEFAULTSTATE)->EnableWindow( FALSE ); GetDlgItem(IDC_BT_RENSTATE)->EnableWindow( FALSE ); // CPA_Ed_1 Mihaela Tancu begin GetDlgItem(IDC_BUTTON_UP)->EnableWindow( FALSE ); GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow( FALSE ); // CPA_Ed_1 Mihaela Tancu end } GetDlgItem(IDC_BT_DELALLSTATES)->EnableWindow( pLB && pLB->GetCount () ); } /*----------------------------------------------------------------------------- * Description : change State list with the one in the given action *---------------------------------------------------------------------------*/ void CDlgActionContents::fn_vSetAction( CPA_Action *_p_oAction ) { CListBox *pLB = M_GetListFromID( IDC_LIST_STATES ); // emptied state list pLB->ResetContent() ; fn_vUpdateButtons( NULL ); // if no action specified (parameters is null, return now if (_p_oAction == NULL) { GetDlgItem(IDC_BT_NEWSTATE)->EnableWindow( FALSE ); return; } GetDlgItem(IDC_BT_NEWSTATE)->EnableWindow( TRUE ); // else get list of states of given action CPA_List* p_oListOfStates = &_p_oAction->m_oListOfStates; // add each state of given action in list POSITION stPos = p_oListOfStates->GetHeadPosition (); int iIndex; while ( stPos ) { CPA_State *p_oState = p_oListOfStates->GetNext ( stPos ) ; iIndex = pLB->AddString( p_oState->GetName() ); if (iIndex != LB_ERR) pLB->SetItemData( iIndex, (DWORD) p_oState ); } // select first state (if exists) if( pLB -> GetCount() > 0 ) m_p_oParentDLL -> mfn_vSetCurrentState( (CPA_State*)pLB -> GetItemData( 0 ) ); else m_p_oParentDLL -> mfn_vSetCurrentState( NULL ); } /*----------------------------------------------------------------------------- * Description : select given state *---------------------------------------------------------------------------*/ void CDlgActionContents::fn_vSetState( CPA_State *_p_oState ) { CListBox *pLB = M_GetListFromID( IDC_LIST_STATES ); if(_p_oState) { int iIndex = pLB->FindStringExact( -1, _p_oState->GetName() ); if( iIndex != LB_ERR ) { pLB->SetCurSel( iIndex ); fn_vUpdateButtons( _p_oState ); } else { pLB->SetCurSel( -1 ); fn_vUpdateButtons( NULL ); } } else { pLB->SetCurSel( -1 ); fn_vUpdateButtons( NULL ); } } /*----------------------------------------------------------------------------- * Description : change Next State given state *---------------------------------------------------------------------------*/ void CDlgActionContents::fn_vSetAsNextState( CPA_State *_p_oNextState) { State_ModifNextState *p_oNextState = new State_ModifNextState ( m_p_oParentDLL, M_GetCurrentState(), _p_oNextState ) ; M_MakeDo( p_oNextState ) ; } /*----------------------------------------------------------------------------- * Description : fill menu with sequential states after given state *---------------------------------------------------------------------------*/ void CDlgActionContents::fn_vFillSequentialStateMenu( CMenu* _p_oMenu, CPA_Action *_p_oCurrentAction, CPA_State *_p_oFirstState) { CPA_List m_oListOfMenuState ; CPA_State *p_oCurrentState = _p_oFirstState; int iNbState = 0; BOOL bContinue = TRUE; m_oListOfMenuState . RemoveAll () ; // add initial state _p_oMenu -> AppendMenu ( MF_STRING , C_uiPMList + iNbState , _p_oFirstState -> GetName() ) ; m_oListOfMenuState . AddTail( _p_oFirstState ); iNbState = 1; // add next states do { // get current state p_oCurrentState = p_oCurrentState -> mfn_p_oGetNextState() ; bContinue = TRUE; if( p_oCurrentState ) { // state already present ??? BOOL bAlreadyInList = ( m_oListOfMenuState . Find( p_oCurrentState ) ? TRUE : FALSE ); // state of other action BOOL bOtherAction = !bAlreadyInList && (p_oCurrentState -> mfn_p_oGetAction() != _p_oCurrentAction ); // add state if(bAlreadyInList) { // add and stop _p_oMenu -> AppendMenu ( MF_STRING , C_uiPMList + iNbState , "return to \'" + p_oCurrentState -> GetName() + "\'" ) ; bContinue = FALSE; } else if(bOtherAction) { // add and stop _p_oMenu -> AppendMenu ( MF_STRING , C_uiPMList + iNbState , p_oCurrentState -> GetName() + " from " + p_oCurrentState -> mfn_p_oGetAction() -> GetName() ) ; bContinue = FALSE; } else { // add and continue _p_oMenu -> AppendMenu ( MF_STRING , C_uiPMList + iNbState , p_oCurrentState -> GetName() ) ; m_oListOfMenuState . AddTail ( p_oCurrentState ) ; iNbState++; } } else { _p_oMenu -> AppendMenu ( MF_STRING , C_uiPMList + iNbState , "NONE" ) ; bContinue = FALSE; } } while (bContinue) ; } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CDlgActionContents::OnRButtonDownStatesList(MSG *pMsg) { // create and display the context popmenu CListBox *pLB = M_GetListFromID(IDC_LIST_STATES); CMenu oPopMenu; CMenu oCreateMenu; CMenu oListMenu; POINT xPos; xPos.x = LOWORD(pMsg->lParam); xPos.y = HIWORD(pMsg->lParam); // update State Under Cursor CPoint oPoint(xPos); BOOL bOutside; int iIndex = pLB->ItemFromPoint(oPoint, bOutside ) ; if(bOutside) { m_p_oStateUnderCursor = NULL; } else { CRect oRect; pLB->GetItemRect(iIndex,&oRect); if(oRect.PtInRect(xPos)) m_p_oStateUnderCursor = (CPA_State*)pLB->GetItemData(iIndex); else m_p_oStateUnderCursor = NULL; } // create popup oPopMenu . CreatePopupMenu () ; // create submenu 'Create' oCreateMenu . CreatePopupMenu () ; oCreateMenu . AppendMenu ( MF_STRING , C_uiPMCreateNormal , "Normal State" ) ; oCreateMenu . AppendMenu ( MF_STRING , C_uiPMCreateTransitional , "Transitional State" ) ; // add submenu 'Create' oPopMenu . AppendMenu ( MF_STRING|MF_POPUP|MF_ENABLED , (UINT)oCreateMenu.m_hMenu , "Create" ) ; // fill if( m_p_oStateUnderCursor ) { if( !m_p_oStateUnderCursor->mfn_bGetTransitional() ) oPopMenu . AppendMenu ( MF_STRING + M_Enable( !M_IsDefaultState(M_GetCurrentAction(),m_p_oStateUnderCursor) ), C_uiPMDefault , "Set as Default State" ) ; oPopMenu . AppendMenu ( MF_STRING + M_Enable(m_p_oStateUnderCursor) , C_uiPMRename , "Rename State" ) ; oPopMenu . AppendMenu ( MF_STRING + M_Enable(m_p_oStateUnderCursor) , C_uiPMCopy , "Copy State" ) ; oPopMenu . AppendMenu ( MF_STRING + M_Enable(m_p_oStateUnderCursor) , C_uiPMDel , "Delete State" ) ; } oPopMenu . AppendMenu ( MF_STRING + M_Enable(pLB->GetCount()) , C_uiPMDelAll , "Delete all States" ) ; if(m_p_oStateUnderCursor && M_GetCurrentState() && !M_GetCurrentState()->mfn_bGetTransitional() ) { oPopMenu . AppendMenu ( MF_SEPARATOR ) ; oPopMenu . AppendMenu ( MF_STRING, C_uiPMNext, "Set \'" + m_p_oStateUnderCursor -> GetName () + "\' as Next State" ) ; } oPopMenu . AppendMenu ( MF_SEPARATOR ) ; // oListMenu . CreatePopupMenu () ; fn_vFillSequentialStateMenu ( &oListMenu , M_GetCurrentAction() , M_GetCurrentState() ); oPopMenu . AppendMenu ( MF_STRING|MF_POPUP|MF_ENABLED , (UINT)oListMenu.m_hMenu , "Next Sequential States" ) ; pLB->ClientToScreen ( &xPos ); // register for TUT module TUT_M_vGetTutDll (); TUT_M_vRegisterMenu (this -> m_hWnd , oPopMenu . m_hMenu , xPos.x, xPos.y); // display oPopMenu . TrackPopupMenu ( TPM_LEFTALIGN|TPM_RIGHTBUTTON, xPos.x, xPos.y, this); oCreateMenu . Detach (); oListMenu . Detach () ; oPopMenu . DestroyMenu (); } // ---------------------------------------------------------------------------- // Description : // ---------------------------------------------------------------------------- void CDlgActionContents::OnKeyDownStatesList(MSG *pMsg) { int nVirtKey = (int)pMsg->wParam; CListBox *pLB = M_GetListFromID(IDC_LIST_STATES); int iIndex = pLB -> GetCurSel(); if ( ( nVirtKey == VK_DELETE ) && ( iIndex != LB_ERR ) ) { OnBtDelstate(); } }