www.pudn.com > SCIDE.rar > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "SCIDE.h" 
 
#include "MainFrm.h" 
 
#include "SCDoc.h" 
#include "SCView.h" 
 
#include "Utils.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_VIEW_WORKSPACE, OnViewWorkspace) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_WORKSPACE, OnUpdateViewWorkspace) 
	ON_COMMAND(ID_VIEW_OUTPUT, OnViewOutput) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_OUTPUT, OnUpdateViewOutput) 
	ON_COMMAND(ID_TOOL_SYSFUNC, OnToolSysfunc) 
	ON_UPDATE_COMMAND_UI(ID_TOOL_SYSFUNC, OnUpdateToolSysfunc) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{	 
	ID_SEPARATOR,               // status line indicator  
	ID_EDIT_INDICATOR_POSITION,	  
	ID_EDIT_INDICATOR_COL, 
	ID_EDIT_INDICATOR_CRLF, 
	ID_INDICATOR_OVR,	 
	ID_EDIT_INDICATOR_READ, 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
 
/* 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
*/ 
}; 
 
//取应用程序所在目录 
CString g_GetHomeDirectory() 
{ 
	TCHAR sFilename[_MAX_PATH]; 
	TCHAR sDrive[_MAX_DRIVE]; 
	TCHAR sDir[_MAX_DIR]; 
	TCHAR sFname[_MAX_FNAME]; 
	TCHAR sExt[_MAX_EXT]; 
	 
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); 
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt); 
 
	CString rVal(CString(sDrive) + CString(sDir)); 
	int nLen = rVal.GetLength(); 
	if (rVal.GetAt(nLen-1) != _T('\\')) 
		rVal += _T("\\"); 
 
	return rVal; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	CString szFileName = g_GetHomeDirectory(); 
	szFileName += "SFTool.exe"; 
 
	OFSTRUCT ofs; 
 
	// 如果 SFTool.exe文件存在,则启用“系统函数定义”功能 
	if (OpenFile(szFileName, &ofs, OF_EXIST) == HFILE_ERROR) 
		m_bToolSysFunc = FALSE; 
	else 
		m_bToolSysFunc = TRUE; 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	//创建浮动菜单工具条 
	if (!m_wndMenuBar.CreateEx(this, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_RAISEDBORDER) || 
		!m_wndMenuBar.LoadMenuBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create menubar\n"); 
		return -1;      // fail to create 
	}	 
 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	//创建编译输出贴边窗口 
	if (!m_wndOutput.Create(_T("信息输出"), this, CSize(150, 100), 
        TRUE, ID_VIEW_OUTPUT))//AFX_IDW_CONTROLBAR_FIRST + 33)) 
    { 
        TRACE0("Failed to create outputbar\n"); 
        return -1;      // fail to create 
	} 
 
	//创建工程贴边窗口 
	if (!m_wndWorkspace.Create(_T("工作台"), this, CSize(200, 100), 
        TRUE, ID_VIEW_WORKSPACE))//AFX_IDW_CONTROLBAR_FIRST + 33)) 
    { 
        TRACE0("Failed to create mybar\n"); 
        return -1;      // fail to create 
	} 
 
	m_wndWorkspace.SetBarStyle(m_wndWorkspace.GetBarStyle() | 
        CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
 
	m_wndOutput.SetBarStyle(m_wndOutput.GetBarStyle() | 
        CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable	 
 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
 
	m_wndWorkspace.EnableDocking(CBRS_ALIGN_ANY); 
	m_wndOutput.EnableDocking(CBRS_ALIGN_ANY); 
 
	m_wndMenuBar.SetWindowText("浮动主菜单"); 
	m_wndMenuBar.EnableDockingEx(CBRS_ALIGN_ANY); 
 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
 
	DockControlBar(&m_wndOutput, AFX_IDW_DOCKBAR_BOTTOM); 
	DockControlBar(&m_wndWorkspace, AFX_IDW_DOCKBAR_LEFT); 
 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CMDIFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return TRUE; 
} 
 
CTreeCtrl *CMainFrame::GetTreeCtrl() 
{ 
	return m_wndWorkspace.m_pMyTree->m_pTreeCtrl; 
} 
 
HTREEITEM CMainFrame::GetTreeRoot() 
{ 
	return m_wndWorkspace.m_hRoot; 
} 
 
//删除树节点的数据 
void CMainFrame::DelTreeItemsData(HTREEITEM hRoot, HTREEITEM hParenRoot) 
{ 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
	if(hRoot == NULL) 
	{ 
		return; 
	} 
	CString szItem, szRoot; 
	if(hRoot != TVI_ROOT) 
	{ 
		szRoot = pTreeCtrl->GetItemText(hRoot); 
		if(0 != pTreeCtrl->GetItemData(hRoot)) 
		{ 
			LPTREEITEMDATA pd = (LPTREEITEMDATA)pTreeCtrl->GetItemData(hRoot); 
			if (pd) 
				delete pd; 
			pTreeCtrl->SetItemData(hRoot,0); 
		} 
	} 
 
	HTREEITEM hChild = pTreeCtrl->GetChildItem(hRoot); 
	 
	if(hChild == NULL) 
	{ 
		szRoot = pTreeCtrl->GetItemText(hRoot); 
		hChild = pTreeCtrl->GetNextSiblingItem(hRoot); 
		 
		if(hChild == NULL) 
		{ 
			 
			HTREEITEM hp = hRoot; 
			while(1)//回朔 
			{ 
				hp = pTreeCtrl->GetParentItem(hp); 
				if(hp == NULL) 
				{ 
					hChild = NULL; 
					break; 
				} 
				if(hp == hParenRoot) 
					return; 
				hChild = pTreeCtrl->GetNextSiblingItem(hp); 
				 
				if(hChild != NULL) 
					break; 
			} 
		} 
	} 
	szItem = pTreeCtrl->GetItemText(hChild); 
	DelTreeItemsData(hChild, hParenRoot); 
} 
 
// 0 -- 信息 
// 1 -- 警告 
// 2 -- 错误 
void CMainFrame::AddInfoItem(LPCTSTR lpszItem, int nType/* = 0*/) 
{ 
	CString str; 
	if (nType == 0) 
		str = "信息:"; 
	else if (nType == 1) 
		str = "警告:"; 
	else 
		str = "错误:"; 
 
	str += lpszItem; 
 
	int nLine = m_wndOutput.m_InfoList.AddString( str ); 
	m_wndOutput.m_InfoList.SetCurSel( nLine ); 
} 
 
void CMainFrame::ClearInfo() 
{ 
	m_wndOutput.m_InfoList.ResetContent(); 
} 
 
HTREEITEM CMainFrame::FindTreeNode(CSCDoc *pDoc) 
{ 
	if (NULL == pDoc) return NULL; 
 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
	HTREEITEM hItem = pTreeCtrl->GetChildItem(GetTreeRoot()); 
	while(hItem) 
	{ 
		LPTREEITEMDATA pd = (LPTREEITEMDATA)pTreeCtrl->GetItemData(hItem); 
		if (pd) 
		{ 
			CSCDoc *pItemDoc = (CSCDoc *)pd->dwPt0; 
			if (pItemDoc == pDoc) 
				return hItem; 
		} 
 
		hItem = pTreeCtrl->GetNextSiblingItem(hItem); 
	} 
 
	return hItem; 
} 
 
void CMainFrame::AddTreeNode(CSCDoc *pDoc, CSCView *pView, CString szFileName) 
{ 
	if (FindTreeNode(pDoc) != NULL) // 已经存在,则不加 
	{ 
		UpdateTreeNode(pDoc, pView, szFileName); 
		return; 
	} 
 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
 
	HTREEITEM hItem = pTreeCtrl->InsertItem(szFileName, 1, 1, GetTreeRoot()); 
	LPTREEITEMDATA pd = new TREEITEMDATA; 
	pd->nType = TID_FILE; 
	pd->szFileName = szFileName; 
	pd->dwPt0 = (DWORD)pDoc; 
	pd->dwPt1 = (DWORD)pView; 
	pd->dwPt2 = NULL; 
	pd->dwPt3 = NULL; 
	pTreeCtrl->SetItemData(hItem, (DWORD)pd); 
 
	UpdateFileCount(); 
 
	pTreeCtrl->Expand(GetTreeRoot(), TVE_EXPAND); 
} 
 
void CMainFrame::UpdateTreeNode(CSCDoc *pDoc, CSCView *pView, CString szFileName) 
{ 
	HTREEITEM hItem = FindTreeNode(pDoc); 
	if (hItem == NULL) // 不存在 
	{ 
		AddTreeNode(pDoc, pView, szFileName); 
		return; 
	} 
 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
 
	LPTREEITEMDATA pd = (LPTREEITEMDATA)pTreeCtrl->GetItemData(hItem); 
	if (!pd) return; 
 
	pd->szFileName = szFileName; 
	pTreeCtrl->SetItemText(hItem, szFileName); 
} 
 
void CMainFrame::DeleteTreeNode(CSCDoc *pDoc) 
{ 
	HTREEITEM hItem = FindTreeNode(pDoc); 
	if (hItem == NULL) // 不存在 
		return; 
 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
	LPTREEITEMDATA pd = (LPTREEITEMDATA)pTreeCtrl->GetItemData(hItem); 
	if (pd)  
		delete pd; 
 
	pTreeCtrl->DeleteItem(hItem); 
	UpdateFileCount(); 
} 
 
void CMainFrame::UpdateFileCount() 
{ 
	CTreeCtrl *pTreeCtrl = GetTreeCtrl(); 
	UINT count = pTreeCtrl->GetCount() - 1; 
	CString szt; 
	szt.Format("脚本源文件(%d)", count); 
	pTreeCtrl->SetItemText(GetTreeRoot(), szt); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CMDIFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CMDIFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
 
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)  
{ 
	// 用于处理浮动菜单事件 
	if (m_wndMenuBar.TranslateFrameMessage(pMsg)) 
		return TRUE; 
 
	// 用于处理在主框架中绘画背景图的OnPaint事件 
	//if (pMsg->hwnd == m_hWndMDIClient && pMsg->message==WM_PAINT) 
	//	PostMessage(WM_PAINT); 
 
	return CMDIFrameWnd::PreTranslateMessage(pMsg); 
} 
 
 
void CMainFrame::OnViewWorkspace()  
{ 
	// TODO: Add your command handler code here 
	BOOL bShow = m_wndWorkspace.IsVisible(); 
	ShowControlBar(&m_wndWorkspace, !bShow, FALSE); 
} 
 
void CMainFrame::OnUpdateViewWorkspace(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(); 
	pCmdUI->SetCheck(m_wndWorkspace.IsVisible()); 
} 
 
void CMainFrame::OnViewOutput()  
{ 
	// TODO: Add your command handler code here 
	BOOL bShow = m_wndOutput.IsVisible(); 
	ShowControlBar(&m_wndOutput, !bShow, FALSE); 
} 
 
void CMainFrame::OnUpdateViewOutput(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(); 
	pCmdUI->SetCheck(m_wndOutput.IsVisible()); 
} 
 
// 用于定义系统函数 
void CMainFrame::OnToolSysfunc()  
{ 
	// TODO: Add your command handler code here 
	CString szFileName = g_GetHomeDirectory(); 
	szFileName += "SFTool.exe"; 
 
	WinExecAndWait32(szFileName, SW_SHOW); 
} 
 
void CMainFrame::OnUpdateToolSysfunc(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(m_bToolSysFunc); 
}