diff --git a/eeschema/class_library.cpp b/eeschema/class_library.cpp index c3b5b010aa..e34b564a77 100644 --- a/eeschema/class_library.cpp +++ b/eeschema/class_library.cpp @@ -210,7 +210,7 @@ bool CMP_LIBRARY::AddAlias( LIB_ALIAS* aAlias ) } entries.push_back( (CMP_LIB_ENTRY*) aAlias ); - isModified = true; + SetModifyFlags( ); return true; } @@ -225,7 +225,7 @@ LIB_COMPONENT* CMP_LIBRARY::AddComponent( LIB_COMPONENT* aComponent ) return NULL; entries.push_back( (CMP_LIB_ENTRY*) newCmp ); - isModified = true; + SetModifyFlags( ); /* Cache libraries are component only libraries. Do not create alias * entries. */ @@ -280,7 +280,7 @@ void CMP_LIBRARY::RemoveEntry( CMP_LIB_ENTRY* aEntry ) LIB_COMPONENT* root; LIB_ALIAS* alias; - isModified = true; + SetModifyFlags( ); if( aEntry->isAlias() ) { @@ -393,7 +393,7 @@ LIB_COMPONENT* CMP_LIBRARY::ReplaceComponent( LIB_COMPONENT* aOldComponent, entries.push_back( (CMP_LIB_ENTRY*) newCmp ); entries.sort(); - isModified = true; + SetModifyFlags( ); return newCmp; } @@ -739,7 +739,7 @@ bool CMP_LIBRARY::Save( const wxString& aFullFileName, bool aOldDocFormat ) return false; } - isModified = false; + ClearModifyFlag( ); timeStamp = GetTimeStamp(); if( !SaveHeader( libfile ) ) @@ -945,6 +945,22 @@ void CMP_LIBRARY::RemoveLibrary( const wxString& aName ) } + /** + * Test for an existing library. + * @param aLibptr - aLibptr. + * @return true found. false if not found. + */ +bool CMP_LIBRARY::LibraryExists( const CMP_LIBRARY* aLibptr ) +{ + BOOST_FOREACH( CMP_LIBRARY& lib, libraryList ) + { + if( &lib == aLibptr ) + return true; + } + + return false; +} + CMP_LIBRARY* CMP_LIBRARY::FindLibrary( const wxString& aName ) { BOOST_FOREACH( CMP_LIBRARY& lib, libraryList ) diff --git a/eeschema/class_library.h b/eeschema/class_library.h index 6b2bee4e1d..af89d042a5 100644 --- a/eeschema/class_library.h +++ b/eeschema/class_library.h @@ -63,6 +63,24 @@ public: int m_Type; /* type indicator */ int m_Flags; +protected: + 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. */ + + static CMP_LIBRARY_LIST libraryList; + static wxArrayString libraryListSortOrder; + + friend class CMP_LIB_ENTRY; + +private: + bool isModified; /* Library modification status. */ + public: CMP_LIBRARY( int aType, const wxFileName& aFileName ); CMP_LIBRARY( int aType, const wxString& aFileName ) @@ -71,6 +89,12 @@ public: } ~CMP_LIBRARY(); + /** Modify flags handling: + */ + void SetModifyFlags( ) { isModified = true; } + void ClearModifyFlag( ) { isModified = false; } + bool getModifyFlag( ) { return isModified;} + /** * Save library to file. * @@ -152,7 +176,7 @@ public: void SetCache( void ) { isCache = true; } - /** + /** * Load a string array with the names of all the entries in this library. * * @param aNames - String array to place entry names into. @@ -341,6 +365,14 @@ public: * of safety from abusing the library list. */ + /** + * Test for an existing library. + * + * @param aLibptr - aLibptr. + * @return true found. false if not found. + */ + + static bool LibraryExists( const CMP_LIBRARY* aLibptr ); /** * Load a component library file. * @@ -442,22 +474,6 @@ public: { return libraryListSortOrder; } - -protected: - 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 isModified; /* Library modification status. */ - bool isCache; /* False for the "standard" libraries, - * True for the library cache */ - wxString header; /* first line of loaded library. */ - - static CMP_LIBRARY_LIST libraryList; - static wxArrayString libraryListSortOrder; - - friend class CMP_LIB_ENTRY; }; diff --git a/eeschema/dialog_eeschema_config.cpp b/eeschema/dialog_eeschema_config.cpp index 5f81566ff9..0e4c02a9f6 100644 --- a/eeschema/dialog_eeschema_config.cpp +++ b/eeschema/dialog_eeschema_config.cpp @@ -17,6 +17,7 @@ #include "general.h" #include "protos.h" #include "netlist.h" +#include "libeditfrm.h" #include "libviewfrm.h" #include @@ -160,8 +161,9 @@ void DIALOG_EESCHEMA_CONFIG::OnOkClick( wxCommandEvent& event ) // take new list in account m_Parent->LoadLibraries(); - if( m_Parent->m_ViewlibFrame ) - m_Parent->m_ViewlibFrame->ReCreateListLib(); + // Clear (if needed) the current active library in libedit because it could be + // removed from memory + WinEDA_LibeditFrame::EnsureActiveLibExists(); } m_Parent->SaveProjectFile( this ); diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp index ed2ebba9fd..3956559e1e 100644 --- a/eeschema/files-io.cpp +++ b/eeschema/files-io.cpp @@ -13,6 +13,7 @@ #include "protos.h" #include "eeschema_id.h" #include "class_library.h" +#include "libeditfrm.h" @@ -104,8 +105,6 @@ int WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, GetScreen()->ClrModify(); - //m_CurrentSheet->m_AssociatedScreen->Pnext = NULL; should be by default - if( IsNew ) { screen->m_CurrentSheetDesc = &g_Sheet_A4; @@ -131,6 +130,10 @@ int WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, LoadProjectFile( wxEmptyString, FALSE ); + // Clear (if needed) the current active library in libedit because it could be + // removed from memory + WinEDA_LibeditFrame::EnsureActiveLibExists(); + // Delete old caches. CMP_LIBRARY::RemoveCacheLibrary(); diff --git a/eeschema/libedit.cpp b/eeschema/libedit.cpp index 4c49dbc699..e0bd2f856c 100644 --- a/eeschema/libedit.cpp +++ b/eeschema/libedit.cpp @@ -24,6 +24,8 @@ void WinEDA_LibeditFrame::DisplayLibInfos() { wxString msg = _( "Component Library Editor: " ); + EnsureActiveLibExists(); + if( m_library ) msg += m_library->GetFullFileName(); else diff --git a/eeschema/libeditfrm.h b/eeschema/libeditfrm.h index 0a8a9a0d9e..0f05dc7b1c 100644 --- a/eeschema/libeditfrm.h +++ b/eeschema/libeditfrm.h @@ -34,6 +34,12 @@ public: ~WinEDA_LibeditFrame(); + /** Function EnsureActiveLibExists + * Must be called after the libraries are reloaded + * (for instance after loading a schematic project) + */ + static void EnsureActiveLibExists(); + void Process_Special_Functions( wxCommandEvent& event ); void OnImportPart( wxCommandEvent& event ); void OnExportPart( wxCommandEvent& event ); @@ -127,6 +133,10 @@ public: private: + /** OnActivate event funtion( virtual ) + */ + virtual void OnActivate( wxActivateEvent& event ); + // General: void SaveOnePartInMemory(); void SelectActiveLibrary(); @@ -209,11 +219,11 @@ protected: /** Default line width for drawing or editing graphic items. */ static int m_drawLineWidth; + /** The current active libary. NULL if no active library is selected. */ + static CMP_LIBRARY* m_library; /** The current component being edited. NULL if no component is selected. */ static LIB_COMPONENT* m_component; - /** The current active libary. NULL if no library is active. */ - static CMP_LIBRARY* m_library; static LIB_DRAW_ITEM* m_lastDrawItem; static LIB_DRAW_ITEM* m_drawItem; static wxString m_aliasName; diff --git a/eeschema/libframe.cpp b/eeschema/libframe.cpp index 31fd266fc5..398e4e35ab 100644 --- a/eeschema/libframe.cpp +++ b/eeschema/libframe.cpp @@ -43,6 +43,7 @@ int CreateNewLibAndSavePartId = ::wxNewId(); */ LIB_COMPONENT* WinEDA_LibeditFrame::m_component = NULL; CMP_LIBRARY* WinEDA_LibeditFrame::m_library = NULL; + wxString WinEDA_LibeditFrame::m_aliasName; int WinEDA_LibeditFrame::m_unit = 1; int WinEDA_LibeditFrame::m_convert = 1; @@ -62,6 +63,7 @@ FILL_T WinEDA_LibeditFrame::m_drawFillStyle = NO_FILL; BEGIN_EVENT_TABLE( WinEDA_LibeditFrame, WinEDA_DrawFrame ) 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 ) @@ -181,6 +183,8 @@ WinEDA_LibeditFrame::WinEDA_LibeditFrame( wxWindow* father, if( DrawPanel ) DrawPanel->m_Block_Enable = true; + + EnsureActiveLibExists(); ReCreateHToolbar(); ReCreateVToolbar(); DisplayLibInfos(); @@ -905,3 +909,29 @@ void WinEDA_LibeditFrame::Process_Special_Functions( wxCommandEvent& event ) if( m_ID_current_state == 0 ) m_lastDrawItem = NULL; } + +/** Called on activate the frame. + * Test if the current library exists + * the library list can be changed by the schematic editor after reloading a new schematic + * and the current m_library can point a non existent lib. + */ +void WinEDA_LibeditFrame::OnActivate( wxActivateEvent& event ) +{ + WinEDA_DrawFrame::OnActivate( event ); + + // Verify the existence of the current active library + // (can be removed or changed by the schematic editor) + EnsureActiveLibExists(); +} + +void WinEDA_LibeditFrame::EnsureActiveLibExists() +{ + if( m_library == NULL ) + return; + + bool exists = CMP_LIBRARY::LibraryExists( m_library ); + if ( exists ) + return; + else + m_library = NULL; +} diff --git a/eeschema/libviewfrm.h b/eeschema/libviewfrm.h index 5f27d3ace5..72e4c9b639 100644 --- a/eeschema/libviewfrm.h +++ b/eeschema/libviewfrm.h @@ -72,6 +72,10 @@ public: int GetConvert( void ) { return m_convert; } private: + /** OnActivate event funtion( virtual ) + */ + virtual void OnActivate( wxActivateEvent& event ); + void SelectCurrentLibrary(); void SelectAndViewLibraryPart( int option ); void ExportToSchematicLibraryPart( wxCommandEvent& event ); diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index 6ec13d99da..3ee7221a01 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -33,7 +33,7 @@ BEGIN_EVENT_TABLE( WinEDA_ViewlibFrame, WinEDA_DrawFrame ) /* Window events */ EVT_CLOSE( WinEDA_ViewlibFrame::OnCloseWindow ) EVT_SIZE( WinEDA_ViewlibFrame::OnSize ) - EVT_ACTIVATE( WinEDA_DrawFrame::OnActivate ) + EVT_ACTIVATE( WinEDA_ViewlibFrame::OnActivate ) /* Sash drag events */ EVT_SASH_DRAGGED( ID_LIBVIEW_LIBWINDOW, WinEDA_ViewlibFrame::OnSashDrag ) @@ -195,7 +195,9 @@ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame( wxWindow* father, if( m_LibList ) ReCreateListLib(); + DisplayLibInfos(); + if( DrawPanel ) DrawPanel->SetAcceleratorTable( table ); Zoom_Automatique( false ); @@ -600,3 +602,15 @@ void WinEDA_ViewlibFrame::SaveSettings() cfg->Write( LIBLIST_WIDTH_KEY, m_LibListSize.x ); cfg->Write( CMPLIST_WIDTH_KEY, m_CmpListSize.x ); } + +/** Called on activate the frame. + * Reload the libraries lists that can be changed by the schematic editor or the library editor + */ +void WinEDA_ViewlibFrame::OnActivate( wxActivateEvent& event ) +{ + WinEDA_DrawFrame::OnActivate( event ); + + if( m_LibList ) + ReCreateListLib(); + DisplayLibInfos(); +} diff --git a/include/wxstruct.h b/include/wxstruct.h index d5036e9a8c..30a1dc0ba6 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -272,7 +272,6 @@ public: void ToPrinter( wxCommandEvent& event ); void SVG_Print( wxCommandEvent& event ); - void OnActivate( wxActivateEvent& event ); void TraceWorkSheet( wxDC* DC, BASE_SCREEN* screen, int line_width ); void PlotWorkSheet( PLOTTER *plotter, BASE_SCREEN* screen ); @@ -297,6 +296,12 @@ public: virtual void ToolOnRightClick( wxCommandEvent& event ); void AdjustScrollBars(); + /** OnActivate event function (virtual) + * called when activating the frame. + * in derived classes with a virtual OnActivate function, + * do not forget to call the WinEDA_DrawFrame::OnActivate( event ) basic function + */ + virtual void OnActivate( wxActivateEvent& event ); /** * Function UpdateStatusBar * updates the status bar information.