570 lines
14 KiB
C++
570 lines
14 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/CPAdTree.hpp"
|
|
#include "itf/CPAdList.hpp"
|
|
#include "ITF/CPABaseO.hpp"
|
|
#include "ITF/CPAEditB.hpp"
|
|
#include "itf/CPAProj.hpp"
|
|
#include "IncTUT.h"
|
|
|
|
#define C_uiCustomEntriesStart 10
|
|
|
|
//#################################################################################
|
|
// CPA_TreeItem
|
|
//#################################################################################
|
|
|
|
/*----------------------------------------
|
|
Constructor
|
|
----------------------------------------*/
|
|
CPA_TreeItem::CPA_TreeItem (CPA_BaseObject *pObject)
|
|
{
|
|
// init parameters
|
|
m_pObject = pObject;
|
|
m_pInfo = NULL;
|
|
m_iIcon = 0;
|
|
m_iState = 0;
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Destructor
|
|
----------------------------------------*/
|
|
CPA_TreeItem::~CPA_TreeItem (void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// Hierarchy Tree Control
|
|
//#################################################################################
|
|
BEGIN_MESSAGE_MAP(CPA_HierarchyTree, CTreeCtrl)
|
|
ON_WM_RBUTTONDOWN()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_KEYUP()
|
|
END_MESSAGE_MAP()
|
|
|
|
/*----------------------------------------
|
|
Constructor
|
|
----------------------------------------*/
|
|
CPA_HierarchyTree::CPA_HierarchyTree (void)
|
|
{
|
|
m_pParentDialog = NULL;
|
|
m_hDraggedItem = NULL;
|
|
m_hTarget = NULL;
|
|
m_pRoot = NULL;
|
|
// init default icons
|
|
m_stDefaultImageList.Create(16, 16, FALSE, 0, 1);
|
|
m_stDefaultImageList.Add(M_GetMainApp()->LoadIcon(CPA_IDI_EDIT_DEFAULT));
|
|
}
|
|
|
|
CPA_HierarchyTree::~CPA_HierarchyTree (void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/*----------------------------------------
|
|
Set functions
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetTreeRoot (CPA_BaseObject *pRoot)
|
|
{
|
|
m_pRoot = pRoot;
|
|
fn_vFillHierarchyTree(pRoot, TVI_ROOT);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Set icons
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetIconList (CImageList *pIconList, BOOL bUpdate)
|
|
{
|
|
// user icon list
|
|
if (pIconList)
|
|
{
|
|
SetImageList(pIconList, TVSIL_NORMAL);
|
|
m_pIconList = pIconList;
|
|
}
|
|
// else default one
|
|
else
|
|
{
|
|
SetImageList(&m_stDefaultImageList, TVSIL_NORMAL);
|
|
m_pIconList = &m_stDefaultImageList;
|
|
}
|
|
|
|
if (bUpdate)
|
|
fn_vFillHierarchyTree(m_pRoot, TVI_ROOT);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Set icons
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetStateList (CImageList *pStateList, BOOL bUpdate)
|
|
{
|
|
// user icon list
|
|
if (pStateList)
|
|
SetImageList(pStateList, TVSIL_STATE);
|
|
m_pStateList = pStateList;
|
|
|
|
if (bUpdate)
|
|
fn_vFillHierarchyTree(m_pRoot, TVI_ROOT);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Init Hierarchy
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::fn_vDeleteHierarchyTree (HTREEITEM hTreeParent)
|
|
{
|
|
CPA_TreeItem *pTreeItem;
|
|
HTREEITEM hChild;
|
|
|
|
if (!m_pRoot)
|
|
return;
|
|
|
|
if (hTreeParent)
|
|
{
|
|
// delete item data
|
|
pTreeItem = (CPA_TreeItem *) GetItemData(hTreeParent);
|
|
if (pTreeItem)
|
|
delete pTreeItem;
|
|
}
|
|
|
|
// test all childs
|
|
hChild = (hTreeParent) ? GetChildItem(hTreeParent) : GetRootItem();
|
|
while (hChild)
|
|
{
|
|
fn_vDeleteHierarchyTree(hChild);
|
|
hChild = GetNextSiblingItem(hChild);
|
|
}
|
|
|
|
// end => delete items
|
|
if (hTreeParent == NULL)
|
|
DeleteAllItems();
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Init Hierarchy
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::fn_vFillHierarchyTree (CPA_BaseObject *pEdParent, HTREEITEM hTreeParent)
|
|
{
|
|
CPA_BaseObject *pEdChild;
|
|
CPA_TreeItem *pTreeItem;
|
|
HTREEITEM hTreeChild;
|
|
void *pInfo;
|
|
int iNumIcon, iNumState;
|
|
|
|
if (!pEdParent)
|
|
return;
|
|
|
|
// first child
|
|
pEdChild = GetCorrespondingChild(pEdParent, NULL);
|
|
|
|
while (pEdChild)
|
|
{
|
|
// create tree item
|
|
pTreeItem = new CPA_TreeItem(pEdChild);
|
|
// get icon
|
|
iNumIcon = GetCorrespondingIcon(pEdChild);
|
|
pTreeItem->SetIcon(iNumIcon);
|
|
// set info
|
|
pInfo = GetCorrespondingInfo(pEdChild, pEdParent);
|
|
pTreeItem->SetInfo(pInfo);
|
|
// get state
|
|
if (m_pStateList)
|
|
{
|
|
// get icon
|
|
iNumState = GetCorrespondingState(pEdChild);
|
|
pTreeItem->SetState(iNumState);
|
|
}
|
|
|
|
// create item
|
|
hTreeChild = InsertItem(pEdChild->GetNameToDraw(), iNumIcon, iNumIcon, hTreeParent, TVI_LAST);
|
|
// set data
|
|
SetItemData(hTreeChild, (DWORD) pTreeItem);
|
|
// if necessary, set state icon
|
|
if (m_pStateList)
|
|
SetItem(hTreeChild, TVIF_STATE, pEdChild->GetNameToDraw(), iNumState, iNumState,
|
|
TVIS_STATEIMAGEMASK, INDEXTOSTATEIMAGEMASK(iNumState), (DWORD)pTreeItem);
|
|
|
|
// next level
|
|
fn_vFillHierarchyTree(pEdChild, hTreeChild);
|
|
|
|
// next child
|
|
pEdChild = GetCorrespondingChild(pEdParent, pEdChild);
|
|
}
|
|
}
|
|
|
|
|
|
/*----------------------------------------
|
|
Drag&Drop End
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnLButtonUp (UINT nFlags, CPoint point)
|
|
{
|
|
if ((!m_hDraggedItem)||(!m_hTarget))
|
|
{
|
|
CTreeCtrl::OnLButtonUp (nFlags, point);
|
|
return;
|
|
}
|
|
|
|
// if target is valid, complete drag&drop
|
|
m_pParentDialog->fn_vOnDragDropEndHierarchy();
|
|
SetItemState(m_hTarget, 0, TVIS_DROPHILITED);
|
|
m_hDraggedItem = NULL;
|
|
m_hTarget = NULL;
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Drag&Drop
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnMouseMove (UINT nFlags, CPoint point)
|
|
{
|
|
HTREEITEM hTarget;
|
|
UINT pFlag;
|
|
|
|
if (!m_hDraggedItem)
|
|
{
|
|
CTreeCtrl::OnMouseMove (nFlags, point);
|
|
return;
|
|
}
|
|
hTarget = HitTest(point, &pFlag);
|
|
if (hTarget != m_hTarget)
|
|
{
|
|
if (m_hTarget)
|
|
SetItemState(m_hTarget, 0, TVIS_DROPHILITED);
|
|
if (m_pParentDialog->fn_bAcceptAsDragDropTarget(hTarget))
|
|
m_hTarget = hTarget;
|
|
else
|
|
m_hTarget = NULL;
|
|
if (m_hTarget)
|
|
SetItemState(m_hTarget, TVIS_DROPHILITED, TVIS_DROPHILITED);
|
|
}
|
|
}
|
|
|
|
|
|
/*----------------------------------------
|
|
DblClk
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_pParentDialog)
|
|
m_pParentDialog->fn_vOnDblClkHierarchyTree();
|
|
|
|
else
|
|
CTreeCtrl::OnLButtonDblClk(nFlags, point);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Key Down
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (!m_pParentDialog || !m_pParentDialog->fn_bOnKeyDownInControl(nChar, nRepCnt, nFlags))
|
|
CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Key Up
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (!m_pParentDialog || !m_pParentDialog->fn_bOnKeyUpInControl(nChar, nRepCnt, nFlags))
|
|
CTreeCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Popup Menu
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::OnRButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
BOOL bEntry = FALSE;
|
|
|
|
ClientToScreen( &point );
|
|
// create popup menu
|
|
CMenu oMenu;
|
|
oMenu.CreatePopupMenu();
|
|
|
|
// Custom Entries
|
|
if (m_pParentDialog)
|
|
bEntry = m_pOwnerEditor->fn_bAddEntriesToTreePopup(m_pParentDialog, m_pParentDialog->GetCurrentType(), &oMenu, C_uiCustomEntriesStart);
|
|
else
|
|
bEntry = m_pOwnerEditor->fn_bAddEntriesToTreePopup(this, m_pRoot, &oMenu, C_uiCustomEntriesStart);
|
|
|
|
// display & track popup menu
|
|
if (bEntry)
|
|
{
|
|
TUT_M_vGetTutDll ();
|
|
TUT_M_vRegisterMenu (this -> m_hWnd , oMenu . m_hMenu , point . x , point . y);
|
|
oMenu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
|
|
}
|
|
// destroy menus
|
|
oMenu.DestroyMenu();
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Answer to Popup
|
|
----------------------------------------*/
|
|
BOOL CPA_HierarchyTree::OnCommand( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
// command from a menu ?
|
|
if (HIWORD(wParam) == 0)
|
|
{
|
|
// custom entries
|
|
if (LOWORD(wParam) >= C_uiCustomEntriesStart)
|
|
{
|
|
if (m_pParentDialog)
|
|
m_pOwnerEditor->fn_vOnCommandInTreePopup(m_pParentDialog, m_pParentDialog->GetCurrentType(), LOWORD(wParam) - C_uiCustomEntriesStart);
|
|
else
|
|
m_pOwnerEditor->fn_vOnCommandInTreePopup(this, m_pRoot, LOWORD(wParam) - C_uiCustomEntriesStart);
|
|
}
|
|
}
|
|
return CTreeCtrl::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
|
|
/*----------------------------------------
|
|
Get Item
|
|
----------------------------------------*/
|
|
HTREEITEM CPA_HierarchyTree::GetCorrespondingItem (CPA_BaseObject *pObject, CPA_BaseObject *pParent, HTREEITEM hElem)
|
|
{
|
|
HTREEITEM hChild, hParent, hResult;
|
|
CPA_TreeItem *pData;
|
|
|
|
// test hElem name
|
|
if (hElem)
|
|
{
|
|
// get item data
|
|
pData = (CPA_TreeItem *) GetItemData(hElem);
|
|
// check item data
|
|
if ((pData)&&(pData->GetObject() == pObject))
|
|
{
|
|
// no parent specified => OK
|
|
if (!pParent)
|
|
return hElem;
|
|
// must test parent
|
|
else
|
|
{
|
|
// get parent item
|
|
hParent = GetParentItem(hElem);
|
|
if (hParent)
|
|
{
|
|
// test parent data
|
|
pData = (CPA_TreeItem *) GetItemData(hParent);
|
|
if ((pData)&&(pData->GetObject() == pParent))
|
|
return hElem;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// test all childs
|
|
hChild = (hElem) ? GetChildItem(hElem) : GetRootItem();
|
|
while (hChild)
|
|
{
|
|
hResult = GetCorrespondingItem(pObject, pParent, hChild);
|
|
if (hResult)
|
|
return hResult;
|
|
hChild = GetNextSiblingItem(hChild);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get Icon
|
|
----------------------------------------*/
|
|
int CPA_HierarchyTree::GetCorrespondingIcon (CPA_BaseObject *pObject)
|
|
{
|
|
// get icon
|
|
if (m_pParentDialog)
|
|
return m_pOwnerEditor->GetIconForTreeItem (m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject);
|
|
else
|
|
return m_pOwnerEditor->GetIconForTreeItem (this, m_pRoot, pObject);
|
|
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get State
|
|
----------------------------------------*/
|
|
int CPA_HierarchyTree::GetCorrespondingState (CPA_BaseObject *pObject)
|
|
{
|
|
// get state
|
|
if (m_pParentDialog)
|
|
return m_pOwnerEditor->GetStateForTreeItem (m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject);
|
|
else
|
|
return m_pOwnerEditor->GetStateForTreeItem (this, m_pRoot, pObject);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get State
|
|
----------------------------------------*/
|
|
CPA_BaseObject * CPA_HierarchyTree::GetCorrespondingChild (CPA_BaseObject *pParent, CPA_BaseObject *pBrother)
|
|
{
|
|
if (m_pParentDialog)
|
|
return m_pOwnerEditor->GetTreeNodeNextChild (m_pParentDialog, m_pParentDialog->GetCurrentType(), pParent, pBrother);
|
|
else
|
|
return m_pOwnerEditor->GetTreeNodeNextChild (this, m_pRoot, pParent, pBrother);
|
|
}
|
|
|
|
|
|
/*----------------------------------------
|
|
Get Info
|
|
----------------------------------------*/
|
|
void * CPA_HierarchyTree::GetCorrespondingInfo (CPA_BaseObject *pObject, CPA_BaseObject *pParent)
|
|
{
|
|
if (m_pParentDialog)
|
|
return m_pOwnerEditor->GetInfoForTreeItem (m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject, pParent);
|
|
else
|
|
return m_pOwnerEditor->GetInfoForTreeItem (this, m_pRoot, pObject, pParent);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get Item Info
|
|
----------------------------------------*/
|
|
void * CPA_HierarchyTree::GetItemInfo (CPA_BaseObject *pObject, CPA_BaseObject *pParent)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return NULL;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return NULL;
|
|
// get item info
|
|
return pItemData->GetInfo();
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Set Item Info
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetItemInfo (CPA_BaseObject *pObject, CPA_BaseObject *pParent, void *pInfo)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return;
|
|
// set item info
|
|
pItemData->SetInfo(pInfo);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get Item Icon
|
|
----------------------------------------*/
|
|
int CPA_HierarchyTree::GetItemIcon (CPA_BaseObject *pObject, CPA_BaseObject *pParent)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return -1;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return -1;
|
|
// get item icon
|
|
return pItemData->GetIcon();
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Set Item Icon
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetItemIcon (CPA_BaseObject *pObject, CPA_BaseObject *pParent, int iIcon)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return;
|
|
// set item icon
|
|
pItemData->SetIcon(iIcon);
|
|
SetItemImage(hItem, iIcon, iIcon);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Get Item State
|
|
----------------------------------------*/
|
|
int CPA_HierarchyTree::GetItemStateI (CPA_BaseObject *pObject, CPA_BaseObject *pParent)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// no image list => no icon index
|
|
if (!m_pStateList)
|
|
return -1;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return -1;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return -1;
|
|
// get item state
|
|
return pItemData->GetState();
|
|
}
|
|
|
|
/*----------------------------------------
|
|
Set Item State
|
|
----------------------------------------*/
|
|
void CPA_HierarchyTree::SetItemStateI (CPA_BaseObject *pObject, CPA_BaseObject *pParent, int iState)
|
|
{
|
|
CPA_TreeItem *pItemData;
|
|
HTREEITEM hItem;
|
|
|
|
// no image list => no icon index
|
|
if (!m_pStateList)
|
|
return;
|
|
|
|
// get item
|
|
hItem = GetCorrespondingItem (pObject, pParent, NULL);
|
|
if (!hItem)
|
|
return;
|
|
//get item data
|
|
pItemData = (CPA_TreeItem *) GetItemData(hItem);
|
|
if (!pItemData)
|
|
return;
|
|
// set item state
|
|
pItemData->SetState(iState);
|
|
SetItem(hItem, TVIF_STATE, pItemData->GetObject()->GetNameToDraw(), iState, iState,
|
|
TVIS_STATEIMAGEMASK, INDEXTOSTATEIMAGEMASK(iState), (DWORD)pItemData);
|
|
}
|
|
|
|
|
|
#endif //ACTIVE_EDITOR
|
|
|
|
|
|
|
|
|