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

📄 filewindowdirectory.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -