summaryrefslogtreecommitdiff
path: root/cvpcb/cvframe.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cvpcb/cvframe.cpp')
-rw-r--r--cvpcb/cvframe.cpp939
1 files changed, 939 insertions, 0 deletions
diff --git a/cvpcb/cvframe.cpp b/cvpcb/cvframe.cpp
new file mode 100644
index 0000000..d68f6b9
--- /dev/null
+++ b/cvpcb/cvframe.cpp
@@ -0,0 +1,939 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2015 Jean-Pierre Charras, jean-pierre.charras
+ * Copyright (C) 2011-2016 Wayne Stambaugh <stambaughw@verizon.net>
+ * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file cvframe.cpp
+ */
+
+#include <fctsys.h>
+#include <build_version.h>
+#include <kiway_express.h>
+#include <pgm_base.h>
+#include <kiface_i.h>
+#include <macros.h>
+#include <confirm.h>
+#include <eda_doc.h>
+#include <eda_dde.h>
+#include <gestfich.h>
+#include <html_messagebox.h>
+#include <wildcards_and_files_ext.h>
+#include <fp_lib_table.h>
+#include <netlist_reader.h>
+
+#include <cvpcb_mainframe.h>
+#include <cvpcb.h>
+#include <cvstruct.h>
+#include <invoke_pcb_dialog.h>
+#include <class_DisplayFootprintsFrame.h>
+#include <cvpcb_id.h>
+
+
+#define FRAME_MIN_SIZE_X 450
+#define FRAME_MIN_SIZE_Y 300
+
+
+// option key to close CvPcb after saving files
+static const wxString KeepCvpcbOpenEntry( wxT( "KeepCvpcbOpen" ) );
+static const wxString FootprintDocFileEntry( wxT( "footprints_doc_file" ) );
+
+
+BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, KIWAY_PLAYER )
+
+ // Menu events
+ EVT_MENU( wxID_SAVE, CVPCB_MAINFRAME::SaveQuitCvpcb )
+ EVT_MENU( wxID_EXIT, CVPCB_MAINFRAME::OnQuit )
+ EVT_MENU( wxID_HELP, CVPCB_MAINFRAME::GetKicadHelp )
+ EVT_MENU( wxID_ABOUT, CVPCB_MAINFRAME::GetKicadAbout )
+ EVT_MENU( ID_SAVE_PROJECT, CVPCB_MAINFRAME::SaveProjectFile )
+ EVT_MENU( ID_PREFERENCES_CONFIGURE_PATHS, CVPCB_MAINFRAME::OnConfigurePaths )
+ EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnKeepOpenOnSave )
+ EVT_MENU( ID_CVPCB_EQUFILES_LIST_EDIT, CVPCB_MAINFRAME::OnEditEquFilesList )
+
+ // Toolbar events
+ EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit )
+
+ EVT_TOOL( ID_CVPCB_LIB_TABLE_EDIT, CVPCB_MAINFRAME::OnEditFootprintLibraryTable )
+ EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, CVPCB_MAINFRAME::DisplayModule )
+ EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, CVPCB_MAINFRAME::ToFirstNA )
+ EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, CVPCB_MAINFRAME::ToPreviousNA )
+ EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS, CVPCB_MAINFRAME::DelAssociations )
+ EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE, CVPCB_MAINFRAME::AutomaticFootprintMatching )
+ EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
+ CVPCB_MAINFRAME::OnSelectFilteringFootprint )
+ EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST,
+ CVPCB_MAINFRAME::OnSelectFilteringFootprint )
+ EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST,
+ CVPCB_MAINFRAME::OnSelectFilteringFootprint )
+
+ // Frame events
+ EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow )
+ EVT_SIZE( CVPCB_MAINFRAME::OnSize )
+
+ EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave )
+END_EVENT_TABLE()
+
+
+#define CVPCB_MAINFRAME_NAME wxT( "CvpcbFrame" )
+
+
+CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
+ KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, wxT( "CvPCB" ), wxDefaultPosition,
+ wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, CVPCB_MAINFRAME_NAME )
+{
+ m_compListBox = NULL;
+ m_footprintListBox = NULL;
+ m_libListBox = NULL;
+ m_mainToolBar = NULL;
+ m_modified = false;
+ m_isEESchemaNetlist = false;
+ m_KeepCvpcbOpen = false;
+ m_undefinedComponentCnt = 0;
+ m_skipComponentSelect = false;
+ m_NetlistFileExtension = wxT( "net" );
+
+ /* Name of the document footprint list
+ * usually located in share/modules/footprints_doc
+ * this is of the responsibility to users to create this file
+ * if they want to have a list of footprints
+ */
+ m_DocModulesFileName = DEFAULT_FOOTPRINTS_LIST_FILENAME;
+
+ // Give an icon
+ wxIcon icon;
+ icon.CopyFromBitmap( KiBitmap( icon_cvpcb_xpm ) );
+ SetIcon( icon );
+
+ SetAutoLayout( true );
+
+ LoadSettings( config() );
+
+ if( m_FrameSize.x < FRAME_MIN_SIZE_X )
+ m_FrameSize.x = FRAME_MIN_SIZE_X;
+
+ if( m_FrameSize.y < FRAME_MIN_SIZE_Y )
+ m_FrameSize.y = FRAME_MIN_SIZE_Y;
+
+ // Set minimal frame width and height
+ SetSizeHints( FRAME_MIN_SIZE_X, FRAME_MIN_SIZE_Y, -1, -1, -1, -1 );
+
+ // Frame size and position
+ SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
+
+ // create the status bar
+ static const int dims[3] = { -1, -1, 250 };
+
+ CreateStatusBar( 3 );
+ SetStatusWidths( 3, dims );
+
+ ReCreateMenuBar();
+ ReCreateHToolbar();
+
+ // Create list of available modules and components of the schematic
+ BuildCmpListBox();
+ BuildFOOTPRINTS_LISTBOX();
+ BuildLIBRARY_LISTBOX();
+
+ m_auimgr.SetManagedWindow( this );
+
+ UpdateTitle();
+
+ EDA_PANEINFO horiz;
+ horiz.HorizontalToolbarPane();
+
+ EDA_PANEINFO info;
+ info.InfoToolbarPane();
+
+
+ if( m_mainToolBar )
+ m_auimgr.AddPane( m_mainToolBar,
+ wxAuiPaneInfo( horiz ).Name( wxT( "m_mainToolBar" ) ).Top() );
+
+ if( m_compListBox )
+ m_auimgr.AddPane( m_compListBox,
+ wxAuiPaneInfo( horiz ).Name( wxT( "m_compListBox" ) ).CentrePane() );
+
+ if( m_libListBox)
+ m_auimgr.AddPane( m_libListBox,
+ wxAuiPaneInfo( info ).Name( wxT( "m_libListBox" ) ).
+ Left().BestSize( (int) ( m_FrameSize.x * 0.20 ), m_FrameSize.y ) );
+
+ if( m_footprintListBox )
+ m_auimgr.AddPane( m_footprintListBox,
+ wxAuiPaneInfo( info ).Name( wxT( "m_footprintListBox" ) ).
+ Right().BestSize( (int) ( m_FrameSize.x * 0.30 ), m_FrameSize.y ) );
+
+ m_auimgr.Update();
+}
+
+
+CVPCB_MAINFRAME::~CVPCB_MAINFRAME()
+{
+ m_auimgr.UnInit();
+}
+
+
+void CVPCB_MAINFRAME::LoadSettings( wxConfigBase* aCfg )
+{
+ EDA_BASE_FRAME::LoadSettings( aCfg );
+
+ aCfg->Read( KeepCvpcbOpenEntry, &m_KeepCvpcbOpen, true );
+ aCfg->Read( FootprintDocFileEntry, &m_DocModulesFileName,
+ DEFAULT_FOOTPRINTS_LIST_FILENAME );
+}
+
+
+void CVPCB_MAINFRAME::SaveSettings( wxConfigBase* aCfg )
+{
+ EDA_BASE_FRAME::SaveSettings( aCfg );
+
+ aCfg->Write( KeepCvpcbOpenEntry, m_KeepCvpcbOpen );
+ aCfg->Write( FootprintDocFileEntry, m_DocModulesFileName );
+
+ int state = 0;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
+ state |= FOOTPRINTS_LISTBOX::BY_COMPONENT;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
+ state |= FOOTPRINTS_LISTBOX::BY_PIN_COUNT;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
+ state |= FOOTPRINTS_LISTBOX::BY_LIBRARY;
+
+ aCfg->Write( wxT( FILTERFOOTPRINTKEY ), state );
+}
+
+
+void CVPCB_MAINFRAME::OnSize( wxSizeEvent& event )
+{
+ event.Skip();
+}
+
+
+void CVPCB_MAINFRAME::OnQuit( wxCommandEvent& event )
+{
+ Close( false );
+}
+
+
+void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
+{
+ if( m_modified )
+ {
+ wxString msg = _( "Component to Footprint links modified.\nSave before exit ?" );
+ int ii = DisplayExitDialog( this, msg );
+
+ switch( ii )
+ {
+ case wxID_CANCEL:
+ Event.Veto();
+ return;
+
+ case wxID_NO:
+ break;
+
+ case wxID_YES:
+ SaveEdits();
+ break;
+ }
+ }
+
+ // Close module display frame
+ if( GetFpViewerFrame() )
+ GetFpViewerFrame()->Close( true );
+
+ m_modified = false;
+
+ Destroy();
+ return;
+}
+
+
+void CVPCB_MAINFRAME::ChangeFocus( bool aMoveRight )
+{
+ wxWindow* hasFocus = wxWindow::FindFocus();
+
+ if( aMoveRight )
+ {
+ if( hasFocus == m_libListBox )
+ m_compListBox->SetFocus();
+ else if( hasFocus == m_compListBox )
+ m_footprintListBox->SetFocus();
+ else if( hasFocus == m_footprintListBox )
+ m_libListBox->SetFocus();
+ }
+ else
+ {
+ if( hasFocus == m_libListBox )
+ m_footprintListBox->SetFocus();
+ else if( hasFocus == m_compListBox )
+ m_libListBox->SetFocus();
+ else if( hasFocus == m_footprintListBox )
+ m_compListBox->SetFocus();
+ }
+}
+
+
+void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
+{
+ if( m_netlist.IsEmpty() )
+ return;
+
+ long first_selected = m_compListBox->GetFirstSelected();
+
+ if( first_selected < 0 )
+ first_selected = -1; // We will start to 0 for the first search , if no item selected
+
+ int candidate = -1;
+
+ for( unsigned jj = first_selected+1; jj < m_netlist.GetCount(); jj++ )
+ {
+ if( m_netlist.GetComponent( jj )->GetFPID().empty() )
+ {
+ candidate = jj;
+ break;
+ }
+ }
+
+ if( candidate >= 0 )
+ {
+ m_compListBox->DeselectAll();
+ m_compListBox->SetSelection( candidate );
+ SendMessageToEESCHEMA();
+ }
+}
+
+
+void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
+{
+ if( m_netlist.IsEmpty() )
+ return;
+
+ int first_selected = m_compListBox->GetFirstSelected();
+
+ if( first_selected < 0 )
+ first_selected = m_compListBox->GetCount();
+
+ int candidate = -1;
+
+ for( int jj = first_selected-1; jj >= 0; jj-- )
+ {
+ if( m_netlist.GetComponent( jj )->GetFPID().empty() )
+ {
+ candidate = jj;
+ break;
+ }
+ }
+
+ if( candidate >= 0 )
+ {
+ m_compListBox->DeselectAll();
+ m_compListBox->SetSelection( candidate );
+ SendMessageToEESCHEMA();
+ }
+}
+
+
+void CVPCB_MAINFRAME::SaveQuitCvpcb( wxCommandEvent& aEvent )
+{
+ SaveEdits();
+
+ m_modified = false;
+
+ if( !m_KeepCvpcbOpen )
+ Close( true );
+}
+
+
+void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
+{
+ if( IsOK( this, _( "Delete selections" ) ) )
+ {
+ m_skipComponentSelect = true;
+
+ // Remove all selections to avoid issues when setting the fpids
+ m_compListBox->DeselectAll();
+
+ for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
+ {
+ FPID fpid;
+
+ m_netlist.GetComponent( i )->SetFPID( fpid );
+ SetNewPkg( wxEmptyString );
+ }
+
+ // Remove all selections after setting the fpids
+ m_compListBox->DeselectAll();
+
+ m_skipComponentSelect = false;
+ m_compListBox->SetSelection( 0 );
+ m_undefinedComponentCnt = m_netlist.GetCount();
+ }
+
+ DisplayStatus();
+}
+
+
+/* Remove in favor of Kiway messaging method of sending netlist
+void CVPCB_MAINFRAME::LoadNetList( wxCommandEvent& event )
+{
+ int id = event.GetId();
+ wxFileName newFileName;
+
+ if( id >= wxID_FILE1 && id <= wxID_FILE9 )
+ {
+ newFileName = GetFileFromHistory( id, _( "Netlist" ) );
+ }
+ else
+ {
+ wxFileDialog dlg( this, _( "Open Net List" ), wxGetCwd(),
+ wxEmptyString, NetlistFileWildcard,
+ wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
+
+ if( dlg.ShowModal() == wxID_CANCEL )
+ return;
+
+ newFileName = dlg.GetPath();
+ }
+
+ if( newFileName == m_NetlistFileName )
+ return;
+
+ OpenProjectFiles( std::vector<wxString>( 1, newFileName.GetFullPath() ) );
+}
+*/
+
+
+bool CVPCB_MAINFRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
+{
+ return true;
+}
+
+
+void CVPCB_MAINFRAME::OnEditFootprintLibraryTable( wxCommandEvent& aEvent )
+{
+ bool tableChanged = false;
+ int r = InvokePcbLibTableEditor( this, &GFootprintTable, Prj().PcbFootprintLibs() );
+
+ if( r & 1 )
+ {
+ wxString fileName = FP_LIB_TABLE::GetGlobalTableFileName();
+
+ try
+ {
+ GFootprintTable.Save( fileName );
+ tableChanged = true;
+ }
+ catch( const IO_ERROR& ioe )
+ {
+ wxString msg = wxString::Format(
+ _( "Error occurred saving the global footprint library table:\n'%s'\n%s" ),
+ GetChars( fileName ),
+ GetChars( ioe.errorText )
+ );
+ wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
+ }
+ }
+
+ if( r & 2 )
+ {
+ wxString fileName = Prj().FootprintLibTblName();
+
+ try
+ {
+ Prj().PcbFootprintLibs()->Save( fileName );
+ tableChanged = true;
+ }
+ catch( const IO_ERROR& ioe )
+ {
+ wxString msg = wxString::Format(
+ _( "Error occurred saving the project footprint library table:\n'%s'\n%s" ),
+ GetChars( fileName ),
+ GetChars( ioe.errorText )
+ );
+ wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
+ }
+ }
+
+ if( tableChanged )
+ {
+ wxBusyCursor dummy;
+ BuildLIBRARY_LISTBOX();
+ m_footprints.ReadFootprintFiles( Prj().PcbFootprintLibs() );
+ }
+}
+
+
+void CVPCB_MAINFRAME::OnKeepOpenOnSave( wxCommandEvent& event )
+{
+ m_KeepCvpcbOpen = event.IsChecked();
+}
+
+
+void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
+{
+ CreateScreenCmp();
+ GetFpViewerFrame()->RedrawScreen( wxPoint( 0, 0 ), false );
+}
+
+
+void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
+{
+ if( m_skipComponentSelect )
+ return;
+
+ wxString libraryName;
+ COMPONENT* component = NULL;
+ int filter = FOOTPRINTS_LISTBOX::UNFILTERED;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
+ filter |= FOOTPRINTS_LISTBOX::BY_COMPONENT;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
+ filter |= FOOTPRINTS_LISTBOX::BY_PIN_COUNT;
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
+ filter |= FOOTPRINTS_LISTBOX::BY_LIBRARY;
+
+ component = GetSelectedComponent();
+ libraryName = m_libListBox->GetSelectedLibrary();
+ m_footprintListBox->SetFootprints( m_footprints, libraryName, component, filter );
+
+ // Tell AuiMgr that objects are changed !
+ if( m_auimgr.GetManagedWindow() ) // Be sure Aui Manager is initialized
+ // (could be not the case when starting CvPcb
+ m_auimgr.Update();
+
+ if( component == NULL )
+ return;
+
+ // Preview of the already assigned footprint.
+ // Find the footprint that was already chosen for this component and select it,
+ // but only if the selection is made from the component list or the library list.
+ // If the selection is made from the footprint list, do not change the current
+ // selected footprint.
+ if( FindFocus() == m_compListBox || FindFocus() == m_libListBox )
+ {
+ wxString module = FROM_UTF8( component->GetFPID().Format().c_str() );
+
+ bool found = false;
+
+ for( int ii = 0; ii < m_footprintListBox->GetCount(); ii++ )
+ {
+ wxString footprintName;
+ wxString msg = m_footprintListBox->OnGetItemText( ii, 0 );
+ msg.Trim( true );
+ msg.Trim( false );
+ footprintName = msg.AfterFirst( wxChar( ' ' ) );
+
+ if( module.Cmp( footprintName ) == 0 )
+ {
+ m_footprintListBox->SetSelection( ii, true );
+ found = true;
+ break;
+ }
+ }
+
+ if( !found )
+ {
+ int ii = m_footprintListBox->GetSelection();
+
+ if ( ii >= 0 )
+ m_footprintListBox->SetSelection( ii, false );
+
+ if( GetFpViewerFrame() )
+ {
+ CreateScreenCmp();
+ }
+ }
+ }
+
+ SendMessageToEESCHEMA();
+ DisplayStatus();
+}
+
+
+void CVPCB_MAINFRAME::OnSelectFilteringFootprint( wxCommandEvent& event )
+{
+ wxListEvent l_event;
+
+ OnSelectComponent( l_event );
+}
+
+
+void CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event )
+{
+ event.Check( m_KeepCvpcbOpen );
+}
+
+
+void CVPCB_MAINFRAME::DisplayStatus()
+{
+ wxString msg;
+ COMPONENT* component;
+
+ if( wxWindow::FindFocus() == m_compListBox || wxWindow::FindFocus() == m_libListBox )
+ {
+ msg.Printf( _( "Components: %d, unassigned: %d" ), (int) m_netlist.GetCount(),
+ m_undefinedComponentCnt );
+ SetStatusText( msg, 0 );
+
+ msg.Empty();
+
+ component = GetSelectedComponent();
+
+ if( component )
+ {
+ for( unsigned ii = 0; ii < component->GetFootprintFilters().GetCount(); ii++ )
+ {
+ if( msg.IsEmpty() )
+ msg += component->GetFootprintFilters()[ii];
+ else
+ msg += wxT( ", " ) + component->GetFootprintFilters()[ii];
+ }
+
+ msg = _( "Filter list: " ) + msg;
+ }
+
+ SetStatusText( msg, 1 );
+ }
+ else
+ {
+ wxString footprintName = m_footprintListBox->GetSelectedFootprint();
+
+ FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( footprintName );
+
+ if( module ) // can be NULL if no netlist loaded
+ {
+ msg = _( "Description: " ) + module->GetDoc();
+ SetStatusText( msg, 0 );
+
+ msg = _( "Key words: " ) + module->GetKeywords();
+ SetStatusText( msg, 1 );
+ }
+ }
+
+ msg.Empty();
+ wxString filters;
+
+ if( m_footprintListBox )
+ {
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
+ filters = _( "key words" );
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) )
+ {
+ if( !filters.IsEmpty() )
+ filters += wxT( "+" );
+
+ filters += _( "pin count" );
+ }
+
+ if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST ) )
+ {
+ if( !filters.IsEmpty() )
+ filters += wxT( "+" );
+
+ filters += _( "library" );
+ }
+
+ if( filters.IsEmpty() )
+ msg = _( "No filtering" );
+ else
+ msg.Printf( _( "Filtered by %s" ), GetChars( filters ) );
+
+ msg << wxT( ": " ) << m_footprintListBox->GetCount();
+
+ SetStatusText( msg, 2 );
+ }
+}
+
+
+bool CVPCB_MAINFRAME::LoadFootprintFiles()
+{
+ FP_LIB_TABLE* fptbl = Prj().PcbFootprintLibs();
+
+ // Check if there are footprint libraries in the footprint library table.
+ if( !fptbl || !fptbl->GetLogicalLibs().size() )
+ {
+ wxMessageBox( _( "No PCB footprint libraries are listed in the current footprint "
+ "library table." ), _( "Configuration Error" ), wxOK | wxICON_ERROR );
+ return false;
+ }
+
+ {
+ wxBusyCursor dummy; // Let the user know something is happening.
+
+ m_footprints.ReadFootprintFiles( fptbl );
+ }
+
+ if( m_footprints.GetErrorCount() )
+ {
+ m_footprints.DisplayErrors( this );
+ }
+
+ return true;
+}
+
+
+void CVPCB_MAINFRAME::UpdateTitle()
+{
+ wxString title = wxString::Format( wxT( "Cvpcb %s " ), GetChars( GetBuildVersion() ) );
+ PROJECT& prj = Prj();
+ wxFileName fn = prj.GetProjectFullName();
+
+ if( fn.IsOk() && !prj.GetProjectFullName().IsEmpty() && fn.FileExists() )
+ {
+ title += wxString::Format( _("Project: '%s'"),
+ GetChars( fn.GetFullPath() )
+ );
+
+ if( !fn.IsFileWritable() )
+ title += _( " [Read Only]" );
+ }
+ else
+ title += _( "[no project]" );
+
+ SetTitle( title );
+}
+
+
+void CVPCB_MAINFRAME::SendMessageToEESCHEMA()
+{
+ if( m_netlist.IsEmpty() )
+ return;
+
+ int selection = m_compListBox->GetSelection();
+
+ if ( selection < 0 )
+ selection = 0;
+
+ if( m_netlist.GetComponent( selection ) == NULL )
+ return;
+
+ COMPONENT* component = m_netlist.GetComponent( selection );
+
+ std::string packet = StrPrintf( "$PART: \"%s\"", TO_UTF8( component->GetReference() ) );
+
+ if( Kiface().IsSingle() )
+ SendCommand( MSG_TO_SCH, packet.c_str() );
+ else
+ Kiway().ExpressMail( FRAME_SCH, MAIL_CROSS_PROBE, packet, this );
+}
+
+
+int CVPCB_MAINFRAME::ReadSchematicNetlist( const std::string& aNetlist )
+{
+ STRING_LINE_READER* strrdr = new STRING_LINE_READER( aNetlist, "Eeschema via Kiway" );
+ KICAD_NETLIST_READER netrdr( strrdr, &m_netlist );
+
+ m_netlist.Clear();
+
+ try
+ {
+ netrdr.LoadNetlist();
+ }
+ catch( const IO_ERROR& ioe )
+ {
+ wxString msg = wxString::Format( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() );
+ wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR );
+ return 1;
+ }
+
+ // We also remove footprint name if it is "$noname" because this is a dummy name,
+ // not the actual name of the footprint.
+ for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ )
+ {
+ if( m_netlist.GetComponent( ii )->GetFPID().GetFootprintName() == std::string( "$noname" ) )
+ m_netlist.GetComponent( ii )->SetFPID( FPID( wxEmptyString ) );
+ }
+
+ // Sort components by reference:
+ m_netlist.SortByReference();
+
+ return 0;
+}
+
+
+void CVPCB_MAINFRAME::CreateScreenCmp()
+{
+ DISPLAY_FOOTPRINTS_FRAME* fpframe = GetFpViewerFrame();
+
+ if( !fpframe )
+ {
+ fpframe = new DISPLAY_FOOTPRINTS_FRAME( &Kiway(), this );
+ fpframe->Show( true );
+ }
+ else
+ {
+ if( fpframe->IsIconized() )
+ fpframe->Iconize( false );
+
+ // The display footprint window might be buried under some other
+ // windows, so CreateScreenCmp() on an existing window would not
+ // show any difference, leaving the user confused.
+ // So we want to put it to front, second after our CVPCB_MAINFRAME.
+ // We do this by a little dance of bringing it to front then the main
+ // frame back.
+ fpframe->Raise(); // Make sure that is visible.
+ Raise(); // .. but still we want the focus.
+ }
+
+ fpframe->InitDisplay();
+}
+
+
+void CVPCB_MAINFRAME::BuildFOOTPRINTS_LISTBOX()
+{
+ wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
+
+ if( m_footprintListBox == NULL )
+ {
+ m_footprintListBox = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
+ wxDefaultPosition, wxDefaultSize );
+ m_footprintListBox->SetFont( wxFont( guiFont.GetPointSize(),
+ wxFONTFAMILY_MODERN,
+ wxFONTSTYLE_NORMAL,
+ wxFONTWEIGHT_NORMAL ) );
+ }
+
+ m_footprintListBox->SetFootprints( m_footprints, wxEmptyString, NULL,
+ FOOTPRINTS_LISTBOX::UNFILTERED );
+ DisplayStatus();
+}
+
+
+void CVPCB_MAINFRAME::BuildCmpListBox()
+{
+ wxString msg;
+ COMPONENT* component;
+ wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
+
+ if( m_compListBox == NULL )
+ {
+ m_compListBox = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
+ wxDefaultPosition, wxDefaultSize );
+ m_compListBox->SetFont( wxFont( guiFont.GetPointSize(),
+ wxFONTFAMILY_MODERN,
+ wxFONTSTYLE_NORMAL,
+ wxFONTWEIGHT_NORMAL ) );
+ }
+
+ m_compListBox->m_ComponentList.Clear();
+
+ for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
+ {
+ component = m_netlist.GetComponent( i );
+
+ msg.Printf( CMP_FORMAT, m_compListBox->GetCount() + 1,
+ GetChars( component->GetReference() ),
+ GetChars( component->GetValue() ),
+ GetChars( FROM_UTF8( component->GetFPID().Format().c_str() ) ) );
+ m_compListBox->m_ComponentList.Add( msg );
+ }
+
+ if( m_compListBox->m_ComponentList.Count() )
+ {
+ m_compListBox->SetItemCount( m_compListBox->m_ComponentList.Count() );
+ m_compListBox->SetSelection( 0, true );
+ m_compListBox->RefreshItems( 0L, m_compListBox->m_ComponentList.Count()-1 );
+ m_compListBox->UpdateWidth();
+ }
+}
+
+
+void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
+{
+ wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
+
+ if( m_libListBox == NULL )
+ {
+ m_libListBox = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
+ wxDefaultPosition, wxDefaultSize );
+ m_libListBox->SetFont( wxFont( guiFont.GetPointSize(),
+ wxFONTFAMILY_MODERN,
+ wxFONTSTYLE_NORMAL,
+ wxFONTWEIGHT_NORMAL ) );
+ }
+
+ FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
+
+ if( tbl )
+ {
+ wxArrayString libNames;
+
+ std::vector< wxString > libNickNames = tbl->GetLogicalLibs();
+
+ for( unsigned ii = 0; ii < libNickNames.size(); ii++ )
+ libNames.Add( libNickNames[ii] );
+
+ m_libListBox->SetLibraryList( libNames );
+ }
+}
+
+
+COMPONENT* CVPCB_MAINFRAME::GetSelectedComponent()
+{
+ int selection = m_compListBox->GetSelection();
+
+ if( selection >= 0 && selection < (int) m_netlist.GetCount() )
+ return m_netlist.GetComponent( selection );
+
+ return NULL;
+}
+
+
+DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFpViewerFrame()
+{
+ // returns the Footprint Viewer frame, if exists, or NULL
+ return (DISPLAY_FOOTPRINTS_FRAME*) wxWindow::FindWindowByName( FOOTPRINTVIEWER_FRAME_NAME );
+}
+
+
+void CVPCB_MAINFRAME::OnConfigurePaths( wxCommandEvent& aEvent )
+{
+ Pgm().ConfigurePaths( this );
+}
+
+
+void CVPCB_MAINFRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
+{
+ const std::string& payload = mail.GetPayload();
+
+ DBG(printf( "%s: %s\n", __func__, payload.c_str() );)
+
+ switch( mail.Command() )
+ {
+ case MAIL_EESCHEMA_NETLIST:
+ ReadNetListAndLinkFiles( payload );
+ /* @todo
+ Go into SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event ) and trim GNL_ALL down.
+ */
+ break;
+
+ default:
+ ; // ignore most
+ }
+}