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

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