From 3335ccd98d84f0654df69f8fb7b16e3184ccf317 Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Mon, 4 Oct 2010 14:54:14 -0400 Subject: [PATCH] Initial work on new component library stucture. * Use C++ map in component library instead of boost::ptr_vector. * Drop Boost pointer containers for standard C++ containers. * Moved duplicate name user interface elements from library object to library editor. * Added code to support direct addition and replacement of component alias objects into libraries. * Removed temporary strings used to add and remove alias objects. * Libraries only store alias objects, components now accessed thru alias. * Simplify library API for adding, removing, and replacing components. * Updated edit component in library dialog and library editor to reflect component library object changes. * Fixed bug in library viewer when displaying alias name. * Made a few header files compile stand alone per the new coding policy. * Remove some dead code and the usual code formatting fixes. --- common/drawpanel.cpp | 10 +- eeschema/annotate.cpp | 2 +- eeschema/class_libentry.cpp | 363 +++++++------ eeschema/class_libentry.h | 191 +++---- eeschema/class_libentry_fields.h | 2 +- eeschema/class_library.cpp | 499 ++++++------------ eeschema/class_library.h | 85 ++- eeschema/class_sch_component.cpp | 2 +- eeschema/classes_body_items.h | 2 + eeschema/dialog_edit_component_in_lib.cpp | 40 +- .../dialog_edit_component_in_schematic.cpp | 4 +- .../dialog_edit_libentry_fields_in_lib.cpp | 16 +- eeschema/edit_component_in_lib.cpp | 135 ++--- eeschema/edit_component_in_schematic.cpp | 2 +- eeschema/libedit.cpp | 133 ++--- eeschema/libeditframe.cpp | 265 ++++------ eeschema/libfield.cpp | 2 +- eeschema/onrightclick.cpp | 2 +- eeschema/schframe.cpp | 2 + eeschema/viewlib_frame.cpp | 10 +- eeschema/viewlibs.cpp | 31 +- include/colors.h | 2 + 22 files changed, 707 insertions(+), 1093 deletions(-) diff --git a/common/drawpanel.cpp b/common/drawpanel.cpp index 2ddb9892ca..c042659382 100644 --- a/common/drawpanel.cpp +++ b/common/drawpanel.cpp @@ -817,7 +817,7 @@ void WinEDA_DrawPanel::DrawGrid( wxDC* DC ) if( double_size ) { wxRealPoint dblgrid = screen_grid_size + screen_grid_size; - m_Parent->PutOnGrid(&org, &dblgrid); + m_Parent->PutOnGrid( &org, &dblgrid ); } // Draw grid: the best algorithm depend on the platform. @@ -862,9 +862,9 @@ void WinEDA_DrawPanel::DrawGrid( wxDC* DC ) break; xpos = org.x + xg; xpos = GRMapX( xpos ); - if( xpos < m_ClipBox.GetOrigin().x) // column not in active screen area. + if( xpos < m_ClipBox.GetOrigin().x ) // column not in active screen area. continue; - if( xpos > m_ClipBox.GetEnd().x) // end of active area reached. + if( xpos > m_ClipBox.GetEnd().x ) // end of active area reached. break; for( jj = 0; ; jj += increment ) { @@ -872,9 +872,9 @@ void WinEDA_DrawPanel::DrawGrid( wxDC* DC ) if( yg > size.y ) break; ypos = org.y + yg; - if( ypos < m_ClipBox.GetOrigin().y) // column not in active screen area. + if( ypos < m_ClipBox.GetOrigin().y ) // column not in active screen area. continue; - if( ypos > m_ClipBox.GetEnd().y) // end of active area reached. + if( ypos > m_ClipBox.GetEnd().y ) // end of active area reached. break; DC->DrawPoint( xpos, GRMapY( ypos ) ); } diff --git a/eeschema/annotate.cpp b/eeschema/annotate.cpp index 8831966dae..7f460f778f 100644 --- a/eeschema/annotate.cpp +++ b/eeschema/annotate.cpp @@ -76,7 +76,7 @@ void ReAnnotatePowerSymbolsOnly( void ) LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( DrawLibItem->m_ChipName ); - if( ( Entry == NULL ) || !Entry->isPower() ) + if( ( Entry == NULL ) || !Entry->IsPower() ) continue; //DrawLibItem->ClearAnnotation(sheet); this clears all annotation :( diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index 397089fa5b..c1b5eb6bae 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -1,6 +1,6 @@ -/**********************************************************/ -/* lib_entry.cpp */ -/**********************************************************/ +/*************************/ +/* class_libentry.cpp */ +/*************************/ #include "fctsys.h" #include "common.h" @@ -20,6 +20,15 @@ #include +// Set this to 1 to print debugging ouput in alias and component destructors to verify +// objects get cleaned up properly. +#if defined( TRACE_DESTRUCTOR ) +#undef TRACE_DESTRUCTOR +#endif + +#define TRACE_DESTRUCTOR 0 + + /** class CMP_LIB_ENTRY * Base class to describe library components and aliases. * This class is not to be used directly. @@ -134,41 +143,31 @@ int LibraryEntryCompare( const CMP_LIB_ENTRY* aItem1, const CMP_LIB_ENTRY* aItem * (like 74LS00, 74HC00 ... and many op amps ) */ -LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent, - CMP_LIBRARY* aLibrary ) : - CMP_LIB_ENTRY( ALIAS, aName, aLibrary ) +LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent ) : + CMP_LIB_ENTRY( ALIAS, aName, NULL ) { - wxASSERT( aRootComponent != NULL && aRootComponent->isComponent() ); - root = aRootComponent; - if( aLibrary == NULL ) - library = aRootComponent->GetLibrary(); } -LIB_ALIAS::LIB_ALIAS( LIB_ALIAS& aAlias, CMP_LIBRARY* aLibrary ) : - CMP_LIB_ENTRY( aAlias ) +LIB_ALIAS::LIB_ALIAS( LIB_ALIAS& aAlias, LIB_COMPONENT* aRootComponent ) : CMP_LIB_ENTRY( aAlias ) { - root = aAlias.root; + root = aRootComponent; } LIB_ALIAS::~LIB_ALIAS() { +#if TRACE_DESTRUCTOR + wxLogDebug( wxT( "Destroying alias \"%s\" of component \"%s\" with alais list count %d." ), + GetChars( name ), GetChars( root->GetName() ), root->m_aliases.size() ); +#endif } -void LIB_ALIAS::SetComponent( LIB_COMPONENT* aComponent ) -{ - wxASSERT( aComponent != NULL && aComponent->isComponent() ); - - root = aComponent; -} - - -/********************************/ +/***********************/ /* class LIB_COMPONENT */ -/********************************/ +/***********************/ /** * Library component object definition. @@ -188,6 +187,10 @@ LIB_COMPONENT::LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary ) : m_showPinNumbers = true; m_showPinNames = true; + // Create the default alias if the name paremeter is not empty. + if( !aName.IsEmpty() ) + m_aliases.push_back( new LIB_ALIAS( aName, this ) ); + // Add the MANDATORY_FIELDS in RAM only. These are assumed to be present // when the field editors are invoked. LIB_FIELD* value = new LIB_FIELD( this, VALUE ); @@ -205,8 +208,6 @@ LIB_COMPONENT::LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary ) { LIB_DRAW_ITEM* newItem; - m_AliasList = aComponent.m_AliasList; - m_aliasListData = aComponent.m_aliasListData; m_FootprintList = aComponent.m_FootprintList; unitCount = aComponent.unitCount; m_unitsLocked = aComponent.m_unitsLocked; @@ -225,13 +226,38 @@ LIB_COMPONENT::LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary ) newItem->SetParent( this ); drawings.push_back( newItem ); } + + for( size_t i = 0; i < aComponent.m_aliases.size(); i++ ) + { + LIB_ALIAS* alias = new LIB_ALIAS( *aComponent.m_aliases[i], this ); + m_aliases.push_back( alias ); + } } LIB_COMPONENT::~LIB_COMPONENT() { +#if TRACE_DESTRUCTOR + wxLogDebug( wxT( "Destroying component <%s> with alias list count of %d" ), + GetChars( GetName() ), m_aliases.size() ); +#endif + + // If the component is being delete directly rather than trough the library, free all + // of the memory allocated by the aliases. + if( !m_aliases.empty() ) + { + LIB_ALIAS* alias; + + while( !m_aliases.empty() ) + { + alias = m_aliases.back(); + m_aliases.pop_back(); + delete alias; + } + } } + /** function IsMulti * @return the sub reference for component having multiple parts per package. * The sub reference identify the part (or unit) @@ -592,15 +618,17 @@ bool LIB_COMPONENT::Save( FILE* aFile ) } } - /* Save the alias list: a line starting by "ALIAS" */ - if( m_AliasList.GetCount() != 0 ) + // Save the alias list: a line starting by "ALIAS". The first alias is the root + // and has the same name as the component. In the old library file format this + // alias does not get added to the alias list. + if( m_aliases.size() > 1 ) { if( fprintf( aFile, "ALIAS" ) < 0 ) return false; - for( i = 0; i < m_AliasList.GetCount(); i++ ) + for( i = 1; i < m_aliases.size(); i++ ) { - if( fprintf( aFile, " %s", CONV_TO_UTF8( m_AliasList[i] ) ) < 0 ) + if( fprintf( aFile, " %s", CONV_TO_UTF8( m_aliases[i]->GetName() ) ) < 0 ) return false; } @@ -616,8 +644,7 @@ bool LIB_COMPONENT::Save( FILE* aFile ) for( i = 0; i < m_FootprintList.GetCount(); i++ ) { - if( fprintf( aFile, " %s\n", - CONV_TO_UTF8( m_FootprintList[i] ) ) < 0 ) + if( fprintf( aFile, " %s\n", CONV_TO_UTF8( m_FootprintList[i] ) ) < 0 ) return false; } @@ -655,8 +682,7 @@ bool LIB_COMPONENT::Save( FILE* aFile ) } -bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum, - wxString& aErrorMsg ) +bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum, wxString& aErrorMsg ) { int unused; char* p; @@ -723,6 +749,9 @@ bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum, value.m_Attributs |= TEXT_NO_VISIBLE; } + // Add the root alias to the alias list. + m_aliases.push_back( new LIB_ALIAS( name, this ) ); + LIB_FIELD& reference = GetReferenceField(); if( strcmp( prefix, "~" ) == 0 ) @@ -872,7 +901,7 @@ bool LIB_COMPONENT::LoadAliases( char* aLine, wxString& aErrorMsg ) while( text ) { - m_AliasList.Add( CONV_FROM_UTF8( text ) ); + m_aliases.push_back( new LIB_ALIAS( CONV_FROM_UTF8( text ), this ) ); text = strtok( NULL, " \t\r\n" ); } @@ -1454,144 +1483,140 @@ void LIB_COMPONENT::SetConversion( bool aSetConvert ) } -/* accessors to aliases data, used by the component editor, during edition -*/ -/** Function LocateAliasData - * @return an index in array string to the alias data (doc, keywords, docfile) - * or -1 if not found - * @param aAliasName = the alias name - * @param aCreateIfNotExist = true if the alias data must be created, when not exists - */ -int LIB_COMPONENT::LocateAliasData( const wxString & aAliasName, bool aCreateIfNotExist) +wxArrayString LIB_COMPONENT::GetAliasNames( bool aIncludeRoot ) const { - int idx = -1; - for( unsigned ii = 0; ii < m_aliasListData.size(); ii += ALIAS_NEXT_IDX ) + wxArrayString names; + + LIB_ALIAS_LIST::const_iterator it; + + for( it=m_aliases.begin(); it= 0 ) - data = m_aliasListData[idx + ALIAS_DOC_IDX]; - - return data; -} - - -/** Function GetAliasDataKeyWords - * @param aAliasName = the alias name - * @return aAliasData = the keywords string - */ -wxString LIB_COMPONENT::GetAliasDataKeyWords( const wxString & aAliasName ) -{ - wxString data; - int idx = LocateAliasData( aAliasName ); - if ( idx >= 0 ) - data = m_aliasListData[idx + ALIAS_KEYWORD_IDX]; - - return data; -} - - -/** Function GetAliasDataDocFileName - * @param aAliasName = the alias name - * @return the Doc filename string - */ -wxString LIB_COMPONENT::GetAliasDataDocFileName( const wxString & aAliasName ) -{ - wxString data; - int idx = LocateAliasData( aAliasName ); - if ( idx >= 0 ) - data = m_aliasListData[idx + ALIAS_DOC_FILENAME_IDX]; - - return data; -} - - - -/** Function SetAliasDataDoc - * @param aAliasName = the alias name - * @param aAliasData = the Doc string - */ -void LIB_COMPONENT::SetAliasDataDoc( const wxString & aAliasName, const wxString & aAliasData ) -{ - int idx = LocateAliasData( aAliasName, true ); - m_aliasListData[idx + ALIAS_DOC_IDX] = aAliasData; -} - -/** Function SetAliasDataKeywords - * @param aAliasName = the alias name - * @param aAliasData = the keywords string - */ -void LIB_COMPONENT::SetAliasDataKeywords( const wxString & aAliasName, const wxString & aAliasData ) -{ - int idx = LocateAliasData( aAliasName, true ); - m_aliasListData[idx + ALIAS_KEYWORD_IDX] = aAliasData; -} - -/** Function SetAliasDataDocFileName - * @param aAliasName = the alias name - * @param aAliasData = the Doc filename string - */ -void LIB_COMPONENT::SetAliasDataDocFileName( const wxString & aAliasName, - const wxString & aAliasData ) -{ - int idx = LocateAliasData( aAliasName, true ); - m_aliasListData[idx + ALIAS_DOC_FILENAME_IDX] = aAliasData; -} - - -/** Function RemoveAliasData - * remove an alias data from list - * @param aAliasName = the alias name - */ -void LIB_COMPONENT::RemoveAliasData(const wxString & aAliasName ) -{ - int idx = LocateAliasData( aAliasName ); - if ( idx >= 0 ) - m_aliasListData.RemoveAt( idx + ALIAS_NAME_IDX, ALIAS_NEXT_IDX ); -} - -/** Function CollectAliasesData - * store in m_aliasListData alias data (doc, keywords, docfile) - * for each alias found in m_AliasList -*/ -void LIB_COMPONENT::CollectAliasesData( CMP_LIBRARY* aLibrary ) -{ - for( unsigned ii = 0; ii < m_AliasList.GetCount(); ii++ ) - { - CMP_LIB_ENTRY* entry = aLibrary->FindEntry( m_AliasList[ii] ); - if ( ! entry ) + if( !aIncludeRoot && (*it)->IsRoot() ) continue; - SetAliasDataDoc( m_AliasList[ii], entry->GetDescription() ); - SetAliasDataKeywords( m_AliasList[ii], entry->GetKeyWords() ); - SetAliasDataDocFileName( m_AliasList[ii], entry->GetDocFileName() ); + names.Add( (*it)->GetName() ); + } + + return names; +} + + +bool LIB_COMPONENT::HasAlias( const wxString& aName ) const +{ + wxCHECK2_MSG( !aName.IsEmpty(), return false, + wxT( "Cannot get alias with an empty name, bad programmer." ) ); + + for( size_t i = 0; i < m_aliases.size(); i++ ) + { + if( aName.CmpNoCase( m_aliases[i]->GetName() ) == 0 ) + return true; + } + + return false; +} + + +void LIB_COMPONENT::SetAliases( const wxArrayString& aAliasList ) +{ + wxCHECK_RET( library == NULL, + wxT( "Component aliases cannot be changed when they are owned by a library." ) ); + + if( aAliasList == GetAliasNames() ) + return; + + // Add names not existing in the current component alias list. + for( size_t i = 0; i < aAliasList.GetCount(); i++ ) + { + if( HasAlias( aAliasList[ i ] ) ) + continue; + + m_aliases.push_back( new LIB_ALIAS( aAliasList[ i ], this ) ); + } + + /* Remove names in the current component that are not in the new alias list. */ + LIB_ALIAS_LIST::iterator it; + + for( it = m_aliases.begin(); it < m_aliases.end(); it++ ) + { + int index = aAliasList.Index( (*it)->GetName(), false ); + + if( index != wxNOT_FOUND || (*it)->IsRoot() ) + continue; + + it = m_aliases.erase( it ); } } + + +void LIB_COMPONENT::RemoveAlias( const wxString& aName ) +{ + wxCHECK_RET( library == NULL, + wxT( "Component aliases cannot be changed when they are owned by a library." ) ); + wxCHECK_RET( !aName.IsEmpty(), wxT( "Cannot get alias with an empty name." ) ); + + LIB_ALIAS_LIST::iterator it; + + for( it = m_aliases.begin(); it < m_aliases.end(); it++ ) + { + if( aName.CmpNoCase( (*it)->GetName() ) == 0 ) + { + m_aliases.erase( it ); + break; + } + } +} + + +LIB_ALIAS* LIB_COMPONENT::RemoveAlias( LIB_ALIAS* aAlias ) +{ + wxCHECK_MSG( aAlias != NULL, NULL, wxT( "Cannot remove alias by NULL pointer." ) ); + + LIB_ALIAS* nextAlias = NULL; + LIB_ALIAS_LIST::iterator it = find( m_aliases.begin(), m_aliases.end(), aAlias ); + + if( it != m_aliases.end() ) + { + bool rename = aAlias->IsRoot(); + + it = m_aliases.erase( it ); + delete aAlias; + + if( !m_aliases.empty() ) + { + if( it == m_aliases.end() ) + it = m_aliases.begin(); + + nextAlias = (*it); + + if( rename ) + SetName( nextAlias->GetName() ); + } + + } + + return nextAlias; +} + + +LIB_ALIAS* LIB_COMPONENT::GetAlias( const wxString& aName ) +{ + wxCHECK2_MSG( !aName.IsEmpty(), return NULL, + wxT( "Cannot get alias with an empty name. Bad programmer!" ) ); + + for( size_t i = 0; i < m_aliases.size(); i++ ) + { + if( aName.CmpNoCase( m_aliases[i]->GetName() ) == 0 ) + return m_aliases[i]; + } + + return NULL; +} + + +LIB_ALIAS* LIB_COMPONENT::GetAlias( size_t aIndex ) +{ + wxCHECK2_MSG( aIndex < m_aliases.size(), return NULL, + wxT( "Illegal alias list index, bad programmer." ) ); + + return m_aliases[aIndex]; +} diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index 7b14174e6c..609d6d1721 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -8,11 +8,27 @@ #include "classes_body_items.h" #include "class_libentry_fields.h" -#include +#include class CMP_LIBRARY; +class LIB_ALIAS; +/** + * LIB_ALIAS map sorting. + */ +struct AliasMapSort +{ + bool operator() ( const wxString& aItem1, const wxString& aItem2 ) const + { return aItem1.CmpNoCase( aItem2 ) < 0; } +}; + +/** + * Alias map used by component library object. + */ +typedef std::map< wxString, LIB_ALIAS*, AliasMapSort > LIB_ALIAS_MAP; + +typedef std::vector< LIB_ALIAS* > LIB_ALIAS_LIST; /* Types for components in libraries * components can be a true component or an alias of a true component. @@ -114,11 +130,10 @@ public: { return !( *this == aName ); } + + bool operator==( const wxString& aName ) const { return *this == ( const wxChar* ) aName; } }; -typedef boost::ptr_vector< CMP_LIB_ENTRY > LIB_ENTRY_LIST; - - extern bool operator<( const CMP_LIB_ENTRY& aItem1, const CMP_LIB_ENTRY& aItem2 ); extern int LibraryEntryCompare( const CMP_LIB_ENTRY* aItem1, const CMP_LIB_ENTRY* aItem2 ); @@ -142,42 +157,21 @@ class LIB_COMPONENT : public CMP_LIB_ENTRY LibrEntryOptions m_options; ///< Special component features such as POWER or NORMAL.) int unitCount; ///< Number of units (parts) per package. LIB_DRAW_ITEM_LIST drawings; ///< How to draw this part. - wxArrayString m_aliasListData; /* ALIAS data (name, doc, keywords and doc filename). - * Used only by the component editor LibEdit - * to store aliases info during edition - * usually void outside the component editor */ - wxArrayString m_AliasList; ///< List of alias names for the component. wxArrayString m_FootprintList; /**< List of suitable footprint names for the - component (wildcard names accepted). */ - + component (wild card names accepted). */ + LIB_ALIAS_LIST m_aliases; ///< List of alias object pointers associated with the + ///< component. void deleteAllFields(); friend class CMP_LIBRARY; + friend class LIB_ALIAS; public: - /* Offsets used in editing library component, - * for handle aliases data in m_AliasListData array string - * when editing a library component, aliases data is stored - * in m_AliasListData. - * 4 strings by alias are stored: - * name, doc, keywords and doc filename - * these constants are indexes in m_AliasListData - * to read/write strings for a given alias - */ - enum alias_idx - { - ALIAS_NAME_IDX = 0, - ALIAS_DOC_IDX = 1, - ALIAS_KEYWORD_IDX = 2, - ALIAS_DOC_FILENAME_IDX = 3, - ALIAS_NEXT_IDX = 4 - }; - LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary = NULL ); LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary = NULL ); - ~LIB_COMPONENT(); + virtual ~LIB_COMPONENT(); virtual wxString GetClass() const { @@ -191,73 +185,32 @@ public: GetValueField().m_Text = aName; } - wxArrayString& GetAliasList() { return m_AliasList; } + wxArrayString GetAliasNames( bool aIncludeRoot = true ) const; + + size_t GetAliasCount() const { return m_aliases.size(); } + + LIB_ALIAS* GetAlias( size_t aIndex ); + + LIB_ALIAS* GetAlias( const wxString& aName ); + + /** + * Test if alias \a aName is in component alias list. + * + * Alias name comparisons are case insensitive. + * + * @param aName - Name of alias. + * @return True if alias name in alias list. + */ + bool HasAlias( const wxString& aName ) const; + + void SetAliases( const wxArrayString& aAliasList ); + + void RemoveAlias( const wxString& aName ); + + LIB_ALIAS* RemoveAlias( LIB_ALIAS* aAlias ); wxArrayString& GetFootPrints() { return m_FootprintList; } - /* accessors to aliases data, used by the component editor, during edition - */ - /** Function CollectAliasesData - * store in m_aliasListData alias data (doc, keywords, docfile) - * for each alias found in m_AliasList - */ - void CollectAliasesData( CMP_LIBRARY* aLibrary ); - - /** Function LocateAliasData - * @return an index in array string to the alias data (doc, keywords, docfile) - * or -1 if not found - * @param aAliasName = the alias name - * @param aCreateIfNotExist = true if the alias data must be created, when not exists - */ - int LocateAliasData( const wxString & aAliasName, bool aCreateIfNotExist = false ); - - /** Function GetAliasDataDoc - * @param aAliasName = the alias name - * @return the Doc string - */ - wxString GetAliasDataDoc( const wxString & aAliasName ); - - /** Function GetAliasDataKeyWords - * @param aAliasName = the alias name - * @return aAliasData = the keywords string - */ - wxString GetAliasDataKeyWords( const wxString & aAliasName ); - - /** Function GetAliasDataDocFileName - * @param aAliasName = the alias name - * @return the Doc filename string - */ - wxString GetAliasDataDocFileName( const wxString & aAliasName ); - - /** Function SetAliasDataDoc - * @param aAliasName = the alias name - * @return aAliasData = the Doc string - */ - void SetAliasDataDoc( const wxString & aAliasName, const wxString & aAliasData ); - - /** Function SetAliasDataKeywords - * @param aAliasName = the alias name - * @param aAliasData = the keywords string - */ - void SetAliasDataKeywords( const wxString & aAliasName, const wxString & aAliasData ); - - /** Function SetAliasDataDocFileName - * @param aAliasName = the alias name - * @param aAliasData = the Doc filename string - */ - void SetAliasDataDocFileName( const wxString & aAliasName, const wxString & aAliasData ); - - /** Function ClearAliasDataDoc - * clear aliases data list - */ - void ClearAliasDataDoc( ) { m_aliasListData.Clear(); } - - /** Function RemoveAliasData - * remove an alias data from list - * @param aAliasName = the alias name - */ - void RemoveAliasData(const wxString & aAliasName ); - EDA_Rect GetBoundaryBox( int aUnit, int aConvert ); bool SaveDateAndTime( FILE* aFile ); @@ -286,8 +239,8 @@ public: bool LoadAliases( char* aLine, wxString& aErrorMsg ); bool LoadFootprints( FILE* aFile, char* aLine, int* aLineNum, wxString& aErrorMsg ); - bool isPower() { return m_options == ENTRY_POWER; } - bool isNormal() { return m_options == ENTRY_NORMAL; } + bool IsPower() { return m_options == ENTRY_POWER; } + bool IsNormal() { return m_options == ENTRY_NORMAL; } void SetPower() { m_options = ENTRY_POWER; } void SetNormal() { m_options = ENTRY_NORMAL; } @@ -301,7 +254,7 @@ public: * in \a aFieldsList. The only known caller of this function is the * library component field editor, and it establishes needed behavior. * - * @param aFieldsList is a set of fields to import, removing all previous fields. +` * @param aFieldsList is a set of fields to import, removing all previous fields. */ void SetFields( const std::vector & aFieldsList ); @@ -320,7 +273,7 @@ public: * finds a field within this component matching \a aFieldName and returns * it or NULL if not found. */ - LIB_FIELD* FindField( const wxString& aFieldName ); + LIB_FIELD* FindField( const wxString& aFieldName ); /** * Return pointer to the requested field. @@ -460,20 +413,6 @@ public: */ bool HasConversion() const; - /** - * Test if alias \a aName is in component alias list. - * - * Alias name comparisons are case insensitive. - * - * @param aName - Name of alias. - * @return True if alias name in alias list. - */ - bool HasAlias( const wxChar* aName ) - { - wxASSERT( aName != NULL ); - return m_AliasList.Index( aName ) != wxNOT_FOUND; - } - /** * Clears the status flag all draw objects in this component. */ @@ -630,6 +569,8 @@ public: void SetShowPinNumbers( bool aShow ) { m_showPinNumbers = aShow; } bool ShowPinNumbers() { return m_showPinNumbers; } + + bool operator==( const LIB_COMPONENT* aComponent ) const { return this == aComponent; } }; @@ -641,23 +582,24 @@ public: */ class LIB_ALIAS : public CMP_LIB_ENTRY { + friend class LIB_COMPONENT; + protected: /** * The actual component of the alias. * - * @note - Do not delete the root component. The root component is owned - * by library the component is part of. Deleting the root component - * will likely cause EESchema to crash. - * Or, if the root component is deleted, aliases must be deleted or their .root member - * must be changed to point a new root component + * @note - Do not delete the root component. The root component is actually shared by + * all of the aliases associated with it. The component pointer will be delete + * in the destructor of the last alias that shares this component is deleted. + * Deleting the root component will likely cause EESchema to crash. */ LIB_COMPONENT* root; public: - LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent, - CMP_LIBRARY* aLibrary = NULL ); - LIB_ALIAS( LIB_ALIAS& aAlias, CMP_LIBRARY* aLibrary = NULL ); - ~LIB_ALIAS(); + LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent ); + LIB_ALIAS( LIB_ALIAS& aAlias, LIB_COMPONENT* aRootComponent = NULL ); + + virtual ~LIB_ALIAS(); virtual wxString GetClass() const { @@ -672,10 +614,9 @@ public: return root; } - /** - * Set the alias root component. - */ - void SetComponent( LIB_COMPONENT* aComponent ); + bool IsRoot() const { return name.CmpNoCase( root->GetName() ) == 0; } + + bool operator==( const LIB_ALIAS* aAlias ) const { return this == aAlias; } }; diff --git a/eeschema/class_libentry_fields.h b/eeschema/class_libentry_fields.h index 04ec9d0d6a..dfee2ff767 100644 --- a/eeschema/class_libentry_fields.h +++ b/eeschema/class_libentry_fields.h @@ -5,7 +5,7 @@ #ifndef CLASS_LIBENTRY_FIELDS_H #define CLASS_LIBENTRY_FIELDS_H - +#include "program.h" #include "classes_body_items.h" diff --git a/eeschema/class_library.cpp b/eeschema/class_library.cpp index d0cd4fca2e..ea73dfcd74 100644 --- a/eeschema/class_library.cpp +++ b/eeschema/class_library.cpp @@ -26,13 +26,6 @@ _( "Library <%s> has duplicate entry name <%s>.\n\ This may cause some unexpected behavior when loading components into a schematic." ); -static bool DuplicateEntryName( const CMP_LIB_ENTRY& aItem1, - const CMP_LIB_ENTRY& aItem2 ) -{ - return aItem1.GetName().CmpNoCase( aItem2.GetName() ) == 0; -} - - bool operator==( const CMP_LIBRARY& aLibrary, const wxChar* aName ) { return aLibrary.GetName().CmpNoCase( aName ) == 0; @@ -90,22 +83,33 @@ CMP_LIBRARY::CMP_LIBRARY( int aType, const wxFileName& aFileName ) CMP_LIBRARY::~CMP_LIBRARY() { + for( LIB_ALIAS_MAP::iterator it=aliases.begin(); it!=aliases.end(); it++ ) + { + LIB_ALIAS* alias = (*it).second; + LIB_COMPONENT* component = alias->GetComponent(); + alias = component->RemoveAlias( alias ); + + if( alias == NULL ) + delete component; + } } void CMP_LIBRARY::GetEntryNames( wxArrayString& aNames, bool aSort, bool aMakeUpperCase ) { - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) + LIB_ALIAS_MAP::iterator it; + + for( it=aliases.begin(); it!=aliases.end(); it++ ) { if( aMakeUpperCase ) { - wxString tmp = entry.GetName(); + wxString tmp = (*it).first; tmp.MakeUpper(); aNames.Add( tmp ); } else { - aNames.Add( entry.GetName() ); + aNames.Add( (*it).first ); } } @@ -119,14 +123,15 @@ void CMP_LIBRARY::SearchEntryNames( wxArrayString& aNames, const wxString& aKeySearch, bool aSort ) { - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) + LIB_ALIAS_MAP::iterator it; + + for( it=aliases.begin(); it!=aliases.end(); it++ ) { - if( !aKeySearch.IsEmpty() && KeyWordOk( aKeySearch, entry.GetKeyWords() ) ) - aNames.Add( entry.GetName() ); + if( !aKeySearch.IsEmpty() && KeyWordOk( aKeySearch, (*it).second->GetKeyWords() ) ) + aNames.Add( (*it).first ); if( !aNameSearch.IsEmpty() && WildCompareString( aNameSearch, - entry.GetName(), - false ) ) - aNames.Add( entry.GetName() ); + (*it).second->GetName(), false ) ) + aNames.Add( (*it).first ); } if( aSort ) @@ -134,16 +139,17 @@ void CMP_LIBRARY::SearchEntryNames( wxArrayString& aNames, } -void CMP_LIBRARY::SearchEntryNames( wxArrayString& aNames, const wxRegEx& aRe, - bool aSort ) +void CMP_LIBRARY::SearchEntryNames( wxArrayString& aNames, const wxRegEx& aRe, bool aSort ) { if( !aRe.IsValid() ) return; - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) + LIB_ALIAS_MAP::iterator it; + + for( it=aliases.begin(); it!=aliases.end(); it++ ) { - if( aRe.Matches( entry.GetKeyWords() ) ) - aNames.Add( entry.GetName() ); + if( aRe.Matches( (*it).second->GetKeyWords() ) ) + aNames.Add( (*it).first ); } if( aSort ) @@ -151,37 +157,43 @@ void CMP_LIBRARY::SearchEntryNames( wxArrayString& aNames, const wxRegEx& aRe, } +bool CMP_LIBRARY::Conflicts( LIB_COMPONENT* aComponent ) +{ + wxCHECK_MSG( aComponent != NULL, false, + wxT( "Cannot test NULL component for conflicts in library " ) + GetName() ); + + for( size_t i=0; im_aliases.size(); i++ ) + { + LIB_ALIAS_MAP::iterator it = aliases.find( aComponent->m_aliases[i]->GetName() ); + + if( it != aliases.end() ) + return true; + } + + return false; +} + + CMP_LIB_ENTRY* CMP_LIBRARY::FindEntry( const wxChar* aName ) { - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) - { - if( entry.GetName().CmpNoCase( aName ) == 0 ) - return &entry; - } + + LIB_ALIAS_MAP::iterator it = aliases.find( wxString( aName ) ); + + if( it != aliases.end() ) + return ( CMP_LIB_ENTRY* ) (*it).second; return NULL; } -CMP_LIB_ENTRY* CMP_LIBRARY::FindEntry( const wxChar* aName, LibrEntryType aType ) -{ - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) - { - if( entry.GetName().CmpNoCase( aName ) == 0 && entry.GetType() == aType ) - return &entry; - } - - return NULL; -} - /** * Return the first entry in the library. * @return The first entry or NULL if the library has no entries. */ CMP_LIB_ENTRY* CMP_LIBRARY::GetFirstEntry() { - if( entries.size() ) - return &entries.front(); + if( aliases.size() ) + return ( LIB_ALIAS* ) (*aliases.begin()).second; else return NULL; } @@ -191,15 +203,14 @@ LIB_COMPONENT* CMP_LIBRARY::FindComponent( const wxChar* aName ) LIB_COMPONENT* component = NULL; CMP_LIB_ENTRY* entry = FindEntry( aName ); - if( entry != NULL && entry->isAlias() ) + if( entry != NULL ) { + wxCHECK_MSG( entry->isAlias(), NULL, + wxT( "Component found in library entry list, bad programmer!" ) ); + LIB_ALIAS* alias = (LIB_ALIAS*) entry; component = alias->GetComponent(); } - else - { - component = (LIB_COMPONENT*) entry; - } return component; } @@ -209,7 +220,9 @@ bool CMP_LIBRARY::AddAlias( LIB_ALIAS* aAlias ) { wxASSERT( aAlias != NULL ); - if( FindEntry( aAlias->GetName() ) != NULL ) + LIB_ALIAS_MAP::iterator it = aliases.find( aAlias->GetName() ); + + if( it != aliases.end() ) { wxString msg; @@ -219,8 +232,8 @@ bool CMP_LIBRARY::AddAlias( LIB_ALIAS* aAlias ) return false; } - entries.push_back( (CMP_LIB_ENTRY*) aAlias ); - SetModifyFlags( ); + aliases[ aAlias->GetName() ] = aAlias; + isModified = true; return true; } @@ -242,220 +255,78 @@ LIB_COMPONENT* CMP_LIBRARY::AddComponent( LIB_COMPONENT* aComponent ) if( aComponent == NULL ) return NULL; - LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aComponent, this ); - newCmp->ClearAliasDataDoc(); // Remove data used only in edition - // Conflict detection: See if already existing aliases exist, // and if yes, ask user for continue or abort // Special case: if the library is the library cache of the project, // old aliases are always removed to avoid conflict, // and user is not prompted ) - if( !IsCache() ) + if( Conflicts( aComponent ) && !IsCache() ) { - wxString msg; - int conflict_count = 0; - for( size_t i = 0; i < newCmp->m_AliasList.GetCount(); i++ ) - { - LIB_ALIAS* alias = FindAlias( newCmp->m_AliasList[ i ] ); - - if( alias == NULL ) - continue; - LIB_COMPONENT* cparent = alias->GetComponent(); - - if( cparent == NULL || // Lib error, should not occur. - ( cparent->GetName().CmpNoCase( newCmp->GetName() ) != 0 ) ) - { - if( cparent ) - msg = cparent->GetName(); - else - msg = _( "unknown" ); - wxString msg1; - wxString parentName; - if( cparent ) - parentName = cparent->GetName(); - else - parentName = _("not found"); - msg1.Printf( _( "alias <%s> already exists and has root name<%s>" ), - GetChars( alias->GetName() ), - GetChars( parentName ) ); - msg << msg1 << wxT( "\n" ); - conflict_count++; - } - - if( conflict_count > 20 ) - break; - } - - if( conflict_count ) // Conflict: ask user what he wants: remove all aliases or abort: - { - wxString title; - wxString msg1; - title.Printf( _( "Conflict in library <%s>"), GetChars( fileName.GetName())); - msg1.Printf( _("and appears in alias list of current component <%s>." ), - GetChars( newCmp->GetName() ) ); - msg << wxT( "\n\n" ) << msg1; - msg << wxT( "\n\n" ) << _( "All old aliases will be removed. Continue ?" ); - int diag = wxMessageBox( msg, title, wxYES | wxICON_QUESTION ); - if( diag != wxYES ) - { - delete newCmp; - return NULL; - } - } + wxFAIL_MSG( wxT( "Cannot add component <" ) + aComponent->GetName() + + wxT( "> to library <" ) + GetName() + wxT( "> due to name conflict." ) ); + return NULL; } - for( size_t i = 0; i < newCmp->m_AliasList.GetCount(); i++ ) + + LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aComponent, this ); + + for( size_t i = 0; i < newCmp->m_aliases.size(); i++ ) { - wxString aliasname = newCmp->m_AliasList[ i ]; + wxString aliasname = newCmp->m_aliases[i]->GetName(); LIB_ALIAS* alias = FindAlias( aliasname ); - if( alias == NULL ) - { - alias = new LIB_ALIAS( aliasname, newCmp ); - entries.push_back( alias ); - } - else - { - LIB_COMPONENT* cparent = alias->GetComponent(); + if( alias != NULL ) + RemoveEntry( (CMP_LIB_ENTRY*) alias ); - if( cparent == NULL || // Lib error, should not occurs - ( cparent->GetName().CmpNoCase( newCmp->GetName() ) != 0) ) - { - // Remove alias from library and alias list of its root component - RemoveEntry( alias ); - alias = new LIB_ALIAS( aliasname, newCmp ); - entries.push_back( alias ); - } - } - // Update alias data: - alias->SetDescription( aComponent->GetAliasDataDoc( aliasname ) ); - alias->SetKeyWords( aComponent->GetAliasDataKeyWords( aliasname ) ); - alias->SetDocFileName( aComponent->GetAliasDataDocFileName( aliasname ) ); + aliases[ aliasname ] = newCmp->m_aliases[i]; } - entries.push_back( (CMP_LIB_ENTRY*) newCmp ); - SetModifyFlags( ); - - entries.sort(); - entries.unique( DuplicateEntryName ); + isModified = true; return newCmp; } -/** function RemoveEntryName - * Remove an \a aName entry from the library list names. - * Warning: this is a partial remove, because if aName is an alias - * it is not removed from its root component. - * this is for internal use only - * Use RemoveEntry( CMP_LIB_ENTRY* aEntry ) to remove safely an entry in library. - * @param aName - Entry name to remove from library. - */ -void CMP_LIBRARY::RemoveEntryName( const wxString& aName ) + +CMP_LIB_ENTRY* CMP_LIBRARY::RemoveEntry( CMP_LIB_ENTRY* aEntry ) { - LIB_ENTRY_LIST::iterator i; + wxCHECK_MSG( aEntry != NULL && aEntry->isAlias(), NULL, + wxT( "Only LIB_ALIAS pointers can be removed from library." ) ); - for( i = entries.begin(); i < entries.end(); i++ ) - { - if( i->GetName().CmpNoCase( aName ) == 0 ) - { - entries.erase( i ); - return; - } - } -} + LIB_ALIAS_MAP::iterator it = aliases.find( aEntry->GetName() ); + if( it == aliases.end() ) + return NULL; -/** - * Remove safely an \a aEntry from the library. - * - * If the entry is an alias, the alias is removed from the library and from - * the alias list of the root component. If the entry is a root component - * with no aliases, it is removed from the library. If the entry is a root - * component with aliases, the root component is renamed to the name of - * the first alias and the root name for all remaining aliases are updated - * to reflect the new root name. - * - * @param aEntry - Entry to remove from library. - */ - void CMP_LIBRARY::RemoveEntry( CMP_LIB_ENTRY* aEntry ) -{ - wxASSERT( aEntry != NULL ); + // If the entry pointer doesn't match the name it is mapped to in the library, we + // have done someething terribly wrong. + wxCHECK_MSG( (*it).second == aEntry, NULL, + wxT( "Pointer mismatch while attempting to remove entry <" ) + + aEntry->GetName() + wxT( "> from library <" ) + GetName() + wxT( ">." ) ); - LIB_COMPONENT* root; - LIB_ALIAS* alias; - - SetModifyFlags( ); - - if( aEntry->isAlias() ) - { - alias = (LIB_ALIAS*) aEntry; - root = alias->GetComponent(); - - /* Remove alias name from the root component alias list */ - if( root == NULL ) // Should not occur, but is not a fatal error - { - wxLogDebug( wxT( "No root component found for alias <%s> in library <%s>." ), - GetChars( aEntry->GetName() ), - GetChars( fileName.GetName() ) ); - } - else - { - int index = root->m_AliasList.Index( aEntry->GetName(), false ); - - if( index == wxNOT_FOUND ) // Should not occur, but is not a fatal error - { - wxLogDebug( wxT( "Alias <%s> not found in component <%s> alias list in \ -library <%s>" ), - GetChars( aEntry->GetName() ), - GetChars( root->GetName() ), - GetChars( fileName.GetName() ) ); - } - else - root->m_AliasList.RemoveAt( index ); - } - - RemoveEntryName( alias->GetName() ); - - return; - } - - root = ( LIB_COMPONENT* ) aEntry; - - /* Entry is a component with no aliases so removal is simple. */ - if( root->m_AliasList.GetCount() == 0 ) - { - RemoveEntryName( root->GetName() ); - return; - } - - /* Entry is a component with one or more alias. */ - wxString aliasName = root->m_AliasList[0]; - - /* The root component is not really deleted, it is renamed with the first - * alias name. */ - alias = FindAlias( aliasName ); + LIB_ALIAS* alias = (LIB_ALIAS*) aEntry; + LIB_COMPONENT* component = alias->GetComponent(); + alias = component->RemoveAlias( alias ); if( alias == NULL ) { - wxLogWarning( wxT( "Alias <%s> for component <%s> not found in library <%s>" ), - GetChars( aliasName ), - GetChars( root->GetName() ), - GetChars( fileName.GetName() ) ); - return; + delete component; + + if( aliases.size() > 1 ) + { + LIB_ALIAS_MAP::iterator next = it; + next++; + + if( next == aliases.end() ) + next = aliases.begin(); + + alias = (*next).second; + } } - /* Remove the first alias name from the component alias list. */ - root->m_AliasList.RemoveAt( 0 ); + aliases.erase( it ); + isModified = true; - /* Rename the component to the name of the first alias. */ - root->SetDescription( alias->GetDescription() ); - root->SetKeyWords( alias->GetKeyWords() ); - - /* Remove the first alias from library. */ - RemoveEntryName( aliasName ); - - /* Change the root name. */ - root->SetName( aliasName ); + return (CMP_LIB_ENTRY*) alias; } @@ -473,79 +344,57 @@ LIB_COMPONENT* CMP_LIBRARY::ReplaceComponent( LIB_COMPONENT* aOldComponent, wxASSERT( aNewComponent != NULL ); wxASSERT( aOldComponent->GetName().CmpNoCase( aNewComponent->GetName() )== 0 ); - size_t i; + /* Remove the old root component. The component will automatically be removed when all + * it's aliases are deleted. + */ + BOOST_FOREACH( LIB_ALIAS* alias, aOldComponent->m_aliases ) + { + RemoveEntry( (CMP_LIB_ENTRY*) alias ); + } LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aNewComponent, this ); - newCmp->ClearAliasDataDoc( ); // this data is currently used only when editing the component - /* We want to remove the old root component, so we must remove old aliases. - * even if they are not modified, because their root component will be removed - */ - for( i = 0; i < aOldComponent->m_AliasList.GetCount(); i++ ) + // Add new aliases to library alias map. + for( size_t i = 0; i < newCmp->m_aliases.size(); i++ ) { - RemoveEntryName( aOldComponent->m_AliasList[ i ] ); + aliases[ newCmp->m_aliases[ i ]->GetName() ] = newCmp->m_aliases[ i ]; } - /* Now, add current aliases. */ - for( i = 0; i < aNewComponent->m_AliasList.GetCount(); i++ ) - { - wxString aliasname = aNewComponent->m_AliasList[ i ]; - LIB_ALIAS* alias = new LIB_ALIAS( aliasname, newCmp ); - // Update alias data: - alias->SetDescription( aNewComponent->GetAliasDataDoc( aliasname ) ); - alias->SetKeyWords( aNewComponent->GetAliasDataKeyWords( aliasname ) ); - alias->SetDocFileName( aNewComponent->GetAliasDataDocFileName( aliasname ) ); - // Add it in library - entries.push_back( alias ); - } + isModified = true; - RemoveEntryName( aOldComponent->GetName() ); - entries.push_back( newCmp ); - entries.sort(); - - SetModifyFlags( ); return newCmp; } CMP_LIB_ENTRY* CMP_LIBRARY::GetNextEntry( const wxChar* aName ) { - size_t i; - CMP_LIB_ENTRY* entry = NULL; + if( aliases.empty() ) + return NULL; - for( i = 0; i < entries.size(); i++ ) - { - if( entries[i].GetName().CmpNoCase( aName ) == 0 ) - { - if( i < entries.size() - 1 ) - { - entry = &entries[ i + 1 ]; - break; - } - } - } + LIB_ALIAS_MAP::iterator it = aliases.find( wxString( aName ) ); - if( entry == NULL ) - entry = &entries.front(); + it++; - return entry; + if( it == aliases.end() ) + it = aliases.begin(); + + return ( CMP_LIB_ENTRY* ) (*it).second; } CMP_LIB_ENTRY* CMP_LIBRARY::GetPreviousEntry( const wxChar* aName ) { - size_t i; - CMP_LIB_ENTRY* entry = NULL; + if( aliases.empty() ) + return NULL; - for( i = 0; i < entries.size(); i++ ) - { - if( entries[i].GetName().CmpNoCase( aName ) == 0 && entry ) - break; + LIB_ALIAS_MAP::iterator it = aliases.find( wxString( aName ) ); - entry = &entries[i]; - } + if( it == aliases.begin() ) + it = aliases.end(); - return entry; + it--; + + return ( CMP_LIB_ENTRY* ) (*it).second; } @@ -574,6 +423,7 @@ bool CMP_LIBRARY::Load( wxString& aErrorMsg ) if( GetLine( file, line, &lineNumber, sizeof( line ) ) == NULL ) { aErrorMsg = _( "The file is empty!" ); + fclose( file ); return false; } @@ -597,18 +447,21 @@ bool CMP_LIBRARY::Load( wxString& aErrorMsg ) || !tkn.GetNextToken().Upper().StartsWith(wxT( "EESCHEMA-LIB" ) ) ) { aErrorMsg = _( "The file is NOT an EESCHEMA library!" ); + fclose( file ); return false; } if( !tkn.HasMoreTokens() ) { aErrorMsg = _( "The file header is missing version and time stamp information." ); + fclose( file ); return false; } if( tkn.GetNextToken() != wxT( "Version" ) || !tkn.HasMoreTokens() ) { aErrorMsg = wxT( "The file header version information is invalid." ); + fclose( file ); return false; } @@ -647,6 +500,7 @@ the current schematic." ), if( !LoadHeader( file, &lineNumber ) ) { aErrorMsg = _( "An error occurred attempting to read the header." ); + fclose( file ); return false; } @@ -665,14 +519,12 @@ the current schematic." ), */ if( FindEntry( libEntry->GetName() ) != NULL ) { - wxString msg( wxGetTranslation(duplicate_name_msg)); + wxString msg( wxGetTranslation( duplicate_name_msg ) ); wxLogWarning( msg, GetChars( fileName.GetName() ), GetChars( libEntry->GetName() ) ); } - /* If we are here, this part is O.k. - put it in: */ - entries.push_back( libEntry ); LoadAliases( libEntry ); } else @@ -686,7 +538,7 @@ the current schematic." ), } } - entries.sort(); + fclose( file ); return true; } @@ -694,23 +546,20 @@ the current schematic." ), void CMP_LIBRARY::LoadAliases( LIB_COMPONENT* component ) { - wxASSERT( component != NULL && component->isComponent() ); + wxCHECK_RET( component != NULL && component->isComponent(), + wxT( "Cannot load aliases of NULL component object. Bad programmer!" ) ); - LIB_ALIAS* alias; - unsigned ii; - - for( ii = 0; ii < component->GetAliasList().GetCount(); ii++ ) + for( size_t i = 0; i < component->m_aliases.size(); i++ ) { - if( FindEntry( component->m_AliasList[ii] ) != NULL ) + if( FindEntry( component->m_aliases[i]->GetName() ) != NULL ) { - wxString msg( wxGetTranslation(duplicate_name_msg)); + wxString msg( wxGetTranslation( duplicate_name_msg ) ); wxLogError( msg, GetChars( fileName.GetName() ), - GetChars( component->m_AliasList[ii] ) ); + GetChars( component->m_aliases[i]->GetName() ) ); } - alias = new LIB_ALIAS( component->m_AliasList[ii], component, this ); - entries.push_back( alias ); + aliases[ component->m_aliases[i]->GetName() ] = component->m_aliases[i]; } } @@ -773,8 +622,7 @@ bool CMP_LIBRARY::LoadDocs( wxString& aErrorMsg ) { if( strncmp( line, "$CMP", 4 ) != 0 ) { - aErrorMsg.Printf( wxT( "$CMP command expected in line %d, aborted." ), - lineNumber ); + aErrorMsg.Printf( wxT( "$CMP command expected in line %d, aborted." ), lineNumber ); fclose( file ); return false; } @@ -790,24 +638,26 @@ bool CMP_LIBRARY::LoadDocs( wxString& aErrorMsg ) { if( strncmp( line, "$ENDCMP", 7 ) == 0 ) break; - text = strtok( line + 2, "\n\r" ); + text = strtok( line + 2, "\n\r" );; - switch( line[0] ) + if( entry ) { - case 'D': - if( entry ) + wxASSERT( entry->isAlias() ); + + switch( line[0] ) + { + case 'D': entry->SetDescription( CONV_FROM_UTF8( text ) ); - break; + break; - case 'K': - if( entry ) + case 'K': entry->SetKeyWords( CONV_FROM_UTF8( text ) ); - break; + break; - case 'F': - if( entry ) + case 'F': entry->SetDocFileName( CONV_FROM_UTF8( text ) ); - break; + break; + } } } } @@ -830,8 +680,7 @@ bool CMP_LIBRARY::Save( const wxString& aFullFileName, bool aOldDocFormat ) backupFileName.SetExt( wxT( "bak" ) ); wxRemoveFile( backupFileName.GetFullPath() ); - if( !wxRenameFile( libFileName.GetFullPath(), - backupFileName.GetFullPath() ) ) + if( !wxRenameFile( libFileName.GetFullPath(), backupFileName.GetFullPath() ) ) { libFileName.MakeAbsolute(); msg = wxT( "Failed to rename old component library file " ) + @@ -845,13 +694,12 @@ bool CMP_LIBRARY::Save( const wxString& aFullFileName, bool aOldDocFormat ) if( libfile == NULL ) { libFileName.MakeAbsolute(); - msg = wxT( "Failed to create component library file " ) + - libFileName.GetFullPath(); + msg = wxT( "Failed to create component library file " ) + libFileName.GetFullPath(); DisplayError( NULL, msg ); return false; } - ClearModifyFlag( ); + isModified = false; timeStamp = GetTimeStamp(); if( !SaveHeader( libfile ) ) @@ -862,14 +710,13 @@ bool CMP_LIBRARY::Save( const wxString& aFullFileName, bool aOldDocFormat ) bool success = true; - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) + for( LIB_ALIAS_MAP::iterator it=aliases.begin(); it!=aliases.end(); it++ ) { - if ( entry.isComponent() ) - { - LIB_COMPONENT* component = ( LIB_COMPONENT* ) &entry; - if ( !component->Save( libfile ) ) - success = false; - } + if( !(*it).second->IsRoot() ) + continue; + + if ( !(*it).second->GetComponent()->Save( libfile ) ) + success = false; } if( fprintf( libfile, "#\n#End Library\n" ) < 0 ) @@ -900,8 +747,7 @@ bool CMP_LIBRARY::SaveDocFile( const wxString& aFullFileName ) backupFileName.SetExt( wxT( "bck" ) ); wxRemoveFile( backupFileName.GetFullPath() ); - if( !wxRenameFile( docFileName.GetFullPath(), - backupFileName.GetFullPath() ) ) + if( !wxRenameFile( docFileName.GetFullPath(), backupFileName.GetFullPath() ) ) { msg = wxT( "Failed to save old library document file " ) + backupFileName.GetFullPath(); @@ -921,8 +767,7 @@ bool CMP_LIBRARY::SaveDocFile( const wxString& aFullFileName ) } char line[256]; - if( fprintf( docfile, "%s Date: %s\n", DOCFILE_IDENT, - DateAndTime( line ) ) < 0 ) + if( fprintf( docfile, "%s Date: %s\n", DOCFILE_IDENT, DateAndTime( line ) ) < 0 ) { fclose( docfile ); return false; @@ -930,9 +775,9 @@ bool CMP_LIBRARY::SaveDocFile( const wxString& aFullFileName ) bool success = true; - BOOST_FOREACH( CMP_LIB_ENTRY& entry, entries ) + for( LIB_ALIAS_MAP::iterator it=aliases.begin(); it!=aliases.end(); it++ ) { - if ( !entry.SaveDoc( docfile ) ) + if ( !(*it).second->SaveDoc( docfile ) ) success = false; } @@ -957,7 +802,7 @@ bool CMP_LIBRARY::SaveHeader( FILE* aFile ) #if 0 if( ( fprintf( aFile, "$HEADER\n" ) < 0 ) || ( fprintf( aFile, "TimeStamp %8.8lX\n", m_TimeStamp ) < 0 ) - || ( fprintf( aFile, "Parts %d\n", entries.size() ) != 2 ) + || ( fprintf( aFile, "Parts %d\n", aliases.size() ) != 2 ) || ( fprintf( aFile, "$ENDHEADER\n" ) != 1 ) ) succes = false; #endif diff --git a/eeschema/class_library.h b/eeschema/class_library.h index ab116fb766..9a337d6f29 100644 --- a/eeschema/class_library.h +++ b/eeschema/class_library.h @@ -57,16 +57,16 @@ extern bool operator<( const CMP_LIBRARY& item1, const CMP_LIBRARY& item2 ); */ class CMP_LIBRARY { - int type; ///< Library type indicator. - wxFileName fileName; ///< Library file name. - wxDateTime timeStamp; ///< Library save time and date. - int versionMajor; ///< Library major version number. - int versionMinor; ///< Library minor version number. - LIB_ENTRY_LIST entries; ///< Parts themselves are saved here. - bool isCache; /**< False for the "standard" libraries, - True for the library cache */ - wxString header; ///< first line of loaded library. - bool isModified; ///< Library modification status. + int type; ///< Library type indicator. + wxFileName fileName; ///< Library file name. + wxDateTime timeStamp; ///< Library save time and date. + int versionMajor; ///< Library major version number. + int versionMinor; ///< Library minor version number. + bool isCache; /**< False for the "standard" libraries, + True for the library cache */ + wxString header; ///< first line of loaded library. + bool isModified; ///< Library modification status. + LIB_ALIAS_MAP aliases; ///< Map of aliases objects associated with the library. static CMP_LIBRARY_LIST libraryList; static wxArrayString libraryListSortOrder; @@ -82,12 +82,6 @@ public: } ~CMP_LIBRARY(); - /** Modify flags handling: - */ - void SetModifyFlags( ) { isModified = true; } - void ClearModifyFlag( ) { isModified = false; } - bool getModifyFlag( ) { return isModified;} - /** * Function Save * saves library to a file. @@ -136,17 +130,6 @@ private: bool LoadHeader( FILE* aFile, int* aLineNum ); void LoadAliases( LIB_COMPONENT* aComponent ); - /** - * Function RemoveEntryName - * removes an \a aName entry from the library list names. - * Warning: this is a partied remove, because if aname is an alias - * it is not removed from its root component. - * this is for internal use only - * Use RemoveEntry( CMP_LIB_ENTRY* aEntry ) to remove safely an entry. - * @param aName - Entry name to remove from library. - */ - void RemoveEntryName( const wxString& aName ); - public: /** * Get library entry status. @@ -155,7 +138,7 @@ public: */ bool IsEmpty() const { - return entries.empty(); + return aliases.empty(); } /** @@ -166,7 +149,7 @@ public: */ int GetCount() const { - return entries.size(); + return aliases.size(); } bool IsModified() const @@ -176,8 +159,6 @@ public: bool IsCache() const { return isCache; } - void SetModified( void ) { isModified = true; } - void SetCache( void ) { isCache = true; } /** @@ -214,8 +195,15 @@ public: * @param aRe - Regular expression used to search component key words. * @param aSort - Sort component name list. */ - void SearchEntryNames( wxArrayString& aNames, const wxRegEx& aRe, - bool aSort = true ); + void SearchEntryNames( wxArrayString& aNames, const wxRegEx& aRe, bool aSort = true ); + + /** + * Checks \a aComponent for name conflict in the library. + * + * @param aComponent - The component to check. + * @erturn True if a conflict exists. Otherwise false. + */ + bool Conflicts( LIB_COMPONENT* aComponent ); /** * Find entry by name. @@ -225,15 +213,6 @@ public: */ CMP_LIB_ENTRY* FindEntry( const wxChar* aName ); - /** - * Find entry by \a aName and \a aType. - * - * @param aName - Name of entry, case insensitive. - * @param aType - Type of entry, root or alias. - * @return Entry if found. NULL if not found. - */ - CMP_LIB_ENTRY* FindEntry( const wxChar* aName, LibrEntryType aType ); - /** * Find component by \a aName. * @@ -256,7 +235,7 @@ public: */ LIB_ALIAS* FindAlias( const wxChar* aName ) { - return (LIB_ALIAS*) FindEntry( aName, ALIAS ); + return (LIB_ALIAS*) FindEntry( aName ); } /** @@ -285,18 +264,17 @@ public: LIB_COMPONENT* AddComponent( LIB_COMPONENT* aComponent ); /** - * Remove safely an \a aEntry from the library. + * Safely remove \a aEntry from the library and return the next entry. * - * If the entry is an alias, the alias is removed from the library and from - * the alias list of the root component. If the entry is a root component - * with no aliases, it is removed from the library. If the entry is a root - * component with aliases, the root component is renamed to the name of - * the first alias and the root name for all remaining aliases are updated - * to reflect the new root name. + * The next entry returned depends on the entry being removed. If the entry being + * remove also removes the component, then the next entry from the list is returned. + * If the entry being used only removes an alias from a component, then the next alias + * of the component is returned. * * @param aEntry - Entry to remove from library. + * @return The next entry in the library or NULL if the library is empty. */ - void RemoveEntry( CMP_LIB_ENTRY* aEntry ); + CMP_LIB_ENTRY* RemoveEntry( CMP_LIB_ENTRY* aEntry ); /** * Replace an existing component entry in the library. @@ -410,8 +388,7 @@ public: * @return Library object if library file loaded successfully, * otherwise NULL. */ - static CMP_LIBRARY* LoadLibrary( const wxFileName& aFileName, - wxString& aErrorMsg ); + static CMP_LIBRARY* LoadLibrary( const wxFileName& aFileName, wxString& aErrorMsg ); /** * Function AddLibrary @@ -443,6 +420,8 @@ public: */ static void RemoveLibrary( const wxString& aName ); + static void RemoveAllLibraries() { libraryList.clear(); } + /** * Function FindLibrary * finds a component library by \a aName. diff --git a/eeschema/class_sch_component.cpp b/eeschema/class_sch_component.cpp index 0a9573b1ef..8a7ee36f76 100644 --- a/eeschema/class_sch_component.cpp +++ b/eeschema/class_sch_component.cpp @@ -1158,7 +1158,7 @@ void SCH_COMPONENT::DisplayInfo( WinEDA_DrawFrame* frame ) GetRef( ( (WinEDA_SchematicFrame*) frame )->GetSheet() ), DARKCYAN ); - if( root_component->isPower() ) + if( root_component->IsPower() ) msg = _( "Power symbol" ); else msg = _( "Name" ); diff --git a/eeschema/classes_body_items.h b/eeschema/classes_body_items.h index 41d471381c..cc8c1e70b7 100644 --- a/eeschema/classes_body_items.h +++ b/eeschema/classes_body_items.h @@ -9,6 +9,8 @@ #include "base_struct.h" +#include + class LIB_COMPONENT; class PLOTTER; diff --git a/eeschema/dialog_edit_component_in_lib.cpp b/eeschema/dialog_edit_component_in_lib.cpp index 1133c9a480..5aba9b08c4 100644 --- a/eeschema/dialog_edit_component_in_lib.cpp +++ b/eeschema/dialog_edit_component_in_lib.cpp @@ -27,9 +27,9 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( WinEDA_Libed Init(); - if (GetSizer()) + if( GetSizer() ) { - GetSizer()->SetSizeHints(this); + GetSizer()->SetSizeHints( this ); } } @@ -40,7 +40,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY::~DIALOG_EDIT_COMPONENT_IN_LIBRARY() /* Initialize state of check boxes and texts */ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::Init( ) +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::Init() { SetFocus(); m_AliasLocation = -1; @@ -55,7 +55,9 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::Init( ) wxString title = _( "Properties for " ); - if( !m_Parent->GetAliasName().IsEmpty() ) + bool isRoot = m_Parent->GetAliasName().CmpNoCase( component->GetName() ) == 0; + + if( !isRoot ) { title += m_Parent->GetAliasName() + _( " (alias of " ) + component->GetName() + wxT( ")" ); @@ -63,20 +65,19 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::Init( ) else { title += component->GetName(); - m_Parent->GetAliasName().Empty(); } SetTitle( title ); InitPanelDoc(); InitBasicPanel(); - if( !m_Parent->GetAliasName().IsEmpty() ) + if( isRoot && component->GetAliasCount() == 1 ) m_ButtonDeleteAllAlias->Enable( false ); /* Place list of alias names in listbox */ - m_PartAliasListCtrl->Append( component->GetAliasList() ); + m_PartAliasListCtrl->Append( component->GetAliasNames( false ) ); - if( component->GetAliasList().GetCount() == 0 ) + if( component->GetAliasCount() <= 1 ) { m_ButtonDeleteAllAlias->Enable( false ); m_ButtonDeleteOneAlias->Enable( false ); @@ -102,23 +103,24 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnCancelClick( wxCommandEvent& event ) void DIALOG_EDIT_COMPONENT_IN_LIBRARY::InitPanelDoc() { + LIB_ALIAS* alias; LIB_COMPONENT* component = m_Parent->GetComponent(); if( component == NULL ) return; wxString aliasname = m_Parent->GetAliasName(); - if( aliasname.IsEmpty() ) // The root component is selected + + if( aliasname.IsEmpty() ) + return; + + alias = component->GetAlias( aliasname ); + + if( alias != NULL ) { - m_DocCtrl->SetValue( component->GetDescription() ); - m_KeywordsCtrl->SetValue( component->GetKeyWords() ); - m_DocfileCtrl->SetValue( component->GetDocFileName() ); - } - else // An alias is currently selected - { - m_DocCtrl->SetValue( component->GetAliasDataDoc( aliasname ) ); - m_KeywordsCtrl->SetValue( component->GetAliasDataKeyWords( aliasname ) ); - m_DocfileCtrl->SetValue( component->GetAliasDataDocFileName( aliasname ) ); + m_DocCtrl->SetValue( alias->GetDescription() ); + m_KeywordsCtrl->SetValue( alias->GetKeyWords() ); + m_DocfileCtrl->SetValue( alias->GetDocFileName() ); } } @@ -151,6 +153,6 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::InitBasicPanel() m_PinsNameInsideButt->SetValue( component->GetPinNameOffset() != 0 ); m_SelNumberOfUnits->SetValue( component->GetPartCount() ); m_SetSkew->SetValue( component->GetPinNameOffset() ); - m_OptionPower->SetValue( component->isPower() ); + m_OptionPower->SetValue( component->IsPower() ); m_OptionPartsLocked->SetValue( component->UnitsLocked() ); } diff --git a/eeschema/dialog_edit_component_in_schematic.cpp b/eeschema/dialog_edit_component_in_schematic.cpp index b96d75008f..bdf968f8cc 100644 --- a/eeschema/dialog_edit_component_in_schematic.cpp +++ b/eeschema/dialog_edit_component_in_schematic.cpp @@ -253,7 +253,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( m_Cmp->m_ChipName ); - if( entry && entry->isPower() ) + if( entry && entry->IsPower() ) m_FieldsBuf[VALUE].m_Text = m_Cmp->m_ChipName; // copy all the fields back, and change the length of m_Fields. @@ -592,7 +592,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copySelectedFieldToPanel() // For power symbols, the value is NOR editable, because value and pin // name must be same and can be edited only in library editor - if( fieldNdx == VALUE && m_LibEntry && m_LibEntry->isPower() ) + if( fieldNdx == VALUE && m_LibEntry && m_LibEntry->IsPower() ) fieldValueTextCtrl->Enable( false ); else fieldValueTextCtrl->Enable( true ); diff --git a/eeschema/dialog_edit_libentry_fields_in_lib.cpp b/eeschema/dialog_edit_libentry_fields_in_lib.cpp index caeee1f9a9..2970c3fe22 100644 --- a/eeschema/dialog_edit_libentry_fields_in_lib.cpp +++ b/eeschema/dialog_edit_libentry_fields_in_lib.cpp @@ -221,17 +221,15 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::OnOKButtonClick( wxCommandEvent& event /* A new name could be entered in VALUE field. * Must not be an existing alias name in alias list box */ wxString* newvalue = &m_FieldsBuf[VALUE].m_Text; - for( size_t i = 0; i < m_LibEntry->GetAliasList().GetCount(); i++ ) + + if( m_LibEntry->HasAlias( *newvalue ) ) { - if( newvalue->CmpNoCase( m_LibEntry->GetAliasList()[i] ) == 0 ) - { - wxString msg; - msg.Printf( _( "A new name is entered for this component\n\ + wxString msg; + msg.Printf( _( "A new name is entered for this component\n\ An alias %s already exists!\nCannot update this component" ), - newvalue->GetData() ); - DisplayError( this, msg ); - return; - } + newvalue->GetData() ); + DisplayError( this, msg ); + return; } /* save old cmp in undo list */ diff --git a/eeschema/edit_component_in_lib.cpp b/eeschema/edit_component_in_lib.cpp index 53f7bda3c8..7809f3f2a9 100644 --- a/eeschema/edit_component_in_lib.cpp +++ b/eeschema/edit_component_in_lib.cpp @@ -66,9 +66,10 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event ) { /* Update the doc, keyword and doc filename strings */ - size_t i; int index; + LIB_ALIAS* alias; LIB_COMPONENT* component = m_Parent->GetComponent(); + if( component == NULL ) { EndModal( wxID_CANCEL ); @@ -77,51 +78,17 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event ) m_Parent->SaveCopyInUndoList( component ); - wxString aliasname = m_Parent->GetAliasName(); + alias = component->GetAlias( m_Parent->GetAliasName() ); - if( aliasname.IsEmpty() ) // The root component is selected - { - component->SetDescription( m_DocCtrl->GetValue() ); - component->SetKeyWords( m_KeywordsCtrl->GetValue() ); - component->SetDocFileName( m_DocfileCtrl->GetValue() ); - } + wxCHECK_RET( alias != NULL, + wxT( "Alias \"" ) + m_Parent->GetAliasName() + wxT( "\" of component \"" ) + + component->GetName() + wxT( "\" does not exist." ) ); - else // An alias is selected: update keyworks (if thias alias is new, it will be added in aliacd data list) - { - component->SetAliasDataDoc(aliasname, m_DocCtrl->GetValue() ); - component->SetAliasDataKeywords(aliasname, m_KeywordsCtrl->GetValue() ); - component->SetAliasDataDocFileName(aliasname, m_DocfileCtrl->GetValue() ); - } + alias->SetDescription( m_DocCtrl->GetValue() ); + alias->SetKeyWords( m_KeywordsCtrl->GetValue() ); + alias->SetDocFileName( m_DocfileCtrl->GetValue() ); - if( m_PartAliasListCtrl->GetStrings() != component->GetAliasList() ) - { - wxArrayString aliases = m_PartAliasListCtrl->GetStrings(); - - /* Add names not existing in the current component alias list. */ - for( i = 0; i < aliases.GetCount(); i++ ) - { - index = component->GetAliasList().Index( aliases[ i ], false ); - - if( index != wxNOT_FOUND ) - continue; - - component->GetAliasList().Add( aliases[ i ] ); - } - - /* Remove names in the current component that are not in the new alias list. */ - for( i = 0; i < component->GetAliasList().GetCount(); i++ ) - { - index = aliases.Index( component->GetAliasList()[ i ], false ); - - if( index == wxNOT_FOUND ) - continue; - - component->GetAliasList().RemoveAt( i ); - i--; - } - - component->GetAliasList() = aliases; - } + component->SetAliases( m_PartAliasListCtrl->GetStrings() ); index = m_SelNumberOfUnits->GetValue(); ChangeNbUnitsPerPackage( index ); @@ -175,13 +142,11 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event ) } -/*******************************************************************************/ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) ) -/******************************************************************************/ { LIB_COMPONENT* component = m_Parent->GetComponent(); - if( component == NULL || m_Parent->GetAliasName().IsEmpty() ) + if( component == NULL ) return; m_DocCtrl->SetValue( component->GetDescription() ); @@ -190,43 +155,30 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocToAlias( wxCommandEvent& WXUNUSED } -/**********************************************************/ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( - wxCommandEvent& WXUNUSED (event) ) -/**********************************************************/ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( wxCommandEvent& WXUNUSED (event) ) { - if( m_PartAliasListCtrl->FindString( m_Parent->GetAliasName() ) - != wxNOT_FOUND ) + if( m_PartAliasListCtrl->FindString( m_Parent->GetAliasName() ) != wxNOT_FOUND ) { wxString msg; - msg.Printf( _( "Alias <%s> cannot be removed while it is being \ -edited!" ), + msg.Printf( _( "Alias <%s> cannot be removed while it is being edited!" ), GetChars( m_Parent->GetAliasName() ) ); DisplayError( this, msg ); return; } - LIB_COMPONENT* component = m_Parent->GetComponent(); - m_Parent->GetAliasName().Empty(); - if( IsOK( this, _( "Remove all aliases from list?" ) ) ) { m_PartAliasListCtrl->Clear(); m_ButtonDeleteAllAlias->Enable( false ); m_ButtonDeleteOneAlias->Enable( false ); - if( component ) - component->ClearAliasDataDoc(); } } -/*******************************************************************************/ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& WXUNUSED (event) ) -/*******************************************************************************/ - /* Add a new name to the alias list box * New name cannot be the root name, and must not exists */ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& WXUNUSED (event) ) { wxString aliasname; LIB_COMPONENT* component = m_Parent->GetComponent(); @@ -249,23 +201,21 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& WXUNUSED || library->FindEntry( aliasname ) != NULL ) { wxString msg; - msg.Printf( _( "Alias or component name <%s> already exists in \ -library <%s>." ), + msg.Printf( _( "Alias or component name <%s> already exists in library <%s>." ), GetChars( aliasname ), GetChars( library->GetName() ) ); - DisplayError( this, msg ); + DisplayError( this, msg ); return; } m_PartAliasListCtrl->Append( aliasname ); - if( m_Parent->GetAliasName().IsEmpty() ) + if( m_Parent->GetAliasName().CmpNoCase( component->GetName() ) == 0 ) m_ButtonDeleteAllAlias->Enable( true ); m_ButtonDeleteOneAlias->Enable( true ); } -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( - wxCommandEvent& WXUNUSED (event) ) +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( wxCommandEvent& WXUNUSED (event) ) { wxString aliasname = m_PartAliasListCtrl->GetStringSelection(); @@ -274,8 +224,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( if( aliasname.CmpNoCase( m_Parent->GetAliasName() ) == 0 ) { wxString msg; - msg.Printf( _( "Alias <%s> cannot be removed while it is being \ -edited!" ), + msg.Printf( _( "Alias <%s> cannot be removed while it is being edited!" ), GetChars( aliasname ) ); DisplayError( this, msg ); return; @@ -284,7 +233,7 @@ edited!" ), m_PartAliasListCtrl->Delete( m_PartAliasListCtrl->GetSelection() ); LIB_COMPONENT* component = m_Parent->GetComponent(); if( component ) - component->RemoveAliasData(aliasname); + component->RemoveAlias( aliasname ); if( m_PartAliasListCtrl->IsEmpty() ) { @@ -301,8 +250,7 @@ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::ChangeNbUnitsPerPackage( int MaxUnit ) { LIB_COMPONENT* component = m_Parent->GetComponent(); - if( component == NULL || component->GetPartCount() == MaxUnit - || MaxUnit < 1 ) + if( component == NULL || component->GetPartCount() == MaxUnit || MaxUnit < 1 ) return false; if( MaxUnit < component->GetPartCount() @@ -327,11 +275,9 @@ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::SetUnsetConvert() if( m_Parent->GetShowDeMorgan() ) { - if( !IsOK( this, _( "Add new pins for alternate body style \ -( DeMorgan ) to component?" ) ) ) - return false; + if( !IsOK( this, _( "Add new pins for alternate body style ( DeMorgan ) to component?" ) ) ) + return false; } - else if( component->HasConversion() ) { if( !IsOK( this, _( "Delete alternate body style (DeMorgan) draw items from component?" ) ) ) @@ -342,20 +288,18 @@ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::SetUnsetConvert() } component->SetConversion( m_Parent->GetShowDeMorgan() ); - m_Parent->OnModify( ); + m_Parent->OnModify(); return true; } -/****************************************************************************/ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& event ) -/****************************************************************************/ { wxString FullFileName, mask; wxString docpath, filename; - docpath = wxGetApp().ReturnLastVisitedLibraryPath(wxT( "doc" )); + docpath = wxGetApp().ReturnLastVisitedLibraryPath( wxT( "doc" ) ); mask = wxT( "*" ); FullFileName = EDA_FileSelector( _( "Doc Files" ), @@ -374,25 +318,23 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& e * list, just add the library name to the list. Otherwise, add * the library name with the full or relative path. * the relative path, when possible is preferable, - * because it preserve use of default libraries paths, when the path is a sub path of these default paths + * because it preserve use of default libraries paths, when the path is a sub path of + * these default paths */ wxFileName fn = FullFileName; wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() ); - filename = wxGetApp().ReturnFilenameWithRelativePathInLibPath(FullFileName); + filename = wxGetApp().ReturnFilenameWithRelativePathInLibPath( FullFileName ); // Filenames are always stored in unix like mode, ie separator "\" is stored as "/" // to ensure files are identical under unices and windows #ifdef __WINDOWS__ - filename.Replace(wxT("\\"), wxT("/") ); + filename.Replace( wxT( "\\" ), wxT( "/" ) ); #endif m_DocfileCtrl->SetValue( filename ); } -/**********************************************************/ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( - wxCommandEvent& WXUNUSED (event) ) -/**********************************************************/ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( wxCommandEvent& WXUNUSED (event) ) { if( IsOK( this, _( "Ok to Delete FootprintFilter LIST" ) ) ) { @@ -403,13 +345,10 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( } -/*******************************************************************************/ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) ) -/*******************************************************************************/ - /* Add a new name to the footprint filter list box * Obvioulsy, cannot be void */ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) ) { wxString Line; LIB_COMPONENT* component = m_Parent->GetComponent(); @@ -421,7 +360,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNU if( dlg.ShowModal() != wxID_OK ) return; // cancelled by user - Line = dlg.GetValue( ); + Line = dlg.GetValue(); Line.Replace( wxT( " " ), wxT( "_" ) ); if( Line.IsEmpty() ) @@ -434,8 +373,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNU { wxString msg; - msg.Printf( _( "Foot print filter <%s> is already defined." ), - GetChars( Line ) ); + msg.Printf( _( "Foot print filter <%s> is already defined." ), GetChars( Line ) ); DisplayError( this, msg ); return; } @@ -446,10 +384,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNU } -/********************************************************/ -void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteOneFootprintFilter( - wxCommandEvent& WXUNUSED (event) ) -/********************************************************/ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteOneFootprintFilter( wxCommandEvent& WXUNUSED (event) ) { LIB_COMPONENT* component = m_Parent->GetComponent(); int ii = m_FootprintFilterListBox->GetSelection(); diff --git a/eeschema/edit_component_in_schematic.cpp b/eeschema/edit_component_in_schematic.cpp index 668ea30930..fcb7e514f5 100644 --- a/eeschema/edit_component_in_schematic.cpp +++ b/eeschema/edit_component_in_schematic.cpp @@ -102,7 +102,7 @@ void WinEDA_SchematicFrame::EditCmpFieldText( SCH_FIELD* Field, wxDC* DC ) { Entry = CMP_LIBRARY::FindLibraryComponent( Cmp->m_ChipName ); - if( Entry && Entry->isPower() ) + if( Entry && Entry->IsPower() ) { DisplayInfoMessage( this, _( "Part is a POWER, value cannot be \ modified!\nYou must create a new power" ) ); diff --git a/eeschema/libedit.cpp b/eeschema/libedit.cpp index 6c48b3919b..8524eefb54 100644 --- a/eeschema/libedit.cpp +++ b/eeschema/libedit.cpp @@ -89,6 +89,7 @@ saved.\n\nDiscard current changes?" ) ) ) if( m_component ) { SAFE_DELETE( m_component ); + m_aliasName.Empty(); } /* Load the new library component */ @@ -96,8 +97,7 @@ saved.\n\nDiscard current changes?" ) ) ) if( LibEntry == NULL ) { - msg.Printf( _( "Component or alias name \"%s\" not found in \ -library \"%s\"." ), + msg.Printf( _( "Component or alias name \"%s\" not found in library \"%s\"." ), GetChars( CmpName ), GetChars( m_library->GetName() ) ); DisplayError( this, msg ); @@ -113,7 +113,7 @@ library \"%s\"." ), GetScreen()->ClearUndoRedoList(); Zoom_Automatique( false ); DrawPanel->Refresh(); - SetShowDeMorgan(m_component->HasConversion() ); + SetShowDeMorgan( m_component->HasConversion() ); m_HToolBar->Refresh(); } @@ -125,28 +125,26 @@ library \"%s\"." ), * 1 if error * m_component advanced copy and created */ -bool WinEDA_LibeditFrame::LoadOneLibraryPartAux( CMP_LIB_ENTRY* LibEntry, - CMP_LIBRARY* Library ) +bool WinEDA_LibeditFrame::LoadOneLibraryPartAux( CMP_LIB_ENTRY* aEntry, CMP_LIBRARY* aLibrary ) { wxString msg, cmpName, rootName; LIB_COMPONENT* component; - if( ( LibEntry == NULL ) || ( Library == NULL ) ) + if( ( aEntry == NULL ) || ( aLibrary == NULL ) ) return false; - if( LibEntry->GetName().IsEmpty() ) + if( aEntry->GetName().IsEmpty() ) { wxLogWarning( wxT( "Entry in library <%s> has empty name field." ), - GetChars( Library->GetName() ) ); + GetChars( aLibrary->GetName() ) ); return false; } - cmpName = LibEntry->GetName(); - m_aliasName.Empty(); + cmpName = m_aliasName = aEntry->GetName(); - if( LibEntry->isAlias() ) + if( aEntry->isAlias() ) { - LIB_ALIAS* alias = (LIB_ALIAS*) LibEntry; + LIB_ALIAS* alias = (LIB_ALIAS*) aEntry; component = alias->GetComponent(); wxASSERT( component != NULL && component->isComponent() ); @@ -154,28 +152,30 @@ bool WinEDA_LibeditFrame::LoadOneLibraryPartAux( CMP_LIB_ENTRY* LibEntry, wxLogDebug( wxT( "\"<%s>\" is alias of \"<%s>\"" ), GetChars( cmpName ), GetChars( component->GetName() ) ); - - m_aliasName = cmpName; } else { - component = (LIB_COMPONENT*) LibEntry; + component = (LIB_COMPONENT*) aEntry; } if( m_component ) + { SAFE_DELETE( m_component ); + m_aliasName.Empty(); + } m_component = new LIB_COMPONENT( *component ); if( m_component == NULL ) { msg.Printf( _( "Could not create copy of part <%s> in library <%s>." ), - GetChars( LibEntry->GetName() ), - GetChars( Library->GetName() ) ); + GetChars( aEntry->GetName() ), + GetChars( aLibrary->GetName() ) ); DisplayError( this, msg ); return false; } + m_aliasName = aEntry->GetName(); m_unit = 1; m_convert = 1; @@ -184,9 +184,6 @@ bool WinEDA_LibeditFrame::LoadOneLibraryPartAux( CMP_LIB_ENTRY* LibEntry, if( m_component->HasConversion() ) m_showDeMorgan = true; - // Collect aliases data and store it in the root component, for edition: - m_component->CollectAliasesData( Library ); - GetBaseScreen()->ClrModify(); DisplayLibInfos(); UpdateAliasSelectList(); @@ -294,8 +291,7 @@ void WinEDA_LibeditFrame::SaveActiveLibrary( wxCommandEvent& event ) if( !success ) { - msg = _( "Error while saving library file \"" ) + fn.GetFullPath() + - _( "\"." ); + msg = _( "Error while saving library file \"" ) + fn.GetFullPath() + _( "\"." ); AppendMsgPanel( _( "*** ERROR: ***" ), msg, RED ); DisplayError( this, msg ); } @@ -303,8 +299,7 @@ void WinEDA_LibeditFrame::SaveActiveLibrary( wxCommandEvent& event ) { msg = _( "Library file \"" ) + fn.GetFullName() + wxT( "\" Ok" ); fn.SetExt( DOC_EXT ); - wxString msg1 = _( "Document file \"" ) + fn.GetFullPath() + - wxT( "\" Ok" ); + wxString msg1 = _( "Document file \"" ) + fn.GetFullPath() + wxT( "\" Ok" ); AppendMsgPanel( msg, msg1, BLUE ); } } @@ -318,6 +313,7 @@ void WinEDA_LibeditFrame::SaveActiveLibrary( wxCommandEvent& event ) void WinEDA_LibeditFrame::DisplayCmpDoc() { wxString msg; + LIB_ALIAS* alias; ClearMsgPanel(); @@ -328,11 +324,15 @@ void WinEDA_LibeditFrame::DisplayCmpDoc() AppendMsgPanel( _( "Part" ), msg, BLUE, 8 ); - if( m_aliasName.IsEmpty() ) + if( m_aliasName == m_component->GetName() ) msg = _( "None" ); else msg = m_aliasName; + alias = m_component->GetAlias( m_aliasName ); + + wxCHECK_RET( alias != NULL, wxT( "Alias not found in component." ) ); + AppendMsgPanel( _( "Alias" ), msg, RED, 8 ); static wxChar UnitLetter[] = wxT( "?ABCDEFGHIJKLMNOPQRSTUVWXYZ" ); @@ -347,34 +347,15 @@ void WinEDA_LibeditFrame::DisplayCmpDoc() AppendMsgPanel( _( "Body" ), msg, GREEN, 8 ); - if( m_component->isPower() ) + if( m_component->IsPower() ) msg = _( "Power Symbol" ); else msg = _( "Component" ); AppendMsgPanel( _( "Type" ), msg, MAGENTA, 8 ); - - if( m_aliasName.IsEmpty() ) - - msg = m_component->GetDescription(); - else - msg = m_component->GetAliasDataDoc( m_aliasName ); - - AppendMsgPanel( _( "Description" ), msg, CYAN, 8 ); - - if( m_aliasName.IsEmpty() ) - msg = m_component->GetKeyWords(); - else - msg = m_component->GetAliasDataKeyWords( m_aliasName ); - - AppendMsgPanel( _( "Key words" ), msg, DARKDARKGRAY ); - - if( m_aliasName.IsEmpty() ) - msg = m_component->GetDocFileName(); - else - msg = m_component->GetAliasDataDocFileName( m_aliasName ); - - AppendMsgPanel( _( "Datasheet" ), msg, DARKDARKGRAY ); + AppendMsgPanel( _( "Description" ), alias->GetDescription(), CYAN, 8 ); + AppendMsgPanel( _( "Key words" ), alias->GetKeyWords(), DARKDARKGRAY ); + AppendMsgPanel( _( "Datasheet" ), alias->GetDocFileName(), DARKDARKGRAY ); } @@ -419,10 +400,8 @@ void WinEDA_LibeditFrame::DeleteOnePart( wxCommandEvent& event ) if( ListNames.IsEmpty() ) { - msg.Printf( _( "Component library <%s> is empty." ), - GetChars( m_library->GetName() ) ); - wxMessageBox( msg, _( "Delete Entry Error" ), - wxID_OK | wxICON_EXCLAMATION, this ); + msg.Printf( _( "Component library <%s> is empty." ), GetChars( m_library->GetName() ) ); + wxMessageBox( msg, _( "Delete Entry Error" ), wxID_OK | wxICON_EXCLAMATION, this ); return; } @@ -453,9 +432,7 @@ void WinEDA_LibeditFrame::DeleteOnePart( wxCommandEvent& event ) if( !IsOK( this, msg ) ) return; - if( m_component == NULL - || ( m_component->GetName().CmpNoCase( LibEntry->GetName() ) != 0 - && !m_component->HasAlias( LibEntry->GetName() ) ) ) + if( m_component == NULL || !m_component->HasAlias( LibEntry->GetName() ) ) { m_library->RemoveEntry( LibEntry ); return; @@ -470,47 +447,24 @@ void WinEDA_LibeditFrame::DeleteOnePart( wxCommandEvent& event ) All changes will be lost. Discard changes?" ) ) ) return; - wxString newCmpName; - CMP_LIB_ENTRY* nextEntry; + CMP_LIB_ENTRY* nextEntry = m_library->RemoveEntry( LibEntry ); - /* - * If the current component has no aliases, then the next entry - * in the library will be shown. If the current component has - * aliases, the updated component will be shown - */ - if( m_component->GetName().CmpNoCase( LibEntry->GetName() ) == 0 ) + if( nextEntry != NULL ) { - if( m_component->GetAliasList().IsEmpty() ) - { - nextEntry = m_library->GetNextEntry( m_component->GetName() ); - - if( nextEntry != NULL ) - newCmpName = nextEntry->GetName(); - } - else - { - newCmpName = m_component->GetAliasList()[ 0 ]; - } + if( LoadOneLibraryPartAux( nextEntry, m_library ) ) + Zoom_Automatique( false ); } else { - newCmpName = m_component->GetName(); + SAFE_DELETE( m_component ); + m_aliasName.Empty(); } - m_library->RemoveEntry( LibEntry ); - - if( !newCmpName.IsEmpty() ) - { - nextEntry = m_library->FindEntry( newCmpName ); - - if( nextEntry != NULL && LoadOneLibraryPartAux( nextEntry, m_library ) ) - Zoom_Automatique( false ); - - DrawPanel->Refresh(); - } + DrawPanel->Refresh(); } + /* * Routine to create a new library component * @@ -537,8 +491,7 @@ lost!\n\nClear the current component from the screen?" ) ) ) if( dlg.GetName().IsEmpty() ) { - wxMessageBox( _( "This new component has no name and cannot be \ -created. Aborted" ) ); + wxMessageBox( _( "This new component has no name and cannot be created. Aborted" ) ); return; } @@ -582,12 +535,16 @@ created. Aborted" ) ); if( dlg.GetPartCount() < 2 ) component->LockUnits( false ); + m_aliasName = component->GetName(); + if( m_component ) { SAFE_DELETE( m_component ); + m_aliasName.Empty(); } m_component = component; + m_aliasName = m_component->GetName(); m_unit = 1; m_convert = 1; DisplayLibInfos(); diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp index af940eb3dc..12015442ad 100644 --- a/eeschema/libeditframe.cpp +++ b/eeschema/libeditframe.cpp @@ -64,132 +64,90 @@ FILL_T WinEDA_LibeditFrame:: m_drawFillStyle = NO_FILL; /* class WinEDA_LibeditFrame */ /*****************************/ BEGIN_EVENT_TABLE( WinEDA_LibeditFrame, WinEDA_DrawFrame ) -EVT_CLOSE( WinEDA_LibeditFrame::OnCloseWindow ) -EVT_SIZE( WinEDA_LibeditFrame::OnSize ) -EVT_ACTIVATE( WinEDA_LibeditFrame::OnActivate ) + EVT_CLOSE( WinEDA_LibeditFrame::OnCloseWindow ) + EVT_SIZE( WinEDA_LibeditFrame::OnSize ) + EVT_ACTIVATE( WinEDA_LibeditFrame::OnActivate ) -/* Main horizontal toolbar. */ -EVT_TOOL_RANGE( ID_ZOOM_IN, ID_ZOOM_PAGE, WinEDA_LibeditFrame::OnZoom ) -EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_LIB, - WinEDA_LibeditFrame::SaveActiveLibrary ) -EVT_TOOL( ID_LIBEDIT_SELECT_CURRENT_LIB, - WinEDA_LibeditFrame::Process_Special_Functions ) -EVT_TOOL( ID_LIBEDIT_DELETE_PART, - WinEDA_LibeditFrame::DeleteOnePart ) -EVT_TOOL( ID_LIBEDIT_NEW_PART, - WinEDA_LibeditFrame::CreateNewLibraryPart ) -EVT_TOOL( ID_LIBEDIT_SELECT_PART, - WinEDA_LibeditFrame::LoadOneLibraryPart ) -EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_PART, - WinEDA_LibeditFrame::Process_Special_Functions ) -EVT_TOOL( wxID_UNDO, - WinEDA_LibeditFrame::GetComponentFromUndoList ) -EVT_TOOL( wxID_REDO, - WinEDA_LibeditFrame::GetComponentFromRedoList ) -EVT_TOOL( ID_LIBEDIT_GET_FRAME_EDIT_PART, - WinEDA_LibeditFrame::OnEditComponentProperties ) -EVT_TOOL( ID_LIBEDIT_GET_FRAME_EDIT_FIELDS, - WinEDA_LibeditFrame::InstallFieldsEditorDialog ) -EVT_TOOL( ID_LIBEDIT_CHECK_PART, - WinEDA_LibeditFrame::OnCheckComponent ) -EVT_TOOL( ID_DE_MORGAN_NORMAL_BUTT, - WinEDA_LibeditFrame::OnSelectBodyStyle ) -EVT_TOOL( ID_DE_MORGAN_CONVERT_BUTT, - WinEDA_LibeditFrame::OnSelectBodyStyle ) -EVT_TOOL( ID_LIBEDIT_VIEW_DOC, - WinEDA_LibeditFrame::OnViewEntryDoc ) -EVT_TOOL( ID_LIBEDIT_EDIT_PIN_BY_PIN, - WinEDA_LibeditFrame::Process_Special_Functions ) -EVT_TOOL( ExportPartId, WinEDA_LibeditFrame::OnExportPart ) -EVT_TOOL( CreateNewLibAndSavePartId, WinEDA_LibeditFrame::OnExportPart ) -EVT_TOOL( ImportPartId, WinEDA_LibeditFrame::OnImportPart ) + /* Main horizontal toolbar. */ + EVT_TOOL_RANGE( ID_ZOOM_IN, ID_ZOOM_PAGE, WinEDA_LibeditFrame::OnZoom ) + EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_LIB, WinEDA_LibeditFrame::SaveActiveLibrary ) + EVT_TOOL( ID_LIBEDIT_SELECT_CURRENT_LIB, WinEDA_LibeditFrame::Process_Special_Functions ) + EVT_TOOL( ID_LIBEDIT_DELETE_PART, WinEDA_LibeditFrame::DeleteOnePart ) + EVT_TOOL( ID_LIBEDIT_NEW_PART, WinEDA_LibeditFrame::CreateNewLibraryPart ) + EVT_TOOL( ID_LIBEDIT_SELECT_PART, WinEDA_LibeditFrame::LoadOneLibraryPart ) + EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_PART, WinEDA_LibeditFrame::Process_Special_Functions ) + EVT_TOOL( wxID_UNDO, WinEDA_LibeditFrame::GetComponentFromUndoList ) + EVT_TOOL( wxID_REDO, WinEDA_LibeditFrame::GetComponentFromRedoList ) + EVT_TOOL( ID_LIBEDIT_GET_FRAME_EDIT_PART, WinEDA_LibeditFrame::OnEditComponentProperties ) + EVT_TOOL( ID_LIBEDIT_GET_FRAME_EDIT_FIELDS, WinEDA_LibeditFrame::InstallFieldsEditorDialog ) + EVT_TOOL( ID_LIBEDIT_CHECK_PART, WinEDA_LibeditFrame::OnCheckComponent ) + EVT_TOOL( ID_DE_MORGAN_NORMAL_BUTT, WinEDA_LibeditFrame::OnSelectBodyStyle ) + EVT_TOOL( ID_DE_MORGAN_CONVERT_BUTT, WinEDA_LibeditFrame::OnSelectBodyStyle ) + EVT_TOOL( ID_LIBEDIT_VIEW_DOC, WinEDA_LibeditFrame::OnViewEntryDoc ) + EVT_TOOL( ID_LIBEDIT_EDIT_PIN_BY_PIN, WinEDA_LibeditFrame::Process_Special_Functions ) + EVT_TOOL( ExportPartId, WinEDA_LibeditFrame::OnExportPart ) + EVT_TOOL( CreateNewLibAndSavePartId, WinEDA_LibeditFrame::OnExportPart ) + EVT_TOOL( ImportPartId, WinEDA_LibeditFrame::OnImportPart ) + EVT_KICAD_CHOICEBOX( ID_LIBEDIT_SELECT_PART_NUMBER, WinEDA_LibeditFrame::OnSelectPart ) + EVT_KICAD_CHOICEBOX( ID_LIBEDIT_SELECT_ALIAS, WinEDA_LibeditFrame::OnSelectAlias ) -EVT_KICAD_CHOICEBOX( ID_LIBEDIT_SELECT_PART_NUMBER, - WinEDA_LibeditFrame::OnSelectPart ) -EVT_KICAD_CHOICEBOX( ID_LIBEDIT_SELECT_ALIAS, - WinEDA_LibeditFrame::OnSelectAlias ) + /* Right vertical toolbar. */ + EVT_TOOL( ID_NO_SELECT_BUTT, WinEDA_LibeditFrame::Process_Special_Functions ) + EVT_TOOL_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_EXPORT_BODY_BUTT, + WinEDA_LibeditFrame::Process_Special_Functions ) -/* Right vertical toolbar. */ -EVT_TOOL( ID_NO_SELECT_BUTT, WinEDA_LibeditFrame::Process_Special_Functions ) -EVT_TOOL_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_EXPORT_BODY_BUTT, - WinEDA_LibeditFrame::Process_Special_Functions ) + /* menubar commands */ + EVT_MENU( wxID_EXIT, WinEDA_LibeditFrame::CloseWindow ) + EVT_MENU( ID_LIBEDIT_SAVE_CURRENT_LIB_AS, WinEDA_LibeditFrame::SaveActiveLibrary ) + EVT_MENU( ID_LIBEDIT_GEN_PNG_FILE, WinEDA_LibeditFrame::OnPlotCurrentComponent ) + EVT_MENU( ID_LIBEDIT_GEN_SVG_FILE, WinEDA_LibeditFrame::OnPlotCurrentComponent ) + EVT_MENU( ID_GENERAL_HELP, WinEDA_DrawFrame::GetKicadHelp ) -/* menubar commands */ -EVT_MENU( wxID_EXIT, - WinEDA_LibeditFrame::CloseWindow ) -EVT_MENU( ID_LIBEDIT_SAVE_CURRENT_LIB_AS, - WinEDA_LibeditFrame::SaveActiveLibrary ) -EVT_MENU( ID_LIBEDIT_GEN_PNG_FILE, - WinEDA_LibeditFrame::OnPlotCurrentComponent ) -EVT_MENU( ID_LIBEDIT_GEN_SVG_FILE, - WinEDA_LibeditFrame::OnPlotCurrentComponent ) -EVT_MENU( ID_GENERAL_HELP, - WinEDA_DrawFrame::GetKicadHelp ) + EVT_MENU( ID_CONFIG_REQ, WinEDA_LibeditFrame::InstallConfigFrame ) + EVT_MENU( ID_CONFIG_SAVE, WinEDA_LibeditFrame::Process_Config ) + EVT_MENU( ID_CONFIG_READ, WinEDA_LibeditFrame::Process_Config ) + EVT_MENU( ID_COLORS_SETUP, WinEDA_LibeditFrame::Process_Config ) + EVT_MENU( ID_LIBEDIT_DIMENSIONS, WinEDA_LibeditFrame::InstallDimensionsDialog ) -EVT_MENU( ID_CONFIG_REQ, - WinEDA_LibeditFrame::InstallConfigFrame ) -EVT_MENU( ID_CONFIG_SAVE, - WinEDA_LibeditFrame::Process_Config ) -EVT_MENU( ID_CONFIG_READ, - WinEDA_LibeditFrame::Process_Config ) -EVT_MENU( ID_COLORS_SETUP, - WinEDA_LibeditFrame::Process_Config ) -EVT_MENU( ID_LIBEDIT_DIMENSIONS, - WinEDA_LibeditFrame::InstallDimensionsDialog ) + EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, + ID_PREFERENCES_HOTKEY_END, + WinEDA_LibeditFrame::Process_Config ) -EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, - ID_PREFERENCES_HOTKEY_END, - WinEDA_LibeditFrame::Process_Config ) + EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, WinEDA_LibeditFrame::SetLanguage ) -EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, - WinEDA_LibeditFrame::SetLanguage ) + /* Context menu events and commands. */ + EVT_MENU( ID_LIBEDIT_EDIT_PIN, WinEDA_LibeditFrame::OnEditPin ) + EVT_MENU( ID_LIBEDIT_ROTATE_PIN, WinEDA_LibeditFrame::OnRotatePin ) + EVT_MENU_RANGE( ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_ITEM, + ID_POPUP_LIBEDIT_ROTATE_GRAPHIC_TEXT, + WinEDA_LibeditFrame::Process_Special_Functions ) -/* Context menu events and commands. */ -EVT_MENU( ID_LIBEDIT_EDIT_PIN, WinEDA_LibeditFrame::OnEditPin ) - -EVT_MENU( ID_LIBEDIT_ROTATE_PIN, WinEDA_LibeditFrame::OnRotatePin ) - -EVT_MENU_RANGE( ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_ITEM, - ID_POPUP_LIBEDIT_ROTATE_GRAPHIC_TEXT, - WinEDA_LibeditFrame::Process_Special_Functions ) - -EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE, - WinEDA_LibeditFrame::Process_Special_Functions ) - -/* Update user interface elements. */ -EVT_UPDATE_UI( ExportPartId, WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( CreateNewLibAndSavePartId, - WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_PART, - WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_FIELDS, - WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( ID_LIBEDIT_CHECK_PART, - WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_PART, - WinEDA_LibeditFrame::OnUpdateEditingPart ) -EVT_UPDATE_UI( wxID_UNDO, WinEDA_LibeditFrame::OnUpdateUndo ) -EVT_UPDATE_UI( wxID_REDO, WinEDA_LibeditFrame::OnUpdateRedo ) -EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_LIB, - WinEDA_LibeditFrame::OnUpdateSaveCurrentLib ) -EVT_UPDATE_UI( ID_LIBEDIT_VIEW_DOC, WinEDA_LibeditFrame::OnUpdateViewDoc ) -EVT_UPDATE_UI( ID_LIBEDIT_EDIT_PIN_BY_PIN, - WinEDA_LibeditFrame::OnUpdatePinByPin ) -EVT_UPDATE_UI( ID_LIBEDIT_SELECT_PART_NUMBER, - WinEDA_LibeditFrame::OnUpdatePartNumber ) -EVT_UPDATE_UI( ID_LIBEDIT_SELECT_ALIAS, - WinEDA_LibeditFrame::OnUpdateSelectAlias ) -EVT_UPDATE_UI( ID_DE_MORGAN_NORMAL_BUTT, - WinEDA_LibeditFrame::OnUpdateDeMorganNormal ) -EVT_UPDATE_UI( ID_DE_MORGAN_CONVERT_BUTT, - WinEDA_LibeditFrame::OnUpdateDeMorganConvert ) -EVT_UPDATE_UI_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_EXPORT_BODY_BUTT, - WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE, + WinEDA_LibeditFrame::Process_Special_Functions ) + /* Update user interface elements. */ + EVT_UPDATE_UI( ExportPartId, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( CreateNewLibAndSavePartId, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_PART, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_FIELDS, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( ID_LIBEDIT_CHECK_PART, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_PART, WinEDA_LibeditFrame::OnUpdateEditingPart ) + EVT_UPDATE_UI( wxID_UNDO, WinEDA_LibeditFrame::OnUpdateUndo ) + EVT_UPDATE_UI( wxID_REDO, WinEDA_LibeditFrame::OnUpdateRedo ) + EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_LIB, WinEDA_LibeditFrame::OnUpdateSaveCurrentLib ) + EVT_UPDATE_UI( ID_LIBEDIT_VIEW_DOC, WinEDA_LibeditFrame::OnUpdateViewDoc ) + EVT_UPDATE_UI( ID_LIBEDIT_EDIT_PIN_BY_PIN, WinEDA_LibeditFrame::OnUpdatePinByPin ) + EVT_UPDATE_UI( ID_LIBEDIT_SELECT_PART_NUMBER, WinEDA_LibeditFrame::OnUpdatePartNumber ) + EVT_UPDATE_UI( ID_LIBEDIT_SELECT_ALIAS, WinEDA_LibeditFrame::OnUpdateSelectAlias ) + EVT_UPDATE_UI( ID_DE_MORGAN_NORMAL_BUTT, WinEDA_LibeditFrame::OnUpdateDeMorganNormal ) + EVT_UPDATE_UI( ID_DE_MORGAN_CONVERT_BUTT, WinEDA_LibeditFrame::OnUpdateDeMorganConvert ) + EVT_UPDATE_UI_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_EXPORT_BODY_BUTT, + WinEDA_LibeditFrame::OnUpdateEditingPart ) END_EVENT_TABLE() + WinEDA_LibeditFrame::WinEDA_LibeditFrame( WinEDA_SchematicFrame* aParent, const wxString& title, const wxPoint& pos, @@ -257,25 +215,24 @@ WinEDA_LibeditFrame::WinEDA_LibeditFrame( WinEDA_SchematicFrame* aParent, horiz.LeftDockable( false ).RightDockable( false ); m_auimgr.AddPane( m_HToolBar, - wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top(). - Row( 0 ) ); + wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top(). + Row( 0 ) ); m_auimgr.AddPane( m_VToolBar, - wxAuiPaneInfo( vert ).Name( wxT( "m_VToolBar" ) ).Right() ); + wxAuiPaneInfo( vert ).Name( wxT( "m_VToolBar" ) ).Right() ); m_auimgr.AddPane( DrawPanel, - wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() ); + wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() ); m_auimgr.AddPane( MsgPanel, - wxAuiPaneInfo( horiz ).Name( wxT( "MsgPanel" ) ).Bottom() ); + wxAuiPaneInfo( horiz ).Name( wxT( "MsgPanel" ) ).Bottom() ); m_auimgr.Update(); } WinEDA_LibeditFrame::~WinEDA_LibeditFrame() { - WinEDA_SchematicFrame* frame = - (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow(); + WinEDA_SchematicFrame* frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow(); frame->m_LibeditFrame = NULL; m_drawItem = m_lastDrawItem = NULL; @@ -347,7 +304,7 @@ void WinEDA_LibeditFrame::OnCloseWindow( wxCloseEvent& Event ) { wxString msg; msg.Printf( _( "Library \"%s\" was modified!\nDiscard changes?" ), - GetChars( lib.GetName() ) ); + GetChars( lib.GetName() ) ); if( !IsOK( this, msg ) ) { Event.Veto(); @@ -404,10 +361,8 @@ int WinEDA_LibeditFrame::BestZoom() } size -= wxSize( 25, 25 ); // reserve 100 mils margin - ii = wxRound( ( (double) dx / (double) size.x ) * - (double) GetScreen()->m_ZoomScalar ); - jj = wxRound( ( (double) dy / (double) size.y ) * - (double) GetScreen()->m_ZoomScalar ); + ii = wxRound( ( (double) dx / (double) size.x ) * (double) GetScreen()->m_ZoomScalar ); + jj = wxRound( ( (double) dy / (double) size.y ) * (double) GetScreen()->m_ZoomScalar ); return MAX( ii + 1, jj + 1 ); } @@ -423,18 +378,13 @@ void WinEDA_LibeditFrame::UpdateAliasSelectList() if( m_component == NULL ) return; - m_SelAliasBox->Append( m_component->GetName() ); + m_SelAliasBox->Append( m_component->GetAliasNames() ); m_SelAliasBox->SetSelection( 0 ); - if( !m_component->GetAliasList().IsEmpty() ) - { - m_SelAliasBox->Append( m_component->GetAliasList() ); + int index = m_SelAliasBox->FindString( m_aliasName ); - int index = m_SelAliasBox->FindString( m_aliasName ); - - if( index != wxNOT_FOUND ) - m_SelAliasBox->SetSelection( index ); - } + if( index != wxNOT_FOUND ) + m_SelAliasBox->SetSelection( index ); } @@ -443,7 +393,6 @@ void WinEDA_LibeditFrame::UpdatePartSelectList() if( m_SelpartBox == NULL ) return; - if( m_SelpartBox->GetCount() != 0 ) m_SelpartBox->Clear(); @@ -493,8 +442,7 @@ void WinEDA_LibeditFrame::OnUpdateRedo( wxUpdateUIEvent& event ) void WinEDA_LibeditFrame::OnUpdateSaveCurrentLib( wxUpdateUIEvent& event ) { - event.Enable( m_library != NULL - && ( m_library->IsModified()|| GetScreen()->IsModify() ) ); + event.Enable( m_library != NULL && ( m_library->IsModified() || GetScreen()->IsModify() ) ); } @@ -504,14 +452,11 @@ void WinEDA_LibeditFrame::OnUpdateViewDoc( wxUpdateUIEvent& event ) if( m_component != NULL && m_library != NULL ) { - if( !m_aliasName.IsEmpty() ) - { - enable = !m_component->GetAliasDataDocFileName(m_aliasName).IsEmpty(); - } - else if( !m_component->GetDocFileName().IsEmpty() ) - { - enable = true; - } + LIB_ALIAS* alias = m_component->GetAlias( m_aliasName ); + + wxCHECK_RET( alias != NULL, wxT( "Alias not found." ) ); + + enable = !alias->GetDocFileName().IsEmpty(); } event.Enable( enable ); @@ -545,8 +490,7 @@ void WinEDA_LibeditFrame::OnUpdateDeMorganNormal( wxUpdateUIEvent& event ) if( m_HToolBar == NULL ) return; - event.Enable( GetShowDeMorgan() - || ( m_component && m_component->HasConversion() ) ); + event.Enable( GetShowDeMorgan() || ( m_component && m_component->HasConversion() ) ); m_HToolBar->ToggleTool( event.GetId(), m_convert <= 1 ); } @@ -556,8 +500,7 @@ void WinEDA_LibeditFrame::OnUpdateDeMorganConvert( wxUpdateUIEvent& event ) if( m_HToolBar == NULL ) return; - event.Enable( GetShowDeMorgan() - || ( m_component && m_component->HasConversion() ) ); + event.Enable( GetShowDeMorgan() || ( m_component && m_component->HasConversion() ) ); m_HToolBar->ToggleTool( event.GetId(), m_convert > 1 ); } @@ -570,8 +513,7 @@ void WinEDA_LibeditFrame::OnUpdateSelectAlias( wxUpdateUIEvent& event ) /* Using the typical event.Enable() call doesn't seem to work with wxGTK * so use the pointer to alias combobox to directly enable or disable. */ - m_SelAliasBox->Enable( m_component != NULL - && !m_component->GetAliasList().IsEmpty() ); + m_SelAliasBox->Enable( m_component != NULL && m_component->GetAliasCount() > 1 ); } @@ -582,12 +524,7 @@ void WinEDA_LibeditFrame::OnSelectAlias( wxCommandEvent& event ) return; m_lastDrawItem = NULL; - - if( m_SelAliasBox->GetStringSelection().CmpNoCase( m_component->GetName() ) - == 0 ) - m_aliasName.Empty(); - else - m_aliasName = m_SelAliasBox->GetStringSelection(); + m_aliasName = m_SelAliasBox->GetStringSelection(); DisplayCmpDoc(); DrawPanel->Refresh(); @@ -614,15 +551,14 @@ void WinEDA_LibeditFrame::OnViewEntryDoc( wxCommandEvent& event ) return; wxString fileName; + LIB_ALIAS* alias = m_component->GetAlias( m_aliasName ); - if( !m_aliasName.IsEmpty() ) - fileName = m_component->GetAliasDataDocFileName(m_aliasName); - else - fileName = m_component->GetDocFileName(); + wxCHECK_RET( alias != NULL, wxT( "Alias not found." ) ); + + fileName = alias->GetDocFileName(); if( !fileName.IsEmpty() ) - GetAssociatedDocument( this, fileName, - &wxGetApp().GetLibraryPathList() ); + GetAssociatedDocument( this, fileName, &wxGetApp().GetLibraryPathList() ); } @@ -956,8 +892,7 @@ void WinEDA_LibeditFrame::Process_Special_Functions( wxCommandEvent& event ) break; default: - DisplayError( this, - wxT( "WinEDA_LibeditFrame::Process_Special_Functions error" ) ); + DisplayError( this, wxT( "WinEDA_LibeditFrame::Process_Special_Functions error" ) ); break; } diff --git a/eeschema/libfield.cpp b/eeschema/libfield.cpp index 1979f57a37..855e5547c5 100644 --- a/eeschema/libfield.cpp +++ b/eeschema/libfield.cpp @@ -186,7 +186,7 @@ void WinEDA_LibeditFrame::EditField( wxDC* DC, LIB_FIELD* Field ) wxString msg; /* Test for an existing name in the current components alias list. */ - if( Field->GetParent()->GetAliasList().Index( Text, false ) != wxNOT_FOUND ) + if( Field->GetParent()->HasAlias( Text ) ) { msg.Printf( _( "The field name <%s> is an existing alias of the \ component <%s>.\nPlease choose another name that does not conflict with any \ diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 64431a180e..2fa472c076 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -284,7 +284,7 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) msg = AddHotkeyName( _( "Edit" ), s_Schematic_Hokeys_Descr, HK_EDIT ); ADD_MENUITEM( editmenu, ID_POPUP_SCH_EDIT_CMP, msg, edit_component_xpm ); - if( libComponent && libComponent->isNormal() ) + if( libComponent && libComponent->IsNormal() ) { msg = AddHotkeyName( _( "Value " ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_VALUE ); ADD_MENUITEM( editmenu, ID_POPUP_SCH_EDIT_VALUE_CMP, msg, edit_comp_value_xpm ); diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 3c4134bf80..716e448316 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -19,6 +19,7 @@ #include "eeschema_id.h" #include "netlist.h" #include "class_pin.h" +#include "class_library.h" #include "annotate_dialog.h" #include "dialog_build_BOM.h" @@ -258,6 +259,7 @@ WinEDA_SchematicFrame::~WinEDA_SchematicFrame() SAFE_DELETE( g_RootSheet ); SAFE_DELETE( m_CurrentSheet ); // a SCH_SHEET_PATH, on the heap. SAFE_DELETE( m_findReplaceData ); + CMP_LIBRARY::RemoveAllLibraries(); } diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index a3be014fd8..071978f68e 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -54,8 +54,7 @@ BEGIN_EVENT_TABLE( WinEDA_ViewlibFrame, WinEDA_DrawFrame ) EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, WinEDA_ViewlibFrame::ClickOnLibList ) EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, WinEDA_ViewlibFrame::ClickOnCmpList ) - EVT_MENU( ID_SET_RELATIVE_OFFSET, - WinEDA_ViewlibFrame::OnSetRelativeOffset ) + EVT_MENU( ID_SET_RELATIVE_OFFSET, WinEDA_ViewlibFrame::OnSetRelativeOffset ) END_EVENT_TABLE() @@ -136,10 +135,9 @@ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame( wxWindow* father, m_LibListWindow->SetAlignment( wxLAYOUT_LEFT ); m_LibListWindow->SetSashVisible( wxSASH_RIGHT, TRUE ); m_LibListWindow->SetExtraBorderSize( EXTRA_BORDER_SIZE ); - m_LibList = - new wxListBox( m_LibListWindow, ID_LIBVIEW_LIB_LIST, - wxPoint( 0, 0 ), wxDefaultSize, - 0, NULL, wxLB_HSCROLL ); + m_LibList = new wxListBox( m_LibListWindow, ID_LIBVIEW_LIB_LIST, + wxPoint( 0, 0 ), wxDefaultSize, + 0, NULL, wxLB_HSCROLL ); } else { diff --git a/eeschema/viewlibs.cpp b/eeschema/viewlibs.cpp index 8f9519d632..e19908cc16 100644 --- a/eeschema/viewlibs.cpp +++ b/eeschema/viewlibs.cpp @@ -266,43 +266,36 @@ void WinEDA_ViewlibFrame::RedrawActiveWindow( wxDC* DC, bool EraseBg ) if( entry == NULL ) return; + wxCHECK_RET( entry->isAlias(), + wxT( "Entry \"" ) + entry->GetName() + wxT( "\" found in library <" ) + + lib->GetName() + wxT( "> is not a LIB_ALIAS object." ) ); + + LIB_ALIAS* alias = (LIB_ALIAS*) entry; + component = alias->GetComponent(); + DrawPanel->DrawBackGround( DC ); - if( entry->isAlias() ) + if( !alias->IsRoot() ) { - LIB_ALIAS* alias = (LIB_ALIAS*) entry; - component = alias->GetComponent(); - if( component == NULL ) // Should not occur - { - wxASSERT( component != NULL ); return; - } - if( ! component->isComponent() ) - { - wxASSERT( component->isComponent() ); - return; - } + // Temporarily change the name field text to reflect the alias name. msg = alias->GetName(); - - /* Temporarily change the name field text to reflect the alias name. */ tmp = component->GetName(); - component->SetName( alias->GetName() ); + component->SetName( msg ); + if( m_unit < 1 ) m_unit = 1; if( m_convert < 1 ) m_convert = 1; - component->SetName( tmp ); } else { - component = (LIB_COMPONENT*) entry; msg = _( "None" ); } - component->Draw( DrawPanel, DC, wxPoint( 0, 0 ), m_unit, m_convert, - GR_DEFAULT_DRAWMODE ); + component->Draw( DrawPanel, DC, wxPoint( 0, 0 ), m_unit, m_convert, GR_DEFAULT_DRAWMODE ); /* Redraw the cursor */ DrawPanel->DrawCursor( DC ); diff --git a/include/colors.h b/include/colors.h index e77bd13752..5ef7b0f27e 100644 --- a/include/colors.h +++ b/include/colors.h @@ -5,6 +5,8 @@ #ifndef _COLORS_H #define _COLORS_H +#include + /* Number of colors ( 32 bit palette. ) */ #define NBCOLOR 24