URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [tools/] [configtool/] [standalone/] [win32/] [MainFrm.cpp] - Rev 174
Compare with Previous | Blame | View Log
//####COPYRIGHTBEGIN#### // // ---------------------------------------------------------------------------- // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // // This program is part of the eCos host tools. // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // ---------------------------------------------------------------------------- // //####COPYRIGHTEND#### // MainFrm.cpp : implementation of the CMainFrame class: // //=========================================================================== //#####DESCRIPTIONBEGIN#### // // Author(s): sdf // Contact(s): sdf // Date: 1998/08/11 // Version: 0.01 // Purpose: // Description: This is the implementation of the main frame class // Requires: // Provides: // See also: // Known bugs: // Usage: // //####DESCRIPTIONEND#### // //=========================================================================== #include "stdafx.h" #define WM_SUBPROCESS (WM_USER+42) #include "BinDirDialog.h" #include "BuildOptionsDialog.h" #include "CTOptionsDialog.h" #include "CTUtils.h" #include "CellView.h" #include "ConfigItem.h" #include "ConfigTool.h" #include "ConfigToolDoc.h" #include "ControlView.h" #include "DescView.h" #include "FindDialog.h" #include "FolderDialog.h" #include "MLTFrame.h" #include "MainFrm.h" #include "MessageBox.h" #include "PlatformsDialog.h" #include "NotePage.h" #include "OutputView.h" #include "PropertiesView.h" #include "RegionGeneralPage.h" #include "RulesView.h" #include "SectionGeneralPage.h" #include "SectionRelocationPage.h" #include "Splash.h" #include "SplitterWndEx.h" #include "Subprocess.h" #include "TestResource.h" #include "ThinSplitter.h" #include "ViewOptions.h" #define INCLUDEFILE "build.hxx" #include "IncludeSTL.h" #include <afxpriv.h> #include <htmlhelp.h> #include <windowsx.h> // for GET_X_LPARAM, GET_Y_LPARAM #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) //UINT WM_FINDREPLACE = RegisterWindowMessage(FINDMSGSTRING); BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_VIEW_PROPERTIES, OnViewProperties) ON_UPDATE_COMMAND_UI(ID_VIEW_PROPERTIES, OnUpdateViewProperties) ON_COMMAND(ID_VIEW_MLT, OnViewMLT) ON_COMMAND(ID_VIEW_SHORTDESC, OnViewShortdesc) ON_UPDATE_COMMAND_UI(ID_VIEW_SHORTDESC, OnUpdateViewShortdesc) ON_COMMAND(ID_VIEW_OUTPUT, OnViewOutput) ON_UPDATE_COMMAND_UI(ID_VIEW_OUTPUT, OnUpdateViewOutput) ON_UPDATE_COMMAND_UI(ID_BUILD_CONFIGURE, OnUpdateBuildConfigure) ON_COMMAND(ID_BUILD_STOP, OnBuildStop) ON_UPDATE_COMMAND_UI(ID_BUILD_STOP, OnUpdateBuildStop) ON_COMMAND(ID_BUILD_CONFIGURE, OnConfigurationBuild) ON_WM_DESTROY() ON_COMMAND(ID_BUILD_TESTS, OnBuildTests) ON_UPDATE_COMMAND_UI(ID_BUILD_TESTS, OnUpdateBuildTests) ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave) ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs) ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen) ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateFileNew) ON_UPDATE_COMMAND_UI(ID_APP_EXIT, OnUpdateAppExit) ON_UPDATE_COMMAND_UI(ID_VIEW_MLT, OnUpdateViewMLT) ON_WM_SYSCOMMAND() ON_UPDATE_COMMAND_UI(ID_CONFIGURATION_REFRESH, OnUpdateConfigurationRefresh) ON_COMMAND(ID_CONFIGURATION_REFRESH, OnConfigurationRefresh) ON_COMMAND(ID_MENU_VIEW_SETTINGS, OnViewSettings) ON_COMMAND(ID_TOOLS_PATHS, OnToolsPaths) ON_WM_SIZE() ON_UPDATE_COMMAND_UI(ID_CONFIGURATION_REPOSITORY, OnUpdateConfigurationRepository) ON_COMMAND(ID_WINDOW_NEXT, OnWindowNext) ON_COMMAND(ID_WINDOW_PREV, OnWindowPrev) ON_COMMAND(ID_HELP_SUBMIT_PR, OnHelpSubmitPr) ON_COMMAND(ID_HELP_ECOS, OnHelpEcos) ON_COMMAND(ID_HELP_RED_HATONTHEWEB, OnHelpRedHatHome) ON_COMMAND(ID_HELP_UITRON, OnHelpUitron) ON_COMMAND(ID_HELP_ECOSHOME, OnHelpEcoshome) ON_COMMAND(ID_RUN_SIM, OnRunSim) ON_COMMAND(ID_BUILD_CLEAN, OnBuildClean) ON_UPDATE_COMMAND_UI(ID_BUILD_CLEAN, OnUpdateBuildClean) ON_COMMAND(ID_TOOLS_SHELL, OnToolsShell) ON_WM_CLOSE() ON_COMMAND(ID_BUILD_OPTIONS, OnBuildOptions) ON_COMMAND(ID_TOOLS_OPTIONS, OnToolsOptions) ON_COMMAND(ID_USERTOOLS_PATHS, OnUsertoolsPaths) ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString) ON_UPDATE_COMMAND_UI(ID_RUN_SIM, OnUpdateRunSim) ON_COMMAND(ID_VIEW_CONFLICTS, OnViewConflicts) ON_UPDATE_COMMAND_UI(ID_VIEW_CONFLICTS, OnUpdateViewConflicts) ON_COMMAND(ID_VIEW_MLTBAR, OnViewMltbar) ON_UPDATE_COMMAND_UI(ID_VIEW_MLTBAR, OnUpdateViewMltbar) ON_COMMAND(ID_RESOLVE_CONFLICTS, OnResolveConflicts) ON_UPDATE_COMMAND_UI(ID_RESOLVE_CONFLICTS, OnUpdateResolveConflicts) ON_COMMAND(ID_GO_HOME, OnGoHome) ON_WM_MEASUREITEM() ON_WM_INITMENUPOPUP() ON_UPDATE_COMMAND_UI(ID_BUILD_OPTIONS, OnUpdateBuildOptions) ON_MESSAGE(WM_SUBPROCESS,OnSubprocess) ON_UPDATE_COMMAND_UI(ID_TOOLS_ADMINISTRATION, OnUpdateToolsAdministration) ON_WM_HELPINFO() ON_COMMAND(ID_EDIT_PLATFORMS, OnEditPlatforms) ON_WM_MENUCHAR() ON_COMMAND(ID_HELP, OnHelp) ON_WM_TIMER() //}}AFX_MSG_MAP ON_NOTIFY(HHN_NAVCOMPLETE, ID_HHNOTIFICATION, OnNavComplete) ON_NOTIFY(HHN_TRACK, ID_HHNOTIFICATION, OnNavComplete) ON_NOTIFY(HHN_WINDOW_CREATE,ID_HHNOTIFICATION, OnNavComplete) END_MESSAGE_MAP() UINT CMainFrame::indicators[] = { ID_SEPARATOR, // status line indicator ID_THERMOMETER, ID_SEPARATOR, // status line indicator ID_SEPARATOR }; bool CMainFrame::m_arMounted[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame(): m_pFindReplaceDialog(NULL), m_strIdleMessage(), m_nThermometerMax(0), m_bFindInProgress(false), m_bStatusBarCreated(false) { } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { DragAcceptFiles(); if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,AFX_IDW_TOOLBAR) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndMLTToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,AFX_IDW_TOOLBAR+1) || !m_wndMLTToolBar.LoadToolBar(IDR_MLTBAR)) { TRACE0("Failed to create MLT toolbar\n"); return -1; // fail to create } m_bMLTToolbarVisible=true; 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 } m_bStatusBarCreated=true; CDC *pDC=GetDC(); CFont *pOldFont=pDC->SelectObject(m_wndStatusBar.GetFont()); m_nThermometerPaneSize=100; m_nPercentagePaneSize=pDC->GetTextExtent(_T("100%")).cx; m_nFailRulePaneSize=pDC->GetTextExtent(_T("333 conflicts")).cx; pDC->SelectObject(pOldFont); ReleaseDC(pDC); CRect rect; m_wndStatusBar.GetItemRect(ThermometerPane, rect); m_Progress.Create(WS_VISIBLE|WS_CHILD|PBS_SMOOTH, rect,&m_wndStatusBar, ID_THERMOMETER); m_Progress.SetRange(0,100); m_Progress.SetPos(0); //CConfigTool::GetConfigToolDoc()->UpdateFailingRuleCount(); // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndMLTToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndMLTToolBar); CSplashWnd::ShowSplashScreen(this); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { //cs.style|=~FWS_ADDTOTITLE; return CFrameWnd::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers CMainFrame::ViewStruct CMainFrame::arView[PaneTypeMax]={ CMainFrame::ViewStruct(_T("Cell"), true,RUNTIME_CLASS(CCellView)), CMainFrame::ViewStruct(_T("Configuration"), true,RUNTIME_CLASS(CControlView)), CMainFrame::ViewStruct(_T("Short Description"), true,RUNTIME_CLASS(CDescView)), CMainFrame::ViewStruct(_T("Output"), true,RUNTIME_CLASS(COutputView)), CMainFrame::ViewStruct(_T("Properties"), true,RUNTIME_CLASS(CPropertiesView)), CMainFrame::ViewStruct(_T("Rules"), false,RUNTIME_CLASS(CRulesView)), CMainFrame::ViewStruct(_T("Memory Layout"), false,RUNTIME_CLASS(CMLTView)) }; // This data defines the layout of the nested splitters CMainFrame::Split CMainFrame::arSplit[]={ CMainFrame::Split(Horz,1,0.8), CMainFrame::Split(Horz,2,0.7), CMainFrame::Split(Vert,3,0.5), CMainFrame::Split(Thin,4,0.4), CMainFrame::Split(Control,5), CMainFrame::Split(Cell,5), CMainFrame::Split(Horz,4,0.6), CMainFrame::Split(Rules,5), CMainFrame::Split(Horz,5,0.5), CMainFrame::Split(Properties,6), CMainFrame::Split(ShortDesc,6), CMainFrame::Split(MLT,3), CMainFrame::Split(Output,2) }; BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { for(int i=0;i<sizeof arView/sizeof arView[0];i++){ ViewStruct &v=arView[(PaneType)i]; v.bVisible=GetApp()->GetProfileInt(_T("Windows"),v.pszName,v.bVisible); } CRect rcClient; GetClientRect(rcClient); BOOL rc=TRUE; // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // x | | x // x Tree (T)| Cell(T) | x // x ^^^^^^^^^^^^^^^^^^| Rules (2) x // x 1 | x // x | |---------------------------x // x | | x // x | | Properties (2) x // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // x MLT x // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // x x // x Output (0) x // x x // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx for(i=0;i<sizeof arSplit/sizeof arSplit[0];i++){ const CSize szDefault(50,50); Split &s=arSplit[i]; CSplitterWndEx *pParent=NULL; bool bSecond=false; int nRowParent=0; int nColParent=0; // Search backwards for our parent. This is the first entry back of level one higher. for(int j=i-1;j>=0;--j){ Split &sp=arSplit[j]; if(sp.nLevel==s.nLevel-1){ pParent=sp.pSplit; nRowParent=(bSecond && Horz==sp.type); nColParent=(bSecond && Horz!=sp.type); break; } else if(sp.nLevel==s.nLevel){ bSecond=true; } } if(s.type>=0 /* a view */){ TRACE(_T("Create view index=%d [%s]\n"),i,arView[s.type].pszName); VERIFY(pParent->CreateView (nRowParent, nColParent, arView[s.type].pClass, szDefault, pContext)); arView[s.type].pView=(CView *)pParent->GetPane(nRowParent,nColParent); arView[s.type].pParent=pParent; } else { int nRows=1+(Horz==s.type); int nCols=1+(Horz!=s.type); UINT id; CWnd *pwndParent; if(NULL==pParent){ pwndParent=this; id=AFX_IDW_PANE_FIRST; } else { id=pParent->IdFromRowCol(nRowParent,nColParent); pwndParent=pParent; } if(Thin==s.type){ TRACE(_T("Create thin splitter index=%d\n"),i); s.pSplit=new CThinSplitter; VERIFY(s.pSplit->CreateStatic (pParent, 1, 2, WS_CHILD|WS_VISIBLE|WS_BORDER, id)); s.pSplit->SetScrollStyle(WS_VSCROLL); } else { TRACE(_T("Create splitter index=%d\n"),i); s.pSplit=new CSplitterWndEx; VERIFY(s.pSplit->CreateStatic (pwndParent, nRows, nCols, WS_CHILD|WS_VISIBLE|WS_BORDER, id)); } } }; for(i=0;i<PaneTypeMax;i++){ LOGFONT lf; ViewStruct &v=arView[(PaneType)i]; GetApp()->LoadFont(v.pszName,lf); if(!arView[(PaneType)i].font.CreateFontIndirect(&lf)){ CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT))->GetLogFont(&lf); } SetPaneFont((PaneType)i,lf); //v.pParent->ShowPane(v.pView,v.bVisible); } for(i=0;i<sizeof arSplit/sizeof arSplit[0];i++){ Split &s=arSplit[i]; if(s.pSplit){ s.pSplit->RecalcLayout(); } } UNUSED_ALWAYS(lpcs); // avoid compiler warning return rc; } void CMainFrame::OnViewProperties() { arView[Properties].bVisible^=1; arView[Properties].pParent->ShowPane(arView[Properties].pView,arView[Properties].bVisible); } void CMainFrame::OnUpdateViewProperties(CCmdUI* pCmdUI) { pCmdUI->SetCheck(arView[Properties].bVisible); } void CMainFrame::OnViewMLT() { arView[MLT].bVisible^=1; arView[MLT].pParent->ShowPane(arView[MLT].pView,arView[MLT].bVisible); ShowControlBar(&m_wndMLTToolBar,arView[MLT].bVisible&m_bMLTToolbarVisible,false); } void CMainFrame::OnViewShortdesc() { arView[ShortDesc].bVisible^=1; arView[ShortDesc].pParent->ShowPane(arView[ShortDesc].pView,arView[ShortDesc].bVisible); } void CMainFrame::OnUpdateViewShortdesc(CCmdUI* pCmdUI) { pCmdUI->SetCheck(arView[ShortDesc].bVisible); } void CMainFrame::OnViewOutput() { arView[Output].bVisible^=1; arView[Output].pParent->ShowPane(arView[Output].pView,arView[Output].bVisible); } void CMainFrame::OnUpdateViewOutput(CCmdUI* pCmdUI) { pCmdUI->SetCheck(arView[Output].bVisible); } void CMainFrame::OnUpdateBuildConfigure(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnBuildStop() { m_sp.Kill(); // leave the rest to OnSubprocessComplete() } void CMainFrame::OnUpdateBuildStop(CCmdUI* pCmdUI) { pCmdUI->Enable(m_sp.ProcessAlive()); } void CMainFrame::OnConfigurationBuild() { Build(); } DWORD CMainFrame::ThreadFunc(LPVOID param) { CMainFrame *pMain=(CMainFrame *)param; CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); CString strCmd(_T("make -n ")); strCmd+=pMain->m_strBuildTarget; SetCurrentDirectory(pDoc->BuildTree()); String strOut; CSubprocess sp; sp.Run(strOut,strCmd); // Don't attempt to change the thermometer itself - not safe from a separate thread pMain->m_nThermometerMax=pDoc->GetCompilationCount(strOut); return 0; } void CMainFrame::Build(const CString &strWhat/*=_T("")*/) { ASSERT(!m_sp.ProcessAlive()); CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); if(!arView[Output].bVisible){ SendMessage(WM_COMMAND,ID_VIEW_OUTPUT,0); } if(pDoc->IsModified()||pDoc->BuildTree().IsEmpty()){ SendMessage (WM_COMMAND, ID_FILE_SAVE); } if(!(pDoc->IsModified()||pDoc->BuildTree().IsEmpty())){ // verify the save worked CString strCmd (_T("make")); if(!strWhat.IsEmpty()){ strCmd+=_TCHAR(' '); strCmd+=strWhat; } if(!GetApp()->m_strMakeOptions.IsEmpty()){ strCmd+=_TCHAR(' '); strCmd+=GetApp()->m_strMakeOptions; } strCmd += _T(" --directory "); // Quoting the name may not mix with the 'sh' command on Unix, so only do it // under Windows where it's more likely there will be spaces needing quoting. #ifdef _WINDOWS CString buildDir(pDoc->BuildTree()); #if 1 // ecUSE_ECOS_X_NOTATION std::string cPath = cygpath(std::string(pDoc->BuildTree())); buildDir = cPath.c_str(); #endif strCmd += CString(_T("\"")) + buildDir + CString(_T("\"")); #else strCmd += CString(pDoc->BuildTree()) ; #endif if(PrepareEnvironment()){ m_strBuildTarget=strWhat; SetThermometerMax(250); // This is just a guess. The thread we are about to spawn will work out the correct answer m_nLogicalLines=0; UpdateThermometer(0); CloseHandle(CreateThread(NULL, 0, ThreadFunc, this, 0 ,&m_dwThreadId)); CString strMsg; strMsg.Format(_T("Building %s"),strWhat); SetIdleMessage(strMsg); SetTimer(42,1000,0); // This timer checks for process completion SetCurrentDirectory(pDoc->BuildTree()); m_sp.Run(SubprocessOutputFunc, this, strCmd, false); SetIdleMessage(); } } } CConfigToolApp * CMainFrame::GetApp() { return (CConfigToolApp *)AfxGetApp(); } void CMainFrame::ActivateFrame(int nCmdShow) { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); CRect rcDefault; SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)(RECT *)rcDefault, 0); // Insist on nothing more than 1000 width, with the golden ratio rcDefault.DeflateRect(max(0,(rcDefault.Width()-1000)/2),max(0,(rcDefault.Height()-618)/2)); GetApp()->RestoreWindowPlacement (this, _T("Window size"),rcDefault); LoadBarState(_T("DockState")); ShowControlBar(&m_wndMLTToolBar,arView[MLT].bVisible,false); CFrameWnd::ActivateFrame(nCmdShow); // must be before we muck about with the splitters CRect rcClient; GetClientRect(rcClient); for(int j=0;j<sizeof arSplit/sizeof arSplit[0];j++){ Split &s=arSplit[j]; if(s.pSplit){ CString strKey; strKey.Format(_T("Split %d"),j); const CString strSplit(GetApp()->GetProfileString(_T("Split"),strKey)); double fSplit=s.fFrac; _tscanf(_T("%f"),&fSplit); s.pSplit->SetSplitPoint(fSplit); s.pSplit->RecalcLayout(); } } for(int i=0;i<PaneTypeMax;i++){ ViewStruct &v=arView[(PaneType)i]; v.pParent->ShowPane(v.pView,v.bVisible); } RecalcLayout(); pDoc->UpdateFailingRuleCount(); } void CMainFrame::OnDestroy() { GetApp()->SaveWindowPlacement (this, _T("Window size")); for(int i=0;i<PaneTypeMax;i++){ LOGFONT lf; ViewStruct &v=arView[(PaneType)i]; v.font.GetLogFont(&lf); GetApp()->SaveFont(v.pszName,lf); } for(int j=0;j<sizeof arSplit/sizeof arSplit[0];j++){ Split &s=arSplit[j]; if(s.pSplit){ CString strSplit; strSplit.Format(_T("%f"),s.pSplit->GetSplitPoint()); CString strKey; strKey.Format(_T("%d"),j); GetApp()->WriteProfileString(_T("Split"),strKey,strSplit); } } for(j=0;j<sizeof arSplit/sizeof arSplit[0];j++){ Split &s=arSplit[j]; if(s.pSplit){ deleteZ(s.pSplit); } } if(m_sp.ProcessAlive()){ m_sp.Kill(); } for(i=0;i<sizeof arView/sizeof arView[0];i++){ GetApp()->WriteProfileInt(_T("Windows"), arView[i].pszName, arView[i].bVisible); } CFrameWnd::OnDestroy(); } void CMainFrame::OnBuildTests() { Build("tests"); } void CMainFrame::OnUpdateBuildTests(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnUpdateFileSave(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnUpdateFileSaveAs(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnUpdateFileOpen(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnUpdateFileNew(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnUpdateAppExit(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { CFrameWnd::OnSysCommand(nID, lParam); } void CMainFrame::OnUpdateConfigurationRefresh(CCmdUI* pCmdUI) { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); pCmdUI->Enable(!m_sp.ProcessAlive() && !pDoc->BuildTree().IsEmpty()); } void CMainFrame::OnConfigurationRefresh() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); pDoc->Reload(); } void CMainFrame::OnViewSettings() { CViewOptions dlg; dlg.DoModal(); } void CMainFrame::OnHelp() // Help->Configuration Tool Help { CConfigTool::GetConfigToolDoc()->ShowURL(CUtils::LoadString(IDS_CONFIGTOOL_HELP)); } void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); if(m_wndStatusBar){ cx=max(0,cx-m_nFailRulePaneSize-m_nThermometerPaneSize-m_nPercentagePaneSize); m_wndStatusBar.SetPaneInfo(StatusPane, 0, SBPS_STRETCH , 0); m_wndStatusBar.SetPaneInfo(ThermometerPane, 0, SBPS_NORMAL, m_nThermometerPaneSize); m_wndStatusBar.SetPaneInfo(PercentagePane, 0, SBPS_NORMAL, m_nPercentagePaneSize); m_wndStatusBar.SetPaneInfo(FailRulePane, 0, SBPS_NORMAL, m_nFailRulePaneSize); CRect rc; m_wndStatusBar.GetItemRect(ThermometerPane, rc); // Reposition the progress control correctly! m_Progress.SetWindowPos(&wndTop, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0); } } void CMainFrame::OnUpdateConfigurationRepository(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnWindowNext() { BumpWindow(+1); } void CMainFrame::OnWindowPrev() { BumpWindow(-1); } void CMainFrame::BumpWindow(int nInc) { CWnd *pWnd=CWnd::GetFocus(); if(pWnd){ int nWindows=sizeof arView/sizeof arView[0]; for(int i=0;i<nWindows;i++){ CWnd *pThisWnd=arView[i].pView; if(pWnd->m_hWnd==pThisWnd->m_hWnd){ for(int j=((i+nInc+nWindows)%nWindows);j!=i;j=((j+nInc+nWindows)%nWindows)){ if(arView[j].bVisible){ arView[j].pView->SetFocus(); return; } } } } } } void CMainFrame::OnHelpSubmitPr() { CString strURL; if(strURL.LoadString(IDS_ECOS_PR_URL)){ CConfigTool::GetConfigToolDoc()->ShowURL(strURL); } } void CMainFrame::OnHelpEcos() { CString strURL; if(strURL.LoadString(IDS_ECOS_SOURCEWARE_URL)){ CConfigTool::GetConfigToolDoc()->ShowURL(strURL); } } void CMainFrame::OnHelpEcoshome() { CString strURL; if(strURL.LoadString(IDS_ECOS_HOME_URL)){ CConfigTool::GetConfigToolDoc()->ShowURL(strURL); } } void CMainFrame::OnHelpRedHatHome() { CString strURL; if(strURL.LoadString(IDS_RED_HAT_HOME_URL)){ CConfigTool::GetConfigToolDoc()->ShowURL(strURL); } } void CMainFrame::OnHelpUitron() { CString strURL; if(strURL.LoadString(IDS_UITRON_HOME_URL)){ CConfigTool::GetConfigToolDoc()->ShowURL(strURL); } } void CMainFrame::OnBuildClean() { Build("clean"); } void CMainFrame::OnUpdateBuildClean(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::OnToolsShell() { if(PrepareEnvironment()){ CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); const CFileName strOldFolder(CFileName::SetCurrentDirectory(pDoc->BuildTree())); CUtils::Launch(_T(""),CUtils::LoadString(IDS_SHELL_NAME)); if(!strOldFolder.IsEmpty()){ // if the current directory was changed SetCurrentDirectory(strOldFolder); // restore the previous current directory } } } bool CMainFrame::PrepareEnvironment(bool bWithBuildTools /* = true */) { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); CConfigToolApp *pApp=(CConfigToolApp *)GetApp(); ::SetEnvironmentVariable(_T("PATH"),pApp->m_strOriginalPath); const CString strPrefix(pDoc->CurrentTargetPrefix()); CFileName strBinDir; bool rc=(! bWithBuildTools) || pApp->m_arstrBinDirs.Lookup(strPrefix,strBinDir); if(!rc){ SendMessage(WM_COMMAND,ID_TOOLS_PATHS,0); rc=pApp->m_arstrBinDirs.Lookup(strPrefix,strBinDir); } if(rc){ CFileName strUserBinDir(pApp->m_strUserToolsDir); if(strUserBinDir.IsEmpty()){ if(1==pDoc->m_arstrUserToolPaths.GetSize()){ pApp->m_strUserToolsDir=pDoc->m_arstrUserToolPaths[0]; } else { SendMessage(WM_COMMAND,ID_USERTOOLS_PATHS,0); } strUserBinDir=pApp->m_strUserToolsDir; } if(!strUserBinDir.IsEmpty()){ // calculate the directory of the host tools from this application's module name CFileName strHostToolsBinDir; ::GetModuleFileName (::GetModuleHandle (NULL), strHostToolsBinDir.GetBuffer (1 + MAX_PATH), MAX_PATH); strHostToolsBinDir.ReleaseBuffer (); strHostToolsBinDir = strHostToolsBinDir.Head (); #ifdef _DEBUG strHostToolsBinDir = _T("C:\\Progra~1\\Redhat~1\\eCos"); #endif // tools directories are in the order host-tools, user-tools, comp-tools, install/bin (if present), contrib-tools (if present) on the path const CFileName strContribBinDir(strUserBinDir,_T("..\\contrib\\bin")); CFileName strUsrBinDir(strUserBinDir,_T("..\\usr\\bin")); const CFileName strInstallBinDir(pDoc->InstallTree (),_T("bin")); // In case strUserBinDir is e.g. c:\program files\red hat\cygwin-00r1\usertools\h-i686-pc-cygwin\bin if (!strUsrBinDir.IsDir ()) strUsrBinDir = CFileName(strUserBinDir + _T("..\\..\\..\\H-i686-pc-cygwin\\bin")); if ( (strUsrBinDir.IsDir () && ! CUtils::AddToPath (strUsrBinDir)) || (strContribBinDir.IsDir () && ! CUtils::AddToPath (strContribBinDir)) || (strInstallBinDir.IsDir () && ! CUtils::AddToPath (strInstallBinDir)) || (bWithBuildTools && ! CUtils::AddToPath (strBinDir)) || ! CUtils::AddToPath (strUserBinDir) || ! CUtils::AddToPath (strHostToolsBinDir)) { CUtils::MessageBoxF(_T("Failed to set PATH environment variable - rc=%d"),GetLastError()); rc=false; } else { if(!SetEnvironmentVariable(_T("MAKE_MODE"),_T("unix"))){ CUtils::MessageBoxF(_T("Failed to set MAKE_MODE environment variable - rc=%d"),GetLastError()); rc=false; } else { SetEnvironmentVariable(_T("GDBTK_LIBRARY"),NULL); SetEnvironmentVariable(_T("GCC_EXEC_PREFIX"),NULL); SetEnvironmentVariable(_T("ECOS_REPOSITORY"),pDoc->PackagesDir()); // useful for ecosconfig if (! pDoc->BuildTree().IsEmpty()) CygMount(pDoc->BuildTree()[0]); if (! pDoc->InstallTree().IsEmpty()) CygMount(pDoc->InstallTree()[0]); if (! pDoc->Repository().IsEmpty()) CygMount(pDoc->Repository()[0]); #ifdef _DEBUG TCHAR buf[512]; ::GetEnvironmentVariable(_T("PATH"), buf, 512); CConfigTool::Log(buf); #endif } } } } return rc; } void CMainFrame::OnClose() { if(m_sp.ProcessAlive()){ if(IDNO==CUtils::MessageBoxFT(MB_YESNO|MB_DEFBUTTON2,_T("A build is in progress: exit anyway?"))){ return; } m_sp.Kill(); } SaveBarState(_T("DockState")); CFrameWnd::OnClose(); } void CMainFrame::OnBuildOptions() { CBuildOptionsDialog dlg; dlg.DoModal(); } void CMainFrame::OnUpdateBuildOptions(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } void CMainFrame::OnToolsOptions() { CToolsOptionsDialog dlg; dlg.DoModal(); } void CMainFrame::OnUpdateViewMLT(CCmdUI* pCmdUI) { pCmdUI->SetCheck(arView[MLT].bVisible); } void CMainFrame::OnViewConflicts() { arView[Rules].bVisible^=1; arView[Rules].pParent->ShowPane(arView[Rules].pView,arView[Rules].bVisible); } void CMainFrame::OnUpdateViewConflicts(CCmdUI* pCmdUI) { pCmdUI->SetCheck(arView[Rules].bVisible); } void CMainFrame::OnToolsPaths() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); CConfigToolApp *pApp=(CConfigToolApp *)GetApp(); CString strDefault; const CString strPrefix(pDoc->CurrentTargetPrefix()); CStringArray arstrPaths; for(POSITION pos = pApp->m_arstrBinDirs.GetStartPosition(); pos != NULL; ){ CString strP,strB; pApp->m_arstrBinDirs.GetNextAssoc(pos, strP, strB); arstrPaths.Add(strB); if(strP==strPrefix){ strDefault=strB; } } CBinDirDialog dlg(arstrPaths,strDefault); dlg.m_strDesc.Format(CUtils::LoadString(IDS_COMPTOOLS_DLG_DESC),strPrefix.IsEmpty()?_T("native"):strPrefix,strPrefix.IsEmpty()?_T(""):strPrefix+_T("-")); dlg.m_strTitle=_T("Build Tools"); if(IDOK==dlg.DoModal()){ CFileName strExe; strExe.Format(_T("%s\\%s%sgcc.exe"),dlg.m_strFolder,strPrefix,strPrefix.IsEmpty()?_T(""):_T("-")); if(strExe.Exists()|| IDYES==CUtils::MessageBoxFT(MB_YESNO,_T("%s does not appear to contain the build tools - use this folder anyway?"),dlg.m_strFolder)){ pApp->m_arstrBinDirs.SetAt(strPrefix,dlg.m_strFolder); } } } void CMainFrame::OnUsertoolsPaths() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); CConfigToolApp * pApp = (CConfigToolApp *) GetApp (); CStringArray arstrPaths; arstrPaths.Copy(pDoc->m_arstrUserToolPaths); if(!pApp->m_strUserToolsDir.IsEmpty()){ arstrPaths.Add(pApp->m_strUserToolsDir); } CBinDirDialog dlg(arstrPaths, pApp->m_strUserToolsDir); dlg.m_strDesc.LoadString(IDS_USERTOOLS_DLG_DESC); dlg.m_strTitle=_T("User Tools"); if(IDOK==dlg.DoModal()){ CFileName strFile(dlg.m_strFolder); strFile+=_T("ls.exe"); if(strFile.Exists()|| IDYES==CUtils::MessageBoxFT(MB_YESNO,_T("%s does not appear to contain the user tools - use this folder anyway?"),dlg.m_strFolder)){ pApp->m_strUserToolsDir=dlg.m_strFolder; } } } void CMainFrame::UpdateThermometer(int nLines) { if(nLines>=0 && 0!=m_nThermometerMax){ int nPercentage=min(100,(100*nLines)/m_nThermometerMax); m_Progress.SetPos(nPercentage); CString str; if(nLines>0){ str.Format(_T("%d%%"),nPercentage); } m_wndStatusBar.SetPaneText(PercentagePane,str); } } void CMainFrame::SetThermometerMax (int nMax) { if(0==nMax){ UpdateThermometer(0); } m_nThermometerMax=nMax; } LRESULT CMainFrame::OnSetMessageString(WPARAM wParam, LPARAM lParam) { if (AFX_IDS_IDLEMESSAGE==wParam){ wParam=0; lParam=(LPARAM)(LPCTSTR )m_strIdleMessage; } return CFrameWnd::OnSetMessageString(wParam, lParam); } void CMainFrame::SetIdleMessage (LPCTSTR pszIdleMessage) { if(NULL==pszIdleMessage){ m_strIdleMessage.LoadString(AFX_IDS_IDLEMESSAGE); } else { m_strIdleMessage=pszIdleMessage; } SendMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE, 0); } void CMainFrame::OnRunSim() { CConfigTool::GetConfigToolDoc()->RunTests(); } bool CMainFrame::SetPaneFont(PaneType pane,const LOGFONT &lf) { CFont &font=arView[pane].font; font.Detach(); font.CreateFontIndirect(&lf); switch(pane){ case Output: CConfigTool::GetOutputView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); break; case ShortDesc: CConfigTool::GetDescView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetDescView()->Invalidate(); break; case Control: case Cell: CConfigTool::GetControlView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetCellView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetControlView()->Invalidate(); CConfigTool::GetCellView()->Invalidate(); break; case Properties: CConfigTool::GetPropertiesView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetPropertiesView()->Invalidate(); break; case Rules: CConfigTool::GetRulesView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetRulesView()->Invalidate(); break; case MLT: CConfigTool::GetRulesView()->SendMessage(WM_SETFONT, (WPARAM)(HFONT)font, 0); CConfigTool::GetRulesView()->Invalidate(); break; default: ASSERT(FALSE); break; } return true; } CFont &CMainFrame::GetPaneFont(PaneType pane) { return arView[pane].font; } void CMainFrame::OnUpdateRunSim(CCmdUI* pCmdUI) { pCmdUI->Enable(!CConfigTool::GetConfigToolDoc()->InstallTree().IsEmpty() && !m_sp.ProcessAlive()); } void CMainFrame::SetFailRulePane(int nCount) { CString strCount; switch (nCount) { case 0: strCount = _T("No conflicts"); break; case 1: strCount = _T("1 conflict"); break; default: strCount.Format (_T("%d conflicts"), nCount); break; } if(m_bStatusBarCreated){ m_wndStatusBar.SetPaneText (FailRulePane, strCount); } } void CMainFrame::OnUpdateFrameTitle (BOOL bAddToTitle) { if ((GetStyle() & FWS_ADDTOTITLE) == 0) return; // leave it alone! /* #ifndef _AFX_NO_OLE_SUPPORT // allow hook to set the title (used for OLE support) if (m_pNotifyHook != NULL && m_pNotifyHook->OnUpdateFrameTitle()) return; #endif */ CDocument* pDoc=CConfigTool::GetConfigToolDoc(); if (bAddToTitle && pDoc != NULL) UpdateFrameTitleForDocument(pDoc->GetTitle() + (pDoc->IsModified () ? "*" : "")); else UpdateFrameTitleForDocument(NULL); } void CMainFrame::OnViewMltbar() { m_bMLTToolbarVisible^=1; ShowControlBar(&m_wndMLTToolBar,m_bMLTToolbarVisible,false); } void CMainFrame::OnUpdateViewMltbar(CCmdUI* pCmdUI) { pCmdUI->Enable(arView[MLT].bVisible); pCmdUI->SetCheck(m_bMLTToolbarVisible); } void CMainFrame::OnResolveConflicts() { if(CConfigToolDoc::NotDone==CConfigTool::GetConfigToolDoc()->ResolveGlobalConflicts()){ // Global inference handler was never invoked. Say something CUtils::MessageBoxF(_T("No solutions can be automatically determined for the current set of conflicts.")); } } void CMainFrame::OnUpdateResolveConflicts(CCmdUI* pCmdUI) { pCmdUI->Enable(CConfigTool::GetConfigToolDoc()->GetCdlInterpreter()->get_toplevel()->get_all_conflicts().size()>0); } void CMainFrame::OnGoHome() // Help->eCos Documentation { CConfigTool::GetConfigToolDoc()->ShowURL(CUtils::LoadString(IDS_ECOS_HELP)); } HMENU CMainFrame::NewMenu() { // Load the menu from the resources m_menu.LoadMenu(IDR_MAINFRAME); m_menu.LoadToolbar(IDR_MAINFRAME); m_menu.LoadToolbar(IDR_MISCBAR); m_menu.ModifyODMenu(NULL,ID_HELP,IDB_HELP); m_menu.ModifyODMenu(NULL,ID_GO_HOME,IDB_HELP); m_menu.ModifyODMenu(NULL,ID_HELP_RED_HATONTHEWEB,IDB_HTML); m_menu.ModifyODMenu(NULL,ID_HELP_ECOSHOME,IDB_HTML); m_menu.ModifyODMenu(NULL,ID_HELP_ECOS,IDB_HTML); m_menu.ModifyODMenu(NULL,ID_HELP_UITRON,IDB_HTML); return(m_menu.Detach()); } //This handler ensure that the popup menu items are drawn correctly void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { BOOL setflag=FALSE; if(lpMeasureItemStruct->CtlType==ODT_MENU){ if(IsMenu((HMENU)lpMeasureItemStruct->itemID)){ CMenu* cmenu=CMenu::FromHandle((HMENU)lpMeasureItemStruct->itemID); if(BCMenu::IsMenu(cmenu)){ m_menu.MeasureItem(lpMeasureItemStruct); setflag=TRUE; } } } if(!setflag)CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } //This handler ensures that keyboard shortcuts work LRESULT CMainFrame::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) { LRESULT lresult; if(BCMenu::IsMenu(pMenu)) lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu); else lresult=CFrameWnd::OnMenuChar(nChar, nFlags, pMenu); return(lresult); } //This handler updates the menus from time to time void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if(!bSysMenu){ if(BCMenu::IsMenu(pPopupMenu))BCMenu::UpdateMenu(pPopupMenu); } } void CALLBACK CMainFrame::SubprocessOutputFunc(void *pParam,LPCTSTR psz) { LPTSTR pszCopy=new TCHAR[1+_tcslen(psz)]; _tcscpy(pszCopy,psz); // Post a message to the mainframe because it wouldn't be safe to manipulate controls from a different thread ((CMainFrame *)pParam)->PostMessage(WM_SUBPROCESS,(WPARAM)pszCopy); } LRESULT CMainFrame::OnSubprocess(WPARAM wParam, LPARAM) { LPTSTR psz=(LPTSTR)wParam; CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); m_nLogicalLines+=pDoc->GetCompilationCount(psz); UpdateThermometer (m_nLogicalLines); CConfigTool::GetOutputView()->AddText(psz); deleteZA(psz); return 0; } void CMainFrame::OnUpdateToolsAdministration(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_sp.ProcessAlive()); } void CMainFrame::CygMount(TCHAR c) { // May not be alpha if it's e.g. a UNC network path if (!_istalpha(c)) return; c=towlower(c); if(!m_arMounted[c-_TCHAR('a')]){ m_arMounted[c-_TCHAR('a')]=true; CString strCmd; String strOutput; strCmd.Format(_T("mount %c: /ecos-%c"),c,c); CSubprocess sub; sub.Run(strOutput,strCmd); } } BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo) { // TODO: Add your message handler code here and/or call default return CFrameWnd::OnHelpInfo(pHelpInfo); } void CMainFrame::OnNavComplete(NMHDR* pHdr, LRESULT*) { TRACE(_T("HH Notify\n")); } BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { if(WM_NOTIFY==pMsg->message){ LPNMHDR pHdr=(LPNMHDR)pMsg->lParam; TRACE(_T("WM_NOTIFY id=%d idFrom=%d code=%d\n"),pMsg->wParam,pHdr->idFrom,pHdr->code); } return CFrameWnd::PreTranslateMessage(pMsg); } void CMainFrame::OnEditPlatforms() { CPlatformsDialog dlg; if(IDOK==dlg.DoModal()){ CeCosTestPlatform::RemoveAllPlatforms(); for(unsigned int i=0;i<dlg.PlatformCount();i++){ CeCosTestPlatform::Add(*dlg.Platform(i)); } CeCosTestPlatform::Save(); } } void CMainFrame::OnTimer(UINT nIDEvent) { if(!m_sp.ProcessAlive()){ KillTimer(nIDEvent); TRACE(_T("m_nThermometerMax=%d m_nLogicalLines=%d\n"),m_nThermometerMax,m_nLogicalLines); if(0==m_sp.GetExitCode){ UpdateThermometer(m_nThermometerMax); Sleep(250); // Allow user to see it } UpdateThermometer(0); SetThermometerMax(0); } CFrameWnd::OnTimer(nIDEvent); }