www.gusucode.com > 一个VC++语法分析模块程序实例源码程序 > 一个VC++语法分析模块程序实例/CompileSys/CompileSys/IDE/WorkSpaceBar.cpp
// mybar.cpp : implementation file // Download: http://www.codesc.net #include "stdafx.h" #include "WorkSpaceBar.h" #include "Resource.h" #include "IDEView.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWorkSpaceBar CWorkSpaceBar::CWorkSpaceBar() { m_pIDEView=0; } CWorkSpaceBar::~CWorkSpaceBar() { } BEGIN_MESSAGE_MAP(CWorkSpaceBar, baseCWorkSpaceBar) //{{AFX_MSG_MAP(CWorkSpaceBar) ON_WM_CREATE() ON_WM_SIZE() ON_NOTIFY(NM_DBLCLK, IDC_TREE, OnDblclkTree) ON_COMMAND(IDM_HIDE_WORKSPACEBAR, OnHideWorkspacebar) ON_NOTIFY(NM_RCLICK, IDC_TREE, OnRclickTree) ON_COMMAND(IDM_EXPAND, OnExpand) ON_COMMAND(IDM_EXPANDALL, OnExpandall) ON_COMMAND(IDM_PINCH, OnPinch) ON_COMMAND(IDM_PINCHALL, OnPinchall) ON_COMMAND(IDM_DEL, OnDel) ON_COMMAND(IDM_DELALL, OnDelall) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWorkSpaceBar message handlers int CWorkSpaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (baseCWorkSpaceBar::OnCreate(lpCreateStruct) == -1) return -1; m_TreeCtrl.Create(WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | LBS_NOTIFY | WS_BORDER | WS_TABSTOP | WS_VSCROLL | WS_EX_CLIENTEDGE, CRect(0,0,0,0),this,IDC_TREE); m_TreeCtrl.ModifyStyle(NULL, WS_VISIBLE|WS_CHILD|TVS_HASLINES| TVS_LINESATROOT|TVS_HASBUTTONS); return 0; } void CWorkSpaceBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { baseCWorkSpaceBar::OnUpdateCmdUI(pTarget, bDisableIfNoHndler); UpdateDialogControls(pTarget, bDisableIfNoHndler); } void CWorkSpaceBar::OnSize(UINT nType, int cx, int cy) { baseCWorkSpaceBar::OnSize(nType, cx, cy); // TODO: Add your message handler code here CRect rc; GetClientRect(rc); m_TreeCtrl.MoveWindow(rc); } void CWorkSpaceBar::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here HTREEITEM hTreeItem=m_TreeCtrl.GetSelectedItem(); int nRetView=FindView(hTreeItem); int nRetTreeItem; int nStartChar,nEndChar; POSITION p; if(nRetView==-1) return; nRetTreeItem=FindTreeItem(m_vectorTree_View[nRetView].vectorTnl,hTreeItem); nStartChar=m_vectorTree_View[nRetView].vectorTnl[nRetTreeItem].lpv.nStrPos; nEndChar=nStartChar+m_vectorTree_View[nRetView].vectorTnl[nRetTreeItem].lpv.nStrLen; //--------------激活根节点对应的视图-------------- m_pIDEDoc=(CIDEDoc*)(::AfxGetApp()->OpenDocumentFile(m_vectorTree_View[nRetView].szFile)); if(!m_pIDEDoc)//该文件已被删除 { //根据不存在的文件删掉这个文件对应的工作空间的树 DelTreeByFile(m_vectorTree_View[nRetView].szFile); return; } p=m_pIDEDoc->GetFirstViewPosition(); m_pIDEView=(CIDEView*)m_pIDEDoc->GetNextView(p); //------------------------------------------------ m_pIDEView->GetEditCtrl().SetSel(nStartChar,nEndChar,1);//选中视图中的文本 m_pIDEView->SendMessage(MSG_PAINTLEFT,0,0);//发送消息到视图更新左边 *pResult = 0; } void CWorkSpaceBar::AddTRF(TREE_FILE trf) { int nRet=FindView(trf.szFile); TREE_FILE trfTemp; if(nRet==-1) { trfTemp.vectorTnl=trf.vectorTnl; trfTemp.szFile=new char[strlen(trf.szFile)]; strcpy(trfTemp.szFile,trf.szFile); m_vectorTree_View.push_back(trfTemp); } else m_vectorTree_View[nRet].vectorTnl=trf.vectorTnl; } int CWorkSpaceBar::FindView(char *szFile) { int nSize=m_vectorTree_View.size(); for(int i=0;i<nSize;i++) { if(!strcmp(szFile,m_vectorTree_View[i].szFile)) return i; } return -1; } void CWorkSpaceBar::OnHideWorkspacebar() { // TODO: Add your command handler code here CMainFrame* pMainFrame=((CMainFrame*)::AfxGetMainWnd()); pMainFrame->ShowControlBar(pMainFrame->GetWorkSapceBar(),0,1); } void CWorkSpaceBar::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here BCMenu *menuPopup; BCMenu menu; POINT point; GetCursorPos(&point); menu.LoadMenu(IDR_MENU_WORKSPACEBAR); menuPopup=(BCMenu*)menu.GetSubMenu(0); menuPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); menuPopup->DestroyMenu(); *pResult = 0; } void CWorkSpaceBar::OnExpand() { // TODO: Add your command handler code here m_TreeCtrl.Expand(m_TreeCtrl.GetSelectedItem(),TVE_EXPAND); } void CWorkSpaceBar::OnExpandall() { // TODO: Add your command handler code here HTREEITEM hFindRoot=m_TreeCtrl.GetRootItem(); while(hFindRoot) { ExpandNode(&m_TreeCtrl,hFindRoot,TVE_EXPAND); hFindRoot=m_TreeCtrl.GetNextItem(hFindRoot,TVGN_NEXT); } } void CWorkSpaceBar::OnPinch() { // TODO: Add your command handler code here m_TreeCtrl.Expand(m_TreeCtrl.GetSelectedItem(),TVE_COLLAPSE); } void CWorkSpaceBar::OnPinchall() { // TODO: Add your command handler code here HTREEITEM hFindRoot=m_TreeCtrl.GetRootItem(); while(hFindRoot) { ExpandNode(&m_TreeCtrl,hFindRoot,TVE_COLLAPSE); hFindRoot=m_TreeCtrl.GetNextItem(hFindRoot,TVGN_NEXT); } } void CWorkSpaceBar::OnDel() { // TODO: Add your command handler code here m_TreeCtrl.DeleteItem(m_TreeCtrl.GetSelectedItem()); } void CWorkSpaceBar::OnDelall() { // TODO: Add your command handler code here m_TreeCtrl.DeleteAllItems(); } int CWorkSpaceBar::FindView(HTREEITEM hTreeItem) { int nBigSize=m_vectorTree_View.size(); int nSmallSize; int i,j; for(i=0;i<nBigSize;i++) { nSmallSize=m_vectorTree_View[i].vectorTnl.size(); for(j=0;j<nSmallSize;j++) { if(hTreeItem==m_vectorTree_View[i].vectorTnl[j].hTreeItem) return i; } } return -1; } int CWorkSpaceBar::FindTreeItem(vector<TREENODE_LPV> vectorTnl,HTREEITEM hTreeItem) { int nSize=vectorTnl.size(); for(int i=0;i<nSize;i++) { if(hTreeItem==vectorTnl[i].hTreeItem) return i; } return -1; } void CWorkSpaceBar::ExpandNode(CTreeCtrl* pTree, HTREEITEM hTreeItem,UINT nCode) { pTree->Expand(hTreeItem,nCode); hTreeItem=pTree->GetChildItem(hTreeItem); while(hTreeItem) { ExpandNode(pTree,hTreeItem,nCode); hTreeItem=pTree->GetNextItem(hTreeItem,TVGN_NEXT); } } void CWorkSpaceBar::DelTreeByFile(char *szFile) { HTREEITEM hFindRoot=m_TreeCtrl.GetRootItem(); while(hFindRoot) { if(!strcmp((LPSTR)(LPCSTR)m_TreeCtrl.GetItemText(hFindRoot),szFile)) m_TreeCtrl.DeleteItem(hFindRoot); hFindRoot=m_TreeCtrl.GetNextItem(hFindRoot,TVGN_NEXT); } }