reman3/Rayman_X/cpa/tempgrp/Tot/Src/ot_dLoad.cpp

268 lines
7.2 KiB
C++

/*=========================================================================
*
* ot_dLoad.cpp : Load dialog - Implementation file
*
*
* Version 1.0
* Creation date 18/08/97
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#define HieFriend
#include "acp_base.h"
#include "OT_inter.hpp"
#include "OT_dLoad.hpp"
#include "x:\cpa\main\inc\_editid.h"
//#################################################################################
// OT_DialogLoad dialog
//#################################################################################
/*----------------------------------------
----------------------------------------*/
OT_DialogLoad::OT_DialogLoad(ObjectTableInterface *pOwnerEditor, CWnd* pParent /*=NULL*/)
: CDialog(OT_DialogLoad::IDD, pParent)
{
// init editor
m_pOwnerEditor = pOwnerEditor;
// init icon list
m_oIconList.Create(16, 16, ILC_MASK, 0, 6);
m_oIconList.Add(LoadIcon(pOwnerEditor->GetDLLIdentity()->hModule, MAKEINTRESOURCE(TOT_IDI_FAMILY)));
m_oIconList.Add(LoadIcon(pOwnerEditor->GetDLLIdentity()->hModule, MAKEINTRESOURCE(TOT_IDI_UNLOAD)));
m_oIconList.Add(LoadIcon(pOwnerEditor->GetDLLIdentity()->hModule, MAKEINTRESOURCE(TOT_IDI_OBJTABLE)));
m_oIconList.Add(LoadIcon(pOwnerEditor->GetDLLIdentity()->hModule, MAKEINTRESOURCE(TOT_IDI_UNLOADB)));
m_oIconList.Add(LoadIcon(pOwnerEditor->GetDLLIdentity()->hModule, MAKEINTRESOURCE(TOT_IDI_OBJTABLEB)));
}
/*----------------------------------------
----------------------------------------*/
void OT_DialogLoad::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(OT_DialogLoad)
DDX_Control(pDX, TOT_IDC_TREE, m_cTree);
//}}AFX_DATA_MAP
}
/*----------------------------------------
----------------------------------------*/
BEGIN_MESSAGE_MAP(OT_DialogLoad, CDialog)
//{{AFX_MSG_MAP(OT_DialogLoad)
ON_NOTIFY(TVN_SELCHANGED, TOT_IDC_TREE, OnSelchangeTreeControl)
ON_NOTIFY(NM_RCLICK, TOT_IDC_TREE, OnRightClkTreeControl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//#################################################################################
// OT_DialogLoad message handlers
//#################################################################################
/*----------------------------------------
----------------------------------------*/
BOOL OT_DialogLoad::OnInitDialog()
{
CPA_BaseObjectList *pListObjects;
EditorObjectTable *pObjTable;
CPA_BaseObject *pObject;
HTREEITEM hFamilyItem, hObjTableItem;
Position Pos;
CString csName;
CDialog::OnInitDialog();
m_hFirstItem = NULL;
m_cTree.DeleteAllItems();
m_cTree.SetImageList(&m_oIconList, TVSIL_NORMAL);
// fill ListBox with invalid Lips Synchros
pListObjects = m_pOwnerEditor->GetInvalidObjectList(C_szObjectTableTypeName);
// only unloaded lips synchro must be dispayed
for (pObject = pListObjects->GetHeadElement(Pos); pObject;
pObject = pListObjects->GetNextElement(Pos))
{
pObjTable = (EditorObjectTable *)pObject;
if (!pObjTable->fn_bIsAvailable())
{
// if necessary, create family item
hFamilyItem = GetCorrespondingItem(pObjTable->GetOwner());
if (!hFamilyItem)
{
hFamilyItem = m_cTree.InsertItem(pObjTable->GetOwner()->GetName(), 0, 0, TVI_ROOT, TVI_SORT);
m_cTree.SetItemData(hFamilyItem, (DWORD) pObjTable->GetOwner());
}
// add lip synchro item
hObjTableItem = m_cTree.InsertItem(pObjTable->GetName(), 1, 1, hFamilyItem, TVI_SORT);
m_cTree.SetItemData(hObjTableItem, (DWORD) pObjTable);
}
}
return TRUE;
}
/*----------------------------------------
----------------------------------------*/
void OT_DialogLoad::OnSelchangeTreeControl (NMHDR* pNMHDR, LRESULT* pResult)
{
CPA_BaseObject *pObject;
HTREEITEM hCurItem;
POSITION pos;
LPNM_TREEVIEW pNMTreeView = (LPNM_TREEVIEW)pNMHDR;
if (pNMTreeView->action)
{
// get selected item
hCurItem = m_cTree.GetSelectedItem();
if (hCurItem != NULL)
{
// get corresponding object
pObject = (CPA_BaseObject *) m_cTree.GetItemData(hCurItem);
// Obj Table => update list
if (pObject->GetType() == C_szObjectTableTypeName)
{
pos = m_oObjectsToLoad.Find(pObject);
// if object is already in the list, remove it
if (pos != NULL)
{
m_oObjectsToLoad.RemoveAt(pos);
m_cTree.SetItemImage(hCurItem, 1, 1);
}
// else add it
else
{
m_oObjectsToLoad.AddTail(pObject);
m_cTree.SetItemImage(hCurItem, 2, 2);
}
// remove selection
m_cTree.SelectItem(NULL);
}
}
}
*pResult = 0;
}
/*----------------------------------------
----------------------------------------*/
void OT_DialogLoad::OnRightClkTreeControl(NMHDR* pNMHDR, LRESULT* pResult)
{
EditorObjectTable *pObjTable = NULL;
EditorObjectTable *pFirstObjTable;
CPA_BaseObject *pObject;
HTREEITEM hCurItem;
POSITION pos;
POINT mousePos;
BOOL bAdd, bPrev;
// get selected item
GetCursorPos(&mousePos);
m_cTree.ScreenToClient(&mousePos);
hCurItem = m_cTree.HitTest(mousePos);
if (hCurItem != NULL)
{
pObject = (CPA_BaseObject *) m_cTree.GetItemData(hCurItem);
// Lip Synchro => update list
if (pObject->GetType() == C_szObjectTableTypeName)
pObjTable = (EditorObjectTable *) pObject;
}
if (!pObjTable)
return;
// first click => get first selected object
if (!m_hFirstItem)
{
// register first item
m_hFirstItem = hCurItem;
m_cTree.SelectItem(m_hFirstItem);
// update icon & state
pFirstObjTable = (EditorObjectTable *) m_cTree.GetItemData(m_hFirstItem);
if (m_oObjectsToLoad.Find(pFirstObjTable) != NULL)
m_cTree.SetItemImage(m_hFirstItem, 3, 3);
else
m_cTree.SetItemImage(m_hFirstItem, 4, 4);
}
// next click => get last selection and update
else
{
pFirstObjTable = (EditorObjectTable *) m_cTree.GetItemData(m_hFirstItem);
if (pObjTable->GetOwner() == pFirstObjTable->GetOwner())
{
bAdd = (m_oObjectsToLoad.Find(pFirstObjTable) == NULL);
bPrev = (pObjTable->GetName() > pFirstObjTable->GetName());
// update all items
while (pObjTable)
{
// update list and icon
pos = m_oObjectsToLoad.Find(pObjTable);
if (bAdd && !pos)
{
m_oObjectsToLoad.AddTail(pObjTable);
m_cTree.SetItemImage(hCurItem, 2, 2);
}
else if (!bAdd && pos)
{
m_oObjectsToLoad.RemoveAt(pos);
m_cTree.SetItemImage(hCurItem, 1, 1);
}
// get previous item
if (pObjTable != pFirstObjTable)
{
if (bPrev)
hCurItem = m_cTree.GetPrevSiblingItem(hCurItem);
else
hCurItem = m_cTree.GetNextSiblingItem(hCurItem);
pObjTable = (EditorObjectTable *) m_cTree.GetItemData(hCurItem);
}
else
pObjTable = NULL;
}
m_hFirstItem = NULL;
m_cTree.SelectItem(m_hFirstItem);
}
}
// *pResult = 0;
}
HTREEITEM OT_DialogLoad::GetCorrespondingItem (CPA_BaseObject *pObject, HTREEITEM hElem)
{
CPA_BaseObject *pData;
HTREEITEM hChild, hResult;
// test hElem name
if (hElem)
{
// get item data
pData = (CPA_BaseObject *) m_cTree.GetItemData(hElem);
// check item data
if (pData == pObject)
return hElem;
}
// test all childs
hChild = (hElem) ? m_cTree.GetChildItem(hElem) : m_cTree.GetRootItem();
while (hChild)
{
hResult = GetCorrespondingItem(pObject, hChild);
if (hResult)
return hResult;
hChild = m_cTree.GetNextSiblingItem(hChild);
}
return NULL;
}