164 lines
4.3 KiB
C++
164 lines
4.3 KiB
C++
// FileTree.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "FileTree.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include <io.h>
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileTree
|
|
|
|
CFileTree::CFileTree()
|
|
{
|
|
CLogFile::WriteLine("File tree control created");
|
|
|
|
m_strFileSpec = "*.cgf";
|
|
m_strSearchFolder = "Objects";
|
|
}
|
|
|
|
CFileTree::~CFileTree()
|
|
{
|
|
CLogFile::WriteLine("File tree control destoried");
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CFileTree, CTreeCtrl)
|
|
//{{AFX_MSG_MAP(CFileTree)
|
|
ON_WM_CREATE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileTree message handlers
|
|
|
|
BOOL CFileTree::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Modify the window styles
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
cs.style |= WS_VISIBLE | WS_CHILD | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT;
|
|
cs.dwExStyle |= WS_EX_CLIENTEDGE;
|
|
|
|
return CTreeCtrl::PreCreateWindow(cs);
|
|
}
|
|
|
|
int CFileTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Fill the tree control with the correct data
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
HTREEITEM hRoot;
|
|
char szSearchPath[_MAX_PATH];
|
|
char szRootName[_MAX_PATH + 512];
|
|
|
|
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
// Create the list
|
|
//m_cImageList.Create(IDB_TREE_VIEW, 16, 1, RGB (255, 0, 255));
|
|
CMFCUtils::LoadTrueColorImageList( m_cImageList,IDB_TREE_VIEW,16,RGB(255,0,255) );
|
|
|
|
// Attach it to the control
|
|
SetImageList(&m_cImageList, TVSIL_NORMAL);
|
|
|
|
// Create name of the root
|
|
sprintf(szRootName, "Master CD %s Folder", m_strSearchFolder.GetBuffer(0));
|
|
|
|
// Add the Master CD folder to the list
|
|
hRoot = InsertItem(szRootName, 2, 2, TVI_ROOT);
|
|
|
|
// Create the folder path
|
|
sprintf(szSearchPath, "%s%s", GetIEditor()->GetMasterCDFolder(), (const char*)m_strSearchFolder );
|
|
|
|
// Fill the list
|
|
RecurseDirectory(szSearchPath, hRoot, m_strFileSpec.GetBuffer(0));
|
|
Expand(hRoot, TVE_EXPAND);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFileTree::RecurseDirectory(char szFolder[_MAX_PATH], HTREEITEM hRoot, PSTR pszFileSpec)
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Enumerate all files in the passed directory which match to the the
|
|
// passed pattern. Also continue with adding all subdirectories
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
CFileEnum cTempFiles;
|
|
__finddata64_t sFile;
|
|
char szFilePath[_MAX_PATH];
|
|
HTREEITEM hNewRoot, hNewItem;
|
|
|
|
ASSERT(pszFileSpec);
|
|
|
|
// Make the path ready for appening a folder or filename
|
|
PathAddBackslash(szFolder);
|
|
|
|
// Start the enumeration of the files
|
|
if (cTempFiles.StartEnumeration(szFolder, "*.*", &sFile))
|
|
{
|
|
do
|
|
{
|
|
// Construct the full filepath of the current file
|
|
strcpy(szFilePath, szFolder);
|
|
strcat(szFilePath, sFile.name);
|
|
|
|
// Have we found a directory ?
|
|
if (sFile.attrib & _A_SUBDIR)
|
|
{
|
|
// Skip the parent directory entries
|
|
if (_stricmp(sFile.name, ".") == 0 ||
|
|
_stricmp(sFile.name, "..") == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Add it to the list and start recursion
|
|
hNewRoot = InsertItem(sFile.name, 0, 0, hRoot);
|
|
RecurseDirectory(szFilePath, hNewRoot, pszFileSpec);
|
|
|
|
continue;
|
|
}
|
|
|
|
// Check if the file name maches the pattern
|
|
if (!PathMatchSpec(sFile.name, pszFileSpec))
|
|
continue;
|
|
|
|
// Remove the extension from the name
|
|
PathRenameExtension(sFile.name, "");
|
|
|
|
// Add the file to the list
|
|
hNewItem = InsertItem(sFile.name, 1, 1, hRoot);
|
|
|
|
// Associate the handle of this item with the path
|
|
// of its file
|
|
m_cFileNames[hNewItem] = CString(szFilePath);
|
|
|
|
} while (cTempFiles.GetNextFile(&sFile));
|
|
}
|
|
}
|
|
|
|
CString CFileTree::GetSelectedFile()
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Return the path of the currently selected file. If there is no
|
|
// currently selected file, just a NULL terminated string will be
|
|
// returned
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
Files::iterator it = m_cFileNames.find(GetSelectedItem());
|
|
if (it != m_cFileNames.end())
|
|
return it->second;
|
|
else
|
|
return CString("");
|
|
}
|