293 lines
7.2 KiB
C++
293 lines
7.2 KiB
C++
/*****************************************************************/
|
|
/* Functions to handle component library files : read functions */
|
|
/*****************************************************************/
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
#include "common.h"
|
|
#include "confirm.h"
|
|
#include "kicad_string.h"
|
|
#include "gestfich.h"
|
|
#include "appl_wxstruct.h"
|
|
|
|
#include "program.h"
|
|
#include "libcmp.h"
|
|
#include "general.h"
|
|
#include "protos.h"
|
|
|
|
#include "dialog_load_error.h"
|
|
|
|
|
|
/**
|
|
* Function LoadLibraryName
|
|
*
|
|
* Routine to load the given library name. FullLibName should hold full path
|
|
* of file name to open, while LibName should hold only its name.
|
|
* If library already exists, it is NOT reloaded.
|
|
*
|
|
* @return : new lib or NULL
|
|
*/
|
|
LibraryStruct* LoadLibraryName( WinEDA_DrawFrame* frame,
|
|
const wxString& FullLibName,
|
|
const wxString& LibName )
|
|
{
|
|
LibraryStruct* NewLib;
|
|
wxFileName fn;
|
|
wxString errMsg;
|
|
|
|
if( ( NewLib = FindLibrary( LibName ) ) != NULL )
|
|
{
|
|
if( NewLib->m_FullFileName == FullLibName )
|
|
return NewLib;
|
|
|
|
delete NewLib;
|
|
}
|
|
|
|
NewLib = new LibraryStruct( LIBRARY_TYPE_EESCHEMA, LibName, FullLibName );
|
|
|
|
wxBusyCursor ShowWait;
|
|
|
|
if( NewLib->Load( errMsg ) )
|
|
{
|
|
if( g_LibraryList == NULL )
|
|
g_LibraryList = NewLib;
|
|
else
|
|
{
|
|
LibraryStruct* tmplib = g_LibraryList;
|
|
while( tmplib->m_Pnext )
|
|
tmplib = tmplib->m_Pnext;
|
|
|
|
tmplib->m_Pnext = NewLib;
|
|
}
|
|
|
|
NewLib->LoadDocs( errMsg );
|
|
}
|
|
else
|
|
{
|
|
wxString msg;
|
|
msg.Printf( _( "Error <%s> occurred attempting to load component \
|
|
library <%s>" ),
|
|
( const wxChar* ) errMsg,
|
|
( const wxChar* ) FullLibName );
|
|
DisplayError( frame, msg );
|
|
SAFE_DELETE( NewLib );
|
|
}
|
|
|
|
return NewLib;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function LoadLibraries
|
|
*
|
|
* Clear all already loaded libraries and load all librairies
|
|
* given in frame->m_ComponentLibFiles
|
|
*/
|
|
void LoadLibraries( WinEDA_SchematicFrame* frame )
|
|
{
|
|
wxFileName fn;
|
|
wxString msg, tmp;
|
|
wxString libraries_not_found;
|
|
unsigned ii, iimax = frame->m_ComponentLibFiles.GetCount();
|
|
|
|
// Free the unwanted libraries (i.e. not in list) but keep the cache lib
|
|
LibraryStruct* nextlib, * lib = g_LibraryList;
|
|
|
|
for( ; lib != NULL; lib = nextlib )
|
|
{
|
|
nextlib = lib->m_Pnext;
|
|
if( lib->m_IsLibCache )
|
|
continue;
|
|
|
|
// is this library in "wanted list" frame->m_ComponentLibFiles ?
|
|
if( frame->m_ComponentLibFiles.Index( lib->m_Name ) == wxNOT_FOUND )
|
|
FreeCmpLibrary( frame, lib->m_Name );
|
|
}
|
|
|
|
// Load missing libraries (if any)
|
|
for( ii = 0; ii < iimax; ii++ )
|
|
{
|
|
fn = frame->m_ComponentLibFiles[ii];
|
|
fn.SetExt( CompLibFileExtension );
|
|
|
|
if( !fn.IsOk() )
|
|
continue;
|
|
|
|
if( !fn.FileExists() )
|
|
{
|
|
tmp = wxGetApp().FindLibraryPath( fn );
|
|
if( !tmp )
|
|
{
|
|
libraries_not_found += fn.GetName() + _( "\n" );
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
tmp = fn.GetFullPath();
|
|
}
|
|
|
|
// Loaded library statusbar message
|
|
msg = _( "Library " ) + tmp;
|
|
|
|
if( LoadLibraryName( frame, tmp, fn.GetName() ) )
|
|
msg += _( " loaded" );
|
|
else
|
|
msg += _( " error!" );
|
|
|
|
frame->PrintMsg( msg );
|
|
}
|
|
|
|
/* Print the libraries not found */
|
|
if( !libraries_not_found.IsEmpty() )
|
|
{
|
|
DIALOG_LOAD_ERROR dialog( frame );
|
|
dialog.MessageSet( _( "The following libraries could not be found:" ) );
|
|
dialog.ListSet( libraries_not_found );
|
|
libraries_not_found.empty();
|
|
dialog.ShowModal();
|
|
}
|
|
|
|
// reorder the linked list to match the order filename list:
|
|
int NumOfLibs = 0;
|
|
|
|
for( lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext )
|
|
{
|
|
lib->m_Flags = 0;
|
|
NumOfLibs++;
|
|
}
|
|
|
|
if( NumOfLibs == 0 )
|
|
return;
|
|
|
|
LibraryStruct** libs =
|
|
(LibraryStruct**) MyZMalloc( sizeof(LibraryStruct*) * (NumOfLibs + 2) );
|
|
|
|
int jj = 0;
|
|
|
|
for( ii = 0; ii < frame->m_ComponentLibFiles.GetCount(); ii++ )
|
|
{
|
|
if( jj >= NumOfLibs )
|
|
break;
|
|
fn = frame->m_ComponentLibFiles[ii];
|
|
lib = FindLibrary( fn.GetName() );
|
|
if( lib )
|
|
{
|
|
lib->m_Flags = 1;
|
|
libs[jj++] = lib;
|
|
}
|
|
}
|
|
|
|
/* Put lib cache at end of list */
|
|
for( lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext )
|
|
{
|
|
if( lib->m_Flags == 0 )
|
|
libs[jj++] = lib;
|
|
}
|
|
|
|
libs[jj] = NULL;
|
|
|
|
/* Change the linked list pointers */
|
|
for( ii = 0; libs[ii] != NULL; ii++ )
|
|
libs[ii]->m_Pnext = libs[ii + 1];
|
|
|
|
g_LibraryList = libs[0];
|
|
|
|
MyFree( libs );
|
|
|
|
for( lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext )
|
|
lib->m_Flags = 0;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function FreeCmpLibrary
|
|
*
|
|
* Routine to remove and free a library from the current loaded libraries.
|
|
*/
|
|
void FreeCmpLibrary( wxWindow* frame, const wxString& LibName )
|
|
{
|
|
int NumOfLibs = NumOfLibraries();
|
|
LibraryStruct* Lib, * TempLib;
|
|
|
|
if( NumOfLibs == 0 )
|
|
{
|
|
DisplayError( frame, wxT( "No libraries are loaded" ), 20 );
|
|
return;
|
|
}
|
|
|
|
/* Search for this library name: */
|
|
for( Lib = g_LibraryList; Lib != NULL; Lib = Lib->m_Pnext )
|
|
{
|
|
if( LibName == Lib->m_Name )
|
|
break;
|
|
}
|
|
|
|
if( Lib == NULL )
|
|
return;
|
|
|
|
if( Lib == g_LibraryList )
|
|
g_LibraryList = Lib->m_Pnext;
|
|
else
|
|
{
|
|
for( TempLib = g_LibraryList; TempLib->m_Pnext != Lib;
|
|
TempLib = TempLib->m_Pnext )
|
|
;
|
|
|
|
TempLib->m_Pnext = TempLib->m_Pnext->m_Pnext;
|
|
}
|
|
|
|
SAFE_DELETE( Lib );
|
|
|
|
/* The removed librairy can be the current library in libedit.
|
|
* If so, clear the current library in libedit */
|
|
if( Lib == CurrentLib )
|
|
CurrentLib = NULL;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function LibraryEntryCompare
|
|
*
|
|
* Routine to compare two EDA_LibComponentStruct for the PriorQue module.
|
|
* Comparison (insensitive case) is based on Part name.
|
|
*/
|
|
int LibraryEntryCompare( EDA_LibComponentStruct* LE1,
|
|
EDA_LibComponentStruct* LE2 )
|
|
{
|
|
return LE1->m_Name.m_Text.CmpNoCase( LE2->m_Name.m_Text );
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
* Routine to find the library given its name.
|
|
*****************************************************************************/
|
|
LibraryStruct* FindLibrary( const wxString& Name )
|
|
{
|
|
LibraryStruct* Lib = g_LibraryList;
|
|
|
|
while( Lib )
|
|
{
|
|
if( *Lib == Name )
|
|
return Lib;
|
|
Lib = Lib->m_Pnext;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
* Routine to find the number of libraries currently loaded.
|
|
*****************************************************************************/
|
|
int NumOfLibraries()
|
|
{
|
|
int ii;
|
|
LibraryStruct* Lib = g_LibraryList;
|
|
|
|
for( ii = 0; Lib != NULL; Lib = Lib->m_Pnext )
|
|
ii++;
|
|
|
|
return ii;
|
|
}
|