|
|
/**************************************************//* 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;}
|