⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filewindowdirectory.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "cedtHeader.h"
#include "SortStringArray.h"
#include "FolderDialog.h"


BOOL CFileWindow::InitLocalDriveList(LPCTSTR lpszInitialDriveName)
{
	TCHAR szBuffer[1024];
	TCHAR * pDrive = szBuffer;

	if( ! GetLogicalDriveStrings(sizeof(szBuffer), szBuffer) ) return FALSE;
	m_cmbLocalDrive.ResetContent();

	CString szDriveName; INT nDrive = 0;
	while( * pDrive ) {
		TCHAR szVolumeName[1024], szFileSystemName[1024];
		DWORD dwSerialNumber, dwMaxComponentLength, dwFileSystemFlags;

		if( GetVolumeInformation(pDrive, szVolumeName, 1024, & dwSerialNumber,
			& dwMaxComponentLength, & dwFileSystemFlags, szFileSystemName, 1024) ) {
			szDriveName.Format("[%c:] %s", toupper(pDrive[0]), szVolumeName);
		} else {
			switch( GetDriveType(pDrive) ) {
			case DRIVE_FIXED: szDriveName.Format("[%c:] Local Drive", toupper(pDrive[0])); break;
			case DRIVE_RAMDISK: szDriveName.Format("[%c:] RAM Disk", toupper(pDrive[0])); break;
			case DRIVE_REMOTE: szDriveName.Format("[%c:] Network Drive", toupper(pDrive[0])); break;
			case DRIVE_CDROM: szDriveName.Format("[%c:] CD-ROM", toupper(pDrive[0])); break;
			case DRIVE_REMOVABLE: szDriveName.Format("[%c:] Removable", toupper(pDrive[0])); break;
			default: szDriveName.Format("[%c:] Unknown Type", toupper(pDrive[0])); break;
			}
		}

		m_cmbLocalDrive.InsertString(nDrive, szDriveName);
		nDrive++; pDrive += strlen(pDrive) + 1;
	}

	if( lpszInitialDriveName ) {
		nDrive = m_cmbLocalDrive.FindString(-1, lpszInitialDriveName);
		if( nDrive != CB_ERR ) m_cmbLocalDrive.SetCurSel(nDrive);
	}

	return TRUE;
}

BOOL CFileWindow::InitFileFilterList(LPCTSTR lpszComposedFilter, INT nInitialFilter, CALLBACK_SELCHANGE fcnCallback)
{
	m_cmbFileFilter.ResetContent(); if( nInitialFilter < 0 ) nInitialFilter = 0; 
	ParseFileFilter(m_arrFilterDescription, m_arrFilterExtensions, lpszComposedFilter);

	INT nSize = m_arrFilterDescription.GetSize();
	for(INT i = 0; i < nSize; i++) m_cmbFileFilter.InsertString( i, m_arrFilterDescription.GetAt(i) );

	m_cmbFileFilter.SetCurSel(nInitialFilter);
	m_fcnCallbackSelchangeFileFilter = fcnCallback;

	return TRUE;
}

BOOL CFileWindow::GetBrowsingDirectory(CString & szDirectory)
{
	HTREEITEM hItem = m_treDirectoryTree.GetSelectedItem();
	CString szFullPath = GetDirectoryItemPathName( hItem );

	if( ! VerifyFilePath( szFullPath ) ) szDirectory = szFullPath;
	else szDirectory = GetFileDirectory( szFullPath );

	return TRUE;
}

BOOL CFileWindow::SetBrowsingDirectory(LPCTSTR lpszDirectory)
{
	CString szDriveName( lpszDirectory, 2 );
	SelectLocalDrive( szDriveName );

	DisplayDirectoryDrive( szDriveName );
	RefreshDirectoryTree( lpszDirectory );

	return TRUE;
}

BOOL CFileWindow::IsSelectedDirectoryItemRoot()
{
	HTREEITEM hItem = m_treDirectoryTree.GetSelectedItem();
	HTREEITEM hRoot = m_treDirectoryTree.GetRootItem();
	return (hItem == hRoot);
}

CString CFileWindow::GetSelectedDirectoryItemText()
{
	HTREEITEM hItem = m_treDirectoryTree.GetSelectedItem();
	if( ! hItem ) { AfxMessageBox(IDS_ERR_NO_DIR_ITEM_SELECTED); return ""; }
	return m_treDirectoryTree.GetItemText(hItem);
}

BOOL CFileWindow::OpenDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return OpenDirectoryItem(hItem);
}

BOOL CFileWindow::ExecuteDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return ExecuteDirectoryItem(hItem);
}

BOOL CFileWindow::ExploreDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return ExploreDirectoryItem(hItem);
}

BOOL CFileWindow::FindInDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return FindInDirectoryItem(hItem);
}

BOOL CFileWindow::MoveDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	if( hItem && m_treDirectoryTree.GetParentItem(hItem) ) {
		CString szPathName = GetDirectoryItemPathName(hItem);
		CString szDirectory = GetFileDirectory(szPathName);
		if( AskDestinationDirectory( szDirectory ) ) {
			return MoveToDirectoryItem(hItem, szDirectory);
		} else return FALSE;
	} else return FALSE;
}

BOOL CFileWindow::CopyDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	if( hItem && m_treDirectoryTree.GetParentItem(hItem) ) {
		CString szPathName = GetDirectoryItemPathName(hItem);
		CString szDirectory = GetFileDirectory(szPathName);
		if( AskDestinationDirectory( szDirectory ) ) {
			return CopyToDirectoryItem(hItem, szDirectory);
		} else return FALSE;
	} else return FALSE;
}

BOOL CFileWindow::RenameDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	if( hItem && m_treDirectoryTree.GetParentItem(hItem) ) {
		CEdit * pEdit = m_treDirectoryTree.EditLabel(hItem);
		return (pEdit != NULL);
	} else return FALSE;
}

BOOL CFileWindow::DeleteDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	if( hItem && m_treDirectoryTree.GetParentItem(hItem) ) {
		return DeleteDirectoryItem(hItem);
	} else return FALSE;
}

BOOL CFileWindow::SetWorkdirDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return SetAsWorkingDirectory(hItem);
}

BOOL CFileWindow::RefreshDirectoryItem()
{
	HTREEITEM hItem = GetSelectedDirectoryItem();
	return RefreshDirectoryItem(hItem);
}



/////////////////////////////////////////////////////////////////////////////
// Inner Functions
BOOL CFileWindow::SelectLocalDrive(LPCTSTR lpszDriveName)
{
	INT nDrive = m_cmbLocalDrive.FindString(-1, lpszDriveName);
	if( nDrive == CB_ERR ) return FALSE;
	m_cmbLocalDrive.SetCurSel(nDrive);
	return TRUE;
}

CString CFileWindow::GetActiveLocalDriveName()
{
	INT nDrive = m_cmbLocalDrive.GetCurSel();
	if( nDrive == CB_ERR ) return "C:";
	CString szDrive; m_cmbLocalDrive.GetLBText(nDrive, szDrive);
	return szDrive.Mid(1, 2);
}

INT CFileWindow::GetActiveFileFilterIndex()
{
	INT nFilter = m_cmbFileFilter.GetCurSel();
	if( nFilter == CB_ERR ) return 0;
	return nFilter;
}

CString CFileWindow::GetActiveFileFilterString()
{
	INT nFilter = m_cmbFileFilter.GetCurSel();
	if( nFilter == CB_ERR ) return "*.*";
	return m_arrFilterExtensions.GetAt(nFilter);
}


BOOL CFileWindow::DoesDirectoryHaveChildren(LPCTSTR lpszPath)
{
	CString szPath = lpszPath;
	if( szPath.Right(1) == "\\" ) szPath += "*.*";
	else szPath += "\\*.*";

	CString szFilter = GetActiveFileFilterString();
	CFileFind find; BOOL bFound = find.FindFile(szPath);

	while( bFound ) {
		bFound = find.FindNextFile();
		CString szFilePath = find.GetFilePath();

		if( find.IsDirectory() && ! find.IsDots() ) return TRUE;
		if( ! find.IsDirectory() && ! find.IsHidden() && MatchFileFilter(szFilePath, szFilter) ) return TRUE;
	}

	return FALSE;
}

CString CFileWindow::GetDirectoryItemPathName(HTREEITEM hItem)
{
	CString szTemp, szReturn = "";

	while( hItem ) {
		szTemp = m_treDirectoryTree.GetItemText( hItem );

		if( ! szReturn.GetLength() ) szReturn = szTemp;
		else szReturn = szTemp + "\\" + szReturn;

		hItem = m_treDirectoryTree.GetParentItem( hItem );
	}

	return szReturn;
}

BOOL CFileWindow::RefreshDirectoryTree(LPCTSTR lpszPathName)
{
	TCHAR szPathName[MAX_PATH]; strcpy( szPathName, lpszPathName );
	if( szPathName[strlen(szPathName)-1] != '\\' ) strcat( szPathName, "\\" );

	HTREEITEM hItem = TVI_ROOT;
	TCHAR * pText = szPathName;

	INT nLen = strlen(szPathName);
	for(INT i = 0; i < nLen; i++) {
		if( szPathName[i] == '\\' ) {
			szPathName[i] = '\0';

			hItem = FindChildDirectoryItem(hItem, pText);
			if( ! hItem ) break; // not found

			CString szPath = GetDirectoryItemPathName(hItem);
			RemoveChildDirectoryItems(hItem);
			DisplayDirectoryPath(hItem, szPath);
			m_treDirectoryTree.Expand(hItem, TVE_EXPAND);

			pText += strlen(pText) + 1;
		}
	}

	if( hItem ) m_treDirectoryTree.SelectItem(hItem);

	return TRUE;
}

BOOL CFileWindow::AskDestinationDirectory(CString & szDirectory)
{
	CString szText( LPCTSTR(IDS_CHOOSE_DIR_DESTINATION) );
	CFolderDialog dlg(szText, szDirectory, NULL, AfxGetMainWnd());
	if( dlg.DoModal() != IDOK ) return FALSE;
	szDirectory = dlg.GetPathName();
	return TRUE;
}


HTREEITEM CFileWindow::GetClickedDirectoryItem()
{
	CPoint point; GetCursorPos( & point ); 
	m_treDirectoryTree.ScreenToClient( & point );

	HTREEITEM hItem; UINT nFlags;
	hItem = m_treDirectoryTree.HitTest( point, & nFlags );

	if( nFlags & TVHT_ONITEM ) return hItem;
	return NULL;
}

HTREEITEM CFileWindow::InsertDirectoryItem(HTREEITEM hParent, LPCTSTR lpszPath)
{
	TCHAR szTemp[MAX_PATH]; strcpy(szTemp, lpszPath); INT nLen = strlen(lpszPath);
	if( szTemp[nLen-1] != '\\' ) { szTemp[nLen] = '\\'; nLen++; szTemp[nLen] = '\0'; }

	SHFILEINFO shFinfo; INT iIcon, iIconSel;
	if( ! SHGetFileInfo(szTemp, 0, &shFinfo, sizeof(shFinfo), SHGFI_SYSICONINDEX) ) return NULL;
	iIcon = iIconSel = shFinfo.iIcon;

	if( szTemp[nLen-1] == '\\' ) { szTemp[nLen-1] = '\0'; }
	return m_treDirectoryTree.InsertItem( GetFileName(szTemp ), iIcon, iIconSel, hParent );
}

HTREEITEM CFileWindow::RemoveChildDirectoryItems(HTREEITEM hParent)
{
	HTREEITEM hChild = m_treDirectoryTree.GetChildItem( hParent );
	while( hChild ) {
		m_treDirectoryTree.DeleteItem( hChild );
		hChild = m_treDirectoryTree.GetChildItem( hParent );
	}
	return hParent;
}

HTREEITEM CFileWindow::FindChildDirectoryItem(HTREEITEM hParent, LPCTSTR lpszText)
{
	HTREEITEM hFound = m_treDirectoryTree.GetChildItem(hParent);
	while( hFound ) {
		CString szText = m_treDirectoryTree.GetItemText( hFound );
		if( ! szText.CompareNoCase(lpszText) ) return hFound;
		hFound = m_treDirectoryTree.GetNextSiblingItem( hFound );
	}
	return NULL;
}


void CFileWindow::DisplayDirectoryDrive(LPCTSTR lpszDrive)
{
	m_treDirectoryTree.DeleteAllItems();

	HTREEITEM hItem = InsertDirectoryItem(TVI_ROOT, lpszDrive);
	if( DoesDirectoryHaveChildren(lpszDrive) ) {
		DisplayDirectoryPath(hItem, lpszDrive);
		m_treDirectoryTree.Expand(hItem, TVE_EXPAND);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -