reman3/Rayman_X/cpa/tempgrp/OAC/Src/EdActors/EDACDgNL.cpp

1662 lines
59 KiB
C++
Raw Permalink Blame History

// 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<CPA_BaseObject> 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<69> 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<CPA_BaseObject> 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<CPA_BaseObject> 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<CPA_BaseObject *, CPA_BaseObject *> 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 ();
}