Files
firestorm/Gameleap/code/mw4/Tools/ContentTrack/DirectoryView.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

272 lines
6.6 KiB
C++

// DirectoryView.cpp : implementation file
//
#include "stdafx.h"
#include "contenttrack.h"
#include "DirectoryView.h"
#include "NodeDataValueFileDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDirectoryView
IMPLEMENT_DYNCREATE(CDirectoryView, CTreeView)
CDirectoryView::CDirectoryView()
{
}
CDirectoryView::~CDirectoryView()
{
}
BEGIN_MESSAGE_MAP(CDirectoryView, CTreeView)
//{{AFX_MSG_MAP(CDirectoryView)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDirectoryView drawing
void CDirectoryView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CDirectoryView diagnostics
#ifdef _DEBUG
void CDirectoryView::AssertValid() const
{
CTreeView::AssertValid();
}
void CDirectoryView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDirectoryView message handlers
void CDirectoryView::OnInitialUpdate()
{
//CTreeCtrl *pCtrl = &GetTreeCtrl();
CTreeView::OnInitialUpdate();
//CTreeView::OnInitialUpdate();
}
void CDirectoryView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
if (pSender)
{
// This was sent from the other view - select the item
if (GetDocument()->IsKindOf(RUNTIME_CLASS(CNodeDataValueFileDoc)))
{
CNodeDataValueFileDoc *pDoc = (CNodeDataValueFileDoc *)GetDocument();
if (pDoc->m_pActiveChild)
{
CNodeObject *pNode = pDoc->m_pActiveChild;
while (pNode && !pNode->IsFile())
{
pNode = pNode->GetParentNode();
}
if (pNode)
{
CTreeCtrl *pCtrl = &GetTreeCtrl();
CNodeDisk *pDisk = ((CNodeDataValueFile *)pNode)->GetNodeDisk();
HTREEITEM hItem;
if (pDisk->m_mapViewHandles.Lookup((LPVOID)pCtrl,(VOID *&)hItem))
{
pCtrl->EnsureVisible(hItem);
pCtrl->SelectItem(hItem);
}
}
}
}
}
else
{
// Update the tree - see that Files are bolded, file references are added, etc
if (GetDocument()->IsKindOf(RUNTIME_CLASS(CNodeDataValueFileDoc)))
{
CNodeDataValueFileDoc *pDoc = (CNodeDataValueFileDoc *)GetDocument();
CNodeDisk *pNode = pDoc->GetRootNode();
InsertNode(pNode,NULL);
}
}
}
int CDirectoryView::InsertNode(CNodeObject *pNode,HTREEITEM hParent)
{
int count = 0;
if (pNode)
{
if ((pNode->GetClassID() == CLASS_CNODEDISKDIRECTORY) || (pNode->GetClassID() == CLASS_CNODEDISKFILE))
{
count++;
char buf[MAX_PATH];
pNode->GetName(buf,MAX_PATH);
CTreeCtrl *pCtrl = &GetTreeCtrl();
CNodeDisk *pDisk = (CNodeDisk *)pNode;
HTREEITEM hChild;
if (pDisk->m_mapViewHandles.Lookup(pCtrl,(VOID *&)hChild))
{
// Update
// - Remove the children of hChild
if (pNode->GetClassID() == CLASS_CNODEDISKFILE)
{
CNodeObject *pObj = (CNodeObject *)pCtrl->GetItemData(hChild);
VERIFY(pObj == pNode);
HTREEITEM hItem = pCtrl->GetChildItem(hChild);
while (hItem)
{
HTREEITEM hNext = pCtrl->GetNextItem(hItem,TVGN_NEXT);
pCtrl->DeleteItem(hItem);
hItem = hNext;
}
}
}
else
{
// Insert
hChild = pCtrl->InsertItem(buf,hParent);
pCtrl->SetItemData(hChild,(DWORD)pNode);
pNode->m_mapViewHandles[pCtrl] = hChild;
if (pNode->GetClassID() == CLASS_CNODEDISKFILE)
{
pCtrl->SetItemState(hChild,TVIS_BOLD,TVIS_BOLD);
}
}
// Add the file's references as children
if (pNode->GetClassID() == CLASS_CNODEDISKFILE)
{
POSITION pos = pNode->GetFirstReference();
while (pos)
{
CNodeObject *pChild = pNode->GetNextReference(pos);
while (pChild && (!pChild->IsFile() ||(pChild->GetClassID() == CLASS_CNODEDATAVALUEFILEPROJECT)))
pChild = pChild->GetParentNode();
// Find the name of the node that loaded this file
CNodeObject *pChild1 = pChild;
if (pChild1)
{
do
{
pChild1 = pChild1->GetParentNode();
} while (pChild1 && !pChild1->IsFile());
}
if (pChild)
{
CNodeDisk *pRefDisk;
if (pChild1)
pRefDisk = ((CNodeDataValueFile *)pChild1)->GetNodeDisk();
else
pRefDisk = ((CNodeDataValueFile *)pChild)->GetNodeDisk();
HTREEITEM hRefChild = pCtrl->InsertItem(pRefDisk->GetPath(),hChild);
pCtrl->SetItemData(hRefChild,(DWORD)pChild);
count++;
}
}
}
POSITION pos = pNode->GetFirstChild();
while (pos)
{
CNodeObject *pChild = pNode->GetNextChild(pos);
count += InsertNode(pChild,hChild);
}
}
else
{
// This item is one of the file's references
}
}
return count;
}
void CDirectoryView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if (pNMTreeView->itemNew.state & TVIS_SELECTED)
{
CNodeObject *pNode = (CNodeObject *)pNMTreeView->itemNew.lParam;
if (pNode)
{
if ((pNode->GetClassID() == CLASS_CNODEDISKDIRECTORY) || (pNode->GetClassID() == CLASS_CNODEDISKFILE))
{
}
else
{
GetDocument()->UpdateAllViews(this,(DWORD)pNode,NULL);
}
}
}
*pResult = 0;
}
BOOL CDirectoryView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP | TVS_FULLROWSELECT | TVS_HASBUTTONS | TVS_LINESATROOT;
return CTreeView::PreCreateWindow(cs);
}
void CDirectoryView::OnDestroy()
{
CTreeView::OnDestroy();
if (GetDocument()->IsKindOf(RUNTIME_CLASS(CNodeDataValueFileDoc)))
{
CNodeDataValueFileDoc *pDoc = (CNodeDataValueFileDoc *)GetDocument();
CNodeDisk *pNode = pDoc->GetRootNode();
int count = DestroyNode(pNode);
}
}
int CDirectoryView::DestroyNode(CNodeObject *pNode)
{
int count = 0;
if (pNode)
{
if ((pNode->GetClassID() == CLASS_CNODEDISKDIRECTORY) || (pNode->GetClassID() == CLASS_CNODEDISKFILE))
{
count++;
CTreeCtrl *pCtrl = &GetTreeCtrl();
HTREEITEM hChild;
if (pNode->m_mapViewHandles.Lookup(pCtrl,(VOID *&)hChild))
{
pNode->m_mapViewHandles.RemoveKey(pCtrl);
}
POSITION pos = pNode->GetFirstChild();
while (pos)
{
CNodeObject *pChild = pNode->GetNextChild(pos);
count += DestroyNode(pChild);
}
}
}
return count;
}