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