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(); }