reman3/Rayman_X/cpa/tempgrp/ITF/cpadlist.cpp

1285 lines
38 KiB
C++

/*=========================================================================
*
* CPAdList.cpp : Lists - Implementation file
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "itf/CPAdList.hpp"
#include "itf/CPAProj.hpp"
#include "itf/DEVMul3D.hpp"
#include "itf/DEVVp3D.hpp"
// positions for the OnSize message
#define C_ComboPy 5
#define C_ComboCx 150
#define C_ComboCy 120
#define C_ButtonPx 5
#define C_ButtonPy 30
#define C_ButtonCy 20
#define C_ListPx 5
#define C_ListPy 55
//#################################################################################
// CPA_ListForDialog
//#################################################################################
/*----------------------------------------
Constructor for Hierarchy Mode
----------------------------------------*/
CPA_ListForDialog::CPA_ListForDialog (CString csName, CPA_BaseObject *pTreeRoot,
CImageList *pIconList, CImageList *pStateList)
{
// hierarchy mode
m_eDrawMode = E_ldm_Tree;
// init name
m_csName = csName;
// init list of icons
m_pIconList = pIconList;
m_pStateList = pStateList;
// init hierarchy
m_pTreeRoot = pTreeRoot;
// no list of objects
m_pSortedList = NULL;
}
/*----------------------------------------
Constructor for List Mode
----------------------------------------*/
CPA_ListForDialog::CPA_ListForDialog (CString csName, CPA_BaseObjectList *pListObjects,
CImageList *pIconList, CImageList *pStateList,
tdeListOrder eDefaultOrder, BOOL bCanChangeOrder,
long lDefaultStyle, BOOL bCanChangeStyle)
{
// list mode
m_eDrawMode = E_ldm_List;
// init name
m_csName = csName;
// init list of objects
m_pSortedList = pListObjects;
// init list of icons
m_pIconList = pIconList;
m_pStateList = pStateList;
// no hierarchy
m_pTreeRoot = NULL;
// init order
m_eListOrder = eDefaultOrder;
m_bCanChangeOrder = bCanChangeOrder;
// init style
m_lDrawStyle = lDefaultStyle;
m_bCanChangeStyle = bCanChangeStyle;
}
/*----------------------------------------
Destructor
----------------------------------------*/
CPA_ListForDialog::~CPA_ListForDialog ()
{
}
/*----------------------------------------
Order
----------------------------------------*/
void CPA_ListForDialog::SetOrder (tdeListOrder eOrder)
{
if (m_bCanChangeOrder)
m_eListOrder = eOrder;
}
/*----------------------------------------
Style
----------------------------------------*/
void CPA_ListForDialog::SetStyle (long lStyle)
{
if (m_bCanChangeStyle)
m_lDrawStyle = lStyle;
}
//#################################################################################
// CPA_DialogList dialog
//#################################################################################
/*----------------------------------------
----------------------------------------*/
CPA_DialogList::CPA_DialogList(CWnd* pParent)
: CFormView(CPA_DialogList::IDD)
{
//{{AFX_DATA_INIT(CPA_DialogList)
//}}AFX_DATA_INIT
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPA_DialogList)
DDX_Control(pDX, CPA_IDC_COMBOTYPE, m_cComboType);
DDX_Control(pDX, CPA_IDC_LISTOBJECTS, m_cListObjects);
DDX_Control(pDX, CPA_IDC_HIERARCHY, m_cHierarchy);
DDX_Control(pDX, CPA_IDC_BUTTONTEST, m_cButtonTest);
//}}AFX_DATA_MAP
}
/*----------------------------------------
----------------------------------------*/
BEGIN_MESSAGE_MAP(CPA_DialogList, CFormView)
//{{AFX_MSG_MAP(CPA_DialogList)
// combo
ON_CBN_SELCHANGE(CPA_IDC_COMBOTYPE, OnSelchangeComboType)
// button
ON_BN_CLICKED(CPA_IDC_BUTTONTEST, OnButtonTest)
// list objects
ON_NOTIFY(LVN_ITEMCHANGED, CPA_IDC_LISTOBJECTS, OnSelchangeListObjects)
ON_NOTIFY(NM_DBLCLK, CPA_IDC_LISTOBJECTS, OnDblClkListObjects)
// hierarchy tree
ON_NOTIFY(TVN_SELCHANGED, CPA_IDC_HIERARCHY, OnSelchangeHierarchy)
ON_NOTIFY(TVN_BEGINDRAG, CPA_IDC_HIERARCHY, OnBeginDragHierarchy)
ON_NOTIFY(NM_DBLCLK, CPA_IDC_HIERARCHY, OnDblClkHierarchy)
// general
ON_WM_DRAWITEM()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//#################################################################################
// CPA_DialogList Inits
//#################################################################################
/*===========================================================================
* Description: Init dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitDialog (CPA_EditorBase *pOwnerEditor, CWnd *pParent)
{
// create the dialog
m_bInitialised = FALSE;
m_pOwnerEditor = pOwnerEditor;
CFormView::Create(NULL, "", WS_VISIBLE|WS_CHILD/*AFX_WS_DEFAULT_VIEW*/, CRect(0,0,120,180), pParent, AFX_IDW_PANE_FIRST, NULL);
m_pSelectedObject = NULL;
m_pSelectedParent = NULL;
m_pClickedObject = NULL;
m_pClickedParent = NULL;
m_pCurrentList = NULL;
// init data for dialog
CFormView::UpdateData(FALSE);
m_cListObjects.SetParentDialog(this);
m_cListObjects.SetOwnerEditor(m_pOwnerEditor);
m_cHierarchy.SetParentDialog(this);
m_cHierarchy.SetOwnerEditor(m_pOwnerEditor);
}
/*===========================================================================
* Description: Init the lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitAllLists (void)
{
// RAZ
m_stListOfListObjects.RemoveAll();
m_pCurrentList = NULL;
m_csTestName.Empty();
m_csTypeName.Empty();
m_bButtonState = FALSE;
m_bTestEnabled = FALSE;
// ask for the lists
m_pOwnerEditor->GetListsForDialog(this);
m_pOwnerEditor->fn_vInitDefaultParameters(this);
m_pCurrentList = GetListFromName(m_csTypeName);
m_bInitialised = TRUE;
}
/*===========================================================================
* Description: init the combo box
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitComboType (void)
{
CPA_ListForDialog *pListDialog;
POSITION pos;
int iIndex;
// RAZ
m_cComboType.ResetContent();
// fill the list of the combo with the available types
for (pListDialog = m_stListOfListObjects.GetHeadElement(pos); pListDialog;
pListDialog = m_stListOfListObjects.GetNextElement(pos))
m_cComboType.AddString(pListDialog->GetName());
// set the current selection
iIndex = m_cComboType.FindStringExact(-1, m_csTypeName);
m_cComboType.SetCurSel(iIndex);
// ask for a new test
m_pOwnerEditor->fn_vSetANewTest(this, m_csTypeName);
}
/*===========================================================================
* Description: reinit dialog when select mode has changed
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vReinitDialog (void)
{
int iInd;
// init the combo box
fn_vInitComboType();
// find current selection in combo
if (!m_pCurrentList)
{
m_cHierarchy.fn_vDeleteHierarchyTree();
m_cHierarchy.ShowWindow(SW_HIDE);
m_cListObjects.DeleteAllItems();
m_cListObjects.ShowWindow(SW_HIDE);
return;
}
// View Mode List
if (m_pCurrentList->GetMode() == E_ldm_List)
{
// enable listbox
m_cHierarchy.ShowWindow(SW_HIDE);
m_cHierarchy.EnableWindow(FALSE);
m_cListObjects.ShowWindow(SW_SHOW);
m_cListObjects.EnableWindow(TRUE);
// init controls
iInd = m_cComboType.FindStringExact(-1, m_csTypeName);
m_cComboType.SetCurSel(iInd);
fn_vInitButtonTest(m_csTestName, m_bButtonState, m_bTestEnabled);
// reinit the list
fn_vReinitPosition(&m_cListObjects, &m_cListObjects, E_lcp_AdjustAll);
fn_vInitListObjects();
}
// DrawMode Tree
else
{
// init tree control
m_cListObjects.ShowWindow(SW_HIDE);
m_cListObjects.EnableWindow(FALSE);
m_cHierarchy.ShowWindow(SW_SHOW);
m_cHierarchy.EnableWindow(TRUE);
// init controls
iInd = m_cComboType.FindStringExact(-1, m_csTypeName);
m_cComboType.SetCurSel(iInd);
fn_vInitButtonTest(m_csTestName, m_bButtonState, m_bTestEnabled);
// reinit hierarchy
fn_vReinitPosition(&m_cHierarchy, &m_cHierarchy, E_lcp_AdjustAll);
fn_vInitHierarchy();
}
}
/*===========================================================================
* Description: Init Test Function and Button
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitButtonTest (CString csName, BOOL bState, BOOL bEnabled)
{
// set text on the button
m_csTestName = csName;
m_cButtonTest.SetWindowText(m_csTestName);
// set button state
m_bButtonState = bState;
m_cButtonTest.EnableWindow(m_bButtonState);
// enable / disable test
m_bTestEnabled = bEnabled;
}
/*===========================================================================
* Description: reinit position when resized
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vReinitPosition (CWnd *pControl, CWnd *pRef, tdeListControlPos ePos)
{
// RECT AbsolutePosition;
RECT WindowPosition;
int px, py, cx, cy, crx, cry;
GetWindowRect(&WindowPosition);
// pRef->GetWindowRect(&AbsolutePosition);
// calculate relative position
cx = WindowPosition.right - WindowPosition.left;
cy = WindowPosition.bottom - WindowPosition.top;
if (pRef == &m_cComboType)
{
px = 0;
py = C_ComboPy;
crx = C_ComboCx;
cry = C_ComboCy;
}
else if (pRef == &m_cButtonTest)
{
px = C_ButtonPx;
py = C_ButtonPy;
crx = 0;
cry = C_ButtonCy;
}
else
{
px = C_ListPx;
py = C_ListPy;
crx = 0;
cry = 0;
}
// px = AbsolutePosition.left - WindowPosition.left;
// py = AbsolutePosition.top - WindowPosition.top;
// crx = AbsolutePosition.right - AbsolutePosition.left;
// cry = AbsolutePosition.bottom - AbsolutePosition.top;
crx = (crx < cx) ? crx : cx - 10;
// move control accoring to its type
if (ePos == E_lcp_Center)
pControl->MoveWindow((cx-crx)/2, py, crx, cry);
else if (ePos == E_lcp_AdjustWidth)
pControl->MoveWindow(px, py, cx - 2*px, cry);
else
pControl->MoveWindow(px, py, cx - 2*px, cy - py - 5);
}
/*===========================================================================
* Description: fill the hierarchy tree
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitHierarchy (void)
{
HTREEITEM hElem;
HTREEITEM hExpItem, hFatItem;
CPA_TreeItem *pExpItem = NULL;
CPA_TreeItem *pFatItem = NULL;
CPA_BaseObject *pExpObj = NULL;
CPA_BaseObject *pFatObj = NULL;
// keep expand state
if (m_pSelectedObject)
{
hElem = m_cHierarchy.GetCorrespondingItem(m_pSelectedObject, m_pSelectedParent, NULL);
// get item to expand
hExpItem = (hElem) ? m_cHierarchy.GetParentItem(hElem) : NULL;
pExpItem = (hExpItem) ? (CPA_TreeItem *) m_cHierarchy.GetItemData(hExpItem) : NULL;
pExpObj = (pExpItem) ? pExpItem->GetObject() : NULL;
// get father of item to expand
hFatItem = (hExpItem) ? m_cHierarchy.GetParentItem(hExpItem) : NULL;
pFatItem = (hFatItem) ? (CPA_TreeItem *) m_cHierarchy.GetItemData(hFatItem) : NULL;
pFatObj = (pFatItem) ? pFatItem->GetObject() : NULL;
}
// RAZ
m_cHierarchy.fn_vDeleteHierarchyTree();
m_pSelectedObject = NULL;
m_pSelectedParent = NULL;
m_pClickedObject = NULL;
hElem = NULL;
// check current list
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
{
m_cHierarchy.SetTreeRoot(NULL);
m_cHierarchy.SetIconList(NULL, FALSE);
m_cHierarchy.SetStateList(NULL, FALSE);
return;
}
// new hierarchy
m_cHierarchy.SetIconList(m_pCurrentList->GetIconList(), FALSE);
m_cHierarchy.SetStateList(m_pCurrentList->GetStateList(), FALSE);
m_cHierarchy.SetTreeRoot(m_pCurrentList->GetRoot());
// find the current selection
m_pSelectedObject = m_pOwnerEditor->GetDialogSelection(this, m_csTypeName, E_ldm_Tree);
m_pSelectedParent = m_pOwnerEditor->GetDialogParentSelection(this, m_csTypeName);
m_pClickedObject = m_pSelectedObject;
m_pClickedParent = m_pSelectedParent;
// find corresponding item
if (m_pSelectedObject)
hElem = m_cHierarchy.GetCorrespondingItem(m_pSelectedObject, m_pSelectedParent, NULL);
// if there is a current selection, expand it
if (hElem)
{
m_cHierarchy.Expand(hElem, TVE_EXPAND);
m_cHierarchy.SelectItem(hElem);
}
// else try to keep previous expand
else if (pExpObj)
{
hExpItem = m_cHierarchy.GetCorrespondingItem(pExpObj, pFatObj, NULL);
hElem = m_cHierarchy.GetChildItem(hExpItem);
if (hElem)
m_cHierarchy.EnsureVisible(hElem);
else
m_cHierarchy.EnsureVisible(hExpItem);
}
// else no selection
else
m_cHierarchy.SelectItem(NULL);
}
/*===========================================================================
* Description: fill the list box with the names of all the
* objects of the current type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vInitListObjects (void)
{
int iInd;
// RAZ
m_pSelectedObject = NULL;
// find the corresponding list
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_List)||(!m_pCurrentList->GetSortedList()))
{
m_cListObjects.SetSortedList(NULL);
m_cListObjects.SetIconList(NULL, FALSE);
m_cListObjects.SetStateList(NULL, FALSE);
return;
}
// reset the list
m_cListObjects.SetSortedList(NULL);
// update parameters
m_cListObjects.SetIconList(m_pCurrentList->GetIconList(), FALSE);
m_cListObjects.SetStateList(m_pCurrentList->GetStateList(), FALSE);
m_cListObjects.SetOrder(m_pCurrentList->GetOrder(), m_pCurrentList->fn_bCanChangeOrder(), FALSE);
m_cListObjects.SetDrawStyle(m_pCurrentList->GetStyle(), m_pCurrentList->fn_bCanChangeStyle(), FALSE);
// set new list
m_cListObjects.SetSortedList(m_pCurrentList->GetSortedList());
m_cListObjects.OnSize(SIZE_RESTORED, 0, 0);
// find the current selection
m_pSelectedObject = m_pOwnerEditor->GetDialogSelection(this, m_csTypeName, E_ldm_List);
// set selection
if (m_pSelectedObject)
{
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) m_pSelectedObject);
m_cListObjects.SetSelectedItem(iInd);
}
else
m_cListObjects.SetSelectedItem(-1);
}
/*===========================================================================
* Description: fill the list box with the names of all the
* objects of the current type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL CPA_DialogList::fn_bCanInsertElement (CPA_BaseObject *pElem)
{
BOOL bRes;
// test function
bRes = ((!m_bTestEnabled)||(m_pOwnerEditor->fn_bTestFunction(m_csTypeName, m_csTestName, pElem)));
if (bRes)
bRes = ((pElem->fn_bIsAvailable())||(m_cListObjects.GetDisplayGray()));
return bRes;
}
/*===========================================================================
* Description: update dialog when selection changes
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vUpdateSelection (tdeListReinitMode eType)
{
CPA_ListForDialog *pListDialog;
HTREEITEM hElem = NULL;
HTREEITEM hSelected;
int iInd;
// type of update
switch (eType)
{
// update all objects
case E_lrm_ReinitList:
if (!m_pCurrentList)
{
m_cHierarchy.fn_vDeleteHierarchyTree();
m_cListObjects.DeleteAllItems();
return;
}
// update button
fn_vInitButtonTest(m_csTestName, m_bButtonState, m_bTestEnabled);
// update list or tree
if (m_pCurrentList->GetMode() == E_ldm_List)
fn_vInitListObjects();
else
fn_vInitHierarchy();
break;
case E_lrm_ChangeSelection:
// find the current selection
if (!m_pCurrentList)
m_pSelectedObject = NULL;
else
{
m_pSelectedObject = m_pOwnerEditor->GetDialogSelection(this, m_csTypeName, m_pCurrentList->GetMode());
if (m_pCurrentList->GetMode() == E_ldm_Tree)
m_pSelectedParent = m_pOwnerEditor->GetDialogParentSelection(this, m_csTypeName);
}
// no selection => no update
if (!m_pSelectedObject)
{
m_cListObjects.SetSelectedItem(-1);
return;
}
// set list selection
if (m_pCurrentList->GetMode() == E_ldm_List)
{
m_pCurrentList->GetSortedList()->fn_bChangeObjectOrder(m_pSelectedObject, 0, E_lo_Common);
if (m_cListObjects.GetOrder() == E_lo_Common)
{
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) m_pSelectedObject);
m_cListObjects.DeleteItem(iInd);
iInd = m_cListObjects.InsertNewItem(0, m_pSelectedObject);
}
else
{
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) m_pSelectedObject);
m_cListObjects.SetSelectedItem(iInd);
}
}
// set tree selection
else
{
hElem = m_cHierarchy.GetCorrespondingItem(m_pSelectedObject, m_pSelectedParent, NULL);
if (hElem)
m_cHierarchy.Expand(hElem, TVE_EXPAND);
m_cHierarchy.SelectItem(hElem);
}
break;
case E_lrm_GoToChild:
case E_lrm_GoToParent:
// reinit viewmode
pListDialog = GetListFromName("Hierarchy");
if ((!pListDialog)||(pListDialog->GetMode() != E_ldm_Tree))
{
m_cHierarchy.fn_vDeleteHierarchyTree();
m_cListObjects.DeleteAllItems();
return;
}
SetCurrentType("Hierarchy");
// find selected item
hSelected = m_cHierarchy.GetCorrespondingItem(m_pSelectedObject, m_pSelectedParent, NULL);
if (eType == E_lrm_GoToChild)
hElem = hSelected;
else
hElem = m_cHierarchy.GetParentItem(hSelected);
// expand node (object or parent)
if (hElem)
m_cHierarchy.Expand(hElem, TVE_EXPAND);
// set current selection
m_cHierarchy.SelectItem(hSelected);
break;
}
}
//#################################################################################
// CPA_DialogList Functions
//#################################################################################
/*===========================================================================
* Description: add a list or a tree to the dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vAddANewTree (CString csName, CPA_BaseObject *pTreeRoot,
CImageList *pIconList, CImageList *pStateList)
{
m_stListOfListObjects.AddTail(new CPA_ListForDialog(csName, pTreeRoot, pIconList, pStateList));
}
void CPA_DialogList::fn_vAddANewList (CString csName, CPA_BaseObjectList *pListObjects,
CImageList *pIconList, CImageList *pStateList,
tdeListOrder eDefaultOrder, BOOL bCanChangeOrder,
long lDefaultStyle, BOOL bCanChangeStyle)
{
m_stListOfListObjects.AddTail(new CPA_ListForDialog(csName, pListObjects, pIconList, pStateList,
eDefaultOrder, bCanChangeOrder, lDefaultStyle,bCanChangeStyle));
}
/*===========================================================================
* Description: remove a list of the dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vDeleteAList (CString csName)
{
CPA_ListForDialog *pListDialog;
POSITION pos = NULL;
pListDialog = GetListFromName(csName);
if (pListDialog)
pos = m_stListOfListObjects.Find(pListDialog, NULL);
if (pos)
{
m_stListOfListObjects.RemoveAt(pos);
delete pListDialog;
}
}
/*===========================================================================
* Description: Find current list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CPA_ListForDialog * CPA_DialogList::GetListFromName (CString csName)
{
CPA_ListForDialog *pListDialog;
POSITION pos;
// check all the lists of dialog
for (pListDialog = m_stListOfListObjects.GetHeadElement(pos); pListDialog;
pListDialog = m_stListOfListObjects.GetNextElement(pos))
{
if (csName == pListDialog->GetName())
return pListDialog;
}
// list was not found
return NULL;
}
/*===========================================================================
* Description: change the type and update dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::SetCurrentType (CString csName)
{
BOOL bRes;
int iInd;
// update parameters
m_csTypeName = csName;
m_pCurrentList = GetListFromName(m_csTypeName);
// update combo
iInd = m_cComboType.FindStringExact(-1, csName);
m_cComboType.SetCurSel(iInd);
// tell owner
bRes = m_pOwnerEditor->fn_bOnSelChangeComboList(this, m_csTypeName);
// default handling
if (!bRes)
fn_vReinitDialog();
}
/*===========================================================================
* Description: change the type and update dialog
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_DialogList::fn_vRedrawElement (CPA_BaseObject *pObject, BOOL bEnsureVisible)
{
int iInd;
// check current list
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_List))
return;
// find current object
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) pObject);
if (iInd == -1)
return;
// redraw item
m_cListObjects.RedrawItems(iInd, iInd);
// if necessary, ensure visible
if (bEnsureVisible)
m_cListObjects.EnsureVisible(iInd, TRUE);
}
//#################################################################################
// CPA_DialogList message handlers
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnSelchangeComboType()
{
BOOL bRes;
// find new selection
m_cComboType.GetLBText(m_cComboType.GetCurSel(), m_csTypeName);
m_pCurrentList = GetListFromName(m_csTypeName);
// tell owner
bRes = m_pOwnerEditor->fn_bOnSelChangeComboList(this, m_csTypeName);
// default handling
if (!bRes)
fn_vReinitDialog();
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnButtonTest (void)
{
BOOL bRes;
// find current selection in combo
if (!m_pCurrentList)
return;
// ask owner
bRes = m_pOwnerEditor->fn_bOnButtonTest(this, m_csTypeName, m_pCurrentList->GetMode());
if (!bRes)
fn_vUpdateSelection(E_lrm_ReinitList);
}
//#################################################################################
// CPA_DialogList message handlers (ListObjects)
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnSelchangeListObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNM_LISTVIEW pNMListView = (LPNM_LISTVIEW)pNMHDR;
BOOL bRes;
BOOL bOldSelect, bNewSelect;
int iInd;
*pResult = 0;
if ((pNMListView->uChanged != LVIF_STATE)||(m_cListObjects.fn_bIsSelecting()))
return;
bOldSelect = (pNMListView->uOldState & LVIS_SELECTED);
bNewSelect = (pNMListView->uNewState & LVIS_SELECTED);
if (bOldSelect != bNewSelect)
{
// find corresponding object
iInd = pNMListView->iItem;
m_pClickedObject = (iInd == -1) ? NULL : (CPA_BaseObject *) m_cListObjects.GetItemData(iInd);
// deselection
m_pSelectedObject = NULL;
m_cListObjects.SetSelectedItem(-1);
// tell owner
bRes = m_pOwnerEditor->fn_bOnSelChangeListObjects(this, m_csTypeName, m_pClickedObject, !bNewSelect);
// default handling
if (!bRes)
{
// set current selection
if ((bNewSelect)&&(m_pClickedObject))
{
m_pSelectedObject = m_pClickedObject;
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) m_pClickedObject);
m_cListObjects.SetSelectedItem(iInd);
}
// update common order
if ((m_cListObjects.GetOrder() == E_lo_Common)&&(m_pClickedObject))
{
m_pCurrentList->GetSortedList()->fn_bChangeObjectOrder(m_pSelectedObject, 0, E_lo_Common);
iInd = m_cListObjects.GetCorrespondingIndex((DWORD) m_pClickedObject);
m_cListObjects.DeleteItem(iInd);
iInd = m_cListObjects.InsertNewItem(0, m_pClickedObject);
}
}
}
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnDblClkListObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNM_LISTVIEW pNMListView = (LPNM_LISTVIEW)pNMHDR;
BOOL bRes;
if (pNMListView->uChanged)
{
if (m_pClickedObject)
{
// tell owner
bRes = m_pOwnerEditor->fn_bOnDblClkListObjects(this, m_csTypeName, m_pClickedObject);
// default handling
if (!bRes)
m_pSelectedObject = m_pClickedObject;
else
{
m_pSelectedObject = NULL;
m_cListObjects.SetSelectedItem(-1);
}
}
}
*pResult = 0;
}
//#################################################################################
// CPA_DialogList message handlers (Hierarchy)
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnSelchangeHierarchy (NMHDR* pNMHDR, LRESULT* pResult)
{
CPA_TreeItem *pItem;
HTREEITEM hCurItem, hFatItem;
BOOL bRes;
LPNM_TREEVIEW pNMTreeView = (LPNM_TREEVIEW)pNMHDR;
if (pNMTreeView->action)
{
hCurItem = m_cHierarchy.GetSelectedItem();
// select the object corresponding to the choice in the list box
if (hCurItem != NULL)
{
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hCurItem);
m_pClickedObject = pItem->GetObject();
hFatItem = m_cHierarchy.GetParentItem(hCurItem);
if (hFatItem != NULL)
{
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hFatItem);
m_pClickedParent = (pItem) ? pItem->GetObject() : NULL;
}
}
if (m_pClickedObject)
{
// tell owner
bRes = m_pOwnerEditor->fn_bOnSelChangeHierarchyTree(this, m_csTypeName, m_pClickedObject, m_pClickedParent);
// default handling
if (!bRes)
{
m_pSelectedObject = m_pClickedObject;
m_pSelectedParent = m_pClickedParent;
}
else
m_cHierarchy.SetItemState(hCurItem, 0, TVIS_SELECTED);
}
}
*pResult = 0;
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnDblClkHierarchy(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNM_TREEVIEW pNMTreeView = (LPNM_TREEVIEW)pNMHDR;
BOOL bRes;
if (pNMTreeView->action)
{
if (m_pClickedObject)
{
// tell owner
bRes = m_pOwnerEditor->fn_bOnDblClkHierarchyTree(this, m_csTypeName, m_pClickedObject, m_pClickedParent);
// default handling
if (!bRes)
{
m_pSelectedObject = m_pClickedObject;
m_pSelectedParent = m_pClickedParent;
}
}
}
*pResult = 0;
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnBeginDragHierarchy (NMHDR* pNMHDR, LRESULT* pResult)
{
CPA_BaseObject *pObjectToDrag = NULL;
CPA_BaseObject *pParentToDrag = NULL;
CPA_TreeItem *pItem;
HTREEITEM hItemToDrag = NULL;
HTREEITEM hParentToDrag = NULL;
BOOL bRes;
// get current list
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
{
m_cHierarchy.SetDraggedItem(NULL);
return;
}
// get item & object to drag
LPNM_TREEVIEW pNMTreeView = (LPNM_TREEVIEW)pNMHDR;
hItemToDrag = pNMTreeView->itemNew.hItem;
if (hItemToDrag)
{
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hItemToDrag);
pObjectToDrag = pItem->GetObject();
hParentToDrag = m_cHierarchy.GetParentItem(hItemToDrag);
if (hParentToDrag)
{
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hParentToDrag);
pParentToDrag = pItem->GetObject();
}
}
// selected ?
if (pObjectToDrag && (pObjectToDrag != m_pSelectedObject))
{
// tell owner
bRes = m_pOwnerEditor->fn_bOnSelChangeHierarchyTree(this, m_csTypeName, pObjectToDrag, pParentToDrag);
// default handling
if (!bRes)
{
m_pSelectedObject = pObjectToDrag;
m_pSelectedParent = pParentToDrag;
}
}
if ((!pObjectToDrag)||(pObjectToDrag != m_pSelectedObject))
{
m_cHierarchy.SetDraggedItem(NULL);
return;
}
// ask permission to dialog owner
bRes = m_pOwnerEditor->fn_bCanDragItemInHierarchyTree(this, m_csTypeName, pObjectToDrag);
// init drag&drop
if (bRes)
m_cHierarchy.SetDraggedItem(hItemToDrag);
else
m_cHierarchy.SetDraggedItem(NULL);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::fn_vOnDragDropEndHierarchy (void)
{
CPA_BaseObject *pObjectToDrag, *pTarget;
CPA_TreeItem *pItem;
HTREEITEM hItemToDrag, hTarget;
BOOL bRes = FALSE;
// get dragged object
hItemToDrag = m_cHierarchy.GetDraggedItem();
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hItemToDrag);
pObjectToDrag = pItem->GetObject();
// get target object
hTarget = m_cHierarchy.GetDropTarget();
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hTarget);
pTarget = pItem->GetObject();
// ask permission to dialog owner
if (m_pOwnerEditor->fn_bCanDropItemInHierarchyTree(this, m_csTypeName, pObjectToDrag, pTarget))
bRes = m_pOwnerEditor->fn_bOnDragDropInHierarchyTree(this, m_csTypeName, pObjectToDrag, pTarget);
// reinit tree
if (bRes)
fn_vInitHierarchy();
}
/*----------------------------------------
----------------------------------------*/
BOOL CPA_DialogList::fn_bAcceptAsDragDropTarget (HTREEITEM hTarget)
{
CPA_BaseObject *pObjectToDrag, *pTarget;
CPA_TreeItem *pItem;
HTREEITEM hItemToDrag;
// no target => no drop
if (!hTarget)
return FALSE;
// get dragged object
hItemToDrag = m_cHierarchy.GetDraggedItem();
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hItemToDrag);
pObjectToDrag = pItem->GetObject();
// get target object
pItem = (CPA_TreeItem *) m_cHierarchy.GetItemData(hTarget);
pTarget = pItem->GetObject();
// ask permission to dialog owner
return m_pOwnerEditor->fn_bCanDropItemInHierarchyTree(this, m_csTypeName, pObjectToDrag, pTarget);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::fn_vOnDblClkHierarchyTree (void)
{
BOOL bRes;
if (m_pClickedObject)
{
// tell owner
bRes = m_pOwnerEditor->fn_bOnDblClkHierarchyTree(this, m_csTypeName, m_pClickedObject, m_pClickedParent);
// default handling
if (!bRes)
{
m_pSelectedObject = m_pClickedObject;
m_pSelectedParent = m_pClickedParent;
}
}
}
//#################################################################################
// CPA_DialogList message handlers (General)
//#################################################################################
/*----------------------------------------
----------------------------------------*/
BOOL CPA_DialogList::fn_bOnKeyDownInControl (UINT nChar, UINT nRepCnt, UINT nFlags)
{
// tell owner
return m_pOwnerEditor->fn_bOnKeyDownInDialog(this, m_csTypeName, m_pCurrentList->GetMode(),
m_pSelectedObject, nChar, nRepCnt, nFlags);
}
/*----------------------------------------
----------------------------------------*/
BOOL CPA_DialogList::fn_bOnKeyUpInControl (UINT nChar, UINT nRepCnt, UINT nFlags)
{
return m_pOwnerEditor->fn_bOnKeyUpInDialog(this, m_csTypeName, m_pCurrentList->GetMode(),
m_pSelectedObject, nChar, nRepCnt, nFlags);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::OnSize (UINT nFlags, int cx, int cy)
{
if (m_bInitialised)
{
// update size and position of controls
fn_vReinitPosition(&m_cComboType, &m_cComboType, E_lcp_Center);
fn_vReinitPosition(&m_cButtonTest, &m_cButtonTest, E_lcp_AdjustWidth);
// get current mode
if (!m_pCurrentList)
return;
// update size and position of the corresponding control
if (m_pCurrentList->GetMode() == E_ldm_List)
fn_vReinitPosition(&m_cListObjects, &m_cListObjects, E_lcp_AdjustAll);
else
fn_vReinitPosition(&m_cHierarchy, &m_cHierarchy, E_lcp_AdjustAll);
}
}
//#################################################################################
// CPA_DialogList list attributes
//#################################################################################
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetPermanentOrder (tdeListOrder ePermanentOrder)
{
m_cListObjects.SetOrder(ePermanentOrder, FALSE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetPermanentStyle (long lPermanentStyle)
{
m_cListObjects.SetDrawStyle(lPermanentStyle, FALSE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetPermanentDisplay (BOOL bPermanentDisplay)
{
m_cListObjects.SetDisplayGray(bPermanentDisplay, FALSE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetPermanentHeaders (BOOL bPermanentHeaders)
{
m_cListObjects.SetColumnHeaders(bPermanentHeaders, FALSE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetDefaultOrder (tdeListOrder eDefaultOrder)
{
m_cListObjects.SetOrder(eDefaultOrder, TRUE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetDefaultStyle (long lDefaultStyle)
{
m_cListObjects.SetDrawStyle(lDefaultStyle, TRUE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetDefaultDisplay (BOOL bDefaultDisplay)
{
m_cListObjects.SetDisplayGray(bDefaultDisplay, TRUE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetDefaultHeaders (BOOL bDefaultHeaders)
{
m_cListObjects.SetColumnHeaders(bDefaultHeaders, TRUE, FALSE);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetItemInfo (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent, void *pInfo)
{
// change only in current list
if (csListName != m_csTypeName)
return;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return;
// change info
m_cHierarchy.SetItemInfo(pObject, pParent, pInfo);
}
/*----------------------------------------
----------------------------------------*/
void * CPA_DialogList::GetItemInfo (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent)
{
// get only in current list
if (csListName != m_csTypeName)
return NULL;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return NULL;
// get info
return m_cHierarchy.GetItemInfo(pObject, pParent);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetItemIcon (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent, int iIcon)
{
// change only in current list
if (csListName != m_csTypeName)
return;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return;
// change icon
m_cHierarchy.SetItemIcon(pObject, pParent, iIcon);
}
/*----------------------------------------
----------------------------------------*/
int CPA_DialogList::GetItemIcon (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent)
{
// get only in current list
if (csListName != m_csTypeName)
return -1;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return -1;
// get icon
return m_cHierarchy.GetItemIcon(pObject, pParent);
}
/*----------------------------------------
----------------------------------------*/
void CPA_DialogList::SetItemState (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent, int iState)
{
// change only in current list
if (csListName != m_csTypeName)
return;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return;
// change state
m_cHierarchy.SetItemStateI(pObject, pParent, iState);
}
/*----------------------------------------
----------------------------------------*/
int CPA_DialogList::GetItemState (CString csListName, CPA_BaseObject *pObject, CPA_BaseObject *pParent)
{
// get only in current list
if (csListName != m_csTypeName)
return -1;
if ((!m_pCurrentList)||(m_pCurrentList->GetMode() != E_ldm_Tree))
return -1;
// get state
return m_cHierarchy.GetItemStateI(pObject, pParent);
}
#endif // ACTIVE_EDITOR