]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - tools/src/tools/configtool/standalone/wxwin/appsettings.cpp
Initial revision
[karo-tx-redboot.git] / tools / src / tools / configtool / standalone / wxwin / appsettings.cpp
diff --git a/tools/src/tools/configtool/standalone/wxwin/appsettings.cpp b/tools/src/tools/configtool/standalone/wxwin/appsettings.cpp
new file mode 100644 (file)
index 0000000..748720e
--- /dev/null
@@ -0,0 +1,986 @@
+//####COPYRIGHTBEGIN####
+//
+// ----------------------------------------------------------------------------
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+// Copyright (C) 2003 John Dallaway
+//
+// 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####
+// appsettings.cpp :
+//
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   julians, jld
+// Contact(s):  julians
+// Date:        2000/08/29
+// Version:     $Id$
+// Purpose:
+// Description: Implementation file for the ecSettings
+// Requires:
+// Provides:
+// See also:
+// Known bugs:
+// Usage:
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "appsettings.h"
+#endif
+
+// Includes other headers for precompiled compilation
+#include "ecpch.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "wx/config.h"
+#include "wx/file.h"
+
+#include "appsettings.h"
+#include "configtree.h"
+#include "outputwin.h"
+#include "shortdescrwin.h"
+#include "mainwin.h"
+
+// For SystemInfo
+#ifdef __WXMSW__
+#include <windows.h>
+#include "wx/msw/winundef.h"
+#ifdef GetTempPath
+#undef GetTempPath
+#endif
+#endif
+
+/*
+* User-changeable and other settings to be saved between sessions
+*/
+
+IMPLEMENT_DYNAMIC_CLASS(ecSettings, wxObject)
+
+ecSettings::ecSettings()
+{
+    m_showToolBar = TRUE;
+    m_frameSize = wxRect(0, 0, 600, 500);
+    m_appName = _("eCos Configuration Tool");
+    m_showSplashScreen = TRUE;
+    m_userName = wxEmptyString;
+    m_serialNumber = 0;
+    m_frameStatus = ecSHOW_STATUS_NORMAL;
+    
+    m_treeSashSize = wxSize(400, 1000);
+    m_conflictsSashSize = wxSize(1000, 80);
+    m_propertiesSashSize = wxSize(1000, 80);
+    m_shortDescrSashSize = wxSize(1000, 80);
+    m_memorySashSize = wxSize(1000, 50);
+    m_outputSashSize = wxSize(1000, 50);
+    m_configPaneWidth = 200;
+    
+    m_showConflictsWindow = FALSE;
+    m_showPropertiesWindow = TRUE;
+    m_showShortDescrWindow = TRUE;
+    m_showMemoryWindow = FALSE;
+    m_showOutputWindow = TRUE;
+
+    m_showMacroNames = FALSE;
+    
+    m_bUseCustomViewer = FALSE;
+    m_bUseExternalBrowser = FALSE;
+    m_eUseCustomBrowser = ecAssociatedExternal;
+    m_bHex = FALSE;
+    m_nRuleChecking = Immediate|Deferred|SuggestFixes ;
+
+#ifdef __WXMSW__
+    m_strViewer = wxT("notepad");
+#endif
+
+    // Find dialog settings
+    m_findText = wxEmptyString;
+    m_findMatchWholeWord = FALSE;
+    m_findMatchCase = FALSE;
+    m_findDirection = TRUE; // Down is TRUE, Up is FALSE
+    m_findSearchWhat = _("Macro names"); // Macro names, item names etc.
+    m_findDialogPos = wxPoint(-1, -1);
+
+    m_editSaveFileOnly = FALSE;
+
+    // Packages dialog settings
+    m_omitHardwarePackages = FALSE;
+    m_matchPackageNamesExactly = FALSE;
+}
+
+// Copy constructor
+ecSettings::ecSettings(const ecSettings& settings)
+{
+    Copy(settings);
+}
+
+void ecSettings::Copy(const ecSettings& settings)
+{
+    m_showToolBar = settings.m_showToolBar;
+    m_frameSize = settings.m_frameSize;
+    m_showSplashScreen = settings.m_showSplashScreen;
+    m_userName = settings.m_userName;
+    m_serialNumber = settings.m_serialNumber;
+    
+    m_treeSashSize = settings.m_treeSashSize;
+    m_conflictsSashSize = settings.m_conflictsSashSize;
+    m_propertiesSashSize = settings.m_propertiesSashSize;
+    m_memorySashSize = settings.m_memorySashSize;
+    m_outputSashSize = settings.m_outputSashSize;
+    m_configPaneWidth = settings.m_configPaneWidth;    
+    m_showMacroNames = settings.m_showMacroNames;
+    
+    m_bUseCustomViewer = settings.m_bUseCustomViewer;
+    m_bUseExternalBrowser = settings.m_bUseExternalBrowser;
+    m_eUseCustomBrowser = settings.m_eUseCustomBrowser;
+    m_bHex = settings.m_bHex;
+    m_nRuleChecking = settings.m_nRuleChecking;
+
+    // Find dialog settings
+    m_findText = settings.m_findText;
+    m_findMatchWholeWord = settings.m_findMatchWholeWord;
+    m_findMatchCase = settings.m_findMatchCase;
+    m_findDirection = settings.m_findDirection; // Down is TRUE, Up is FALSE
+    m_findSearchWhat = settings.m_findSearchWhat;
+    m_findDialogPos = settings.m_findDialogPos;
+
+    // Run tests settings
+    m_runTestsSettings = settings.m_runTestsSettings;
+
+    m_userToolsDir = settings.m_userToolsDir;
+    m_buildToolsDir = settings.m_buildToolsDir;
+
+    m_editSaveFileOnly = settings.m_editSaveFileOnly;
+
+    // Packages dialog settings
+    m_omitHardwarePackages = settings.m_omitHardwarePackages;
+    m_matchPackageNamesExactly = settings.m_matchPackageNamesExactly;
+}
+
+ecSettings::~ecSettings()
+{
+}
+
+// Do some initialisation within ecApp::OnInit
+bool ecSettings::Init()
+{
+    return TRUE;
+}
+
+// Get a name suitable for the configuration file on all platforms:
+// e.g. eCos Configuration Tool on Windows, .eCosConfigTool on Unix
+wxString ecSettings::GetConfigAppName() const
+{
+#ifdef __WXGTK__
+    return wxString(wxT("eCosConfigTool"));
+#else
+    return GetAppName();
+#endif
+}
+
+
+// Create new filename
+wxString ecSettings::GenerateFilename(const wxString& rootName)
+{
+    wxString path;
+    if (!m_lastFilename.IsEmpty())
+        path = wxPathOnly(m_lastFilename);
+    else
+       //        path = wxGetApp().GetAppDir();
+        path = wxGetCwd();
+    
+    wxString filename(path);
+    if (filename.Last() != wxFILE_SEP_PATH )
+        filename += wxFILE_SEP_PATH;
+    filename += rootName;
+    
+    wxString fullFilename = filename + wxT(".ecc");
+    int i = 0;
+    wxString postfixStr;
+    while (wxFileExists(fullFilename))
+    {
+        i ++;
+        postfixStr.Printf("%d", i);
+        fullFilename = filename + postfixStr + wxT(".ecc");
+    }
+    
+    m_lastFilename = fullFilename;
+    return fullFilename;
+}
+
+// Load config info
+bool ecSettings::LoadConfig()
+{
+    wxConfig config(wxGetApp().GetSettings().GetConfigAppName());
+    
+    config.Read(_("/Window Status/FrameStatus"), & m_frameStatus);
+    config.Read(_("/Window Status/ShowToolBar"), (bool*) & m_showToolBar);
+    config.Read(_("/Window Status/ShowSplashScreen"), (bool*) & m_showSplashScreen);
+    config.Read(_("/Window Status/ShowConflictsWindow"), (bool*) & m_showConflictsWindow);
+    config.Read(_("/Window Status/ShowPropertiesWindow"), (bool*) & m_showPropertiesWindow);
+    config.Read(_("/Window Status/ShowShortDescrWindow"), (bool*) & m_showShortDescrWindow);
+    config.Read(_("/Window Status/ShowMemoryWindow"), (bool*) & m_showMemoryWindow);
+    config.Read(_("/Window Status/ShowOutputWindow"), (bool*) & m_showOutputWindow);
+    
+    config.Read(_("/Files/LastFile"), & m_lastFilename);
+    
+    config.Read(_("/Window Size/WindowX"), & m_frameSize.x);
+    config.Read(_("/Window Size/WindowY"), & m_frameSize.y);
+    config.Read(_("/Window Size/WindowWidth"), & m_frameSize.width);
+    config.Read(_("/Window Size/WindowHeight"), & m_frameSize.height);
+
+    config.Read(_("/Window Size/TreeSashWidth"), & m_treeSashSize.x);
+    config.Read(_("/Window Size/TreeSashHeight"), & m_treeSashSize.y);
+    config.Read(_("/Window Size/ConfigPaneWidth"), & m_configPaneWidth);
+    config.Read(_("/Window Size/ConflictsWidth"), & m_conflictsSashSize.x);
+    config.Read(_("/Window Size/ConflictsHeight"), & m_conflictsSashSize.y);
+    config.Read(_("/Window Size/PropertiesWidth"), & m_propertiesSashSize.x);
+    config.Read(_("/Window Size/PropertiesHeight"), & m_propertiesSashSize.y);
+    config.Read(_("/Window Size/ShortDescrWidth"), & m_shortDescrSashSize.x);
+    config.Read(_("/Window Size/ShortDescrHeight"), & m_shortDescrSashSize.y);
+    config.Read(_("/Window Size/OutputWidth"), & m_outputSashSize.x);
+    config.Read(_("/Window Size/OutputHeight"), & m_outputSashSize.y);
+    config.Read(_("/Window Size/MemoryWidth"), & m_memorySashSize.x);
+    config.Read(_("/Window Size/MemoryHeight"), & m_memorySashSize.y);
+
+    config.Read(_("/Options/ShowMacroNames"), (bool*) & m_showMacroNames);
+    config.Read(_("/Options/UseCustomViewer"), (bool*) & m_bUseCustomViewer);
+    config.Read(_("/Options/UseExternalBrowser"), (bool*) & m_bUseExternalBrowser);
+    
+    int tmp = (int) m_eUseCustomBrowser;
+    config.Read(_("/Options/UseCustomBrowser"), & tmp);
+    m_eUseCustomBrowser = (ecBrowserType) tmp;
+    
+    config.Read(_("/Options/Browser"), & m_strBrowser);
+    config.Read(_("/Options/Viewer"), & m_strViewer);
+    config.Read(_("/Options/HexDisplay"), (bool*) & m_bHex);
+    config.Read(_("/Options/UseDefaultFonts"), (bool*) & m_windowSettings.m_useDefaults);
+    config.Read(_("/Rule/Checking"), & m_nRuleChecking);
+
+    // Find dialog settings
+    config.Read(_("/Find/Text"), & m_findText);
+    config.Read(_("/Find/MatchWholeWord"), (bool*) & m_findMatchWholeWord);
+    config.Read(_("/Find/MatchCase"), & m_findMatchCase);
+    config.Read(_("/Find/Direction"), (bool*) & m_findDirection);
+    config.Read(_("/Find/SearchWhat"), & m_findSearchWhat);
+    config.Read(_("/Find/DialogX"), & m_findDialogPos.x);
+    config.Read(_("/Find/DialogY"), & m_findDialogPos.y);
+
+    // Package dialog settings
+    config.Read(_("/Packages/OmitHardwarePackages"), & m_omitHardwarePackages);
+    config.Read(_("/Packages/MatchPackageNamesExactly"), & m_matchPackageNamesExactly);
+
+    // Run tests settings
+    m_runTestsSettings.LoadConfig(config);
+
+    // Fonts
+    m_windowSettings.LoadConfig(config);   
+    
+    if (!config.Read(_("/Paths/UserToolsDir"), & m_userToolsDir))
+    {
+        // Use the default provided by the installer
+        config.Read(_("Default User Tools Path"), & m_userToolsDir);
+    }
+
+    // Only to be used if we fail to find the information installed
+    // with the Configuration Tool.
+    config.Read(_("/Paths/BuildToolsDir"), & m_buildToolsDir);
+    if (m_buildToolsDir.IsEmpty()) // first invocation by this user
+    {
+        // we have no clues as to the location of the build tools so
+        // test for ../../../gnutools relative to the configtool location
+        wxFileName gnutools = wxFileName (wxGetApp().GetAppDir(), wxEmptyString);
+        gnutools.Normalize(); // remove trailing "./" if present
+               if (2 < gnutools.GetDirCount())
+        {
+            gnutools.RemoveDir (gnutools.GetDirCount()-1);
+            gnutools.RemoveDir (gnutools.GetDirCount()-1);
+            gnutools.RemoveDir (gnutools.GetDirCount()-1);
+            gnutools.AppendDir (wxT("gnutools"));
+            if (gnutools.DirExists()) // we've found the gnutools
+                m_buildToolsDir = gnutools.GetFullPath();
+        }
+    }
+
+    // look for *objcopy in and under the build tools directory
+    if (! m_buildToolsDir.IsEmpty())
+    {
+        wxArrayString objcopyFiles;
+        wxString objcopyFileSpec(wxT("objcopy"));
+#ifdef __WXMSW__
+        objcopyFileSpec += wxT(".exe");
+#endif
+        size_t objcopyCount = wxDir::GetAllFiles(m_buildToolsDir, &objcopyFiles, wxT("*") + objcopyFileSpec, wxDIR_FILES | wxDIR_DIRS);
+        for (int count=0; count < objcopyCount; count++)
+        {
+            wxFileName file (objcopyFiles [count]);
+            wxString new_prefix (file.GetFullName().Left (file.GetFullName().Find(objcopyFileSpec)));
+            if ((! new_prefix.IsEmpty()) && ('-' == new_prefix.Last()))
+                new_prefix = new_prefix.Left (new_prefix.Len() - 1); // strip off trailing hyphen
+            m_arstrBinDirs.Set(new_prefix, file.GetPath(wxPATH_GET_VOLUME));
+        }
+    }
+
+    if (!config.Read(_("/Build/Make Options"), & m_strMakeOptions))
+    {
+#ifdef __WXMSW__
+        SYSTEM_INFO SystemInfo;
+        GetSystemInfo(&SystemInfo);
+//        disable -j option for now due to problem with Cygwin 1.3.18
+//        m_strMakeOptions.Printf(_T("-j%d"),SystemInfo.dwNumberOfProcessors);
+#endif
+    }
+    
+    // Set default build tools binary directories as specified by the installer
+    ecFileName strDefaultBuildToolsPath;
+
+#ifdef __WXMSW__
+    {
+        // This should look in HKEY_LOCAL_MACHINE
+
+        wxConfig config2(wxT("eCos"), wxEmptyString, wxEmptyString, wxEmptyString, wxCONFIG_USE_GLOBAL_FILE|wxCONFIG_USE_LOCAL_FILE);
+
+        wxString versionKey = GetInstallVersionKey();
+        wxConfigPathChanger path(& config2, wxString(wxT("/")) + versionKey + wxT("/"));
+
+        if (!versionKey.IsEmpty() && config2.Read(wxT("Default Build Tools Path"), & strDefaultBuildToolsPath))
+        {
+#ifdef __WXMSW__
+            wxString gccExe(wxT("*-gcc.exe"));
+#else
+            wxString gccExe(wxT("*-gcc"));
+#endif
+            
+            // Note that this is not a recursive search. Compilers for
+            // different targets may be in the same directory. This finds all targets.
+            
+            // look for *-gcc[.exe] in the default build tools directory
+            wxLogNull log;
+            wxDir finder(strDefaultBuildToolsPath);
+            wxString filename;
+            
+            if (finder.IsOpened())
+            {
+                bool bMore = finder.GetFirst(& filename, gccExe);
+                while (bMore)
+                {
+                    wxString targetName = filename.Left(filename.Find(wxT("-gcc")));
+                    m_arstrBinDirs.Set(targetName, strDefaultBuildToolsPath);
+                    
+                    bMore = finder.GetNext(& filename);
+                }
+            }
+        }
+    }
+#endif
+
+#ifndef __WXMSW__
+    // Look in the PATH for build tools, under Unix
+    {
+        wxString strPath;
+        if (wxGetEnv(wxT("PATH"), & strPath))
+        {
+           wxString gccExe(wxT("*-gcc"));
+
+           wxArrayString arstrPath;
+            ecUtils::Chop(strPath, arstrPath, wxT(':'));
+
+            for (int i = arstrPath.GetCount()-1;i >= 0; --i)
+            { // Reverse order is important to treat path correctly
+                if (wxT(".") != arstrPath[i] && !arstrPath[i].IsEmpty())
+                {
+                    wxLogNull log;
+                    wxDir finder(arstrPath[i]);
+                    wxString filename;
+
+                    if (finder.IsOpened())
+                    {
+                        bool bMore = finder.GetFirst(& filename, gccExe);
+                        while (bMore)
+                        {
+                            wxString targetName = filename.Left(filename.Find(wxT("-gcc")));
+                            m_arstrBinDirs.Set(targetName, arstrPath[i]);
+
+                            bMore = finder.GetNext(& filename);
+                        }
+                    }
+                }
+            }
+        }
+    }
+#endif
+    
+    // Read build tools directories (current user)
+    
+    {
+        wxConfigPathChanger path(& config, wxT("/Build Tools/"));
+        //config.SetPath(wxT("/Build Tools"));
+        wxString key(wxT(""));
+        long index;
+        bool bMore = config.GetFirstEntry(key, index);
+        while (bMore)
+        {
+            wxString value;
+            if (config.Read(key, & value))
+            {
+                m_arstrBinDirs.Set(key, value);
+            }
+            bMore = config.GetNextEntry(key, index);
+        }
+    }
+    
+    // Read toolchain paths (local machine again)
+#ifdef __WXMSW__    
+    wxArrayString arstrToolChainPaths;
+
+    // Use eCos just as a test.
+    //GetRepositoryRegistryClues(arstrToolChainPaths,_T("eCos"));
+    GetRepositoryRegistryClues(arstrToolChainPaths,_T("GNUPro eCos"));
+    
+    size_t i;
+    for (i = (size_t) 0; i < arstrToolChainPaths.GetCount(); i++)
+    {
+        ecFileName strDir(arstrToolChainPaths[i]);
+        strDir += wxT("H-i686-cygwin32\\bin");
+        
+        if (strDir.IsDir())
+        {
+            // This is a potential toolchain location. Look for *-gcc.exe
+            wxLogNull log;
+            wxDir finder(strDefaultBuildToolsPath);
+            wxString filename;
+            
+            if (finder.IsOpened())
+            {
+                bool bMore = finder.GetFirst(& filename, wxT("*-gcc.exe"));
+                while (bMore)
+                {
+                    // TODO: if there is more than one path, we will have to
+                    // check the existance of this target name in m_arstrBinDirs and
+                    // append to the end, or something.
+                    wxString targetName = filename.Left(filename.Find(wxT("-gcc")));
+                    m_arstrBinDirs.Set(targetName, strDefaultBuildToolsPath);
+                    
+                    bMore = finder.GetNext(& filename);
+                }
+            }
+        }
+    }
+
+    // The official user tools are now Cygwin 00r1. If you can't find these,
+    // try GNUPro unsupported.
+    GetRepositoryRegistryClues(m_userToolPaths, wxT("GNUPro 00r1"));
+    if (m_userToolPaths.GetCount() == 0)
+    {
+        GetRepositoryRegistryClues(m_userToolPaths, wxT("Cygwin 00r1"));
+    }
+
+    if (m_userToolPaths.GetCount() > 0)
+    {
+        for ( i = (size_t) 0 ; i < m_userToolPaths.GetCount(); i++)
+        {
+            ecFileName str(m_userToolPaths[i]);
+            str += "H-i686-cygwin32\\bin";
+            if(str.IsDir())
+            {
+                m_userToolPaths[i] = str;
+            } else
+            {
+                m_userToolPaths.Remove(i);
+                i--;
+            }
+        }
+    }
+    else
+    {
+        GetRepositoryRegistryClues(m_userToolPaths, wxT("GNUPro unsupported"));
+        
+        for ( i = (size_t) 0 ; i < m_userToolPaths.GetCount(); i++)
+        {
+            ecFileName str(m_userToolPaths[i]);
+            str += "H-i686-cygwin32\\bin";
+            if(str.IsDir())
+            {
+                m_userToolPaths[i] = str;
+            } else
+            {
+                m_userToolPaths.Remove(i);
+                i--;
+            }
+        }
+    }
+#endif
+    
+    // Include the path in the set of potential user paths
+    {
+        wxString strPath;
+        if (wxGetEnv(wxT("PATH"), & strPath))
+        {
+            wxArrayString arstrPath;
+            ecUtils::Chop(strPath, arstrPath, wxT(';'));
+            
+            for (int i = arstrPath.GetCount()-1;i >= 0; --i)
+            { // Reverse order is important to treat path correctly
+
+                const ecFileName &strFolder = arstrPath[i];
+                if (wxT(".") != strFolder && !strFolder.IsEmpty())
+                {
+                    ecFileName strFile(strFolder);
+                    strFile += wxT("ls.exe");
+                    if ( strFile.Exists() )
+                    {
+                        if (!wxArrayStringIsMember(m_userToolPaths, strFolder))
+                        {
+                            m_userToolPaths.Add(strFolder);
+                        }
+
+                        if ( m_userToolsDir.IsEmpty() )
+                        {
+                            m_userToolsDir = strFolder;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    // Load current repository from eCos Configuration Tool/Paths/RepositoryDir
+    {
+        wxConfig eCosConfig(wxGetApp().GetSettings().GetConfigAppName(), wxEmptyString, wxEmptyString, wxEmptyString, wxCONFIG_USE_GLOBAL_FILE|wxCONFIG_USE_LOCAL_FILE);
+        wxConfigPathChanger path(& config, wxT("/Repository/"));
+
+        //if (!eCosConfig.Read(wxT("Folder"), & m_strRepository))
+        if (!eCosConfig.Read(wxT("/Paths/RepositoryDir"), & m_strRepository))
+        {
+#ifdef __WXMSW__
+            // If we can't find the current folder, look for clues in the registry.
+            wxArrayString arstr;
+            switch (GetRepositoryRegistryClues(arstr, wxT("eCos")))
+            {
+            case 0:
+                break;
+            case 1:
+            default:
+                m_strRepository = arstr[0];
+                break;
+            }
+#elif defined(__WXGTK__)
+            // If we can't find the current folder, look for the latest version
+            // in /opt/ecos
+            m_strRepository = FindLatestVersion();
+#else
+            // Unsupported platform
+            m_strRepositor = wxEmptyString;
+#endif
+        }
+
+        // If we have set ECOS_REPOSITORY, this overrides whatever we have
+        // read or found.
+        wxString envVarValue = wxGetenv(wxT("ECOS_REPOSITORY"));
+        if (!envVarValue.IsEmpty())
+        {
+            // Note that ECOS_REPOSITORY has the packages (or ecc) folder in the name.
+            // In order to be in the form that is compatible with configtool operation,
+            // it needs to have that stripped off.
+            envVarValue = ecUtils::PosixToNativePath(envVarValue); // accommodate posix-style ECOS_REPOSITORY value under Cygwin
+            wxString packagesName = wxFileNameFromPath(envVarValue);
+            if (packagesName == wxT("ecc") || packagesName == wxT("packages"))
+                envVarValue = wxPathOnly(envVarValue);
+
+            m_strRepository = envVarValue;
+        }
+    }
+
+#ifdef __WXMSW__
+    if (m_userToolsDir.IsEmpty())
+        m_userToolsDir = GetCygwinInstallPath() + wxT("\\bin");
+#else
+    if (m_userToolsDir.IsEmpty())
+        m_userToolsDir = wxT("/bin");
+#endif
+    
+    return TRUE;
+}
+
+#ifdef __WXMSW__
+wxString ecSettings::GetCygwinInstallPath()
+{
+    HKEY hKey = 0;
+    DWORD type;
+    BYTE value[256];
+    DWORD sz = sizeof(value);
+    wxString strCygwinInstallPath;
+
+    // look for the "/" mount point in the system registry settings
+    if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Cygnus Solutions\\Cygwin\\mounts v2\\/", 0, KEY_READ, &hKey)) {
+        if (ERROR_SUCCESS == RegQueryValueEx(hKey, "native", NULL, & type, value, & sz)) {
+            strCygwinInstallPath = (const char*) value;
+        }
+        RegCloseKey(hKey);
+    }
+
+    // if not yet found, look for the "/" mount point in the user's registry settings
+    hKey = 0;
+    sz = sizeof(value);
+    if (strCygwinInstallPath.IsEmpty() && (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Cygnus Solutions\\Cygwin\\mounts v2\\/", 0, KEY_READ, &hKey))) {
+        if (ERROR_SUCCESS == RegQueryValueEx(hKey, "native", NULL, & type, value, & sz)) {
+            strCygwinInstallPath = (const char*) value;
+        }
+        RegCloseKey(hKey);
+    }
+
+    return strCygwinInstallPath;
+}
+#endif
+
+// Save config info
+bool ecSettings::SaveConfig()
+{
+    wxConfig config(wxGetApp().GetSettings().GetConfigAppName());
+    
+    config.Write(_("/Files/LastFile"), m_lastFilename);
+    
+    config.Write(_("/Window Status/FrameStatus"), (long) m_frameStatus);
+    config.Write(_("/Window Status/ShowToolBar"), m_showToolBar);
+    config.Write(_("/Window Status/ShowSplashScreen"), m_showSplashScreen);
+    config.Write(_("/Window Status/ShowConflictsWindow"), m_showConflictsWindow);
+    config.Write(_("/Window Status/ShowPropertiesWindow"), m_showPropertiesWindow);
+    config.Write(_("/Window Status/ShowShortDescrWindow"), m_showShortDescrWindow);
+    config.Write(_("/Window Status/ShowMemoryWindow"), m_showMemoryWindow);
+    config.Write(_("/Window Status/ShowOutputWindow"), m_showOutputWindow);
+    
+    config.Write(_("/Window Size/WindowX"), (long) m_frameSize.x);
+    config.Write(_("/Window Size/WindowY"), (long) m_frameSize.y);
+    config.Write(_("/Window Size/WindowWidth"), (long) m_frameSize.width);
+    config.Write(_("/Window Size/WindowHeight"), (long) m_frameSize.height);
+    config.Write(_("/Window Size/TreeSashWidth"), (long) m_treeSashSize.x);
+    config.Write(_("/Window Size/TreeSashHeight"), (long) m_treeSashSize.y);
+    config.Write(_("/Window Size/ConfigPaneWidth"), (long) m_configPaneWidth);
+    config.Write(_("/Window Size/ConflictsWidth"), (long) m_conflictsSashSize.x);
+    config.Write(_("/Window Size/ConflictsHeight"), (long) m_conflictsSashSize.y);
+    config.Write(_("/Window Size/PropertiesWidth"), (long) m_propertiesSashSize.x);
+    config.Write(_("/Window Size/PropertiesHeight"), (long) m_propertiesSashSize.y);
+    config.Write(_("/Window Size/ShortDescrWidth"), (long) m_shortDescrSashSize.x);
+    config.Write(_("/Window Size/ShortDescrHeight"), (long) m_shortDescrSashSize.y);
+    config.Write(_("/Window Size/OutputWidth"), (long) m_outputSashSize.x);
+    config.Write(_("/Window Size/OutputHeight"), (long) m_outputSashSize.y);
+    config.Write(_("/Window Size/MemoryWidth"), (long) m_memorySashSize.x);
+    config.Write(_("/Window Size/MemoryHeight"), (long) m_memorySashSize.y);
+    
+    config.Write(_("/Options/ShowMacroNames"), m_showMacroNames);
+    config.Write(_("/Options/UseCustomViewer"), m_bUseCustomViewer);
+    config.Write(_("/Options/UseExternalBrowser"), m_bUseExternalBrowser);
+    config.Write(_("/Options/UseCustomBrowser"), (long) m_eUseCustomBrowser);
+    config.Write(_("/Options/Browser"), m_strBrowser);
+    config.Write(_("/Options/Viewer"), m_strViewer);
+    config.Write(_("/Options/HexDisplay"), m_bHex);
+    config.Write(_("/Options/UseDefaultFonts"), m_windowSettings.m_useDefaults);
+
+    config.Write(_("/Rule/Checking"), (long) m_nRuleChecking);
+    
+    config.Write(_("/Paths/UserToolsDir"), m_userToolsDir);
+    config.Write(_("/Paths/BuildToolsDir"), m_buildToolsDir);
+    
+    config.Write(_("/Build/Make Options"), m_strMakeOptions);
+
+    // Find dialog settings
+    config.Write(_("/Find/Text"), m_findText);
+    config.Write(_("/Find/MatchWholeWord"), m_findMatchWholeWord);
+    config.Write(_("/Find/MatchCase"), m_findMatchCase);
+    config.Write(_("/Find/Direction"), m_findDirection);
+    config.Write(_("/Find/SearchWhat"), m_findSearchWhat);
+    config.Write(_("/Find/DialogX"), (long) m_findDialogPos.x);
+    config.Write(_("/Find/DialogY"), (long) m_findDialogPos.y);
+    
+    // Package dialog settings
+    config.Write(_("/Packages/OmitHardwarePackages"), m_omitHardwarePackages);
+    config.Write(_("/Packages/MatchPackageNamesExactly"), m_matchPackageNamesExactly);
+
+    // Save current repository to eCos Configuration Tool/Paths/RepositoryDir
+    // UNLESS it was overridden by ECOS_REPOSITORY
+    {
+        wxString envVarValue = wxGetenv(wxT("ECOS_REPOSITORY"));
+        if (m_strRepository == envVarValue)
+        {
+            // Don't override the value in the local settings
+        }
+        else
+            config.Write(wxT("/Paths/RepositoryDir"), m_strRepository);
+    }
+    
+    // Run tests settings
+    m_runTestsSettings.SaveConfig(config);
+
+    // Fonts
+    m_windowSettings.SaveConfig(config);
+    
+    return TRUE;
+}
+
+void ecSettings::ShowSettingsDialog(const wxString& page)
+{
+#if 0
+    ecSettingsDialog* dialog = new ecSettingsDialog(wxGetApp().GetTopWindow());
+    if (!page.IsEmpty())
+        dialog->GetNotebook()->SetSelection(ecFindNotebookPage(dialog->GetNotebook(), page));
+    
+    int ret = dialog->ShowModal();
+    dialog->Destroy();
+#endif
+}
+
+#ifndef MAX_PATH
+#define MAX_PATH 1024
+#endif
+
+// TODO for non-Windows platforms
+const ecFileName& ecSettings::DefaultExternalBrowser()
+{
+#ifdef __WXMSW__
+    static bool bFirstTime=TRUE;
+    if(bFirstTime){
+        const ecFileName strFile(ecFileName::GetTempPath()+wxT("index.html"));
+        wxFile f;
+        if(f.Create(strFile, TRUE))
+        {
+            f.Close();
+            bool rc=((int)  ::FindExecutable(strFile,wxT("."),m_strDefaultExternalBrowser.GetWriteBuf(MAX_PATH))>32);
+            m_strDefaultExternalBrowser.UngetWriteBuf();
+            if(!rc){
+                m_strDefaultExternalBrowser=wxT("");
+            }
+            wxRemoveFile(strFile);
+        }
+        bFirstTime=FALSE;
+    }
+#endif
+    return m_strDefaultExternalBrowser;
+}
+
+ecFileName ecSettings::m_strDefaultExternalBrowser;
+
+// Go looking for potential candidates in SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
+int ecSettings::GetRepositoryRegistryClues(wxArrayString& arstr, const wxString& pszPrefix)
+{
+    arstr.Clear();
+
+#ifdef __WXMSW__
+    wxConfig config(wxT("Windows"), wxT("Microsoft"), wxEmptyString, wxEmptyString, wxCONFIG_USE_GLOBAL_FILE);
+    config.SetPath(wxT("/CurrentVersion/App Paths"));
+
+    wxString key(wxT(""));
+    long index;
+    bool bMore = config.GetFirstGroup(key, index);
+    while (bMore)
+    {
+        if (key.Find(pszPrefix) == 0)
+        {
+            wxString value;
+            //wxString key2(wxString(wxT("/")) + key + wxString(wxT("/Path")));
+            wxString key2(key + wxString(wxT("/Path")));
+            if (config.Read(key2, & value))
+            {
+                arstr.Add(value);
+            }
+        }
+        bMore = config.GetNextGroup(key, index);
+    }
+    return arstr.GetCount();
+#else
+    return 0;
+#endif
+}
+
+// Finds the path of the latest installed eCos
+wxString ecSettings::FindLatestVersion()
+{
+#ifdef __WXGTK__
+    wxString ecosRoot(wxT("/opt/ecos"));
+    wxLogNull log;
+    wxDir dir(ecosRoot);
+    
+    wxString latestDir;
+    wxString latestVersion;
+    
+    if (dir.IsOpened())
+    {
+        wxString filename;
+        bool cont = dir.GetFirst(& filename, wxT("ecos-*"), wxDIR_DIRS);
+        while (cont)
+        {
+            wxString ver(filename.Mid(5));
+            if (latestVersion.IsEmpty() || latestVersion.CompareTo(ver) < 0)
+            {
+                latestVersion = ver;
+                latestDir = ecosRoot + wxT("/") + filename;
+            }
+            
+            cont = dir.GetNext(& filename);
+        }
+    }
+//    if (latestDir.IsEmpty())
+//        latestDir = wxGetCwd();
+    return latestDir;
+#else
+    wxMessageBox(wxT("FindLatestVersion() is only implemented for Unix."));
+    return wxEmptyString;
+#endif
+}
+
+wxString ecSettings::GetInstallVersionKey ()
+{
+#ifdef __WXMSW__
+
+#ifndef MAX_PATH
+#define MAX_PATH 1024
+#endif
+
+    wxString strKey = wxT("SOFTWARE\\eCos");
+    wxString strVersionKey = wxT("");
+    wxString rc = wxT("");
+    wxChar 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.CompareTo (pszBuffer) < 0) {
+                strVersionKey = pszBuffer;
+            }
+        }
+        RegCloseKey (hKey);
+    }
+    return strVersionKey;
+#else
+    wxMessageBox(wxT("GetInstallVersionKey() is only implemented for Windows."));
+    return wxEmptyString;
+#endif
+}
+
+/*
+ * ecRunTestSettings
+ * Settings relating to running tests
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(ecRunTestsSettings, wxObject)
+
+ecRunTestsSettings::ecRunTestsSettings():
+    m_ep(CeCosTest::ExecutionParameters::RUN),
+    m_nTimeout(900),
+    m_nDownloadTimeout(120),
+    m_nTimeoutType(TIMEOUT_AUTOMATIC),
+    m_nDownloadTimeoutType(TIMEOUT_SPECIFIED),
+    m_bRemote(FALSE),
+    m_bSerial(TRUE),
+    m_strPort(wxT("COM1")),
+    m_nBaud(38400),
+    m_nLocalTCPIPPort(1),
+    m_nReset(RESET_MANUAL),
+    m_nResourcePort(1),
+    m_nRemotePort(1),
+    m_bFarmed(TRUE),
+    m_strRemoteHost(wxT("")),
+    m_strResourceHost(wxT("")),
+    m_strLocalTCPIPHost(wxT("")),
+    m_strReset(wxT(""))
+{
+}
+
+ecRunTestsSettings::ecRunTestsSettings(const ecRunTestsSettings& settings)
+{
+    Copy(settings);
+}
+
+void ecRunTestsSettings::Copy(const ecRunTestsSettings& settings)
+{
+    m_nTimeoutType = settings.m_nTimeoutType;
+    m_nDownloadTimeoutType = settings.m_nDownloadTimeoutType;
+    m_bRemote = settings.m_bRemote;
+    m_bSerial = settings.m_bSerial;
+    m_strPort = settings.m_strPort;
+    m_nBaud = settings.m_nBaud;
+    m_nLocalTCPIPPort = settings.m_nLocalTCPIPPort;
+    m_nReset = settings.m_nReset;
+    m_nResourcePort = settings.m_nResourcePort;
+    m_nRemotePort = settings.m_nRemotePort;
+    m_bFarmed = settings.m_bFarmed;
+    m_strTarget = settings.m_strTarget;
+    m_strRemoteHost = settings.m_strRemoteHost;
+    m_strResourceHost = settings.m_strResourceHost;
+    m_strLocalTCPIPHost = settings.m_strLocalTCPIPHost;
+    m_strReset = settings.m_strReset;
+}
+
+bool ecRunTestsSettings::LoadConfig(wxConfig& config)
+{
+    config.Read(_("/Run Tests/TimeoutType"), & m_nTimeoutType);
+    config.Read(_("/Run Tests/DownloadTimeoutType"), & m_nDownloadTimeoutType);
+    config.Read(_("/Run Tests/Remote"), (bool*) & m_bRemote);
+    config.Read(_("/Run Tests/Serial"), (bool*) & m_bSerial);
+    config.Read(_("/Run Tests/Port"), & m_strPort);
+    config.Read(_("/Run Tests/Baud"), & m_nBaud);
+    config.Read(_("/Run Tests/LocalTCPIPHost"), & m_strLocalTCPIPHost);
+    config.Read(_("/Run Tests/LocalTCPIPPort"), & m_nLocalTCPIPPort);
+//  Reset type is determined at run-time for standalone configtool
+//    config.Read(_("/Run Tests/ResetType"), & m_nReset);
+    config.Read(_("/Run Tests/ResetString"), & m_strReset);
+    config.Read(_("/Run Tests/ResourceHost"), & m_strResourceHost);
+    config.Read(_("/Run Tests/ResourcePort"), & m_nResourcePort);
+    config.Read(_("/Run Tests/RemoteHost"), & m_strRemoteHost);
+    config.Read(_("/Run Tests/RemotePort"), & m_nRemotePort);
+    config.Read(_("/Run Tests/Farmed"), (bool*) & m_bFarmed);
+
+    return TRUE;
+}
+
+bool ecRunTestsSettings::SaveConfig(wxConfig& config)
+{
+    config.Write(_("/Run Tests/TimeoutType"), (long) m_nTimeoutType);
+    config.Write(_("/Run Tests/DownloadTimeoutType"), (long) m_nDownloadTimeoutType);
+    config.Write(_("/Run Tests/Remote"), m_bRemote);
+    config.Write(_("/Run Tests/Serial"), m_bSerial);
+    config.Write(_("/Run Tests/Port"), m_strPort);
+    config.Write(_("/Run Tests/Baud"), (long) m_nBaud);
+    config.Write(_("/Run Tests/LocalTCPIPHost"), m_strLocalTCPIPHost);
+    config.Write(_("/Run Tests/LocalTCPIPPort"), (long) m_nLocalTCPIPPort);
+    config.Write(_("/Run Tests/ResetType"), (long) m_nReset);
+    config.Write(_("/Run Tests/ResetString"), m_strReset);
+    config.Write(_("/Run Tests/ResourceHost"), m_strResourceHost);
+    config.Write(_("/Run Tests/ResourcePort"), (long) m_nResourcePort);
+    config.Write(_("/Run Tests/RemoteHost"), m_strRemoteHost);
+    config.Write(_("/Run Tests/RemotePort"), (long) m_nRemotePort);
+    config.Write(_("/Run Tests/Farmed"), m_bFarmed);
+
+    return TRUE;
+}
+