469 lines
13 KiB
C++
469 lines
13 KiB
C++
/**************************************************/
|
|
/* projet_config : routines de trace du cartouche */
|
|
/**************************************************/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
|
|
#include "common.h"
|
|
|
|
#define CONFIG_VERSION 1
|
|
|
|
#define FORCE_LOCAL_CONFIG TRUE
|
|
|
|
|
|
/*********************************************************************/
|
|
static bool ReCreatePrjConfig(const wxString & local_config_filename,
|
|
const wxString & GroupName, bool ForceUseLocalConfig)
|
|
/*********************************************************************/
|
|
/* Cree ou recree la configuration locale de kicad (filename.pro)
|
|
initialise:
|
|
g_Prj_Config
|
|
g_Prj_Config_LocalFilename
|
|
g_Prj_Default_Config_FullFilename
|
|
return:
|
|
TRUE si config locale
|
|
FALSE si default config
|
|
*/
|
|
{
|
|
// free old config
|
|
if ( g_Prj_Config ) delete g_Prj_Config;
|
|
g_Prj_Config = NULL;
|
|
|
|
// Init local Config filename
|
|
if ( local_config_filename.IsEmpty() ) g_Prj_Config_LocalFilename = wxT("kicad");
|
|
else g_Prj_Config_LocalFilename = local_config_filename;
|
|
|
|
ChangeFileNameExt( g_Prj_Config_LocalFilename, g_Prj_Config_Filename_ext );
|
|
|
|
// Init local config filename
|
|
if ( ForceUseLocalConfig || wxFileExists(g_Prj_Config_LocalFilename) )
|
|
{
|
|
g_Prj_Default_Config_FullFilename.Empty();
|
|
g_Prj_Config = new wxFileConfig(wxEmptyString, wxEmptyString,
|
|
g_Prj_Config_LocalFilename, wxEmptyString,
|
|
wxCONFIG_USE_RELATIVE_PATH);
|
|
g_Prj_Config->DontCreateOnDemand();
|
|
|
|
if ( ForceUseLocalConfig ) return TRUE;
|
|
|
|
// Test de la bonne version du fichier (ou groupe) de configuration
|
|
int version = -1, def_version = 0;
|
|
g_Prj_Config->SetPath(GroupName);
|
|
version = g_Prj_Config->Read( wxT("version"), def_version);
|
|
g_Prj_Config->SetPath(UNIX_STRING_DIR_SEP);
|
|
if ( version > 0 ) return TRUE;
|
|
else delete g_Prj_Config; // Version incorrecte
|
|
}
|
|
|
|
|
|
// Fichier local non trouve ou invalide
|
|
g_Prj_Config_LocalFilename.Empty();
|
|
g_Prj_Default_Config_FullFilename =
|
|
ReturnKicadDatasPath() +
|
|
wxT("template/kicad") +
|
|
g_Prj_Config_Filename_ext;
|
|
|
|
// Recreate new config
|
|
g_Prj_Config = new wxFileConfig(wxEmptyString, wxEmptyString,
|
|
wxEmptyString, g_Prj_Default_Config_FullFilename,
|
|
wxCONFIG_USE_RELATIVE_PATH);
|
|
g_Prj_Config->DontCreateOnDemand();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/***************************************************************************************/
|
|
void WinEDA_App::WriteProjectConfig(const wxString & local_config_filename,
|
|
const wxString & GroupName, PARAM_CFG_BASE ** List)
|
|
/***************************************************************************************/
|
|
/* enregistrement de la config "projet"*/
|
|
{
|
|
const PARAM_CFG_BASE * pt_cfg;
|
|
wxString msg;
|
|
|
|
ReCreatePrjConfig(local_config_filename, GroupName,
|
|
FORCE_LOCAL_CONFIG);
|
|
/* Write date ( surtout pour eviter bug de wxFileConfig
|
|
qui se trompe de rubrique si declaration [xx] en premiere ligne
|
|
(en fait si groupe vide) */
|
|
g_Prj_Config->SetPath(UNIX_STRING_DIR_SEP);
|
|
msg = DateAndTime();
|
|
g_Prj_Config->Write( wxT("update"), msg);
|
|
msg = GetAppName();
|
|
g_Prj_Config->Write( wxT("last_client"), msg);
|
|
|
|
/* ecriture de la configuration */
|
|
g_Prj_Config->DeleteGroup(GroupName); // Erase all datas
|
|
g_Prj_Config->Flush();
|
|
|
|
g_Prj_Config->SetPath(GroupName);
|
|
g_Prj_Config->Write( wxT("version"), CONFIG_VERSION);
|
|
g_Prj_Config->SetPath(UNIX_STRING_DIR_SEP);
|
|
|
|
for( ; *List != NULL ; List++)
|
|
{
|
|
pt_cfg = *List;
|
|
if ( pt_cfg->m_Group ) g_Prj_Config->SetPath(pt_cfg->m_Group);
|
|
else g_Prj_Config->SetPath(GroupName);
|
|
|
|
switch( pt_cfg->m_Type )
|
|
{
|
|
case PARAM_INT:
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_INT *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
m_EDA_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
else
|
|
g_Prj_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
break;
|
|
|
|
case PARAM_SETCOLOR:
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_SETCOLOR *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
m_EDA_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
else
|
|
g_Prj_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
break;
|
|
|
|
case PARAM_DOUBLE:
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_DOUBLE *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
m_EDA_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
else
|
|
g_Prj_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
break;
|
|
|
|
case PARAM_BOOL:
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_BOOL *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
m_EDA_Config->Write(pt_cfg->m_Ident, (int)*PTCFG->m_Pt_param);
|
|
else
|
|
g_Prj_Config->Write(pt_cfg->m_Ident, (int)*PTCFG->m_Pt_param);
|
|
break;
|
|
|
|
case PARAM_WXSTRING:
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_WXSTRING *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
m_EDA_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
else
|
|
g_Prj_Config->Write(pt_cfg->m_Ident, *PTCFG->m_Pt_param);
|
|
break;
|
|
|
|
case PARAM_LIBNAME_LIST:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_LIBNAME_LIST *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
wxArrayString * libname_list = PTCFG->m_Pt_param;
|
|
if ( libname_list == NULL ) break;
|
|
unsigned indexlib = 0;
|
|
wxString cle_config;
|
|
for ( ; indexlib < libname_list->GetCount(); indexlib++ )
|
|
{
|
|
cle_config = pt_cfg->m_Ident;
|
|
// We use indexlib+1 because first lib name is LibName1
|
|
cle_config << (indexlib+1);
|
|
g_Prj_Config->Write(cle_config, libname_list->Item(indexlib));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case PARAM_COMMAND_ERASE: // Erase all datas
|
|
if ( pt_cfg->m_Ident )
|
|
{
|
|
m_EDA_Config->DeleteGroup(pt_cfg->m_Ident);
|
|
g_Prj_Config->DeleteGroup(pt_cfg->m_Ident);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
g_Prj_Config->SetPath(UNIX_STRING_DIR_SEP);
|
|
delete g_Prj_Config;
|
|
g_Prj_Config = NULL;
|
|
}
|
|
|
|
|
|
/***************************************************************************************/
|
|
bool WinEDA_App::ReadProjectConfig(const wxString & local_config_filename,
|
|
const wxString & GroupName, PARAM_CFG_BASE ** List,
|
|
bool Load_Only_if_New)
|
|
/***************************************************************************************/
|
|
/* Lecture de la config "projet"
|
|
*** si Load_Only_if_New == TRUE, elle n'est lue que si elle
|
|
*** est differente de la config actuelle (dates differentes)
|
|
|
|
return:
|
|
TRUE si lue.
|
|
Met a jour en plus:
|
|
g_EDA_Appl->m_CurrentOptionFileDateAndTime
|
|
g_EDA_Appl->m_CurrentOptionFile
|
|
*/
|
|
{
|
|
const PARAM_CFG_BASE * pt_cfg;
|
|
wxString timestamp;
|
|
|
|
if ( List == NULL )return FALSE;
|
|
|
|
ReCreatePrjConfig(local_config_filename, GroupName, FALSE);
|
|
|
|
g_Prj_Config->SetPath(UNIX_STRING_DIR_SEP);
|
|
timestamp = g_Prj_Config->Read( wxT("update") );
|
|
if ( Load_Only_if_New && ( !timestamp.IsEmpty() ) &&
|
|
(timestamp == g_EDA_Appl->m_CurrentOptionFileDateAndTime) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
g_EDA_Appl->m_CurrentOptionFileDateAndTime = timestamp;
|
|
|
|
if ( ! g_Prj_Default_Config_FullFilename.IsEmpty() )
|
|
g_EDA_Appl->m_CurrentOptionFile = g_Prj_Default_Config_FullFilename;
|
|
else
|
|
{
|
|
if ( wxPathOnly(g_Prj_Config_LocalFilename).IsEmpty() )
|
|
g_EDA_Appl->m_CurrentOptionFile =
|
|
wxGetCwd() + STRING_DIR_SEP + g_Prj_Config_LocalFilename;
|
|
else
|
|
g_EDA_Appl->m_CurrentOptionFile = g_Prj_Config_LocalFilename;
|
|
}
|
|
|
|
for( ; *List != NULL ; List++)
|
|
{
|
|
pt_cfg = *List;
|
|
if ( pt_cfg->m_Group ) g_Prj_Config->SetPath(pt_cfg->m_Group);
|
|
else g_Prj_Config->SetPath(GroupName);
|
|
switch( pt_cfg->m_Type )
|
|
{
|
|
case PARAM_INT:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_INT *)pt_cfg)
|
|
int itmp;
|
|
if ( pt_cfg->m_Setup)
|
|
itmp = m_EDA_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
else
|
|
itmp = g_Prj_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
if( (itmp < PTCFG->m_Min) || (itmp > PTCFG->m_Max) )
|
|
itmp = PTCFG->m_Default;
|
|
*PTCFG->m_Pt_param = itmp;
|
|
break;
|
|
}
|
|
|
|
case PARAM_SETCOLOR:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_SETCOLOR *)pt_cfg)
|
|
int itmp;
|
|
if ( pt_cfg->m_Setup)
|
|
itmp = m_EDA_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
else
|
|
itmp = g_Prj_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
if( (itmp < 0) || (itmp > MAX_COLOR) )
|
|
itmp = PTCFG->m_Default;
|
|
*PTCFG->m_Pt_param = itmp;
|
|
break;
|
|
}
|
|
|
|
case PARAM_DOUBLE:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_DOUBLE *)pt_cfg)
|
|
double ftmp = 0; wxString msg;
|
|
if ( pt_cfg->m_Setup)
|
|
msg = m_EDA_Config->Read(pt_cfg->m_Ident, wxT("") );
|
|
else
|
|
msg = g_Prj_Config->Read(pt_cfg->m_Ident, wxT("") );
|
|
|
|
if ( msg.IsEmpty() ) ftmp = PTCFG->m_Default;
|
|
else
|
|
{
|
|
msg.ToDouble(&ftmp);
|
|
if( (ftmp < PTCFG->m_Min) || (ftmp > PTCFG->m_Max) )
|
|
ftmp = PTCFG->m_Default;
|
|
}
|
|
*PTCFG->m_Pt_param = ftmp;
|
|
break;
|
|
}
|
|
|
|
case PARAM_BOOL:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_BOOL *)pt_cfg)
|
|
int itmp;
|
|
if ( pt_cfg->m_Setup)
|
|
itmp = m_EDA_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
else
|
|
itmp = g_Prj_Config->Read(pt_cfg->m_Ident, PTCFG->m_Default );
|
|
*PTCFG->m_Pt_param = itmp ? TRUE : FALSE;
|
|
break;
|
|
}
|
|
|
|
case PARAM_WXSTRING:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_WXSTRING *)pt_cfg)
|
|
if (PTCFG->m_Pt_param == NULL) break;
|
|
if ( pt_cfg->m_Setup)
|
|
*PTCFG->m_Pt_param = m_EDA_Config->Read(pt_cfg->m_Ident );
|
|
else
|
|
*PTCFG->m_Pt_param = g_Prj_Config->Read(pt_cfg->m_Ident );
|
|
break;
|
|
}
|
|
|
|
case PARAM_LIBNAME_LIST:
|
|
{
|
|
#undef PTCFG
|
|
#define PTCFG ((PARAM_CFG_LIBNAME_LIST *)pt_cfg)
|
|
int indexlib = 1; // We start indexlib to 1 because first lib name is LibName1
|
|
wxString libname, id_lib;
|
|
wxArrayString * libname_list = PTCFG->m_Pt_param;
|
|
while ( 1 )
|
|
{
|
|
id_lib = pt_cfg->m_Ident; id_lib << indexlib; indexlib++;
|
|
libname = g_Prj_Config->Read(id_lib, wxT("") );
|
|
if( libname.IsEmpty() ) break;
|
|
libname_list->Add(libname);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case PARAM_COMMAND_ERASE:
|
|
break;
|
|
}
|
|
}
|
|
|
|
delete g_Prj_Config;
|
|
g_Prj_Config = NULL;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/**************************************************************/
|
|
/* Constructeurs des descripteurs de structs de configuration */
|
|
/**************************************************************/
|
|
|
|
PARAM_CFG_BASE::PARAM_CFG_BASE(const wxChar * ident, const paramcfg_id type,
|
|
const wxChar * group)
|
|
{
|
|
m_Ident = ident;
|
|
m_Type = type;
|
|
m_Group = group;
|
|
m_Setup = FALSE;
|
|
}
|
|
|
|
|
|
PARAM_CFG_INT::PARAM_CFG_INT(const wxChar * ident, int * ptparam,
|
|
int default_val, int min, int max,
|
|
const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_INT, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
m_Min = min;
|
|
m_Max = max;
|
|
}
|
|
|
|
PARAM_CFG_INT::PARAM_CFG_INT(bool Insetup, const wxChar * ident, int * ptparam,
|
|
int default_val, int min, int max,
|
|
const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_INT, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
m_Min = min;
|
|
m_Max = max;
|
|
m_Setup = Insetup;
|
|
}
|
|
|
|
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR(const wxChar * ident, int * ptparam,
|
|
int default_val, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_SETCOLOR, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
}
|
|
|
|
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR(bool Insetup, const wxChar * ident, int * ptparam,
|
|
int default_val, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_SETCOLOR, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
m_Setup = Insetup;
|
|
}
|
|
|
|
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE(const wxChar * ident, double * ptparam,
|
|
double default_val, double min , double max,
|
|
const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_DOUBLE, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
m_Min = min;
|
|
m_Max = max;
|
|
}
|
|
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE(bool Insetup, const wxChar * ident, double * ptparam,
|
|
double default_val, double min , double max,
|
|
const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_DOUBLE, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val;
|
|
m_Min = min;
|
|
m_Max = max;
|
|
m_Setup = Insetup;
|
|
}
|
|
|
|
PARAM_CFG_BOOL::PARAM_CFG_BOOL(const wxChar * ident, bool * ptparam,
|
|
int default_val, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_BOOL, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val ? TRUE : FALSE;
|
|
}
|
|
|
|
PARAM_CFG_BOOL::PARAM_CFG_BOOL(bool Insetup, const wxChar * ident, bool * ptparam,
|
|
int default_val, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_BOOL, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Default = default_val ? TRUE : FALSE;
|
|
m_Setup = Insetup;
|
|
}
|
|
|
|
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING(const wxChar * ident,
|
|
wxString * ptparam, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_WXSTRING, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
}
|
|
|
|
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING(bool Insetup, const wxChar * ident,
|
|
wxString * ptparam, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_WXSTRING, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
m_Setup = Insetup;
|
|
}
|
|
|
|
PARAM_CFG_LIBNAME_LIST::PARAM_CFG_LIBNAME_LIST(const wxChar * ident,
|
|
wxArrayString * ptparam, const wxChar * group)
|
|
: PARAM_CFG_BASE(ident, PARAM_LIBNAME_LIST, group)
|
|
{
|
|
m_Pt_param = ptparam;
|
|
}
|
|
|