This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Installer/DirectoryBrowser.cpp

247 lines
12 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Installer *
* *
* $Archive:: /Commando/Code/Installer/DirectoryBrowser.cpp $*
* *
* $Author:: Ian_l $*
* *
* $Modtime:: 11/25/01 11:12p $*
* *
* $Revision:: 6 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
// Includes.
#include "DirectoryBrowser.h"
#include "ErrorHandler.h"
#include "TreeCtrl.h"
#include <io.h>
/***********************************************************************************************
* DirectoryBrowserClass::Get_Selected_Path -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void DirectoryBrowserClass::Get_Selected_Path (WideStringClass &selectedpath)
{
TreeCtrlClass *treectrl;
treectrl = Get_Dlg_Item (IDC_BROWSER_TREE)->As_TreeCtrlClass();
if (treectrl->Get_Selected_Item() != NULL) {
Build_Pathname (treectrl->Get_Selected_Item(), selectedpath);
} else {
selectedpath = L"???";
}
}
/***********************************************************************************************
* BrowserDialogClass::On_Init_Dialog -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void DirectoryBrowserClass::On_Init_Dialog (void)
{
TreeCtrlClass *treectrl;
char drivename [] = "?:";
treectrl = Get_Dlg_Item (IDC_BROWSER_TREE)->As_TreeCtrlClass();
// Make an entry at the root of the tree control for every fixed drive.
for (char r = 'A'; r <= 'Z'; r++) {
drivename [0] = r;
// If the drive is a fixed hard disc...
if (GetDriveType (drivename) == DRIVE_FIXED) {
TreeItemClass *treeitem;
treeitem = treectrl->Insert_Item (WideStringClass (drivename), TreeCtrlClass::ICON_FOLDER, TreeCtrlClass::ICON_FOLDER_OPEN, NULL);
treeitem->Set_Needs_Children (Has_Children (treectrl, treectrl->Get_ID(), treeitem));
}
}
treectrl->Sort_Children_Alphabetically (NULL);
// Must call base class.
PopupDialogClass::On_Init_Dialog();
}
/***********************************************************************************************
* DirectoryBrowserClass::On_TreeCtrl_Needs_Children -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void DirectoryBrowserClass::On_TreeCtrl_Needs_Children (TreeCtrlClass *tree_ctrl, int ctrl_id, TreeItemClass *parent_item)
{
if (parent_item != NULL) {
WideStringClass path;
Build_Pathname (parent_item, path);
Add_Folders (true, path, tree_ctrl, parent_item);
tree_ctrl->Sort_Children_Alphabetically (parent_item);
parent_item->Set_Needs_Children (false);
}
}
/***********************************************************************************************
* DirectoryBrowserClass::Has_Children -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool DirectoryBrowserClass::Has_Children (TreeCtrlClass *tree_ctrl, int ctrl_id, TreeItemClass *parent_item)
{
bool haschildren = true;
if (parent_item != NULL) {
WideStringClass path;
Build_Pathname (parent_item, path);
haschildren = Add_Folders (false, path, tree_ctrl, parent_item);
}
return (haschildren);
}
/***********************************************************************************************
* DirectoryBrowserClass::Build_Pathname -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
void DirectoryBrowserClass::Build_Pathname (TreeItemClass *treenode, WideStringClass &path)
{
WideStringClass backslash ("\\");
if (treenode->Get_Parent() != NULL) {
Build_Pathname (treenode->Get_Parent(), path);
}
if (path.Get_Length() > 0) {
path += backslash;
}
// Append the tree node's name whilst recursively unwinding.
path += treenode->Get_Name();
}
/***********************************************************************************************
* DirectoryBrowserClass::Add_Folders -- *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/22/01 IML : Created. *
*=============================================================================================*/
bool DirectoryBrowserClass::Add_Folders (bool recurse, const WideStringClass &path, TreeCtrlClass *treectrl, TreeItemClass *treenode)
{
const WCHAR *wildcardname = L"*.*";
WideStringClass pathname (path);
StringClass multibytepathname;
WIN32_FIND_DATA finddata;
HANDLE handle;
bool done = false;
bool haschildren = false;
// Add a child node for each subdirectory.
pathname += L"\\";
pathname += wildcardname;
multibytepathname = pathname;
handle = FindFirstFile (multibytepathname, &finddata);
if (handle != INVALID_HANDLE_VALUE) {
while (!done) {
WideStringClass filename (finddata.cFileName);
if ((filename [0] != L'.') && (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
TreeItemClass *treechild;
haschildren = true;
if (!recurse) break;
treechild = treectrl->Insert_Item (filename, TreeCtrlClass::ICON_FOLDER, TreeCtrlClass::ICON_FOLDER_OPEN, treenode);
treechild->Set_Needs_Children (Has_Children (treectrl, treectrl->Get_ID(), treechild));
}
if (done = FindNextFile (handle, &finddata) == 0) {
if (GetLastError() != ERROR_NO_MORE_FILES) FATAL_SYSTEM_ERROR;
}
}
if (!FindClose (handle)) FATAL_SYSTEM_ERROR;
}
// Does this node have any children?
return (haschildren);
}