// EDACDgNL.cpp : implementation file // #include "stdafx.h" #include "ACP_Base.h" #include "ITF.h" #include "TAC.h" #include "_Ainterf.hpp" #include "EDAcIRes.h" #include "cpa_nll.hpp" #include "EDACDgNL.hpp" #include "cpa_nll.hpp" #include "EDACstrg.hpp" #include "EDACactr.hpp" #include "EDACdgif.hpp" #include "TUT.h" // Tutorial dll include #undef CPA_WANTS_IMPORT #undef CPA_EXPORT #define CPA_WANTS_EXPORT #include "_Actors.hpp" #undef CPA_WANTS_EXPORT #define CPA_WANTS_IMPORT //======================================================================================= //======================================================================================= void vZoneAddNameToNameList(short _wIndex, CPA_tdoNameList *_p_oNameList) { //notify the activation list editor tdstModifZone stModifZone; stModifZone.wIndex = _wIndex; stModifZone.p_oNameList = _p_oNameList; g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLActionName)->OnQueryAction(g_pclInterface, C_uiInsertZone, (long) &stModifZone); } void vWayAddNameToNameList(short _wIndex, CPA_tdoNameList *_p_oNameList) { //nothing to do for way lists } void vZoneRemoveNameFromNameList(short _wIndex, CPA_tdoNameList *_p_oNameList) { //notify the activation list editor tdstModifZone stModifZone; stModifZone.wIndex = _wIndex; stModifZone.p_oNameList = _p_oNameList; g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLActionName)->OnQueryAction(g_pclInterface, C_uiRemoveZone, (long) &stModifZone); } void vWayRemoveNameFromNameList(short _wIndex, CPA_tdoNameList *_p_oNameList) { //nothing to do for way lists } //======================================================================================= //======================================================================================= static tdstListSpecificActions gs_stZoneActions = { vZoneAddNameToNameList, vZoneRemoveNameFromNameList }; static tdstListSpecificActions gs_stWayActions = { vWayAddNameToNameList, vWayRemoveNameFromNameList }; static tdstListSpecificActions *gs_p_stSpecificActions = NULL; //======================================================================================= //======================================================================================= tdoDummyName::tdoDummyName(CString _csName, tdeShareMode _eShareMode) { m_wInitIndex = -1; m_p_oAssociatedName = NULL; m_eShareMode = _eShareMode; m_csName = _csName; } //======================================================================================= tdoDummyName::tdoDummyName(tdoObjectName *_p_oObjectName, short _wIndex) { m_wInitIndex = _wIndex; m_p_oAssociatedName = _p_oObjectName; m_eShareMode = _p_oObjectName->m_eGetShareMode(); m_csName = _p_oObjectName->GetName(); } //======================================================================================= //======================================================================================= tdoDummyNameList::tdoDummyNameList(CString _csName) { m_p_oAssociatedList = NULL; m_csName = _csName; } //======================================================================================= tdoDummyNameList::tdoDummyNameList(CPA_tdoNameList *_p_oNameList) { m_p_oAssociatedList = _p_oNameList; m_csName = _p_oNameList->GetName(); POSITION xPos = _p_oNameList->GetHeadPosition(); short wIndex = 0; while ( xPos ) { tdoObjectName *p_oObjectName = _p_oNameList->GetNext(xPos); m_clNames.AddTail(new tdoDummyName(p_oObjectName, wIndex)); wIndex ++; } } //======================================================================================= tdoDummyNameList::~tdoDummyNameList() { POSITION xPos; xPos = m_clNames.GetHeadPosition(); while ( xPos ) delete m_clNames.GetNext(xPos); xPos = m_clDeletedNames.GetHeadPosition(); while ( xPos ) delete m_clDeletedNames.GetNext(xPos); } //======================================================================================= tdoDummyName *tdoDummyNameList::m_p_oFindActiveName(CString _csName) { POSITION xNamePos = m_clNames.GetHeadPosition(); while ( xNamePos ) { tdoDummyName *p_oName = m_clNames.GetNext(xNamePos); if ( p_oName->m_csGetName() == _csName ) return p_oName; } return NULL; } //======================================================================================= tdoDummyName *tdoDummyNameList::m_p_oFindDeletedName(CString _csName) { POSITION xNamePos = m_clDeletedNames.GetHeadPosition(); while ( xNamePos ) { tdoDummyName *p_oName = m_clDeletedNames.GetNext(xNamePos); if ( p_oName->m_csGetName() == _csName ) return p_oName; } return NULL; } //======================================================================================= BOOL tdoDummyNameList::m_bNameExists(CString _csName) { if ( m_p_oFindActiveName(_csName) || m_p_oFindDeletedName(_csName) ) return TRUE; else return FALSE; } //======================================================================================= tdoDummyName *tdoDummyNameList::m_p_oAddName(CString _csName, tdeShareMode _eShareMode) { tdoDummyName *p_oAddedName = new tdoDummyName(_csName, _eShareMode); if ( p_oAddedName ) m_clNames.AddTail(p_oAddedName); return p_oAddedName; } //======================================================================================= BOOL tdoDummyNameList::m_bRemoveName(CString _csName) { POSITION xPos; xPos = m_clNames.GetHeadPosition(); while ( xPos ) { tdoDummyName *p_oDeletedName = m_clNames.GetAt(xPos); if ( p_oDeletedName->m_csGetName() == _csName ) { //make the list of deleted names reference this name m_clDeletedNames.AddTail(p_oDeletedName); //and remove the name from the active list m_clNames.RemoveAt(xPos); return TRUE; } else m_clNames.GetNext(xPos); } return FALSE; } //======================================================================================= BOOL tdoDummyNameList::m_bRenameName(CString _csOldName, CString _csNewName) { tdoDummyName *p_oName = m_p_oFindActiveName(_csOldName); if ( p_oName ) p_oName->m_vSetName(_csNewName); return p_oName ? TRUE : FALSE; } //======================================================================================= BOOL tdoDummyNameList::m_bReshareName(CString _csName, tdeShareMode _eShareMode) { tdoDummyName *p_oName = m_p_oFindActiveName(_csName); if ( p_oName ) p_oName->m_vSetShareMode(_eShareMode); return p_oName ? TRUE : FALSE; } //======================================================================================= void tdoDummyNameList::m_vValidateActiveNames(EdActors_EditNameListsDialog *_p_oDialog) { CPA_tdoNameList *p_oNameList = m_p_oGetAssociatedList(); ASSERT(p_oNameList); //we validate only active lists, hence the namelist must exist! POSITION xNamePos = m_clNames.GetHeadPosition(); short wObjectIndex = 0; while ( xNamePos ) { tdoDummyName *p_oName = m_clNames.GetNext(xNamePos); ASSERT(p_oName); if ( p_oName->m_bWasHereOnInit() ) { tdoObjectName *p_oObjectName = p_oName->m_p_oGetAssociatedName(); if ( p_oName->m_bNameChanged() ) //if the name changed { //update it *p_oObjectName = p_oName->m_csGetName(); //and save the parent name list p_oNameList->fn_vUpdateReference(p_oNameList); } if ( p_oName->m_bShareModeChanged() ) { if ( p_oNameList->m_pEdtListHandler->fn_bChangeNameListShareMode( wObjectIndex, p_oName->m_eGetShareMode(), _p_oDialog->m_p_stArgs->stIn.p_oEditorActor->m_fn_p_oGetObjectList( _p_oDialog->m_p_stArgs->stIn.p_c_szScriptName ) ) ) p_oNameList->fn_vUpdateReference(p_oNameList); } } else //this is a brand new name in the list { p_oNameList->fn_vUpdateReference(p_oNameList); tdoObjectName *p_oNewObjectName = new tdoObjectName( p_oNameList, p_oName->m_csGetName(), p_oName->m_eGetShareMode() ); //call the specific code for the object lists associated to the name list gs_p_stSpecificActions->fn_vWhenNameAdded(wObjectIndex, p_oNameList); /*tdstModifZone stModifZone; stModifZone.wIndex = wObjectIndex; stModifZone.p_oNameList = p_oNameList; //should not be called for lists of way names, but Marc says that in that case he will do nothing, because he updates activations //that have the name list as father. Since this is not a zone name list, he will not find any activation, hence he will do nothing g_pclInterface->GetMainWorld()->GetToolDLLWithName(C_szDLLActionName)->OnQueryAction(g_pclInterface, C_uiInsertZone, (long) &stModifZone);*/ //TODO: même chose pour les chemins... //ask the handler to add the name to the name list p_oNameList->m_pEdtListHandler->fn_vAddObjectToAllLists(p_oNewObjectName, wObjectIndex/*, NULL*/); } wObjectIndex ++; } } //======================================================================================= void tdoDummyNameList::m_vInvalidateDeletedNames() { CPA_tdoNameList *p_oNameList = m_p_oGetAssociatedList(); while ( !m_clDeletedNames.IsEmpty() ) { tdoDummyName *p_oName = m_clDeletedNames.RemoveHead(); ASSERT(p_oName); if ( p_oName->m_bWasHereOnInit() ) { ASSERT(p_oNameList); //if the name was here on init, the list was here too... tdoObjectName *p_oObjectName = p_oName->m_p_oGetAssociatedName(); p_oNameList->m_pEdtListHandler->m_vRemoveObjectFromAllLists(p_oName->m_wGetInitIndex()); //the list is to be saved p_oNameList->fn_vUpdateReference(p_oNameList); //call the specific code for the object lists associated to the name list gs_p_stSpecificActions->fn_vWhenNameRemoved(p_oName->m_wGetInitIndex(), p_oNameList); } //remove the name from the list delete p_oName; } } //======================================================================================= void tdoDummyNameList::m_vFillControls(CListBox *_p_oListBox, CEdit *_p_oCurEdit) { POSITION xNamePos = m_clNames.GetHeadPosition(); while ( xNamePos ) { tdoDummyName *p_oName = m_clNames.GetNext(xNamePos); short wIndex = _p_oListBox->AddString(p_oName->m_csGetName()); _p_oListBox->SetItemDataPtr(wIndex, p_oName); } _p_oListBox->SetCurSel(LB_ERR); _p_oCurEdit->SetWindowText(""); } //======================================================================================= void tdoDummyNameList::m_vSetAssociatedList(CPA_tdoNameList *_p_oNameList, BOOL _bAreYouSure /*= FALSE*/) { ASSERT(_bAreYouSure); m_p_oAssociatedList = _p_oNameList; } //======================================================================================= //======================================================================================= tdoListModifHandler::tdoListModifHandler(CString _csNameListType, CPA_Family *_p_oFamily) { m_csNameListType = _csNameListType; m_p_oFamily = _p_oFamily; m_p_oDialog = NULL; //will be set if the modifs are accepted by the user //Gets the current Family List CPA_List oNameListList; g_pclInterface->GetMainWorld()->fn_lFindObjects( &oNameListList, "", // obj name (char *) LPCTSTR(m_csNameListType), //type (CPA_BaseObject *) m_p_oFamily // owner ); POSITION xPos = oNameListList.GetHeadPosition(); while ( xPos ) { //get the list of names CPA_tdoNameList *p_oNameList = (CPA_tdoNameList *) oNameListList.GetNext(xPos); //create an associated dummy name list and add it to our active list tdoDummyNameList *p_oList = new tdoDummyNameList(p_oNameList); m_clLists.AddTail(p_oList); } //emtpy the list before it is destroyed... oNameListList.RemoveAll(); } //======================================================================================= tdoListModifHandler::~tdoListModifHandler() { if ( m_bModifsAreAccepted() ) m_vPerformAllModifs(); POSITION xPos; xPos = m_clLists.GetHeadPosition(); while ( xPos ) delete m_clLists.GetNext(xPos); xPos = m_clDeletedLists.GetHeadPosition(); while ( xPos ) delete m_clDeletedLists.GetNext(xPos); } //======================================================================================= tdoDummyNameList *tdoListModifHandler::m_p_oFindActiveNameList(CString _csName) { POSITION xListPos; xListPos = m_clLists.GetHeadPosition(); while ( xListPos ) { tdoDummyNameList *p_oList = m_clLists.GetNext(xListPos); if ( p_oList->m_csGetName() == _csName ) return p_oList; } return NULL; } //======================================================================================= tdoDummyNameList *tdoListModifHandler::m_p_oFindDeletedNameList(CString _csName) { POSITION xListPos; xListPos = m_clDeletedLists.GetHeadPosition(); while ( xListPos ) { tdoDummyNameList *p_oList = m_clDeletedLists.GetNext(xListPos); if ( p_oList->m_csGetName() == _csName ) return p_oList; } return NULL; } //======================================================================================= BOOL tdoListModifHandler::m_bListExists(CString _csName) { if ( m_p_oFindActiveNameList(_csName) || m_p_oFindDeletedNameList(_csName) ) return TRUE; else return FALSE; } //======================================================================================= BOOL tdoListModifHandler::m_bNameExists(CString _csName) { POSITION xListPos; xListPos = m_clLists.GetHeadPosition(); while ( xListPos ) if ( m_clLists.GetNext(xListPos)->m_bNameExists(_csName) ) return TRUE; xListPos = m_clDeletedLists.GetHeadPosition(); while ( xListPos ) if ( m_clDeletedLists.GetNext(xListPos)->m_bNameExists(_csName) ) return TRUE; return FALSE; } //======================================================================================= tdoDummyNameList *tdoListModifHandler::m_p_oAcceptListAdd(CString _csName) { if ( !m_bListExists(_csName) ) { tdoDummyNameList *p_oAddedList = new tdoDummyNameList(_csName); if ( p_oAddedList ) m_clLists.AddTail(p_oAddedList); return p_oAddedList; } return NULL; } //======================================================================================= BOOL tdoListModifHandler::m_bAcceptListDelete(CString _csName) { POSITION xPos; xPos = m_clLists.GetHeadPosition(); while ( xPos ) { tdoDummyNameList *p_oDeletedList = m_clLists.GetAt(xPos); if ( p_oDeletedList->m_csGetName() == _csName ) { //make the list of deleted names reference this name m_clDeletedLists.AddTail(p_oDeletedList); //and remove the name from the active list m_clLists.RemoveAt(xPos); return TRUE; } else m_clLists.GetNext(xPos); } return FALSE; } //======================================================================================= BOOL tdoListModifHandler::m_bAcceptListRename(CString _csOldName, CString _csNewName) { tdoDummyNameList *p_oList = m_p_oFindActiveNameList(_csOldName); if ( p_oList ) p_oList->m_vSetName(_csNewName); return p_oList ? TRUE : FALSE; } //======================================================================================= tdoDummyName *tdoListModifHandler::m_p_oAcceptNameAdd(CString _csListName, CString _csName, tdeShareMode _eShareMode) { tdoDummyNameList *p_oList = m_p_oFindActiveNameList(_csListName); if ( p_oList && !p_oList->m_bNameExists(_csName) ) return p_oList->m_p_oAddName(_csName, _eShareMode); return NULL; } //======================================================================================= BOOL tdoListModifHandler::m_bAcceptNameDelete(CString _csListName, CString _csName) { tdoDummyNameList *p_oList = m_p_oFindActiveNameList(_csListName); if ( p_oList ) return p_oList->m_bRemoveName(_csName); return FALSE; } //======================================================================================= BOOL tdoListModifHandler::m_bAcceptNameRename(CString _csListName, CString _csOldName, CString _csNewName) { tdoDummyNameList *p_oList = m_p_oFindActiveNameList(_csListName); if ( p_oList ) return p_oList->m_bRenameName(_csOldName, _csNewName); return FALSE; } //======================================================================================= BOOL tdoListModifHandler::m_bAcceptNameReshare(CString _csListName, CString _csName, tdeShareMode _eShareMode) { tdoDummyNameList *p_oList = m_p_oFindActiveNameList(_csListName); if ( p_oList ) return p_oList->m_bReshareName(_csName, _eShareMode); return FALSE; } //======================================================================================= void tdoListModifHandler::m_vPerformAllModifs() { //first of all, remove all the deleted lists while ( !m_clDeletedLists.IsEmpty() ) { tdoDummyNameList *p_oList = m_clDeletedLists.RemoveHead(); if ( p_oList ) { if ( p_oList->m_bWasHereOnInit() ) //if the list was not here from the start { CPA_tdoNameList *p_oNameList = p_oList->m_p_oGetAssociatedList(); //tell the coherence manager that the name list no longer exists... g_oCoherenceManager.m_fn_vDestroyObject(p_oNameList); //tel the name list not to save itself //TODO: vérifier que le pointeur sur l'objet n'est pas utilisé par la callback //de sauvegarde quand c'est une notification de destruction... //au besoin passer NULL comme objet pour un NotifyDelete p_oNameList->fn_vNotifyUnSave(); //start by removing the deleted names from the list p_oList->m_vInvalidateDeletedNames(); //empty the list of names p_oNameList->RemoveAll(); //and destroy it (it will be removed from the reachable list automatically) delete p_oNameList; } delete p_oList; } } //now scan all active lists POSITION xListPos = m_clLists.GetHeadPosition(); while ( xListPos ) { tdoDummyNameList *p_oList = m_clLists.GetNext(xListPos); if ( p_oList ) { CPA_tdoNameList *p_oNameList = NULL; //start by creating the new lists if ( !p_oList->m_bWasHereOnInit() ) { p_oNameList = new CPA_tdoNameList( (char *) LPCTSTR(m_csNameListType), /* type name */ (CPA_BaseObject *) m_p_oFamily, /* owner */ FALSE, //section does not exist yet p_oList->m_csGetName() /* object name */ ); /* last 2 args are optional */ if ( p_oNameList ) { //give the true list to the dummy list, so that the rest of the processing can continue p_oList->m_vSetAssociatedList(p_oNameList, TRUE); p_oNameList->fn_vNotifySave(); } } else p_oNameList = p_oList->m_p_oGetAssociatedList(); if ( m_bModifsAreAccepted() ) { //make the model use the selected list upon return if ( m_p_oDialog->m_p_oListSelectedForModel == p_oList ) m_p_oDialog->m_p_stArgs->stOut.p_oNameListSelectedForModel = p_oList->m_p_oGetAssociatedList(); } //rename it if necessary if ( p_oNameList && p_oList->m_bNameChanged() && p_oNameList->fn_eRename(p_oList->m_csGetName()) == E_mc_None ) { // if the object was successfully renamed //notify all models referencing this list CPA_List oFatherList; short wNbFathers = g_oCoherenceManager.m_fn_iGetFatherList(p_oNameList, &oFatherList); while ( wNbFathers ) { CPA_SaveObject *p_oCurFather = (CPA_SaveObject *) oFatherList.RemoveHead(); if ( p_oCurFather ) p_oCurFather->fn_vNotifySave(); wNbFathers --; } } //start by removing the deleted names from the list p_oList->m_vInvalidateDeletedNames(); //now create the added names p_oList->m_vValidateActiveNames(m_p_oDialog); } } } //======================================================================================= void tdoListModifHandler::m_vFillControls(CListBox *_p_oListBox, CEdit *_p_oCurEdit, tdoDummyNameList *_p_oCurrentSelectedList) { _p_oListBox->ResetContent(); POSITION xListPos = m_clLists.GetHeadPosition(); while ( xListPos ) { tdoDummyNameList *p_oList = m_clLists.GetNext(xListPos); if ( _p_oCurrentSelectedList ) //we display the contents of the current list { if ( p_oList == _p_oCurrentSelectedList ) { p_oList->m_vFillControls(_p_oListBox, _p_oCurEdit); break; } } else //we just display the list of lists { short wIndex = _p_oListBox->AddString(p_oList->m_csGetName()); _p_oListBox->SetItemDataPtr(wIndex, p_oList); } } } //======================================================================================= tdoDummyNameList *tdoListModifHandler::m_p_oGetListforNameList(CPA_tdoNameList *_p_oNameList) { if ( _p_oNameList ) { POSITION xPos = m_clLists.GetHeadPosition(); while ( xPos ) { tdoDummyNameList *p_oList = m_clLists.GetNext(xPos); if ( p_oList && p_oList->m_p_oGetAssociatedList() == _p_oNameList ) return p_oList; } } return NULL; } //======================================================================================= ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // EdActors_EditNameListsDialog dialog BOOL EdActors_EditNameListsDialog::PreTranslateMessage(MSG* pMsg) { switch( pMsg->message ) { case WM_LBUTTONDOWN: if ( pMsg->hwnd == m_p_oItemListBox->m_hWnd ) return m_bIconClickedInListBox(CPoint(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam))); //fall through case WM_MOUSEMOVE: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONUP: m_poToolTip->RelayEvent(pMsg); } return CDialog::PreTranslateMessage(pMsg); } //========================================================================== //========================================================================== EdActors_EditNameListsDialog::~EdActors_EditNameListsDialog() { if ( m_poToolTip ) { delete m_poToolTip; m_poToolTip = NULL; } if ( m_p_oListModifHandler ) { delete m_p_oListModifHandler; m_p_oListModifHandler = NULL; } } //========================================================================== //========================================================================== EdActors_EditNameListsDialog::EdActors_EditNameListsDialog(tdstCarEditNameListsDialogArgs *p_stArgs, CWnd* pParent /*=NULL*/) : CDialog(EdActors_EditNameListsDialog::IDD, &g_oBaseFrame) { //messages come from user input, unless otherwise specified m_bAutodispatch = FALSE; m_bUserEditedAList = FALSE; m_eEditMode = E_em_None; m_p_oDefaultButton = m_p_oOkButton; m_p_stArgs = p_stArgs; //{{AFX_DATA_INIT(EdActors_EditNameListsDialog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_p_oListModifHandler = new tdoListModifHandler( m_p_stArgs->stIn.p_c_szNameListType, m_p_stArgs->stIn.p_oEditorActor->m_pclActor->m_pub_fn_pclGetFamily() ); //here is the only list-type specific code of the dialog: find out which //structure to use if ( strstr(m_p_stArgs->stIn.p_c_szNameListType, C_szWayName) ) gs_p_stSpecificActions = &gs_stWayActions; else gs_p_stSpecificActions = &gs_stZoneActions; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(EdActors_EditNameListsDialog) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } //========================================================================== //========================================================================== BEGIN_MESSAGE_MAP(EdActors_EditNameListsDialog, CDialog) //{{AFX_MSG_MAP(EdActors_EditNameListsDialog) ON_BN_CLICKED(IDC_BUTTON_ENL_CURRENTMODE, OnEnlSwapEditModeButtonClicked) ON_BN_CLICKED(IDC_RADIO_ENL_COMMON, OnEnlShareModeRadioButtonClicked) ON_WM_DRAWITEM() ON_LBN_SELCHANGE(IDC_LIST_ENL_ITEMLIST, OnEnlListBoxSelChange) ON_EN_CHANGE(IDC_EDIT_ENL_NAME, OnEnlNameEditChange) ON_BN_CLICKED(IDC_BUTTON_ENL_ADD, OnEnlAddButtonClicked) ON_BN_CLICKED(IDC_BUTTON_ENL_DELETE, OnEnlDeleteButtonClicked) ON_BN_CLICKED(IDC_BUTTON_ENL_RENAME, OnEnlRenameButtonClicked) ON_WM_CLOSE() ON_BN_CLICKED(IDC_RADIO_ENL_SHARED, OnEnlShareModeRadioButtonClicked) ON_BN_CLICKED(IDC_RADIO_ENL_SPECIFIC, OnEnlShareModeRadioButtonClicked) ON_BN_CLICKED(IDC_DEFAULTBUTTON, OnEnlDefaultButtonClicked) ON_NOTIFY_EX(TTN_NEEDTEXT, 0, m_bGetToolTipText) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // EdActors_EditNameListsDialog message handlers void EdActors_EditNameListsDialog::m_vSetDefaultButton(CButton *_p_oButton) { m_p_oDefaultButton = _p_oButton; return; //until we have something that works, do nothing... } //========================================================================== //========================================================================== BOOL EdActors_EditNameListsDialog::m_bGetToolTipText(UINT uiControlId, NMHDR *pNMHDR, LRESULT *pResult ) { TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; //since uiControlId is not used, we can use it as a local variable... uiControlId = pNMHDR->idFrom; uiControlId = ::GetDlgCtrlID((HWND)uiControlId); short wIndex; for ( wIndex = 0; wIndex < sizeof(m_a13_stToopTipData) / sizeof(m_a13_stToopTipData[0]); wIndex ++ ) if ( m_a13_stToopTipData[wIndex].uiControlId == uiControlId ) { strcpy(pTTT->szText, m_a13_stToopTipData[wIndex].pszTipText); return TRUE; } return FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlNameEditChange() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; CString oNewNameString; short wIndex = m_p_oItemListBox->GetCurSel(); m_p_oNameEdit->GetWindowText(oNewNameString); oNewNameString = g_pclInterface->GetInterface()->GetPrefixedName(oNewNameString); if ( oNewNameString.IsEmpty() ) { //there is no item with such name, so unselect all items in the listbox m_p_oAddButton->EnableWindow(FALSE); m_p_oItemListBox->SetCurSel(LB_ERR); m_vSetDefaultButton(m_p_oOkButton); M_vFakeMessage(OnEnlListBoxSelChange); } else // there is text in the edit { //look for an object with the same name CPA_List oItemList; g_pclInterface->GetMainWorld()->fn_lFindObjects( &oItemList, oNewNameString, // obj name (m_eEditMode == E_em_NameListEdit) //the combo lists names ? ? C_szObjectNameType //the combo lists object names -> look for object name : (char *) m_p_stArgs->stIn.p_c_szNameListType, //else look for name lists (m_eEditMode == E_em_NameListEdit) //the combo lists names ? ? m_p_oCurrentSelectedList->m_p_oGetAssociatedList() //owner of a name is the name list : (CPA_BaseObject *) m_p_stArgs->stIn.p_oEditorActor->m_pclActor->m_pub_fn_pclGetFamily() //owner of a list is the family ); short wFoundItem = oItemList.GetCount(); if ( !wFoundItem ) //now search in the dummy names too... { wFoundItem = (m_eEditMode == E_em_NameListEdit) ? (m_p_oListModifHandler->m_bNameExists(oNewNameString) ? 1 : 0) : (m_p_oListModifHandler->m_bListExists(oNewNameString) ? 1 : 0); } //there is at most one item with such a name... ASSERT(wFoundItem <= 1); if ( wFoundItem ) //we found an item with that name { BOOL bItemIsInListBox = FALSE; CString csItemName; short wNbItems = m_p_oItemListBox->GetCount(); for ( short wItem = 0; wItem < wNbItems; wItem ++ ) { //make the list box select the object with the same name. Since we cannot get the //inde from the item data, we have to search for the string ourselves csItemName = (m_eEditMode == E_em_NameListEdit) ? ((tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(wItem))->m_csGetName() : ((tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(wItem))->m_csGetName(); if ( csItemName == oNewNameString ) { bItemIsInListBox = TRUE; m_p_oItemListBox->SetCurSel(wItem); M_vFakeMessage(OnEnlListBoxSelChange); break; } } if ( !bItemIsInListBox ) //we found the name in a "deleted" list { //we cannot re-add it m_p_oAddButton->EnableWindow(FALSE); //nor delete it again m_p_oDeleteButton->EnableWindow(FALSE); //nor name an item with this name, else we would have at the same time //a deleted and an active item of the same name... m_p_oRenameButton->EnableWindow(wIndex != LB_ERR); } m_vSetDefaultButton(m_p_oSwapEditModeButton); } else //no object was found with the same name (which is not empty, BTW) { m_p_oAddButton->EnableWindow(TRUE); //the names are not equal, so we cannot delete m_p_oDeleteButton->EnableWindow(FALSE); //we can rename if an item is selected m_p_oRenameButton->EnableWindow(wIndex != LB_ERR); //we can delete if an item is selected, and if we have the right to do so: //the item is an object name or it is a name list with no associated object list //that is not the list of the model /*m_p_oDeleteButton->EnableWindow( (wIndex != LB_ERR) && ( (m_eEditMode == E_em_NameListEdit) || ( (m_p_stArgs->stOut.p_oNameListSelectedForModel != m_p_oCurrentSelectedList->m_p_oGetAssociatedList()) && (m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->m_pEdtListHandler->fn_oGetListOfEdtLists()->GetCount() <= 0) ) ) );*/ m_vSetDefaultButton(m_p_oAddButton); } //empty the list, else the destructor will ASSERT() oItemList.RemoveAll(); } m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlShareModeRadioButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; short wIndex = m_p_oItemListBox->GetCurSel(); if ( wIndex != LB_ERR ) { tdoDummyName *p_oName = (tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(wIndex); tdeShareMode ePreviousMode = p_oName->m_eGetShareMode(); tdeShareMode eNewMode = m_eGetRadioShareMode(); ASSERT(eNewMode != E_sm_None); //if the model has no instance, or if he has instances he does not set the attribute to to Virge, //accept and perform the change if ( m_p_stArgs->stIn.bModelCanSelectANameList || eNewMode != E_sm_Virge ) { //change the share mode of the currently selected name m_p_oListModifHandler->m_bAcceptNameReshare(m_p_oCurrentSelectedList->m_csGetName(), p_oName->m_csGetName(), eNewMode); //make the listbox redraw the item CRect oItemRect; m_p_oItemListBox->GetItemRect(wIndex, &oItemRect); m_p_oItemListBox->InvalidateRect(oItemRect); //the list was edited, hence we cannot get back to list selection mode m_bUserEditedAList = TRUE; m_p_oSwapEditModeButton->EnableWindow(FALSE); } else //we do not accept the change m_vSetRadioShareMode(ePreviousMode); //restore the buttons to what they were before } m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlSwapEditModeButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; //empty the list box anyway //m_p_oItemListBox->ResetContent(); if ( m_eEditMode != E_em_NameListEdit ) //we enter name list edition mode { ASSERT(m_p_oCurrentSelectedList); m_eEditMode = E_em_NameListEdit; //update the various displays m_p_oSwapEditModeButton->SetWindowText("Swap to name list selection mode"); m_p_oEditGroupTitle->SetWindowText("Current selected name"); m_p_oItemListTitle->SetWindowText( CString("List of names in list ") + m_p_oCurrentSelectedList->m_csGetName() ); m_p_oVirgeRadioButton->ShowWindow(TRUE); m_p_oSharedRadioButton->ShowWindow(TRUE); m_p_oCommonRadioButton->ShowWindow(TRUE); //a new item can be set to Virge only if there are no object list or if the name list //already has a virge field CPA_tdoNameList *p_oNameList = m_p_oCurrentSelectedList->m_p_oGetAssociatedList(); m_p_oVirgeRadioButton->EnableWindow( m_p_stArgs->stIn.bModelCanSelectANameList || (!p_oNameList || p_oNameList->m_bHasAVirgeField()) ); //fill the listbox with the contents of the current name list m_p_oListModifHandler->m_vFillControls(m_p_oItemListBox, m_p_oNameEdit, m_p_oCurrentSelectedList); /*POSITION xPos; m_p_oCurrentSelectedNameList->GetHeadElement(xPos); while ( xPos ) { tdoObjectName *p_oName = m_p_oCurrentSelectedNameList->GetNext(xPos); int iIndex = m_p_oItemListBox->AddString(p_oName->GetName()); m_p_oItemListBox->SetItemData(iIndex, p_oName->m_eGetShareMode()); } m_p_oItemListBox->SetCurSel(LB_ERR);*/ M_vFakeMessage(OnEnlListBoxSelChange); } else if ( m_eEditMode != E_em_NameListSelect ) //we enter name list choice mode { m_eEditMode = E_em_NameListSelect; m_p_oSwapEditModeButton->SetWindowText("Swap to list edition mode"); m_p_oEditGroupTitle->SetWindowText("Current selected list"); m_p_oItemListTitle->SetWindowText( CString("List of name lists for family ") + ((CPA_BaseObject *) m_p_stArgs->stIn.p_oEditorActor->m_pclActor->m_pub_fn_pclGetFamily())->GetName() ); m_p_oVirgeRadioButton->ShowWindow(FALSE); m_p_oSharedRadioButton->ShowWindow(FALSE); m_p_oCommonRadioButton->ShowWindow(FALSE); //fill the listbox with the list of name lists m_p_oListModifHandler->m_vFillControls(m_p_oItemListBox, m_p_oNameEdit, NULL); /*//Gets the current Family List CPA_ReachableObjectList oNameListList; g_pclInterface->GetMainWorld()->fn_lFindObjects( &oNameListList, "", // obj name (char *) m_p_stArgs->stIn.p_c_szNameListType, (CPA_ReachableObject *) m_p_stArgs->stIn.p_oEditorActor->m_fn_pclGetFamily() // owner ); POSITION xPos; oNameListList.GetHeadElement(xPos); while ( xPos ) { CPA_tdoNameList *p_oNameList = (CPA_tdoNameList *) oNameListList.GetNext(xPos)->GetObject(); int iIndex = m_p_oItemListBox->AddString(p_oNameList->GetName()); m_p_oItemListBox->SetItemDataPtr(iIndex, p_oNameList); } //emtpy the list before it is destroyed... oNameListList.RemoveAll(); m_p_oItemListBox->SetCurSel(LB_ERR);*/ M_vFakeMessage(OnEnlListBoxSelChange); } else ASSERT(FALSE); m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlListBoxSelChange() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; int iIndex = m_p_oItemListBox->GetCurSel(); //either the change failed, and the edit is empty, or is succeded and the edit //holds the name of the selected item //-> and nothing can be done with the rename button in either case m_p_oRenameButton->EnableWindow(FALSE); //irrelevant for E_em_NameListSelect, but useful when no item is selected... BOOL bCanTakeVirgeMode = !m_p_oCurrentSelectedList || m_p_stArgs->stIn.bModelCanSelectANameList || !m_p_oCurrentSelectedList->m_bWasHereOnInit() || m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->m_bHasAVirgeField(); if ( iIndex == LB_ERR ) { //we can swap mode only from list edition to list selection, and if the current list //was not modified m_p_oSwapEditModeButton->EnableWindow((m_eEditMode == E_em_NameListSelect) ? FALSE : !m_bUserEditedAList); //no item is selected yet, so clear the other controls m_p_oNameEdit->SetWindowText(""); //m_p_oVirgeRadioButton->EnableWindow(TRUE); m_p_oSharedRadioButton->EnableWindow(TRUE); m_p_oCommonRadioButton->EnableWindow(TRUE); m_p_oVirgeRadioButton->EnableWindow(bCanTakeVirgeMode); m_p_oDeleteButton->EnableWindow(FALSE); //we cannot add, because empty is not a defined name m_p_oAddButton->EnableWindow(FALSE); } else //a valid item was selected { /*m_p_oVirgeRadioButton->EnableWindow(TRUE); m_p_oSharedRadioButton->EnableWindow(TRUE); m_p_oCommonRadioButton->EnableWindow(TRUE);*/ if ( m_eEditMode == E_em_NameListSelect ) //we display the list of name lists { //remember which list was selected last m_p_oCurrentSelectedList = (tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(iIndex); //we can enter list edit mode only if the is the list of the model m_p_oSwapEditModeButton->EnableWindow(m_p_oCurrentSelectedList == m_p_oListSelectedForModel); //we can delete the list only if it has no associated object list, or if it is a list we //just created (hence it does not have an associated existing name list, hence no object //list will be affected either CPA_tdoNameList *p_oNameList = m_p_oCurrentSelectedList->m_p_oGetAssociatedList(); m_p_oDeleteButton->EnableWindow( (!p_oNameList) || (p_oNameList->m_pEdtListHandler->fn_oGetListOfEdtLists()->GetCount() <= 0) ); } else if ( m_eEditMode == E_em_NameListEdit ) //we display the list of names for the model's list { tdoDummyName *p_oName = (tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(iIndex); //set the share buttons according to the selected item status m_vSetRadioShareMode(p_oName->m_eGetShareMode()); //if the name was here on init, and is Virge, and the name list has object list, the mode cannot be changed BOOL bCannotLeaveVirgeMode = ( p_oName->m_bWasHereOnInit() && p_oName->m_p_oGetAssociatedName()->m_eGetShareMode() == E_sm_Virge && m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->m_pEdtListHandler->fn_oGetListOfEdtLists()->GetCount() > 0 //there are object lists ); m_p_oCommonRadioButton->EnableWindow(!bCannotLeaveVirgeMode); m_p_oSharedRadioButton->EnableWindow(!bCannotLeaveVirgeMode); m_p_oVirgeRadioButton->EnableWindow(bCanTakeVirgeMode); //we can go back to selection mode only if the current list has not been edited m_p_oSwapEditModeButton->EnableWindow(!m_bUserEditedAList); //we can delete the current name from the list only if the section for the associated name list //does not exist yet or if this is a brand new list m_p_oDeleteButton->EnableWindow( !m_p_oCurrentSelectedList->m_bWasHereOnInit() || !m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->fn_bSectionExists() ); } else ASSERT(FALSE); CString csNameToEdit, csNameInEdit; m_p_oNameEdit->GetWindowText(csNameInEdit); csNameInEdit = g_pclInterface->GetInterface()->GetPrefixedName(csNameInEdit); if ( m_eEditMode == E_em_NameListEdit ) csNameToEdit = ((tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(iIndex))->m_csGetName(); else csNameToEdit = ((tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(iIndex))->m_csGetName(); //put the name in the edit if ( csNameInEdit != csNameToEdit ) m_p_oNameEdit->SetWindowText(csNameToEdit); //we cannot add another item with the name of the selected item m_p_oAddButton->EnableWindow(FALSE); } m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlAddButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; CString csEditText; m_p_oNameEdit->GetWindowText(csEditText); csEditText = g_pclInterface->GetInterface()->GetPrefixedName(csEditText); if ( m_eEditMode == E_em_NameListSelect ) //we add a list { tdoDummyNameList *p_oAddedList = m_p_oListModifHandler->m_p_oAcceptListAdd(csEditText); if ( p_oAddedList ) { if ( m_p_oListSelectedForModel == NULL ) m_p_oListSelectedForModel = p_oAddedList; short wIndex = m_p_oItemListBox->AddString(p_oAddedList->m_csGetName()); m_p_oItemListBox->SetItemDataPtr(wIndex, p_oAddedList); m_p_oItemListBox->SetCurSel(wIndex); M_vFakeMessage(OnEnlListBoxSelChange); if ( m_p_oListSelectedForModel == p_oAddedList ) //if this is the list for the model M_vFakeMessage(OnEnlSwapEditModeButtonClicked); //go directly to edit it } } else //we add a name in the current list { tdeShareMode eShareMode = m_eGetRadioShareMode(); tdoDummyName *p_oAddedName = m_p_oListModifHandler->m_p_oAcceptNameAdd( m_p_oCurrentSelectedList->m_csGetName(), csEditText, eShareMode == E_sm_None ? E_sm_Common : eShareMode ); if ( p_oAddedName ) { m_bUserEditedAList = TRUE; short wIndex = m_p_oItemListBox->AddString(p_oAddedName->m_csGetName()); m_p_oItemListBox->SetItemDataPtr(wIndex, p_oAddedName); m_p_oItemListBox->SetCurSel(wIndex); M_vFakeMessage(OnEnlListBoxSelChange); } } //next time we press RETURN will activate the Ok button m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlDeleteButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; CString csEditText; m_p_oNameEdit->GetWindowText(csEditText); csEditText = g_pclInterface->GetInterface()->GetPrefixedName(csEditText); short wSelIndex = m_p_oItemListBox->GetCurSel(); ASSERT(wSelIndex != LB_ERR); //just a failsafe, should never occur... tdoDummyNameList *p_oList = (tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(wSelIndex); CPA_tdoNameList *p_oNameList = p_oList->m_p_oGetAssociatedList(); if ( p_oNameList && (m_eEditMode == E_em_NameListSelect) ) //we delete an existing name list { //if some instances use that list, ask the operator if he want to proceed CList oFatherList; int iNbFathers = g_oCoherenceManager.m_fn_iGetFatherList(p_oNameList, &oFatherList); if ( iNbFathers > 0 ) { CString csFatherNames = "The following models (and their instances) are using this name list.\n" "Are you sure you want to destroy it ?\n\n"; POSITION xFatherPos; xFatherPos = oFatherList.GetHeadPosition(); //add each name to the string while ( xFatherPos ) { csFatherNames += oFatherList.GetNext(xFatherPos)->GetName(); csFatherNames += "\n"; } //ask if the designer wants to destroy the object list if ( AfxMessageBox(csFatherNames, MB_YESNO) != IDYES ) { m_bAutodispatch = FALSE; return; } } } BOOL bResult = FALSE; if ( m_eEditMode == E_em_NameListSelect ) //we delete a list bResult = m_p_oListModifHandler->m_bAcceptListDelete(csEditText); else //we delete a name from the current list bResult = m_p_oListModifHandler->m_bAcceptNameDelete( m_p_oCurrentSelectedList->m_csGetName(), csEditText ); //update display if ( bResult ) { if ( m_eEditMode == E_em_NameListSelect ) //we delete a list { if ( m_p_oListSelectedForModel == p_oList ) //if this is the list selected for the model { //clear the selection m_p_oListSelectedForModel = NULL; //redisplay all controls as should be m_p_oItemListBox->Invalidate(); } } else m_bUserEditedAList = TRUE; m_p_oItemListBox->DeleteString(wSelIndex); m_p_oItemListBox->SetCurSel(LB_ERR); M_vFakeMessage(OnEnlListBoxSelChange); } m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlRenameButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; short wSelIndex = m_p_oItemListBox->GetCurSel(); ASSERT(wSelIndex != LB_ERR); //just a failsafe, should never occur... CString csEditText, csOriginalName; m_p_oNameEdit->GetWindowText(csEditText); csEditText = g_pclInterface->GetInterface()->GetPrefixedName(csEditText); csOriginalName = (m_eEditMode == E_em_NameListEdit) ? ((tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(wSelIndex))->m_csGetName() : ((tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(wSelIndex))->m_csGetName(); if ( csOriginalName != csEditText ) //just a failsafe, should never occur... { BOOL bResult = FALSE; if ( m_eEditMode == E_em_NameListSelect ) //we rename a list bResult = m_p_oListModifHandler->m_bAcceptListRename(csOriginalName, csEditText); else //we rename a name in the current list bResult = m_p_oListModifHandler->m_bAcceptNameRename( m_p_oCurrentSelectedList->m_csGetName(), csOriginalName, csEditText ); //update display if ( bResult ) { /*//we cannot add or rename again, since an object with the name in the edit now exists m_p_oAddButton->EnableWindow(FALSE); m_p_oRenameButton->EnableWindow(FALSE); //but we can delete because the forementionned object is selected m_p_oDeleteButton->EnableWindow(FALSE);*/ m_p_oItemListBox->Invalidate(); //M_vFakeMessage(OnEnlListBoxSelChange); } } m_vSetDefaultButton(m_p_oOkButton); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== BOOL EdActors_EditNameListsDialog::m_bIconClickedInListBox(CPoint oPoint) { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return FALSE; m_bAutodispatch = TRUE; short wSelectedItem = m_p_oItemListBox->GetCurSel(); short wNbItems = m_p_oItemListBox->GetCount(); m_p_oItemListBox->ClientToScreen(&oPoint); CRect oListRect; m_p_oItemListBox->GetWindowRect(&oListRect); if ( oListRect.PtInRect(oPoint) ) { short wClickedItem = LB_ERR; for ( short wItem = 0; wItem < wNbItems; wItem ++ ) { //get the item rect in the list's rect coordinates CRect oIconRect, oClientItemRect; m_p_oItemListBox->GetItemRect(wItem, &oClientItemRect); oIconRect = oClientItemRect; //convert the item rect in screen coordinates oIconRect.OffsetRect(oListRect.TopLeft()); //before we shrink to the icon's size, check if we clicked in the full rectangle if ( oIconRect.PtInRect(oPoint) ) wClickedItem = wItem; //we test only the left part, where the icon is drawn oIconRect.right = oIconRect.left + oIconRect.Height(); //if we clicked on the icon if ( oIconRect.PtInRect(oPoint) ) { if ( m_eEditMode == E_em_NameListEdit ) //we want to change the share mode { //the user edited a list -> we cannot get back into list selection mode m_bUserEditedAList = TRUE; tdoDummyName *p_oName = (tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(wItem); tdeShareMode eNewMode; //get the old mode eNewMode = p_oName->m_eGetShareMode(); //compute the new mode if ( eNewMode == E_sm_Common ) eNewMode = E_sm_Shared; else if ( eNewMode == E_sm_Shared ) { //if the model has instances, he cannot make a name specific, so we swap back to common BOOL bCanTakeVirgeMode = !m_p_oCurrentSelectedList || m_p_stArgs->stIn.bModelCanSelectANameList || !m_p_oCurrentSelectedList->m_bWasHereOnInit() || m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->m_bHasAVirgeField(); eNewMode = bCanTakeVirgeMode ? E_sm_Virge : E_sm_Common; } else if ( eNewMode == E_sm_Virge ) { //if the name was here on init, and is Virge, and the name list has object list, the mode cannot be changed BOOL bCannotLeaveVirgeMode = ( p_oName->m_bWasHereOnInit() && p_oName->m_p_oGetAssociatedName()->m_eGetShareMode() == E_sm_Virge && m_p_oCurrentSelectedList->m_p_oGetAssociatedList()->m_pEdtListHandler->fn_oGetListOfEdtLists()->GetCount() > 0 //there are object lists ); m_p_oCommonRadioButton->EnableWindow(!bCannotLeaveVirgeMode); m_p_oSharedRadioButton->EnableWindow(!bCannotLeaveVirgeMode); //determine the new mode eNewMode = bCannotLeaveVirgeMode ? E_sm_Virge : E_sm_Common; //if we couyd change the mode, the list was edited, else is was not... m_bUserEditedAList = !bCannotLeaveVirgeMode; } else ASSERT(FALSE); //put the new mode in the item p_oName->m_vSetShareMode(eNewMode); //update the radio buttons if we modify the selected item if ( wItem == m_p_oItemListBox->GetCurSel() ) m_vSetRadioShareMode(p_oName->m_eGetShareMode()); //make the listbox redraw the icon m_p_oItemListBox->InvalidateRect(oClientItemRect); //the user edited a list -> we cannot get back into list selection mode //m_bUserEditedAList = TRUE; m_p_oSwapEditModeButton->EnableWindow(!m_bUserEditedAList); //reenable message handling before returning m_bAutodispatch = FALSE; return TRUE; //short-circuit standard behaviour } else /* m_eEditMode == E_em_NameListSelect */ //we want to make the model use the clicked list { //we dont have the right to select another name list if ( !m_p_stArgs->stIn.bModelCanSelectANameList ) { m_bAutodispatch = FALSE; return TRUE; //the click is handled, but we do nothing... } //failsafe test: //we should never be in name list selection mode if the user modified a list, //because the user cannot get back into list selection mode after having modified a list //TODO: a model cannot change name list if the instances have object lists !!! if ( !m_bUserEditedAList ) { //get the clicked name list tdoDummyNameList *p_oList = (tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(wItem); if ( p_oList != m_p_oListSelectedForModel ) m_p_oListSelectedForModel = p_oList; else m_p_oListSelectedForModel = NULL; //redisplay all controls as should be m_p_oItemListBox->Invalidate(); M_vFakeMessage(OnEnlListBoxSelChange); } //reenable message handling before returning m_bAutodispatch = FALSE; return TRUE; } } else if ( wClickedItem != LB_ERR ) //we clicked outside the icon of the item, but on an item nonetheless { if ( wSelectedItem == wClickedItem ) //if we clicked on the selected item { m_p_oItemListBox->SetCurSel(LB_ERR); M_vFakeMessage(OnEnlListBoxSelChange); //reenable message handling before returning m_bAutodispatch = FALSE; return TRUE; } } } //item loop } //clicked in CListBox client area //reenable message handling before returning m_bAutodispatch = FALSE; //we did not click on the icon, so resume standard behaviour return FALSE; } //========================================================================== //========================================================================== BOOL EdActors_EditNameListsDialog::OnInitDialog() { short /*wIndex, wMode, wOk,*/ wModelIndex = LB_ERR; CDialog::OnInitDialog(); //Creates tool tips m_poToolTip = new CToolTipCtrl; m_poToolTip->Create(this, WS_VISIBLE | TTS_ALWAYSTIP); EnableToolTips(TRUE); CString oDialogTitle; GetWindowText(oDialogTitle); SetWindowText(oDialogTitle + " (" + m_p_stArgs->stIn.p_c_szScriptName + ")"); M_vRegisterControl(m_p_oNameEdit, CEdit *, IDC_EDIT_ENL_NAME, 0, "enter a new name"); M_vRegisterControl(m_p_oEditGroupTitle, CStatic *, IDC_STATIC_ENL_GROUP, 1, "type of edited items"); M_vRegisterControl(m_p_oItemListTitle, CStatic *, IDC_STATIC_ENL_ITEMLIST, 2, "type of listed items"); M_vRegisterControl(m_p_oSwapEditModeButton, CButton *, IDC_BUTTON_ENL_CURRENTMODE, 3, "swap the edit mode"); M_vRegisterControl(m_p_oAddButton, CButton *, IDC_BUTTON_ENL_ADD, 4, "add a new item"); M_vRegisterControl(m_p_oRenameButton, CButton *, IDC_BUTTON_ENL_RENAME, 5, "rename the current item"); M_vRegisterControl(m_p_oDeleteButton, CButton *, IDC_BUTTON_ENL_DELETE, 6, "delete the current item"); M_vRegisterControl(m_p_oCommonRadioButton, CButton *, IDC_RADIO_ENL_COMMON, 7, "change the item's share mode"); M_vRegisterControl(m_p_oSharedRadioButton, CButton *, IDC_RADIO_ENL_SHARED, 8, "change the item's share mode"); M_vRegisterControl(m_p_oVirgeRadioButton, CButton *, IDC_RADIO_ENL_SPECIFIC, 9, "change the item's share mode"); M_vRegisterControl(m_p_oItemListBox, CListBox *, IDC_LIST_ENL_ITEMLIST, 10, "select an item to edit"); M_vRegisterControl(m_p_oOkButton, CButton *, IDOK, 11, "Irremediably accept all changes"); M_vRegisterControl(m_p_oCancelButton, CButton *, IDCANCEL, 12, "Cancel all changes"); // Register the controls for the tutorial TUT_M_vGetTutDll (); TUT_M_vRegisterControlID (IDC_EDIT_ENL_NAME , "OAC_NL_NewName" , TUT_e_TextEdit); TUT_M_vRegisterControlID (IDC_BUTTON_ENL_CURRENTMODE , "OAC_NL_ChangeMode" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_BUTTON_ENL_ADD , "OAC_NL_Add" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_BUTTON_ENL_RENAME , "OAC_NL_Rename" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_BUTTON_ENL_DELETE , "OAC_NL_Delete" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_RADIO_ENL_COMMON , "OAC_NL_Common" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_RADIO_ENL_SHARED , "OAC_NL_Shared" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_RADIO_ENL_SPECIFIC , "OAC_NL_Specific" , TUT_e_Button ); TUT_M_vRegisterControlID (IDC_LIST_ENL_ITEMLIST , "OAC_NL_List" , TUT_e_ListBox ); TUT_M_vRegisterControlID (IDOK , "OAC_NL_Ok" , TUT_e_Button ); TUT_M_vRegisterControlID (IDCANCEL , "OAC_NL_Cancel" , TUT_e_Button ); m_p_stArgs->stOut.p_oNameListSelectedForModel = m_p_stArgs->stIn.p_oCurrentNameList; m_p_oListSelectedForModel = m_p_oCurrentSelectedList = m_p_oListModifHandler->m_p_oGetListforNameList(m_p_stArgs->stOut.p_oNameListSelectedForModel); //load the icons m_hIconCommon = M_GetMainApp()->LoadIcon(IDI_ICON_COMMON_MODE); m_hIconShared = M_GetMainApp()->LoadIcon(IDI_ICON_SHARED_MODE); m_hIconVirge = M_GetMainApp()->LoadIcon(IDI_ICON_VIRGE_MODE); m_hIconChecked = M_GetMainApp()->LoadIcon(IDI_ICON_BOOLCHECK); //enter the correct mode if ( m_p_stArgs->stIn.p_oCurrentNameList ) //if the model has a name list, edit it m_eEditMode = E_em_NameListSelect; else m_eEditMode = E_em_NameListEdit; M_vFakeMessage(OnEnlSwapEditModeButtonClicked); m_bAutodispatch = FALSE; //now fill the combo and edit with what we got //m_p_oListModifHandler->m_vFillControls(m_p_oItemListBox, m_p_oNameEdit, m_p_oCurrentSelectedList); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnEnlDefaultButtonClicked() { //do not handle calls generated by automodifications if ( m_bAutodispatch ) return; m_bAutodispatch = TRUE; if ( m_p_oDefaultButton == m_p_oOkButton ) M_vFakeMessage(OnOK); else if ( m_p_oDefaultButton == m_p_oAddButton ) M_vFakeMessage(OnEnlAddButtonClicked); else if ( m_p_oDefaultButton == m_p_oSwapEditModeButton ) M_vFakeMessage(OnEnlSwapEditModeButtonClicked); else ASSERT(m_p_oDefaultButton == NULL); m_bAutodispatch = FALSE; } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::OnOK() { //update the out structure only if the changes are accepted m_p_oListModifHandler->m_vModifsAreAccepted(this); CDialog::OnOK(); } //========================================================================== //========================================================================== /*void EdActors_EditNameListsDialog::OnMeasureItem(int _nIDCtl, LPMEASUREITEMSTRUCT _lpMeasureItemStruct) { ASSERT(_nIDCtl == IDC_LIST_ENL_ITEMLIST ); _lpMeasureItemStruct->itemWidth = 100; _lpMeasureItemStruct->itemHeight = 20; }*/ void EdActors_EditNameListsDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT _lpDrawItemStruct) { if ( nIDCtl == IDC_LIST_ENL_ITEMLIST ) { //draw the line of the list box CDC *pDC = CDC::FromHandle (_lpDrawItemStruct->hDC); // Get the drawing device RECT xItemRect = _lpDrawItemStruct->rcItem; // Get the position to draw short wItemId = _lpDrawItemStruct->itemID; //item to redraw BOOL bSelected = _lpDrawItemStruct->itemState & ODS_SELECTED; // Get if the line is selected or not CString csStringToDraw; pDC->SetMapMode(MM_TEXT); // Select colors pDC->FillSolidRect(&xItemRect, GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW)); if ( wItemId != LB_ERR ) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(GetSysColor (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT)); if ( m_eEditMode == E_em_NameListEdit ) { tdoDummyName *p_oName = (tdoDummyName *) m_p_oItemListBox->GetItemDataPtr(wItemId); // Draw the icon for shared mode tdeShareMode eShareMode = p_oName->m_eGetShareMode(); if ( eShareMode != E_sm_None ) { HICON hIconToDraw; switch ( eShareMode ) { case E_sm_Common : hIconToDraw = m_hIconCommon; break; case E_sm_Shared : hIconToDraw = m_hIconShared; break; case E_sm_Virge : hIconToDraw = m_hIconVirge; break; default : ASSERT (0); } pDC->DrawIcon(xItemRect.left, xItemRect.top, hIconToDraw); } csStringToDraw = p_oName->m_csGetName(); } else { tdoDummyNameList *p_oList = (tdoDummyNameList *) m_p_oItemListBox->GetItemDataPtr(wItemId); //name list //draw the checkmark if this is the current name list for the model if ( m_p_oListSelectedForModel == p_oList ) pDC->DrawIcon(xItemRect.left, xItemRect.top, m_hIconChecked); //get the name list's name csStringToDraw = p_oList->m_csGetName(); } //draw the items's name xItemRect.left += 16; pDC->DrawText ((char *)LPCTSTR(csStringToDraw), -1 , &xItemRect, DT_SINGLELINE | DT_LEFT | DT_VCENTER); } } else CDialog::OnDrawItem(nIDCtl, _lpDrawItemStruct); } //========================================================================== //========================================================================== void EdActors_EditNameListsDialog::m_vSetRadioShareMode(tdeShareMode _eShareMode) { m_p_oCommonRadioButton->SetCheck(_eShareMode == E_sm_Common); m_p_oSharedRadioButton->SetCheck(_eShareMode == E_sm_Shared); m_p_oVirgeRadioButton->SetCheck(_eShareMode == E_sm_Virge); } //========================================================================== //========================================================================== tdeShareMode EdActors_EditNameListsDialog::m_eGetRadioShareMode() { tdeShareMode eNewMode; if ( m_p_oCommonRadioButton->GetCheck() ) eNewMode = E_sm_Common; else if ( m_p_oSharedRadioButton->GetCheck() ) eNewMode = E_sm_Shared; else if ( m_p_oVirgeRadioButton->GetCheck() ) eNewMode = E_sm_Virge; else eNewMode = E_sm_None; return eNewMode; } void EdActors_EditNameListsDialog::OnDestroy () { // Unregister the controls for the tutorial TUT_M_vGetTutDll (); TUT_M_vUnregisterControlID (IDC_EDIT_ENL_NAME ); TUT_M_vUnregisterControlID (IDC_BUTTON_ENL_CURRENTMODE); TUT_M_vUnregisterControlID (IDC_BUTTON_ENL_ADD ); TUT_M_vUnregisterControlID (IDC_BUTTON_ENL_RENAME ); TUT_M_vUnregisterControlID (IDC_BUTTON_ENL_DELETE ); TUT_M_vUnregisterControlID (IDC_RADIO_ENL_COMMON ); TUT_M_vUnregisterControlID (IDC_RADIO_ENL_SHARED ); TUT_M_vUnregisterControlID (IDC_RADIO_ENL_SPECIFIC ); TUT_M_vUnregisterControlID (IDC_LIST_ENL_ITEMLIST ); TUT_M_vUnregisterControlID (IDOK ); TUT_M_vUnregisterControlID (IDCANCEL ); CDialog::OnDestroy (); }