wxString PCB_BASE_FRAME::SelectFootprint( EDA_DRAW_FRAME* aWindow, const wxString& aLibraryName, const wxString& aMask, const wxString& aKeyWord, FP_LIB_TABLE* aTable ) { static wxString oldName; // Save the name of the last module loaded. wxString fpname; wxString msg; wxArrayString libraries; std::vector< wxArrayString > rows; wxASSERT( aTable != NULL ); MList.ReadFootprintFiles( aTable, !aLibraryName ? NULL : &aLibraryName ); if( MList.GetErrorCount() ) { MList.DisplayErrors( this ); return wxEmptyString; } if( MList.GetCount() == 0 ) { wxString tmp; for( unsigned i = 0; i < libraries.GetCount(); i++ ) { tmp += libraries[i] + wxT( "\n" ); } msg.Printf( _( "No footprints could be read from library file(s):\n\n%s\nin any of " "the library search paths. Verify your system is configured properly " "so the footprint libraries can be found." ), GetChars( tmp ) ); DisplayError( aWindow, msg ); return wxEmptyString; } if( !aKeyWord.IsEmpty() ) // Create a list of modules found by keyword. { for( unsigned ii = 0; ii < MList.GetCount(); ii++ ) { if( KeyWordOk( aKeyWord, MList.GetItem( ii ).GetKeywords() ) ) { wxArrayString cols; cols.Add( MList.GetItem( ii ).GetFootprintName() ); cols.Add( MList.GetItem( ii ).GetNickname() ); rows.push_back( cols ); } } } else if( !aMask.IsEmpty() ) // Create a list of modules found by pattern { for( unsigned ii = 0; ii < MList.GetCount(); ii++ ) { const wxString& candidate = MList.GetItem( ii ).GetFootprintName(); if( WildCompareString( aMask, candidate, false ) ) { wxArrayString cols; cols.Add( MList.GetItem( ii ).GetFootprintName() ); cols.Add( MList.GetItem( ii ).GetNickname() ); rows.push_back( cols ); } } } else // Create the full list of modules { for( unsigned ii = 0; ii < MList.GetCount(); ii++ ) { wxArrayString cols; cols.Add( MList.GetItem( ii ).GetFootprintName() ); cols.Add( MList.GetItem( ii ).GetNickname() ); rows.push_back( cols ); } } if( !rows.empty() ) { wxArrayString headers; headers.Add( _( "Module" ) ); headers.Add( _( "Library" ) ); msg.Printf( _( "Modules [%d items]" ), (int) rows.size() ); EDA_LIST_DIALOG dlg( aWindow, msg, headers, rows, oldName, DisplayCmpDoc ); if( dlg.ShowModal() == wxID_OK ) { fpname = dlg.GetTextSelection(); fpname = dlg.GetTextSelection( 1 ) + wxT( ":" ) + fpname; SkipNextLeftButtonReleaseEvent(); } else fpname.Empty(); } else { DisplayError( aWindow, _( "No footprint found." ) ); fpname.Empty(); } if( fpname != wxEmptyString ) oldName = fpname; wxLogDebug( wxT( "Footprint '%s' was selected." ), GetChars( fpname ) ); return fpname; }