📄 filewindowdirectory.cpp
字号:
void CFileWindow::DisplayDirectoryPath(HTREEITEM hParent, LPCTSTR lpszPath)
{
CString szPath = lpszPath;
if( szPath.Right(1) == "\\" ) szPath += "*.*";
else szPath += "\\*.*";
CSortStringArray arrDirectories, arrFiles;
INT i, nSize;
CString szFilter = GetActiveFileFilterString();
CFileFind find; BOOL bFound = find.FindFile(szPath);
while( bFound ) {
bFound = find.FindNextFile();
CString szFilePath = find.GetFilePath();
if( find.IsDirectory() && ! find.IsDots() ) arrDirectories.Add( szFilePath );
if( ! find.IsDirectory() && ! find.IsHidden() && MatchFileFilter(szFilePath, szFilter) ) arrFiles.Add( szFilePath );
}
arrDirectories.Sort(); nSize = arrDirectories.GetSize();
for(i = 0; i < nSize; i++) {
szPath = arrDirectories.GetAt(i);
HTREEITEM hItem = InsertDirectoryItem(hParent, szPath);
if( DoesDirectoryHaveChildren(szPath) ) m_treDirectoryTree.InsertItem("NULL", hItem);
}
arrFiles.Sort(); nSize = arrFiles.GetSize();
for(i = 0; i < nSize; i++) {
szPath = arrFiles.GetAt(i);
HTREEITEM hItem = InsertDirectoryItem(hParent, szPath);
}
}
/////////////////////////////////////////////////////////////////////////////
// Handlers
void CFileWindow::OnDropdownLocalDrive()
{
CString szDriveName = GetActiveLocalDriveName();
m_szPrevDriveName = szDriveName;
InitLocalDriveList(szDriveName);
}
void CFileWindow::OnSelchangeLocalDrive()
{
CWaitCursor wait;
m_treDirectoryTree.SetRedraw(FALSE);
CString szDriveName = GetActiveLocalDriveName();
if( szDriveName.Compare(m_szPrevDriveName) ) DisplayDirectoryDrive(szDriveName);
m_treDirectoryTree.SetRedraw(TRUE);
}
void CFileWindow::OnSelchangeFileFilter()
{
CWaitCursor wait;
m_treDirectoryTree.SetRedraw(FALSE);
HTREEITEM hItem = GetSelectedDirectoryItem();
if( hItem ) RefreshDirectoryTree( GetDirectoryItemPathName(hItem) );
else RefreshDirectoryTree( GetActiveLocalDriveName() ); // no selected item
m_treDirectoryTree.SetRedraw(TRUE);
if( m_fcnCallbackSelchangeFileFilter ) m_fcnCallbackSelchangeFileFilter( GetActiveFileFilterIndex() );
}
void CFileWindow::OnItemexpandedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
UINT state = pNMTreeView->itemNew.state;
CString szPath = GetDirectoryItemPathName( hItem );
CWaitCursor wait;
m_treDirectoryTree.SetRedraw(FALSE);
if( state & TVIS_EXPANDED ) { // expand
RemoveChildDirectoryItems( hItem );
DisplayDirectoryPath(hItem, szPath);
} else { // collapse
RemoveChildDirectoryItems( hItem );
if( DoesDirectoryHaveChildren(szPath) ) m_treDirectoryTree.InsertItem("NULL", hItem);
}
m_treDirectoryTree.SetRedraw(TRUE);
*pResult = 0;
}
void CFileWindow::OnSelchangedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
HTREEITEM hItem = GetSelectedDirectoryItem();
if( hItem ) SetAsCurrentDirectory(hItem);
*pResult = 0;
}
void CFileWindow::OnClickDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
}
void CFileWindow::OnDblclkDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
HTREEITEM hItem = GetClickedDirectoryItem();
if( hItem ) OpenDirectoryItem(hItem);
*pResult = 0;
}
void CFileWindow::OnRclickDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
HTREEITEM hItem = GetClickedDirectoryItem();
if( hItem ) m_treDirectoryTree.SelectItem(hItem);
OpenDirectoryContextMenu(hItem);
*pResult = 0;
}
void CFileWindow::OnBeginlabeleditDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
HTREEITEM hParent = m_treDirectoryTree.GetParentItem(pTVDispInfo->item.hItem);
m_bLabelEditing = hParent ? TRUE : FALSE;
* pResult = m_bLabelEditing ? 0 : 1;
}
void CFileWindow::OnEndlabeleditDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
CString szText = m_treDirectoryTree.GetItemText(pTVDispInfo->item.hItem);
if( pTVDispInfo->item.pszText && szText.CompareNoCase(pTVDispInfo->item.pszText) ) {
RenameDirectoryItem( pTVDispInfo->item.hItem, pTVDispInfo->item.pszText );
}
m_bLabelEditing = FALSE;
* pResult = 0;
}
/////////////////////////////////////////////////////////////////////////////
// Action Functions
BOOL CFileWindow::OpenDirectoryContextMenu(HTREEITEM hItem)
{
CPoint point; GetCursorPos( & point );
CMenu * pMenu, context; context.LoadMenu(IDR_FILE_WINDOW);
if( hItem ) {
if( ! IsSelectedDirectoryItemRoot() ) {
CString szPathName = GetDirectoryItemPathName(hItem);
if( VerifyFilePath(szPathName) ) {
pMenu = GetSubMenuByText( & context, "DIR_FILE" );
} else pMenu = GetSubMenuByText( & context, "DIR_FOLDER" );
} else pMenu = GetSubMenuByText( & context, "DIR_ROOT" );
} else pMenu = GetSubMenuByText( & context, "DIR_NULL" );
UINT nFlags = TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON;
return pMenu->TrackPopupMenu(nFlags, point.x, point.y, AfxGetMainWnd());
}
BOOL CFileWindow::SetAsCurrentDirectory(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szDirName, szPathName = GetDirectoryItemPathName(hItem);
if( ! VerifyFilePath(szPathName) ) {
szDirName = szPathName;
return ::SetCurrentDirectory(szDirName + "\\");
} else {
szDirName = GetFileDirectory(szPathName);
return ::SetCurrentDirectory(szDirName + "\\");
}
}
BOOL CFileWindow::SetAsWorkingDirectory(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
if( ! VerifyFilePath(szPathName) ) {
CCedtApp::m_szInitialWorkingDirectory = szPathName;
return TRUE;
} else return FALSE;
}
BOOL CFileWindow::ShowDirectoryItemProperties(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
HINSTANCE hResult = ::ShellExecute(NULL, "properties", szPathName, NULL, NULL, SW_SHOWNORMAL);
return ((UINT)hResult > 32) ? TRUE : FALSE;
/* CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd();
SHObjectProperties( pFrame->m_hWnd, SHOP_FILEPATH, szPathName, NULL );
// this function is available only in Win2000
return TRUE; */
}
BOOL CFileWindow::OpenDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
if( VerifyFilePath(szPathName) ) {
CCedtApp * pApp = (CCedtApp *)AfxGetApp(); if( ! pApp ) return FALSE;
return pApp->PostOpenDocumentFile( szPathName, 0 );
} else return FALSE;
}
BOOL CFileWindow::ExecuteDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
if( VerifyFilePath(szPathName) ) {
CWnd * pWnd = AfxGetMainWnd(); if( ! pWnd ) return FALSE;
HINSTANCE hResult = ::ShellExecute(NULL, "open", szPathName, NULL, NULL, SW_SHOWNORMAL);
return ((UINT)hResult > 32) ? TRUE : FALSE;
} else return FALSE;
}
BOOL CFileWindow::ExploreDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
if( ! VerifyFilePath(szPathName) ) {
CWnd * pWnd = AfxGetMainWnd(); if( ! pWnd ) return FALSE;
HINSTANCE hResult = ::ShellExecute(NULL, "open", szPathName, NULL, NULL, SW_SHOWNORMAL);
return ((UINT)hResult > 32) ? TRUE : FALSE;
} else return FALSE;
}
BOOL CFileWindow::FindInDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
CString szPathName = GetDirectoryItemPathName(hItem);
if( ! VerifyFilePath(szPathName) ) {
CWnd * pWnd = AfxGetMainWnd(); if( ! pWnd ) return FALSE;
HINSTANCE hResult = ::ShellExecute(NULL, "find", szPathName, NULL, NULL, SW_SHOWNORMAL);
return ((UINT)hResult > 32) ? TRUE : FALSE;
} else return FALSE;
}
BOOL CFileWindow::MoveToDirectoryItem(HTREEITEM hItem, LPCTSTR lpszDestination)
{
if( ! hItem ) return FALSE;
TCHAR szFrom[MAX_PATH]; memset(szFrom, 0x00, sizeof(szFrom)); strcpy(szFrom, GetDirectoryItemPathName(hItem));
TCHAR szDest[MAX_PATH]; memset(szDest, 0x00, sizeof(szDest)); strcpy(szDest, lpszDestination);
CWnd * pWnd = AfxGetMainWnd();
SHFILEOPSTRUCT fo; memset( & fo, 0x00, sizeof(SHFILEOPSTRUCT) );
fo.hwnd = pWnd->m_hWnd; fo.wFunc = FO_MOVE;
fo.pFrom = szFrom; fo.pTo = szDest;
fo.fFlags = FOF_ALLOWUNDO;
if( ! SHFileOperation( & fo ) && ! fo.fAnyOperationsAborted && ! VerifyPathName(szFrom) ) {
HTREEITEM hParent = m_treDirectoryTree.GetParentItem(hItem);
m_treDirectoryTree.SelectItem(hParent);
m_treDirectoryTree.DeleteItem(hItem);
return TRUE;
} else return FALSE;
}
BOOL CFileWindow::CopyToDirectoryItem(HTREEITEM hItem, LPCTSTR lpszDestination)
{
if( ! hItem ) return FALSE;
TCHAR szFrom[MAX_PATH]; memset(szFrom, 0x00, sizeof(szFrom)); strcpy(szFrom, GetDirectoryItemPathName(hItem));
TCHAR szDest[MAX_PATH]; memset(szDest, 0x00, sizeof(szDest)); strcpy(szDest, lpszDestination);
CWnd * pWnd = AfxGetMainWnd();
SHFILEOPSTRUCT fo; memset( & fo, 0x00, sizeof(SHFILEOPSTRUCT) );
fo.hwnd = pWnd->m_hWnd; fo.wFunc = FO_COPY;
fo.pFrom = szFrom; fo.pTo = szDest;
fo.fFlags = FOF_ALLOWUNDO;
if( ! SHFileOperation( & fo ) && ! fo.fAnyOperationsAborted ) {
return TRUE;
} else return FALSE;
}
BOOL CFileWindow::RenameDirectoryItem(HTREEITEM hItem, LPCTSTR lpszNewName)
{
if( ! hItem ) return FALSE;
TCHAR szFrom[MAX_PATH]; memset(szFrom, 0x00, sizeof(szFrom)); strcpy(szFrom, GetDirectoryItemPathName(hItem));
TCHAR szDest[MAX_PATH]; memset(szDest, 0x00, sizeof(szDest)); strcpy(szDest, GetFileDirectory(szFrom) + "\\" + lpszNewName);
CWnd * pWnd = AfxGetMainWnd();
SHFILEOPSTRUCT fo; memset( & fo, 0x00, sizeof(SHFILEOPSTRUCT) );
fo.hwnd = pWnd->m_hWnd; fo.wFunc = FO_RENAME;
fo.pFrom = szFrom; fo.pTo = szDest;
fo.fFlags = FOF_ALLOWUNDO;
if( ! SHFileOperation( & fo ) && ! fo.fAnyOperationsAborted && ! VerifyPathName(szFrom) ) {
return m_treDirectoryTree.SetItemText(hItem, lpszNewName);
} else return FALSE;
}
BOOL CFileWindow::DeleteDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
TCHAR szFrom[MAX_PATH]; memset(szFrom, 0x00, sizeof(szFrom)); strcpy(szFrom, GetDirectoryItemPathName(hItem));
CWnd * pWnd = AfxGetMainWnd();
SHFILEOPSTRUCT fo; memset( & fo, 0x00, sizeof(SHFILEOPSTRUCT) );
fo.hwnd = pWnd->m_hWnd; fo.wFunc = FO_DELETE;
fo.pFrom = szFrom; fo.fFlags = FOF_ALLOWUNDO;
if( ! SHFileOperation( & fo ) && ! fo.fAnyOperationsAborted && ! VerifyPathName(szFrom) ) {
HTREEITEM hParent = m_treDirectoryTree.GetParentItem(hItem);
m_treDirectoryTree.SelectItem(hParent);
m_treDirectoryTree.DeleteItem(hItem);
return TRUE;
} else return FALSE;
}
BOOL CFileWindow::RefreshDirectoryItem(HTREEITEM hItem)
{
if( ! hItem ) return FALSE;
if( VerifyFilePath( GetDirectoryItemPathName(hItem) ) ) hItem = m_treDirectoryTree.GetParentItem(hItem);
CWaitCursor wait;
m_treDirectoryTree.SetRedraw(FALSE);
CString szPath = GetDirectoryItemPathName(hItem);
RemoveChildDirectoryItems( hItem );
DisplayDirectoryPath(hItem, szPath);
m_treDirectoryTree.Expand(hItem, TVE_EXPAND);
m_treDirectoryTree.SelectItem( hItem );
m_treDirectoryTree.SetRedraw(TRUE);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -