www.pudn.com > c02 vc6.rar > FileTreeView.cpp


// FileTreeView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "C02IDE.h" 
#include "FileTreeView.h" 
#include  
#include "MainFrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileTreeView 
 
IMPLEMENT_DYNCREATE(CFileTreeView, CView) 
 
CFileTreeView::CFileTreeView() 
{ 
} 
 
CFileTreeView::~CFileTreeView() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CFileTreeView, CView) 
	//{{AFX_MSG_MAP(CFileTreeView) 
	ON_NOTIFY(TVN_ITEMEXPANDING, ID_FILETREE, OnItemexpanding) 
	ON_NOTIFY(NM_DBLCLK, ID_FILETREE, OnDblclk) 
	ON_WM_SIZE() 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileTreeView drawing 
 
void CFileTreeView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileTreeView diagnostics 
 
#ifdef _DEBUG 
void CFileTreeView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CFileTreeView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileTreeView message handlers 
 
void CFileTreeView::InitRootDirectory() 
{ 
	HTREEITEM		hItem,hti; 
	CStringArray	arDriverName; 
	CString			strDriverName; 
	CString			str; 
	UINT			nDriverType; 
 
	if (m_tree.GetImageList(TVSIL_NORMAL) == NULL) 
		m_tree.SetImageList(&m_ImageList,TVSIL_NORMAL); 
 
	hItem = m_tree.InsertItem(_T("我的电脑"),0,0,TVI_ROOT,TVI_LAST); 
 
	char szDriverName[500]; 
	char szDriverLabel[500]; 
	memset(szDriverName,0,sizeof(szDriverName)); 
	memset(szDriverLabel,0,sizeof(szDriverLabel)); 
	DWORD nLength = GetLogicalDriveStrings(sizeof(szDriverName),szDriverName); 
	 
	for (int i=0; i<(int)nLength; i++) 
	{ 
		if (szDriverName[i] != '\0') 
			strDriverName += szDriverName[i]; 
		else 
		{ 
			strDriverName = strDriverName.Left(strDriverName.GetLength() - 1); 
			arDriverName.Add(strDriverName); 
			strDriverName = ""; 
		} 
	} 
 
	char *szCurDir = NULL; 
	for (i=0; i=0; i--) 
	{ 
		if (strFileName.GetAt(i) != '.') 
			strFileExName = strFileName.GetAt(i) + strFileExName; 
		else 
			return strFileExName; 
	} 
	return strFileExName; 
} 
 
BOOL CFileTreeView::GetSubSiblingItem(HTREEITEM hItem, char *szCurDir) 
{ 
	BOOL bHaveChild = FALSE; 
	CString strEx; 
	HANDLE hFind; 
	HTREEITEM hti; 
	WIN32_FIND_DATA wfd; 
 
	if (_chdir(szCurDir) != 0) return bHaveChild; 
	hFind = FindFirstFile(_T("*.*"),&wfd); 
	if(hFind == INVALID_HANDLE_VALUE) return bHaveChild; 
 
	if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && 
		!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 
	{ 
		if( wfd.cFileName[0] != '.' ) 
		{ 
			bHaveChild = TRUE; 
			hti = m_tree.InsertItem(wfd.cFileName,6,6,hItem,TVI_FIRST); 
			m_tree.SetItemData(hti,DIR); 
			DisplayButton(hti); 
			_chdir(".."); // 查找完毕之后, 返回上一级目录 
		}  
	}  
	else 
	{  
		strEx = GetFileExName(wfd.cFileName); 
		strEx.MakeUpper(); 
		if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 
		{ 
			if (strEx == "RTF") 
			{ 
				hti = m_tree.InsertItem(wfd.cFileName,8,8,hItem,TVI_LAST); 
				m_tree.SetItemData(hti,FILETREE); 
				bHaveChild = TRUE; 
			} 
			else if (strEx == "TXT" || strEx == "LOG" || strEx == "INI" || strEx == "HTM" || 
					 strEx == "HTML"|| strEx == "CPP" || strEx == "H"   || strEx == "JAVA"|| 
					 strEx == "C"   || strEx == "CSS" || strEx == "DIC" || strEx == "INF") 
			{ 
				hti = m_tree.InsertItem(wfd.cFileName,7,7,hItem,TVI_LAST); 
				m_tree.SetItemData(hti,FILETREE); 
				bHaveChild = TRUE; 
			} 
		} 
	}  
 
	while(FindNextFile(hFind, &wfd))  
	{  
		if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&  
			!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 
		{  
			if(wfd.cFileName[0] != '.')  
			{  
				bHaveChild = TRUE; 
				hti = m_tree.InsertItem(wfd.cFileName,6,6,hItem,TVI_FIRST); 
				m_tree.SetItemData(hti,DIR); 
				DisplayButton(hti); 
				_chdir(".."); // 查找完毕之后, 返回上一级目录  
			}  
		}  
		else  
		{  
			strEx = GetFileExName(wfd.cFileName); 
			strEx.MakeUpper(); 
			if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 
			{ 
				if (strEx == "RTF") 
				{ 
					hti = m_tree.InsertItem(wfd.cFileName,8,8,hItem,TVI_LAST); 
					m_tree.SetItemData(hti,FILETREE); 
					bHaveChild = TRUE; 
				} 
				else if (strEx == "TXT" || strEx == "LOG" || strEx == "INI" || strEx == "HTM" || 
						 strEx == "HTML"|| strEx == "CPP" || strEx == "H"   || strEx == "JAVA"|| 
						 strEx == "C"   || strEx == "CSS" || strEx == "DIC" || strEx == "INF") 
				{ 
					hti = m_tree.InsertItem(wfd.cFileName,7,7,hItem,TVI_LAST); 
					m_tree.SetItemData(hti,FILETREE); 
					bHaveChild = TRUE; 
				} 
			} 
		}  
	}  
	FindClose(hFind); 
	return bHaveChild;} 
 
BOOL CFileTreeView::HaveSubDirOrFile(char *szCurDir) 
{ 
	BOOL bHaveChild = FALSE; 
	HANDLE hFind; 
	WIN32_FIND_DATA wfd; 
	CString strEx; 
 
	if (_chdir(szCurDir) != 0) return bHaveChild; 
	hFind = FindFirstFile(_T("*.*"),&wfd); 
	if(hFind == INVALID_HANDLE_VALUE) return bHaveChild; 
 
	if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
	{  
		if( wfd.cFileName[0] != '.' )  
		{ 
			bHaveChild = TRUE; 
			_chdir(".."); // 查找完毕之后, 返回上一级目录  
			FindClose(hFind); 
			return bHaveChild; 
		}  
	}  
	else 
	{  
		strEx = GetFileExName(wfd.cFileName); 
		strEx.MakeUpper(); 
		if (strEx == "TXT" || strEx == "LOG" || strEx == "INI" || strEx == "HTM" || 
		    strEx == "HTML"|| strEx == "CPP" || strEx == "H"   || strEx == "JAVA"|| 
		    strEx == "C"   || strEx == "CSS" || strEx == "DIC" || strEx == "INF" || 
			strEx == "RTF") 
		{ 
			bHaveChild = TRUE; 
			FindClose(hFind); 
			return bHaveChild; 
		} 
	}  
 
	while(FindNextFile(hFind, &wfd))  
	{  
		if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
		{  
			if(wfd.cFileName[0] != '.')  
			{  
				bHaveChild = TRUE; 
				_chdir(".."); 
				FindClose(hFind); 
				return bHaveChild; 
			}  
		}  
		else  
		{  
			strEx = GetFileExName(wfd.cFileName); 
			strEx.MakeUpper(); 
			if (strEx == "TXT" || strEx == "LOG" || strEx == "INI" || strEx == "HTM" || 
				strEx == "HTML"|| strEx == "CPP" || strEx == "H"   || strEx == "JAVA"|| 
				strEx == "C"   || strEx == "CSS" || strEx == "DIC" || strEx == "INF" || 
				strEx == "RTF") 
			{ 
				bHaveChild = TRUE; 
				FindClose(hFind); 
				return bHaveChild; 
			} 
		} 
	}  
	FindClose(hFind); 
	return bHaveChild; 
} 
 
void CFileTreeView::HideButton(HTREEITEM hti) 
{ 
	TVITEM tvi; 
	tvi.mask = TVIF_CHILDREN; 
	tvi.hItem = hti; 
	tvi.cChildren = 0; 
 
	m_tree.SetItem(&tvi); 
} 
 
void CFileTreeView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)  
{ 
 
	CView::OnActivateView(bActivate, pActivateView, pDeactiveView); 
} 
 
void CFileTreeView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	HTREEITEM hti,hParent; 
	CTreeCtrl &tree = m_tree; 
	CString strPath,str1,str2; 
 
	hti = tree.GetSelectedItem(); 
	if (tree.GetItemData(hti) == FILETREE) 
	{ 
		strPath = tree.GetItemText(hti); 
		hParent = tree.GetParentItem(hti); 
		while (hParent != tree.GetRootItem()) 
		{ 
			strPath = tree.GetItemText(hParent) + "\\" + strPath; 
			hParent = tree.GetParentItem(hParent); 
		} 
		strPath += "\\"; 
		str1 = strPath.Mid(strPath.Find(":") - 2 + 1,2); 
		str2 = strPath.Right(strPath.GetLength() - strPath.Find(":") - 2); 
		strPath = str1 + str2; 
		strPath = strPath.Left(strPath.GetLength() - 1); 
		m_strOpenFile = strPath; 
 
		///////////////////////////////////////////////////////////////////// 
		//临时打开文件 
//		CMDIChildWnd *pMainFrame = ((CMainFrame*)GetParentFrame())->MDIGetActive(); 
//		CWnd *pWnd = ((CRichFrame*)pMainFrame)->m_wndSplitter.GetPane(0,0); 
//		CSynEditView *pRich = (CSynEditView*)pWnd; 
//		pRich->SetFileName(strPath); 
//		pRich->OnOpen(); 
		///////////////////////////////////////////////////////////////////// 
 
 
	m_bAutoReturn = AfxGetApp()->GetProfileInt(_T("Editor Settings"),  _T("Auto Return"), TRUE); 
    CC02IDEApp *pApp = (CC02IDEApp *)AfxGetApp(); 
	pApp->OpenDocumentFile(strPath); //用MFC的方法建立一个新视 
	CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;	 
	CCJMDIChildWnd *m_pChild = (CCJMDIChildWnd *) pFrame->GetActiveFrame();	 
 
 
	ProjectList *curpro; 
	curpro=new ProjectList; 
    curpro=(ProjectList*)(projectinfo.GetAt(0)); 
 
	 gotoline=0; 
 
	 findstring=""; 
  
	 findstringcurhang=0; 
  
	 findstringcurlie=-1; 
// strreplacewith=""; 
  
    FileList * m_pnewfile; 
    m_pnewfile=new FileList; 
 
 
	int n_file=curpro->proinfstru.GetSize(); 
	//声明文件节点 
	struct fileitem m_pcurnode; 
    for (int j=0;j<=n_file-1;j++) 
	{ 
		//取得文件节点信息的第j个项 
		 m_pcurnode=fileitemarray[j]; 
		 //如果节点的窗口指针等于当前活动窗口指针 
		 if(m_pcurnode.m_pchildf==m_pChild) 
			return ;  
	} 
 
 
	TCHAR* ch_wndtitle=NULL; 
	CString str_newfilename=_T(""); 
	m_pChild->GetWindowText(str_newfilename); 
		//(ch_wndtitle; 
	m_pnewfile->m_pChildWnd= m_pChild; 
      
	 
 
 
//     m_pnewfile->funcinfstru=NULL; 
    
 
      
 
     if(str_newfilename!=_T(""))   
		m_pnewfile->str_filename=str_newfilename; 
	 else  
	 { 
 
		str_newfilename.Format("%d",n_file); 
		str_newfilename="no title file";//+str_newfilename; 
        
		m_pnewfile->str_filename=str_newfilename; 
//		pChild->SetWindowText(str_newfilename); 
	 } 
 
    curpro->proinfstru.Add((CObject *)m_pnewfile); 
 
 
	projectinfo.RemoveAll(); 
	projectinfo.InsertAt(0,(CObject *)curpro); 
	m_pnewfile->str_proname=_T("1"); 
	m_mappro.SetAt(m_pChild->GetSafeHwnd(),(void*&)m_pnewfile); 
//	projectfile.InsertAt(0,(CObject*)curpro); 
 
 
  
 
	 m_pDocClass->UpdateTabView(); 
     m_pDocFile->UpdateTabView(); 
     CMainFrame *m_pmainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;	 
 
//	 CWorkspaceView* m_ptab=(CWorkspaceView*)m_pmainFrame->m_wndWorkspace; 
 
	 m_pfile=m_pnewfile; 
	  
	 m_pmainFrame->updatecomfile(); 
 
    } 
	*pResult = 0; 
} 
 
//////////////////////////////////////////////////////////////////////// 
//当需要展开节点时,将该节点下的内容加入 
//////////////////////////////////////////////////////////////////////// 
void CFileTreeView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	 
	CTreeCtrl &tree = m_tree; 
	HTREEITEM hti = pNMTreeView->itemNew.hItem; 
	 
	if (hti != tree.GetRootItem()) 
	{ 
		//清空儿子 
		HTREEITEM hChild = tree.GetChildItem(hti); 
		while (hChild) 
		{ 
			tree.DeleteItem(hChild); 
			hChild = tree.GetChildItem(hti); 
		} 
 
		char *szCurDir; 
		HTREEITEM hParent; 
		CString strPath,str1,str2; 
 
		strPath = tree.GetItemText(hti); 
		hParent = tree.GetParentItem(hti); 
		while (hParent != tree.GetRootItem()) 
		{ 
			strPath = tree.GetItemText(hParent) + "\\" + strPath; 
			hParent = tree.GetParentItem(hParent); 
		} 
		strPath += "\\"; 
		str1 = strPath.Mid(strPath.Find(":") - 2 + 1,2); 
		str2 = strPath.Right(strPath.GetLength() - strPath.Find(":") - 2); 
		strPath = str1 + str2; 
 
		szCurDir = (LPSTR)(LPCSTR)strPath; 
		if (!GetSubSiblingItem(hti,szCurDir)) 
			HideButton(hti); 
	} 
 
	*pResult = 0; 
} 
 
void CFileTreeView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
	 
	if (m_tree) 
		m_tree.MoveWindow(0,0,cx,cy,TRUE); 
} 
 
int CFileTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	if (!m_tree) 
		m_tree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS,CRect(0,0,0,0),this,ID_FILETREE); 
 
	if (!m_ImageList) 
 
		 
		m_ImageList.Create(IDB_FILE,16,16,RGB(0,255,0)); 
 
	InitRootDirectory(); 
 
	return 0; 
} 
 
void CFileTreeView::OnFiletreeRefresh() 
{ 
	InitRootDirectory(); 
}