Mercurial > ecos
diff host/tools/configtool/standalone/win32/Configtool.cpp @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 6736c52df507 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/standalone/win32/Configtool.cpp @@ -0,0 +1,766 @@ +//####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#### +// ConfigTool.cpp : Defines the class behaviors for the application. +// +// +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sdf +// Contact(s): sdf +// Date: 1998/08/11 +// Version: 0.01 +// Purpose: +// Description: This is the implementation of the application class +// Requires: +// Provides: +// See also: +// Known bugs: +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +#include "stdafx.h" + +#include "ConfigTool.h" +#include "ConfigToolDoc.h" +#include "ControlView.h" +#include "CSHDialog.h" +#include "CTUtils.h" +#include "eCosDialog.h" +#include "eCosTest.h" +#include "FileName.h" +#include "MainFrm.h" +#include "OutputView.h" +#include "RegKeyEx.h" +#include "Splash.h" + +#include <afxadv.h> +#include <afxdisp.h> // for AfxEnableControlContainer() +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +CString CConfigTool::strHelpFile; + +///////////////////////////////////////////////////////////////////////////// +// CConfigToolApp + +BEGIN_MESSAGE_MAP(CConfigToolApp, CWinApp) +//{{AFX_MSG_MAP(CConfigToolApp) +ON_COMMAND(ID_APP_ABOUT, OnAppAbout) +//}}AFX_MSG_MAP +// Standard file based document commands +ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) +ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) +// Standard print setup command +ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) +END_MESSAGE_MAP() + + + +///////////////////////////////////////////////////////////////////////////// +// CConfigToolApp construction +CConfigToolApp::CConfigToolApp() +{ + m_GrayPen.CreatePen(PS_SOLID,1,RGB(192,192,192)); + m_VersionInfo.dwOSVersionInfoSize=sizeof OSVERSIONINFO; + ::GetVersionEx(&m_VersionInfo); +} + +///////////////////////////////////////////////////////////////////////////// +// The one and only CConfigToolApp object + +CConfigToolApp theApp; + +///////////////////////////////////////////////////////////////////////////// +// CConfigToolApp initialization + +BOOL CConfigToolApp::InitInstance() +{ + CeCosTest::Init(); + CFileName strCSHFile; + ::GetModuleFileName(::GetModuleHandle(NULL),strCSHFile.GetBuffer(1+MAX_PATH),MAX_PATH); + strCSHFile.ReleaseBuffer(); + strCSHFile.ReplaceExtension(_T(".chm")); + CConfigTool::strHelpFile=strCSHFile; + CCSHDialog::SetCSHFilePath(strCSHFile); + + extern UINT arCommonDialogMap[]; + CeCosDialog::AddDialogMap(arCommonDialogMap); + + extern UINT arStandaloneDialogMap[]; + CeCosDialog::AddDialogMap(arStandaloneDialogMap); + + extern UINT arPkgAdminDialogMap[]; + CeCosDialog::AddDialogMap(arPkgAdminDialogMap); + + extern UINT arTestToolDialogMap[]; + CeCosDialog::AddDialogMap(arTestToolDialogMap); + + // CG: The following block was added by the Splash Screen component. + \ + { + \ + CCommandLineInfo cmdInfo; + \ + ParseCommandLine(cmdInfo); + \ + + \ + CSplashWnd::EnableSplashScreen(cmdInfo.m_bShowSplash); + \ + } + AfxEnableControlContainer(); + // Standard initialization + // If you are not using these features and wish to reduce the size + // of your final executable, you should remove from the following + // the specific initialization routines you do not need. + + int nSize=GetEnvironmentVariable(_T("PATH"), NULL, 0); + if(nSize>0){ + GetEnvironmentVariable(_T("PATH"),m_strOriginalPath.GetBuffer(1+nSize),nSize); + m_strOriginalPath.ReleaseBuffer(); + } + +#ifdef _AFXDLL + Enable3dControls(); // Call this when using MFC in a shared DLL +#else + Enable3dControlsStatic(); // Call this when linking to MFC statically +#endif + SetRegistryKey(IDS_REGKEY); + LoadStdProfileSettings(); // Load standard INI file options (including MRU) + + // Register the application's document templates. Document templates + // serve as the connection between documents, frame windows and views. + + CSingleDocTemplate* pDocTemplate; + pDocTemplate = new CSingleDocTemplate( + IDR_MAINFRAME, + RUNTIME_CLASS(CConfigToolDoc), + RUNTIME_CLASS(CMainFrame), // main SDI frame window + RUNTIME_CLASS(CControlView)); + AddDocTemplate(pDocTemplate); + + // Parse command line for standard shell commands, DDE, file open + CCommandLineInfo cmdInfo; + //ParseCommandLine(cmdInfo); + + CString strCmdLine(GetCommandLine()); + CStringArray arArgs; + int nWords=CUtils::Chop(strCmdLine,arArgs,_TCHAR(' '),/*bObserveStrings=*/true,/*bBackslashQuotes=*/false); + bool bBuild=false; + bool bRun=false; + CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); + for(int i=1;i<nWords;i++) + { + CString &str=arArgs[i]; + if(0==str.Compare(_T("-R")) && i<nWords-1){ + pDoc->SetRepository(arArgs[++i]); + } else if (0==str.CompareNoCase(_T("-S")) && i<nWords-1){ + // Load settings file + } else if (0==str.CompareNoCase(_T("-B"))){ + // Build + bBuild=true; + } else if (0==str.CompareNoCase(_T("-R"))){ + // run + bRun=true; + } else { + cmdInfo.m_nShellCommand=CCommandLineInfo::FileOpen; + cmdInfo.m_strFileName=str; + } + } + + // Dispatch commands specified on the command line + if (!ProcessShellCommand(cmdInfo)) + return FALSE; + + CMenu* pMenu = m_pMainWnd->GetMenu(); + if (pMenu)pMenu->DestroyMenu(); + HMENU hMenu = ((CMainFrame*) m_pMainWnd)->NewMenu(); + pMenu = CMenu::FromHandle( hMenu ); + m_pMainWnd->SetMenu(pMenu); + ((CMainFrame*)m_pMainWnd)->m_hMenuDefault = hMenu; + + + // The one and only window has been initialized, so show and update it. + m_pMainWnd->ShowWindow(SW_SHOW); + m_pMainWnd->UpdateWindow(); + + return TRUE; +} + +///////////////////////////////////////////////////////////////////////////// +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialog +{ +public: + CAboutDlg(); + + // Dialog Data + //{{AFX_DATA(CAboutDlg) + enum { IDD = IDD_ABOUTBOX }; + CStatic m_static; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAboutDlg) +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +protected: + //{{AFX_MSG(CAboutDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) +{ + //{{AFX_DATA_INIT(CAboutDlg) + //}}AFX_DATA_INIT +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAboutDlg) + DDX_Control(pDX, IDC_STATIC_ABOUT, m_static); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) +//{{AFX_MSG_MAP(CAboutDlg) +ON_WM_LBUTTONDBLCLK() +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +// App command to run the dialog +void CConfigToolApp::OnAppAbout() +{ + CAboutDlg aboutDlg; + aboutDlg.DoModal(); +} + +///////////////////////////////////////////////////////////////////////////// +// CConfigToolApp commands + + +int CConfigToolApp::ExitInstance() +{ + // Save persistence info + WriteProfileString(_T("Build"), _T("MakeOptions"),m_strMakeOptions); + WriteProfileString(CUtils::LoadString(IDS_KEY_USER_DIR), _T("Folder"), m_strUserToolsDir); + // Write any target bindirs to the registry + for(POSITION pos = m_arstrBinDirs.GetStartPosition(); pos != NULL; ){ + CString strPrefix,strBinDir; + m_arstrBinDirs.GetNextAssoc(pos, strPrefix, strBinDir); + WriteProfileString(CUtils::LoadString(IDS_KEY_TOOLS_DIR),strPrefix,strBinDir); + } + ::DeleteFile(CConfigToolDoc::HTMLHelpLinkFileName()); + CeCosTest::Term(); + return CWinApp::ExitInstance(); +} + +void CConfigToolApp::LoadStdProfileSettings() +{ + CWinApp::LoadStdProfileSettings(4); + + CString strNotepad; + FindExecutable(_T("Notepad.exe"),_T(""),strNotepad.GetBuffer(MAX_PATH)); + strNotepad.ReleaseBuffer(); + + m_strMakeOptions= GetProfileString(_T("Build"), _T("MakeOptions"),_T("")); + if(m_strMakeOptions.IsEmpty()){ + SYSTEM_INFO SystemInfo; + GetSystemInfo(&SystemInfo); + m_strMakeOptions.Format(_T("-j%d"),SystemInfo.dwNumberOfProcessors); + } + + CRegKeyEx InstallKey (HKEY_LOCAL_MACHINE, GetInstallVersionKey (), KEY_READ); + + m_strUserToolsDir= GetProfileString(CUtils::LoadString(IDS_KEY_USER_DIR), _T("Folder"), _T("")); + if(!m_strUserToolsDir.IsDir()){ // if the user specified user tools dir does not exist + InstallKey.QueryValue (_T("Default User Tools Path"), m_strUserToolsDir); // use the installer default + if (!m_strUserToolsDir.IsDir()) { // if the default user tools dir does not exist + m_strUserToolsDir=_T(""); // force prompting for the user tools dir + } + } + + // set default build tools binary directories as specified by the installer + CFileName strDefaultBuildToolsPath; + if (InstallKey.QueryValue (_T("Default Build Tools Path"), strDefaultBuildToolsPath)) { + // look for *-gcc.exe in the default build tools directory + CFileFind finder; + BOOL bMore=finder.FindFile (strDefaultBuildToolsPath + _T("*-gcc.exe")); + while (bMore) { // for each file matching the globbing pattern + bMore = finder.FindNextFile (); + CFileName strFile (finder.GetFileName ()); + m_arstrBinDirs.SetAt (strFile.Left (strFile.Find (_T("-gcc"))), strDefaultBuildToolsPath); + } + } + + CRegKeyEx k; + k.Attach(GetSectionKey(CUtils::LoadString(IDS_KEY_TOOLS_DIR))); + CFileName strDir; + CString strPrefix; + for(int i=0;k.QueryValue(i,strPrefix,strDir);i++){ + if(strDir.IsDir()){ + m_arstrBinDirs.SetAt(strPrefix,strDir); + } + } + + CStringArray arstrToolChainPaths; + GetRepositoryRegistryClues(arstrToolChainPaths,_T("GNUPro eCos")); + for(i=0;i<arstrToolChainPaths.GetSize();i++){ + CFileName strDir(arstrToolChainPaths[i]); + strDir+="H-i686-cygwin32\\bin"; + if(strDir.IsDir()){ + // This is a potential toolchain location. Look for *-gcc.exe + CFileFind finder; + BOOL bMore=finder.FindFile(strDir+"*-gcc.exe"); + while (bMore) { + bMore = finder.FindNextFile(); + CFileName strFile(finder.GetFileName()); + m_arstrBinDirs.SetAt(strFile.Left(strFile.Find(_T("-gcc"))),strDir); + } + } + } + + GetRepositoryRegistryClues(m_arstrUserToolPaths, _T("GNUPro unsupported")); + for(i=0;i<m_arstrUserToolPaths.GetSize();i++){ + CFileName str(m_arstrUserToolPaths[i]); + str+="H-i686-cygwin32\\bin"; + if(str.IsDir()){ + m_arstrUserToolPaths.SetAt(i,str); + } else { + m_arstrUserToolPaths.RemoveAt(i); + i--; + } + } + + // Include the path in the set of potential user paths + { + CString strPath; + int nSize=GetEnvironmentVariable(CUtils::LoadString(IDS_PATH), NULL, 0); + if(nSize>0){ + GetEnvironmentVariable(CUtils::LoadString(IDS_PATH), strPath.GetBuffer(nSize), nSize); + strPath.ReleaseBuffer(); + CStringArray arstrPath; + CUtils::Chop(strPath,arstrPath,_TCHAR(';')); + for(int i=arstrPath.GetSize()-1;i>=0;--i){ // Reverse order is important to treat path correctly + const CFileName &strFolder=arstrPath[i]; + CFileName strFile(strFolder); + strFile+=_T("ls.exe"); + if(strFile.Exists()){ + m_arstrUserToolPaths.Add(strFolder); + if(m_strUserToolsDir.IsEmpty()){ + m_strUserToolsDir=strFolder; + } + } + } + } + } +} + +BOOL CConfigToolApp::OnIdle(LONG lCount) +{ + if(lCount==0) + { + CMainFrame *pMain=CConfigTool::GetMain(); + if(pMain){ + // During startup the main window will be the splash screen + CDC *pDC=pMain->GetDC(); + CFont *pOldFont=pDC->SelectObject(pMain->m_wndStatusBar.GetFont()); + pDC->SelectObject(pOldFont); + pMain->ReleaseDC(pDC); + + } + } + return CWinApp::OnIdle(lCount); +} + +BOOL CConfigToolApp::PreTranslateMessage(MSG* pMsg) +{ + // CG: The following lines were added by the Splash Screen component. + if (CSplashWnd::PreTranslateAppMessage(pMsg)) + return TRUE; + + return CWinApp::PreTranslateMessage(pMsg); +} + +BOOL CAboutDlg::OnInitDialog() +{ + CString strVersion; + strVersion.Format(_T("%s %s"),_T(__DATE__),_T(__TIME__)); + SetDlgItemText(IDC_STATIC_DATETIME,strVersion); + CDialog::OnInitDialog(); + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +bool CConfigToolApp::Launch(const CString & strFileName,const CString &strViewer) +{ + bool rc=false; + + if(!strViewer.IsEmpty())//use custom editor + { + CString strCmdline(strViewer); + + TCHAR *pszCmdLine=strCmdline.GetBuffer(strCmdline.GetLength()); + GetShortPathName(pszCmdLine,pszCmdLine,strCmdline.GetLength()); + strCmdline.ReleaseBuffer(); + + strCmdline+=_TCHAR(' '); + strCmdline+=strFileName; + PROCESS_INFORMATION pi; + STARTUPINFO si; + + si.cb = sizeof(STARTUPINFO); + si.lpReserved = NULL; + si.lpReserved2 = NULL; + si.cbReserved2 = 0; + si.lpDesktop = NULL; + si.dwFlags = 0; + si.lpTitle=NULL; + + if(CreateProcess( + NULL, // app name + //strCmdline.GetBuffer(strCmdline.GetLength()), // command line + strCmdline.GetBuffer(strCmdline.GetLength()), // command line + NULL, // process security + NULL, // thread security + TRUE, // inherit handles + 0, + NULL, // environment + NULL, // current dir + &si, // startup info + &pi)){ + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + rc=true; + } else { + CUtils::MessageBoxF(_T("Failed to invoke %s.\n"),strCmdline); + } + strCmdline.ReleaseBuffer(); + } else {// Use association + TCHAR szExe[MAX_PATH]; + HINSTANCE h=FindExecutable(strFileName,_T("."),szExe); + if(int(h)<=32){ + CString str; + switch(int(h)){ + case 0: str=_T("The system is out of memory or resources.");break; + case 31: str=_T("There is no association for the specified file type.");break; + case ERROR_FILE_NOT_FOUND: str=_T("The specified file was not found.");break; + case ERROR_PATH_NOT_FOUND: str=_T("The specified path was not found.");break; + case ERROR_BAD_FORMAT: str=_T("The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).");break; + default: break; + } + CUtils::MessageBoxF(_T("Failed to open document %s.\r\n%s"),strFileName,str); + } else { + + SHELLEXECUTEINFO sei = {sizeof(sei), 0, AfxGetMainWnd()->GetSafeHwnd(), _T("open"), + strFileName, NULL, NULL, SW_SHOWNORMAL, AfxGetInstanceHandle( )}; + + sei.hInstApp=0; + HINSTANCE hInst=ShellExecute(AfxGetMainWnd()->GetSafeHwnd(),_T("open"), strFileName, NULL, _T("."), 0)/*ShellExecuteEx(&sei)*/; + if(int(hInst)<=32/*sei.hInstApp==0*/) + { + CString str; + switch(int(hInst)) + { + case 0 : str=_T("The operating system is out of memory or resources. ");break; + case ERROR_FILE_NOT_FOUND : str=_T("The specified file was not found. ");break; + case ERROR_PATH_NOT_FOUND : str=_T("The specified path was not found. ");break; + case ERROR_BAD_FORMAT : str=_T("The .EXE file is invalid (non-Win32 .EXE or error in .EXE image). ");break; + case SE_ERR_ACCESSDENIED : str=_T("The operating system denied access to the specified file. ");break; + case SE_ERR_ASSOCINCOMPLETE : str=_T("The filename association is incomplete or invalid. ");break; + case SE_ERR_DDEBUSY : str=_T("The DDE transaction could not be completed because other DDE transactions were being processed. ");break; + case SE_ERR_DDEFAIL : str=_T("The DDE transaction failed. ");break; + case SE_ERR_DDETIMEOUT : str=_T("The DDE transaction could not be completed because the request timed out. ");break; + case SE_ERR_DLLNOTFOUND : str=_T("The specified dynamic-link library was not found. ");break; + //case SE_ERR_FNF : str=_T("The specified file was not found. ");break; + case SE_ERR_NOASSOC : str=_T("There is no application associated with the given filename extension. ");break; + case SE_ERR_OOM : str=_T("There was not enough memory to complete the operation. ");break; + //case SE_ERR_PNF : str=_T("The specified path was not found. ");break; + case SE_ERR_SHARE : str=_T("A sharing violation occurred. ");break; + default: str=_T("An unexpected error occurred");break; + } + CUtils::MessageBoxF(_T("Failed to open document %s using %s.\r\n%s"),strFileName,szExe,str); + } else { + rc=true; + } + } + } + return rc; +} + +/* +void CConfigToolApp::AddToRecentFileList(LPCTSTR lpszPathName) +{ +const CFileName strDir=CFileName(lpszPathName).Head(); +if(strDir.IsDir()){ +CWinApp::AddToRecentFileList(strDir); +} +} +*/ + +int CConfigToolApp::GetRepositoryRegistryClues(CStringArray &arstr,LPCTSTR pszPrefix) +{ + // Go looking for potential candidates in SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths + arstr.RemoveAll(); + CRegKeyEx k1(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"),KEY_READ); + CString strKey; + for(int i=0;k1.QueryKey(i,strKey);i++){ + if(0==strKey.Find(pszPrefix)){ + CRegKeyEx k2((HKEY)k1,strKey,KEY_READ); + CFileName strDir; + if(k2.QueryValue(_T("Path"),strDir) && strDir.IsDir()){ + arstr.Add(strDir); + } + } + } + return arstr.GetSize(); +} + + +void CAboutDlg::OnLButtonDblClk(UINT nFlags, CPoint point) +{ + UNUSED_ALWAYS(point); + UNUSED_ALWAYS(nFlags); +} + +//const char CConfigToolApp::s_profileFlags[] = _T("flags"); +LPCTSTR CConfigToolApp::s_profileMax = _T("max"); +LPCTSTR CConfigToolApp::s_profileTool = _T("tool"); +LPCTSTR CConfigToolApp::s_profileStatus = _T("status"); +LPCTSTR CConfigToolApp::s_profileRect = _T("Rect"); + +void CConfigToolApp::SaveWindowPlacement(CWnd *pWnd, const CString &strKey) +{ + // Our position + CString strText; + + WINDOWPLACEMENT wndpl; + wndpl.length = sizeof(WINDOWPLACEMENT); + // gets current window position and + // iconized/maximized status + pWnd->GetWindowPlacement(&wndpl); + strText.Format(_T("%04d %04d %04d %04d"), + wndpl.rcNormalPosition.left, + wndpl.rcNormalPosition.top, + wndpl.rcNormalPosition.right, + wndpl.rcNormalPosition.bottom); + if(!pWnd->IsWindowVisible()){ + wndpl.showCmd=SW_HIDE; + } + WriteProfileInt (strKey,_T("Show"), wndpl.showCmd); + WriteProfileString(strKey,s_profileRect, strText); +} + +BOOL CConfigToolApp::RestoreWindowPlacement(CWnd *pWnd,const CString &strKey,const CRect &rcDefault) +{ + // Set the windows according to registry settings + CString strText; + WINDOWPLACEMENT wndpl; + CRect rect; + + strText = GetProfileString(strKey,s_profileRect); + if (!strText.IsEmpty()) { + rect.left = _ttoi((LPCTSTR ) strText); + rect.top = _ttoi((LPCTSTR ) strText + 5); + rect.right = _ttoi((LPCTSTR ) strText + 10); + rect.bottom = _ttoi((LPCTSTR ) strText + 15); + } else { + rect = rcDefault; + } + + CRect rcMax; + SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)(RECT *)rcMax, 0); + + if(rect.Width()<100 || rect.Height()<100 || rect.Width()>rcMax.Width() || rect.Height()>rcMax.Height()){ + rect=rcDefault; + } + + wndpl.length = sizeof(WINDOWPLACEMENT); + wndpl.showCmd = GetProfileInt(strKey,_T("Show"),SW_SHOWNA); + wndpl.flags = 0; + + wndpl.ptMinPosition = CPoint(0, 0); + wndpl.ptMaxPosition =CPoint(-::GetSystemMetrics(SM_CXBORDER),-::GetSystemMetrics(SM_CYBORDER)); + wndpl.rcNormalPosition = rect; + + // sets window's position and iconized/maximized status + return pWnd->SetWindowPlacement(&wndpl); +} + +void CConfigToolApp::LoadFont(const CString & strKey, LOGFONT & lf) +{ + lf.lfHeight =(LONG)GetProfileInt(strKey,_T("Height"),0); + if(0==lf.lfHeight){ + CFont font; + font.Attach(HFONT(GetStockObject(DEFAULT_GUI_FONT))); + font.GetLogFont(&lf); + } else { + lf.lfWidth =(LONG)GetProfileInt(strKey,_T("Width"),0); + lf.lfEscapement =(LONG)GetProfileInt(strKey,_T("Escapement"),0); + lf.lfOrientation =(LONG)GetProfileInt(strKey,_T("Orientation"),0); + lf.lfWeight =(LONG)GetProfileInt(strKey,_T("Weight"),0); + lf.lfItalic =(BYTE)GetProfileInt(strKey,_T("Italic"),0); + lf.lfUnderline =(BYTE)GetProfileInt(strKey,_T("Underline"),0); + lf.lfStrikeOut =(BYTE)GetProfileInt(strKey,_T("StrikeOut"),0); + lf.lfCharSet =(BYTE)GetProfileInt(strKey,_T("CharSet"),0); + lf.lfOutPrecision =(BYTE)GetProfileInt(strKey,_T("OutPrecision"),0); + lf.lfClipPrecision =(BYTE)GetProfileInt(strKey,_T("ClipPrecision"),0); + lf.lfQuality =(BYTE)GetProfileInt(strKey,_T("Quality"),0); + lf.lfPitchAndFamily =(BYTE)GetProfileInt(strKey,_T("PitchAndFamily"),0); + CString strFaceName =GetProfileString(strKey,_T("FaceName"),_T("")); + if(strFaceName.GetLength()<=31){ + _tcscpy(lf.lfFaceName,strFaceName); + } else { + lf.lfFaceName[0]=_TCHAR('\0'); + } + } +} + +void CConfigToolApp::SaveFont(const CString & strKey, const LOGFONT & lf) +{ + WriteProfileInt(strKey,_T("Height"), (int)lf.lfHeight); + WriteProfileInt(strKey,_T("Width"), (int)lf.lfWidth); + WriteProfileInt(strKey,_T("Escapement"), (int)lf.lfEscapement); + WriteProfileInt(strKey,_T("Orientation"), (int)lf.lfOrientation); + WriteProfileInt(strKey,_T("Weight"), (int)lf.lfWeight); + WriteProfileInt(strKey,_T("Italic"), (int)lf.lfItalic); + WriteProfileInt(strKey,_T("Underline"), (int)lf.lfUnderline); + WriteProfileInt(strKey,_T("StrikeOut"), (int)lf.lfStrikeOut); + WriteProfileInt(strKey,_T("CharSet"), (int)lf.lfCharSet); + WriteProfileInt(strKey,_T("OutPrecision"), (int)lf.lfOutPrecision); + WriteProfileInt(strKey,_T("ClipPrecision"), (int)lf.lfClipPrecision); + WriteProfileInt(strKey,_T("Quality"), (int)lf.lfQuality); + WriteProfileInt(strKey,_T("PitchAndFamily"),(int)lf.lfPitchAndFamily); + WriteProfileString(strKey,_T("FaceName"), lf.lfFaceName); +} + +CEditView *CConfigTool::m_pEditView=NULL; +COutputView *CConfigTool::m_pOutputView=NULL; +CControlView *CConfigTool::m_pControlView=NULL; +CCellView *CConfigTool::m_pCellView=NULL; +CDescView *CConfigTool::m_pDescView=NULL; +CPropertiesView *CConfigTool::m_pPropertiesView=NULL; +CRulesView *CConfigTool::m_pRulesView=NULL; +CConfigToolDoc *CConfigTool::m_pConfigToolDoc=NULL; +CMainFrame *CConfigTool::m_pMain=NULL; +CMLTView *CConfigTool::m_pMLTView=NULL; + +CControlView *CConfigTool::GetControlView() { return m_pControlView; } +COutputView *CConfigTool::GetOutputView() { return m_pOutputView; } +CCellView *CConfigTool::GetCellView() { return m_pCellView; } +CDescView *CConfigTool::GetDescView() { return m_pDescView; } +CPropertiesView *CConfigTool::GetPropertiesView() { return m_pPropertiesView; } +CRulesView *CConfigTool::GetRulesView() { return m_pRulesView; } +CMLTView *CConfigTool::GetMLTView() { return m_pMLTView; } + +void CConfigTool::SetDocument(CConfigToolDoc *pDoc) {m_pConfigToolDoc=pDoc; } +void CConfigTool::SetMain(CMainFrame * pMain) { m_pMain=pMain; } +void CConfigTool::SetControlView(CControlView *pControlView) {m_pControlView=pControlView; } +void CConfigTool::SetOutputView(COutputView *pOutputView) {m_pOutputView=pOutputView; } +void CConfigTool::SetCellView(CCellView *pCellView) {m_pCellView=pCellView; } +void CConfigTool::SetDescView(CDescView *pDescView) {m_pDescView=pDescView; } +void CConfigTool::SetMLTView(CMLTView *pMLTView) {m_pMLTView=pMLTView; } +void CConfigTool::SetPropertiesView(CPropertiesView *pPropertiesView) {m_pPropertiesView=pPropertiesView; } +void CConfigTool::SetRulesView(CRulesView *pRulesView) {m_pRulesView=pRulesView; } +CMainFrame *CConfigTool::GetMain() +{ + CWnd *pWnd=AfxGetMainWnd(); + return (pWnd && pWnd->IsKindOf(RUNTIME_CLASS(CMainFrame)))?(CMainFrame*)pWnd:NULL; +} + +int CConfigTool::Log(LPCTSTR pszFormat, ...) +{ + va_list marker; + va_start (marker, pszFormat); + + for(int nLength=100;nLength;) { + TCHAR *buf=new TCHAR[1+nLength]; + int n=_vsntprintf(buf, nLength, pszFormat, marker ); + if(-1==n){ + nLength*=2; // NT behavior + } else if (n<nLength){ + CWnd *pMain=CConfigTool::GetMain(); + if(pMain){ + // During startup the main window will be the splash screen + COutputView *pView=CConfigTool::GetOutputView(); + if(pView){ + pView->AddText(buf); + pView->AddText(_T("\r\n")); + } + } + ((CConfigToolApp *)AfxGetApp())->m_strBufferedLogMessages+=buf; + ((CConfigToolApp *)AfxGetApp())->m_strBufferedLogMessages+=_T("\r\n"); + nLength=0; // trigger exit from loop + } else { + nLength=n+1; // UNIX behavior generally, or NT behavior when buffer size exactly matches required length + } + delete [] buf; + } + + va_end (marker); + + return 0; +} + +void CConfigTool::DismissSplash() +{ + CSplashWnd::EnableSplashScreen(FALSE); +} + +CString CConfigToolApp::GetInstallVersionKey () +{ + CString strKey = _T("SOFTWARE\\Red Hat\\eCos"); + CString strVersionKey = _T(""); + CString rc = _T(""); + TCHAR pszBuffer [MAX_PATH + 1]; + HKEY hKey; + + // get the greatest eCos version subkey + if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_LOCAL_MACHINE, strKey, 0L, KEY_READ, &hKey)) { + DWORD dwIndex = 0; + while (ERROR_SUCCESS == RegEnumKey (hKey, dwIndex++, (LPTSTR) pszBuffer, sizeof (pszBuffer))) { + if (strVersionKey.Compare (pszBuffer) < 0) { + strVersionKey = pszBuffer; + } + } + RegCloseKey (hKey); + } + return strKey + _T("\\") + strVersionKey; +}
