Files
Jedi-Academy/tools/ModView/commtest/commtestView.cpp
2013-04-04 14:32:05 -07:00

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;
}