472 lines
12 KiB
C++
472 lines
12 KiB
C++
// commtestView.cpp : implementation of the CCommtestView class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "commtest.h"
|
|
#include <assert.h>
|
|
#include "commtestDoc.h"
|
|
#include "commtestView.h"
|
|
#include "../tools/modview/wintalk.h"
|
|
#include "bits.h"
|
|
#include "mainfrm.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView
|
|
|
|
IMPLEMENT_DYNCREATE(CCommtestView, CTreeView)
|
|
|
|
BEGIN_MESSAGE_MAP(CCommtestView, CTreeView)
|
|
//{{AFX_MSG_MAP(CCommtestView)
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_TIMER()
|
|
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
|
|
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
|
|
//}}AFX_MSG_MAP
|
|
// Standard printing commands
|
|
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
|
|
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
|
|
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView construction/destruction
|
|
|
|
CCommtestView* gpCommTestView = NULL;
|
|
CCommtestView::CCommtestView()
|
|
{
|
|
}
|
|
|
|
CCommtestView::~CCommtestView()
|
|
{
|
|
}
|
|
|
|
BOOL CCommtestView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
// TODO: Modify the Window class or styles here by modifying
|
|
// the CREATESTRUCT cs
|
|
|
|
if (!CTreeView::PreCreateWindow(cs))
|
|
{
|
|
return FALSE;
|
|
}
|
|
cs.style |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS/* | TVS_EDITLABELS*/;
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView drawing
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView printing
|
|
|
|
BOOL CCommtestView::OnPreparePrinting(CPrintInfo* pInfo)
|
|
{
|
|
// default preparation
|
|
return DoPreparePrinting(pInfo);
|
|
}
|
|
|
|
void CCommtestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
|
{
|
|
// TODO: add extra initialization before printing
|
|
}
|
|
|
|
void CCommtestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
|
{
|
|
// TODO: add cleanup after printing
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CCommtestView::AssertValid() const
|
|
{
|
|
CTreeView::AssertValid();
|
|
}
|
|
|
|
void CCommtestView::Dump(CDumpContext& dc) const
|
|
{
|
|
CTreeView::Dump(dc);
|
|
}
|
|
|
|
CCommtestDoc* CCommtestView::GetDocument() // non-debug version is inline
|
|
{
|
|
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCommtestDoc)));
|
|
return (CCommtestDoc*)m_pDocument;
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCommtestView message handlers
|
|
|
|
enum eTimerHandles
|
|
{
|
|
th_DO_NOT_USE = 0, // system reserved for NULL timer
|
|
th_100FPS = 1,
|
|
};
|
|
|
|
|
|
int CCommtestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CTreeView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
m_TimerHandle_Update100FPS = SetTimer( th_100FPS, // UINT nIDEvent,
|
|
200, // UINT nElapse, (in milliseconds)
|
|
NULL // void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)
|
|
);
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CCommtestView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
|
|
{
|
|
m_TimerHandle_Update100FPS = 0;
|
|
|
|
BOOL b = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
|
|
|
|
gpCommTestView = this;
|
|
|
|
HTREEITEM h = GetTreeCtrl().InsertItem("test_root_item", NULL);
|
|
GetTreeCtrl().InsertItem("child", h);
|
|
|
|
return b;
|
|
}
|
|
|
|
void CCommtestView::OnDestroy()
|
|
{
|
|
if (m_TimerHandle_Update100FPS)
|
|
{
|
|
bool bOk = !!KillTimer(m_TimerHandle_Update100FPS); // NZ return if good
|
|
if (bOk)
|
|
{
|
|
m_TimerHandle_Update100FPS = NULL;
|
|
}
|
|
else
|
|
{
|
|
// ErrorBox("Error killing timer!"); // should never happen
|
|
}
|
|
}
|
|
|
|
|
|
CTreeView::OnDestroy();
|
|
}
|
|
|
|
void CCommtestView::OnTimer(UINT nIDEvent)
|
|
{
|
|
if (nIDEvent != th_100FPS)
|
|
{
|
|
CTreeView::OnTimer(nIDEvent);
|
|
return;
|
|
}
|
|
|
|
// WinTalk_HandleMessages();
|
|
}
|
|
|
|
//DEL void CCommtestView::OnDraw(CDC* pDC)
|
|
//DEL {
|
|
//DEL CCommtestDoc* pDoc = GetDocument();
|
|
//DEL ASSERT_VALID(pDoc);
|
|
//DEL // TODO: add draw code for native data here
|
|
//DEL }
|
|
|
|
|
|
extern char *va(char *format, ...);
|
|
extern bool gbCommInitialised;
|
|
extern bool R_IsDescendantOf(HTREEITEM hTreeItem_This, HTREEITEM hTreeItem_Ancestor);
|
|
extern bool gbInhibit;
|
|
|
|
|
|
|
|
// search tree for an item whose userdata matches what's been passed...
|
|
//
|
|
// hTreeItem = tree item to start from, pass NULL to start from root
|
|
//
|
|
HTREEITEM R_ModelTree_FindItemWithThisData(HTREEITEM hTreeItem, UINT32 uiData2Match)
|
|
{
|
|
if (!hTreeItem)
|
|
hTreeItem = gpCommTestView->GetTreeCtrl().GetRootItem();
|
|
|
|
if (hTreeItem)
|
|
{
|
|
CString str(gpCommTestView->GetTreeCtrl().GetItemText(hTreeItem));
|
|
OutputDebugString(va("Scanning item %X (%s)\n",hTreeItem,(LPCSTR)str));
|
|
|
|
if (str=="BoltOns")
|
|
{
|
|
int x=1;
|
|
}
|
|
|
|
// check this tree item...
|
|
//
|
|
TreeItemData_t TreeItemData;
|
|
TreeItemData.uiData = gpCommTestView->GetTreeCtrl().GetItemData(hTreeItem);
|
|
|
|
// match?...
|
|
//
|
|
if (TreeItemData.uiData == uiData2Match)
|
|
return hTreeItem;
|
|
|
|
// check child...
|
|
//
|
|
HTREEITEM hTreeItem_Child = gpCommTestView->GetTreeCtrl().GetChildItem(hTreeItem);
|
|
if (hTreeItem_Child)
|
|
{
|
|
HTREEITEM hTreeItemFound = R_ModelTree_FindItemWithThisData(hTreeItem_Child, uiData2Match);
|
|
if (hTreeItemFound)
|
|
return hTreeItemFound;
|
|
}
|
|
|
|
// process siblings...
|
|
//
|
|
HTREEITEM hTreeItem_Sibling = gpCommTestView->GetTreeCtrl().GetNextSiblingItem(hTreeItem);
|
|
if (hTreeItem_Sibling)
|
|
{
|
|
HTREEITEM hTreeItemFound = R_ModelTree_FindItemWithThisData(hTreeItem_Sibling, uiData2Match);
|
|
if (hTreeItemFound)
|
|
return hTreeItemFound;
|
|
}
|
|
|
|
// this treeitem isnt a match, and neither are its siblings or children, so...
|
|
//
|
|
return NULL;
|
|
}
|
|
|
|
// we must have called this when the treeview was uninitialised... (duh!)
|
|
//
|
|
ASSERT(0);
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
void CCommtestView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
|
|
if (gbCommInitialised && GetTreeCtrl().GetCount() > 3 /*?*/ && !gbInhibit)
|
|
{
|
|
HTREEITEM hTreeItem = GetTreeCtrl().GetSelectedItem();
|
|
|
|
CString Text = GetTreeCtrl().GetItemText(hTreeItem);
|
|
|
|
TreeItemData_t TreeItemData;
|
|
TreeItemData.uiData = GetTreeCtrl().GetItemData(hTreeItem);
|
|
|
|
LPCSTR psArg = Text;
|
|
if (Text == "Bones")
|
|
psArg = "#all";
|
|
if (Text == "Surfaces")
|
|
psArg = "#all";
|
|
|
|
// LPCSTR psAnswer;
|
|
bool bOk = false;
|
|
|
|
/* if (R_IsDescendantOf(hTreeItem, ghTreeItem_Surfaces))
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightbone #none");
|
|
bOk = WinTalk_IssueCommand(va("model_highlightsurface %s",psArg),NULL,0,&psAnswer);
|
|
}
|
|
else
|
|
if (R_IsDescendantOf(hTreeItem, ghTreeItem_Bones))
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightsurface #none");
|
|
bOk = WinTalk_IssueCommand(va("model_highlightbone %s",psArg),NULL,0,&psAnswer);
|
|
}
|
|
else
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightbone #none");
|
|
WinTalk_IssueCommand( "model_highlightsurface #none");
|
|
}
|
|
*/
|
|
|
|
WinTalk_IssueCommand(va("model_highlightbone %d #none",TreeItemData.iModelHandle));
|
|
WinTalk_IssueCommand(va("model_highlightsurface %d #none",TreeItemData.iModelHandle));
|
|
|
|
switch (TreeItemData.iItemType)
|
|
{
|
|
case TREEITEMTYPE_SURFACEHEADER: // "surfaces"
|
|
{
|
|
bOk = WinTalk_IssueCommand(va("model_highlightsurface %d #all",TreeItemData.iModelHandle));
|
|
}
|
|
break;
|
|
|
|
case TREEITEMTYPE_BONEHEADER: // "bones"
|
|
{
|
|
bOk = WinTalk_IssueCommand(va("model_highlightbone %d #all",TreeItemData.iModelHandle));
|
|
}
|
|
break;
|
|
|
|
case TREEITEMTYPE_GLM_SURFACE: // a surface
|
|
{
|
|
bOk = WinTalk_IssueCommand(va("model_highlightsurface %d %s",TreeItemData.iModelHandle, psArg));
|
|
}
|
|
break;
|
|
|
|
case TREEITEMTYPE_BONEALIASHEADER: // alias header
|
|
{
|
|
bOk = WinTalk_IssueCommand(va("model_highlightbone %d #aliased",TreeItemData.iModelHandle));
|
|
}
|
|
break;
|
|
|
|
case TREEITEMTYPE_GLM_BONEALIAS: // a bone alias
|
|
case TREEITEMTYPE_GLM_BONE: // a bone
|
|
{
|
|
// WinTalk_IssueCommand(va("model_highlightsurface %d #none",TreeItemData.iModelHandle));
|
|
bOk = WinTalk_IssueCommand(va("model_highlightbone %d %s",TreeItemData.iModelHandle, psArg));
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (bOk)
|
|
{
|
|
//
|
|
}
|
|
else
|
|
{
|
|
// assert(0);
|
|
}
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
// "psInitialLoadName" param can be "" if not bothered, "psInitialDir" can be NULL to open to last browse-dir
|
|
//
|
|
// psFilter example: TEXT("Model files (*.glm)|*.glm|All Files(*.*)|*.*||") // LPCSTR psFilter
|
|
//
|
|
char *InputLoadFileName(LPCSTR psInitialLoadName, LPCSTR psCaption, LPCSTR psInitialDir, LPCSTR psFilter)
|
|
{
|
|
CFileStatus Filestatus;
|
|
CFile File;
|
|
static char name[MAX_PATH];
|
|
|
|
CFileDialog FileDlg(TRUE, NULL, NULL,
|
|
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
|
|
//TEXT("Map Project Files (*.mpj)|*.lit|Other Map Files (*.smd/*.sc2)|*.sc2;*.smd|FastMap Files (*.fmf)|*.fmf|All Files(*.*)|*.*||"), //Map Object Files|*.sms||"),
|
|
psFilter, //Map Object Files|*.sms||"),
|
|
AfxGetMainWnd());
|
|
|
|
static CString strInitialDir;
|
|
if (psInitialDir)
|
|
strInitialDir = psInitialDir;
|
|
|
|
FileDlg.m_ofn.lpstrInitialDir = (LPCSTR) strInitialDir;
|
|
FileDlg.m_ofn.lpstrTitle=psCaption; // Load Editor Model";
|
|
strcpy(name,psInitialLoadName);
|
|
FileDlg.m_ofn.lpstrFile=name;
|
|
|
|
if (FileDlg.DoModal() == IDOK)
|
|
{
|
|
return name;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
LPCSTR Model_GetSupportedTypesFilter(void)
|
|
{
|
|
return "Model files (*.glm)|*.glm|All Files(*.*)|*.*||";
|
|
}
|
|
|
|
|
|
|
|
void CCommtestView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
|
|
if (gbCommInitialised && GetTreeCtrl().GetCount() > 3 /*?*/ && !gbInhibit)
|
|
{
|
|
HTREEITEM hTreeItem = GetTreeCtrl().GetSelectedItem();
|
|
|
|
CString Text = GetTreeCtrl().GetItemText(hTreeItem);
|
|
|
|
TreeItemData_t TreeItemData;
|
|
TreeItemData.uiData = GetTreeCtrl().GetItemData(hTreeItem);
|
|
|
|
bool bOk = false;
|
|
|
|
/* if (R_IsDescendantOf(hTreeItem, ghTreeItem_Surfaces))
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightbone #none");
|
|
bOk = WinTalk_IssueCommand(va("model_highlightsurface %s",psArg),NULL,0,&psAnswer);
|
|
}
|
|
else
|
|
if (R_IsDescendantOf(hTreeItem, ghTreeItem_Bones))
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightsurface #none");
|
|
bOk = WinTalk_IssueCommand(va("model_highlightbone %s",psArg),NULL,0,&psAnswer);
|
|
}
|
|
else
|
|
{
|
|
WinTalk_IssueCommand( "model_highlightbone #none");
|
|
WinTalk_IssueCommand( "model_highlightsurface #none");
|
|
}
|
|
*/
|
|
|
|
switch (TreeItemData.iItemType)
|
|
{
|
|
case TREEITEMTYPE_MODELNAME:
|
|
{
|
|
// is this a bolted model or the root (find out by seeing if its parent is a "BoltOns" treeitem)...
|
|
//
|
|
HTREEITEM hTreeItemParent = GetTreeCtrl().GetParentItem(hTreeItem);
|
|
if (hTreeItemParent)
|
|
{
|
|
TreeItemData_t TreeItemData_Parent;
|
|
TreeItemData_Parent.uiData = GetTreeCtrl().GetItemData(hTreeItemParent);
|
|
if (TreeItemData_Parent.iItemType == TREEITEMTYPE_BOLTONSHEADER)
|
|
{
|
|
//if (GetYesNo("Unbolt/discard this model?"))
|
|
{
|
|
//<modelhandle of bolted thing to delete>
|
|
WinTalk_IssueCommand(va("model_deletebolton %d",TreeItemData.iModelHandle));
|
|
GetTreeCtrl().DeleteItem(hTreeItem);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TREEITEMTYPE_GLM_BONE: // a bone
|
|
{
|
|
extern CMainFrame* gCMainFrame;
|
|
if (gCMainFrame)
|
|
{
|
|
char *psFullPathedFilename = InputLoadFileName( "", // LPCSTR psInitialLoadName,
|
|
"Load Model", // LPCSTR psCaption,
|
|
"S:\\base\\models\\test\\conetree4", // LPCSTR psInitialDir,
|
|
Model_GetSupportedTypesFilter() // LPCSTR psFilter
|
|
);
|
|
if (psFullPathedFilename)
|
|
{
|
|
gCMainFrame->BoltModel(TreeItemData.iModelHandle, Text, psFullPathedFilename);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (bOk)
|
|
{
|
|
//
|
|
}
|
|
else
|
|
{
|
|
// assert(0);
|
|
}
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|