📄 filewindowdirectory.cpp
字号:
#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 + -