Files
firestorm/Gameleap/code/mw4/Tools/ResourceBrowser/ResTreeView.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

269 lines
6.0 KiB
C++

// ResTreeView.cpp : implementation file
//
#include "stdafx.h"
#include "ResourceBrowser.h"
#include "ResourceBrowserDoc.h"
#include "ResTreeView.h"
#include "ReportDlg.h"
#include <Adept\Adept.hpp>
#include <Stuff\Stuff.hpp>
#include <MW4\MW4.hpp>
using namespace Stuff;
using namespace Adept;
using namespace MechWarrior4;
/////////////////////////////////////////////////////////////////////////////
// CResTreeView
IMPLEMENT_DYNCREATE(CResTreeView, CTreeView)
CResTreeView::CResTreeView()
{
m_dwDefaultStyle |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
}
CResTreeView::~CResTreeView()
{
}
BEGIN_MESSAGE_MAP(CResTreeView, CTreeView)
//{{AFX_MSG_MAP(CResTreeView)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_COMMAND(ID_TOOLS_UNRESOURCEIFIEDREPORT, OnToolsUnresourceifiedreport)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResTreeView drawing
void CResTreeView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CResTreeView diagnostics
#ifdef _DEBUG
void CResTreeView::AssertValid() const
{
CTreeView::AssertValid();
}
void CResTreeView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CResTreeView message handlers
BOOL CResTreeView::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
// TODO: Add your specialized code here and/or call the base class
return CTreeView::OnChildNotify(message, wParam, lParam, pLResult);
}
void CResTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
AddDirectory(CString(path),CString("Content"));
}
void CResTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CResourceBrowserDoc *doc=(CResourceBrowserDoc *)GetDocument();
doc->m_CurPath="";
BuildPath(doc->m_CurPath,pNMTreeView->itemNew.hItem);
doc->UpdateAllViews(this);
*pResult = 0;
}
void CResTreeView::AddDirectory(CString &basepath,CString &dir,HTREEITEM par)
{
HTREEITEM itm;
itm=GetTreeCtrl().InsertItem(dir,par);
WIN32_FIND_DATA file_data;
HANDLE file_find;
file_find=FindFirstFile(basepath+"\\"+dir+"\\*.*",&file_data);
if(file_find != INVALID_HANDLE_VALUE)
{
CString dir_name;
do
{
dir_name=file_data.cFileName;
if(file_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY &&
dir_name!="." && dir_name!=".." )
{
AddDirectory(basepath+"\\"+dir,dir_name,itm);
}
}
while (FindNextFile(file_find,&file_data));
}
}
void CResTreeView::BuildPath(CString &str, HTREEITEM itm)
{
if(itm!=NULL)
{
str=GetTreeCtrl().GetItemText(itm)+"\\"+str;
BuildPath(str,GetTreeCtrl().GetParentItem(itm));
}
}
void CResTreeView::UnResReportOnDir(NotationFile *note_file,CString dir)
{
Page *page=NULL;
WIN32_FIND_DATA file_data;
HANDLE file_find;
file_find=FindFirstFile(dir+"*.*",&file_data);
CString file_name;
if(file_find != INVALID_HANDLE_VALUE)
{
do
{
file_name=file_data.cFileName;
int count = 0;
if(!(file_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) &&
file_name.CompareNoCase("vssver.scc") &&
!InResources(dir+file_name))
{
if(!page) page=note_file->AddPage(dir);
page->SetEntry(dir+file_name,"no");
}
}
while (FindNextFile(file_find,&file_data));
}
file_find=FindFirstFile(dir+"*.*",&file_data);
if(file_find != INVALID_HANDLE_VALUE)
{
do
{
file_name=file_data.cFileName;
int count = 0;
if(file_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY && file_name!="." && file_name!="..")
{
UnResReportOnDir(note_file,dir+file_name+"\\");
}
}
while (FindNextFile(file_find,&file_data));
}
}
void CResTreeView::OnToolsUnresourceifiedreport()
{
CReportDlg rdlg;
if(rdlg.DoModal()==IDOK)
{
NotationFile report;
report.DeleteAllPages();
switch(rdlg.m_TList)
{
case 0: UnResReportOnDir(&report,"Content\\"); break;
case 1: MultiResReport(&report); break;
}
report.SaveAs(rdlg.m_DPath);
MessageBox("Report Complete","All Done",MB_OK);
}
}
void CResTreeView::MultiResReport(Stuff::NotationFile *note_file)
{
if(Adept::ResourceManager::Instance==NULL) return;
Adept::Resource curres;
curres.First(NULL);
Page *statpage=note_file->SetPage("FINAL STATS");
CString res_name,base_name,dir_name;
int totaldups=0;
int totaldupsize=0;
int totaldupcomsize=0;
while(curres.ReadAndNext())
{
const char *resname=curres.GetName();
short rfilenum;
CString FirstDep;
int count=0;
CString filename;
for(rfilenum=0;rfilenum<FreeId;rfilenum++)
{
ResourceFile *rfile=ResourceManager::Instance->GetResourceFile(rfilenum);
Resource res(resname,rfile);
if(res.DoesResourceExist())
{
filename=ResFileNames[rfilenum];
count++;
if(count==1)
{
if(res.GetResourceID()!=curres.GetResourceID()) break;
FirstDep=filename;
}
else if(count==2)
{
totaldups++;
Page *page=note_file->SetPage(resname);
page->SetEntry(FirstDep,(int)res.GetSize());
}
if(count>1)
{
totaldupsize+=res.GetSize();
totaldupcomsize+=res.GetCompressedSize();
Page *page=note_file->SetPage(resname);
page->SetEntry(filename,(int)res.GetSize());
}
}
}
}
statpage->SetEntry("Duplicate files",totaldups);
statpage->SetEntry("Duplicate bytes(uncompressed)",totaldupsize);
statpage->SetEntry("Duplicate bytes(On Disk)",totaldupcomsize);
statpage->SetEntry("Compression Ratio",(Scalar)totaldupsize/totaldupcomsize);
}
bool CResTreeView::InResources(CString &str)
{
Adept::Resource res(str);
return res.DoesResourceExist();
}