31#include <lib_table_lexer.h>
51#include <wx/filedlg.h>
100 return m_rows.insert( aIterator, aRow );
107 return m_rows.erase( aFirst, aLast );
111 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
150 wxString result = options;
160 if( options != result )
174 size_t ndx = cb_text.find(
"(sym_lib_table" );
176 if( ndx != std::string::npos )
182 LIB_TABLE_LEXER lexer( &slr );
188 tmp_tbl.
Parse( &lexer );
202 for(
unsigned i = 0; i < tmp_tbl.
GetCount(); ++i )
206 m_grid->AutoSizeColumns(
false );
213 m_grid->AutoSizeColumns(
false );
221 const wxString& aGlobalTablePath,
223 const wxString& aProjectTablePath ) :
225 m_globalTable( aGlobalTable ),
226 m_projectTable( aProjectTable ),
227 m_project( aProject ),
234 wxArrayString pluginChoices;
249 [&](
WX_GRID* aGrid,
int aCol )
251 int prevWidth = aGrid->GetColSize( aCol );
253 aGrid->AutoSizeColumn( aCol,
false );
254 aGrid->SetColSize( aCol, std::max( prevWidth, aGrid->GetColSize( aCol ) ) );
261 aGrid->SetDefaultRowSize( aGrid->GetDefaultRowSize() + 4 );
266 aGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
269 wxGridCellAttr* attr;
271 attr =
new wxGridCellAttr;
279 aGrid->SetColAttr(
COL_URI, attr );
281 attr =
new wxGridCellAttr;
282 attr->SetEditor(
new wxGridCellChoiceEditor( pluginChoices ) );
283 aGrid->SetColAttr(
COL_TYPE, attr );
285 attr =
new wxGridCellAttr;
286 attr->SetRenderer(
new wxGridCellBoolRenderer() );
290 attr =
new wxGridCellAttr;
291 attr->SetRenderer(
new wxGridCellBoolRenderer() );
304 if( aGrid->GetNumberRows() > 0 )
305 aGrid->SelectRow( 0 );
364 wxFileName fn( aLibraryPath );
365 wxString ext = fn.GetExt().Lower();
385 for(
int r = 0; r < model->GetNumberRows(); )
387 wxString nick = model->GetValue( r,
COL_NICKNAME ).Trim(
false ).Trim();
388 wxString uri = model->GetValue( r,
COL_URI ).Trim(
false ).Trim();
389 unsigned illegalCh = 0;
394 msg =
_(
"A library table row nickname and path cells are empty." );
396 msg =
_(
"A library table row nickname cell is empty." );
398 msg =
_(
"A library table row path cell is empty." );
400 wxMessageDialog badCellDlg(
this, msg,
_(
"Invalid Row Definition" ),
401 wxYES_NO | wxCENTER | wxICON_QUESTION | wxYES_DEFAULT );
402 badCellDlg.SetExtendedMessage(
_(
"Empty cells will result in all rows that are "
403 "invalid to be removed from the table." ) );
404 badCellDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel(
_(
"Remove Invalid Cells" ) ),
405 wxMessageDialog::ButtonLabel(
_(
"Cancel Table Update" ) ) );
407 if( badCellDlg.ShowModal() == wxID_NO )
414 model->DeleteRows( r, 1 );
418 msg = wxString::Format(
_(
"Illegal character '%c' in nickname '%s'" ),
429 wxMessageDialog errdlg(
this, msg,
_(
"Library Nickname Error" ) );
439 model->SetValue( r,
COL_URI, uri );
442 wxString ltype = model->GetValue( r,
COL_TYPE );
443 model->LIB_TABLE_GRID::SetValue( r,
COL_URI, uri );
444 model->SetValue( r,
COL_TYPE, ltype );
458 for(
int r1 = 0; r1 < model->GetNumberRows() - 1; ++r1 )
462 for(
int r2=r1+1; r2 < model->GetNumberRows(); ++r2 )
468 msg = wxString::Format(
_(
"Multiple libraries cannot share the same "
469 "nickname ('%s')." ), nick1 );
479 wxMessageDialog errdlg(
this, msg,
_(
"Library Nickname Error" ) );
493 for(
unsigned int r = 0; r < table->GetCount(); ++r )
515 msg.Printf(
_(
"Symbol library '%s' failed to load." ), row.
GetNickName() );
517 wxMessageDialog errdlg(
this, msg + wxS(
"\n" ) + ioe.
What(),
518 _(
"Error Loading Library" ) );
551 wxFileDialog dlg(
this,
_(
"Select Library" ), openDir, wxEmptyString, wildcards,
552 wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE );
554 if( dlg.ShowModal() == wxID_CANCEL )
563 bool addDuplicates =
false;
564 bool applyToAll =
false;
565 wxString warning =
_(
"Warning: Duplicate Nickname" );
566 wxString msg =
_(
"A library nicknamed '%s' already exists." );
567 wxString detailedMsg =
_(
"One of the nicknames will need to be changed after "
568 "adding this library." );
570 wxArrayString filePathsList;
571 dlg.GetPaths( filePathsList );
573 for(
const wxString& filePath : filePathsList )
575 wxFileName fn( filePath );
579 if(
cur_model()->ContainsNickname( nickname ) )
584 addDuplicates =
OKOrCancelDialog(
this, warning, wxString::Format( msg, nickname ),
585 detailedMsg,
_(
"Skip" ),
_(
"Add Anyway" ),
586 &applyToAll ) == wxID_CANCEL;
589 doAdd = addDuplicates;
594 int last_row =
m_cur_grid->GetNumberRows() - 1;
608 path = fn.GetFullPath();
614 if( !filePathsList.IsEmpty() )
653 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
654 wxGridCellCoordsArray cells =
m_cur_grid->GetSelectedCells();
655 wxGridCellCoordsArray blockTopLeft =
m_cur_grid->GetSelectionBlockTopLeft();
656 wxGridCellCoordsArray blockBotRight =
m_cur_grid->GetSelectionBlockBottomRight();
659 for(
unsigned ii = 0; ii < cells.GetCount(); ii++ )
660 selectedRows.Add( cells[ii].GetRow() );
663 if( !blockTopLeft.IsEmpty() && !blockBotRight.IsEmpty() )
665 for(
int i = blockTopLeft[0].GetRow(); i <= blockBotRight[0].GetRow(); ++i )
666 selectedRows.Add( i );
670 if( selectedRows.size() == 0 &&
m_cur_grid->GetGridCursorRow() >= 0 )
671 selectedRows.Add(
m_cur_grid->GetGridCursorRow() );
673 if( selectedRows.size() == 0 )
679 std::sort( selectedRows.begin(), selectedRows.end() );
684 for(
int ii = selectedRows.GetCount()-1; ii >= 0; ii-- )
686 int row = selectedRows[ii];
688 if( row != last_row )
695 if(
m_cur_grid->GetNumberRows() > 0 && curRow >= 0 )
711 boost::ptr_vector< LIB_TABLE_ROW >::auto_type move_me =
715 tbl->
m_rows.insert( tbl->
m_rows.begin() + curRow, move_me.release() );
720 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow, 0 );
721 tbl->GetView()->ProcessTableMessage( msg );
739 if(
unsigned( curRow + 1 ) < tbl->
m_rows.size() )
741 boost::ptr_vector< LIB_TABLE_ROW >::auto_type move_me =
745 tbl->
m_rows.insert( tbl->
m_rows.begin() + curRow, move_me.release() );
750 wxGridTableMessage msg( tbl, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, curRow - 1, 0 );
751 tbl->GetView()->ProcessTableMessage( msg );
765 wxArrayInt selectedRows =
m_cur_grid->GetSelectedRows();
767 if( selectedRows.empty() &&
m_cur_grid->GetGridCursorRow() >= 0 )
768 selectedRows.push_back(
m_cur_grid->GetGridCursorRow() );
770 wxArrayInt legacyRows;
775 for(
int row : selectedRows )
778 legacyRows.push_back( row );
781 if( legacyRows.size() <= 0 )
783 wxMessageBox(
_(
"Select one or more rows containing libraries in Legacy format (*.lib) "
784 "to save as current KiCad format (*.kicad_sym)." ) );
789 if( legacyRows.size() == 1 )
791 msg.Printf(
_(
"Save '%s' as current KiCad format (*.kicad_sym) "
792 "and replace legacy entry in table?" ),
797 msg.Printf(
_(
"Save %d Legacy format libraries as current KiCad format (*.kicad_sym) "
798 "and replace legacy entries in table?" ),
799 (
int) legacyRows.size() );
806 for(
int row : legacyRows )
811 wxFileName legacyLib( resolvedPath );
813 if( !legacyLib.Exists() )
815 msg.Printf(
_(
"Library '%s' not found." ), relPath );
820 wxFileName newLib( resolvedPath );
821 newLib.SetExt(
"kicad_sym" );
823 if( newLib.Exists() )
825 msg.Printf(
_(
"File '%s' already exists. Do you want overwrite this file?" ),
826 newLib.GetFullPath() );
828 switch( wxMessageBox( msg,
_(
"Migrate Library" ),
829 wxYES_NO | wxCANCEL | wxICON_QUESTION,
m_parent ) )
833 case wxCANCEL:
return;
837 if(
convertLibrary( libName, legacyLib.GetFullPath(), newLib.GetFullPath() ) )
839 relPath =
NormalizePath( newLib.GetFullPath(), &
Pgm().GetLocalEnvVariables(),
845 relPath = newLib.GetFullPath();
852 msg.Printf(
_(
"Failed to save symbol library file '%s'." ), newLib.GetFullPath() );
860 const wxString& newFilepath )
864 std::vector<LIB_SYMBOL*> symbols;
865 std::vector<LIB_SYMBOL*> newSymbols;
866 std::map<LIB_SYMBOL*, LIB_SYMBOL*> symbolMap;
873 formatter->
Print( 0,
"(kicad_symbol_lib (version %d) (generator kicad_converter))",
884 if( symbol->IsAlias() )
889 newSymbols.push_back(
new LIB_SYMBOL( *symbol ) );
890 symbolMap[symbol] = newSymbols.back();
896 if( !symbol->IsAlias() )
901 newSymbols.push_back(
new LIB_SYMBOL( *symbol ) );
902 newSymbols.back()->SetParent( symbolMap[ symbol->GetParent().lock().get() ] );
954 wxRegEx re(
".*?(\\$\\{(.+?)\\})|(\\$\\((.+?)\\)).*?", wxRE_ADVANCED );
955 wxASSERT( re.IsValid() );
957 std::set< wxString > unique;
967 for(
int row = 0; row < tbl->GetNumberRows(); ++row )
969 wxString uri = tbl->GetValue( row,
COL_URI );
971 while( re.Matches( uri ) )
973 wxString envvar = re.GetMatch( uri, 2 );
976 if( envvar.IsEmpty() )
977 envvar = re.GetMatch( uri, 4 );
980 unique.insert( envvar );
983 uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
994 for(
const wxString& evName : unique )
999 m_path_subs_grid->SetCellValue( row, 0, wxT(
"${" ) + evName + wxT(
"}" ) );
1003 wxGetEnv( evName, &evValue );
1066 wxString currentLib;
1070 projectTable = aKiway->
Prj().SchSymbolLibTable();
1074 currentLib = symbolEditor->GetCurLib();
1077 symbolEditor->FreezeLibraryTree();
1079 if( symbolEditor->HasLibModifications() )
1081 msg =
_(
"Modifications have been made to one or more symbol libraries.\n"
1082 "Changes must be saved or discarded before the symbol library "
1083 "table can be modified." );
1087 case wxID_YES: symbolEditor->SaveAll();
break;
1088 case wxID_NO: symbolEditor->RevertAll();
break;
1090 case wxID_CANCEL: symbolEditor->ThawLibraryTree();
return;
1099 projectTable, projectTableFn.GetFullPath() ) );
1101 if( dlg.ShowModal() == wxID_CANCEL )
1104 symbolEditor->ThawLibraryTree();
1113 globalTable->
Save( globalTablePath );
1117 msg.Printf(
_(
"Error saving global library table:\n\n%s" ), ioe.
What() );
1118 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1126 projectTable->
Save( projectTableFn.GetFullPath() );
1130 msg.Printf(
_(
"Error saving project-specific library table:\n\n%s" ), ioe.
What() );
1131 wxMessageBox( msg,
_(
"File Save Error" ), wxOK | wxICON_ERROR );
1137 symbolEditor->ThawLibraryTree();
1140 std::string payload =
"";
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
bool m_ProjectTableChanged
void InstallPanel(wxPanel *aPanel)
bool m_GlobalTableChanged
DIALOG_PLUGIN_OPTIONS is an options editor in the form of a two column name/value spreadsheet like (t...
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
wxString m_lastSymbolLibDir
Editor for wxGrid cells that adds a file/folder browser to the grid input field.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
virtual void paste_text(const wxString &cb_text)
WX_GRID * m_grid
I don't own the grid, but he owns me.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
void SetKiway(wxWindow *aDest, KIWAY *aKiway)
It is only used for debugging, since "this" is not a wxWindow*.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
static unsigned FindIllegalLibraryNameChar(const UTF8 &aLibraryName)
Looks for characters that are illegal in library nicknames.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
Define a library symbol object.
This abstract base class mixes any object derived from LIB_TABLE into wxGridTableBase so the result c...
void SetValue(int aRow, int aCol, const wxString &aValue) override
bool AppendRows(size_t aNumRows=1) override
int GetNumberRows() override
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
const wxString & GetOptions() const
Return the options string, which may hold a password or anything else needed to instantiate the under...
LIB_TABLE * GetParent() const
virtual const wxString GetType() const =0
Return the type of library represented by this row.
void SetParent(LIB_TABLE *aParent)
const wxString & GetNickName() const
LIB_TABLE_ROW * clone() const
bool GetIsEnabled() const
void SetOptions(const wxString &aOptions)
Change the library options strings.
LIB_TABLE_ROW & At(unsigned aIndex)
Get the 'n'th LIB_TABLE_ROW object.
void Clear()
Delete all rows.
unsigned GetCount() const
Get the number of rows contained in the table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
void reindex()
Rebuilds the m_nickIndex.
Class PANEL_SYM_LIB_TABLE_BASE.
STD_BITMAP_BUTTON * m_browse_button
STD_BITMAP_BUTTON * m_move_up_button
STD_BITMAP_BUTTON * m_delete_button
STD_BITMAP_BUTTON * m_move_down_button
STD_BITMAP_BUTTON * m_append_button
WX_GRID * m_path_subs_grid
Dialog to show and edit symbol library tables.
void OnUpdateUI(wxUpdateUIEvent &event) override
void moveUpHandler(wxCommandEvent &event) override
virtual ~PANEL_SYM_LIB_TABLE()
bool allowAutomaticPluginTypeSelection(wxString &aLibraryPath)
SYMBOL_LIB_TABLE * m_projectTable
static size_t m_pageNdx
Remember the last notebook page selected.
void deleteRowHandler(wxCommandEvent &event) override
wxString m_lastProjectLibDir
void browseLibrariesHandler(wxCommandEvent &event) override
SYMBOL_LIB_TABLE_GRID * cur_model() const
PANEL_SYM_LIB_TABLE(DIALOG_EDIT_LIBRARY_TABLES *aParent, PROJECT *m_project, SYMBOL_LIB_TABLE *aGlobal, const wxString &aGlobalTablePath, SYMBOL_LIB_TABLE *aProject, const wxString &aProjectTablePath)
bool verifyTables()
Trim important fields, removes blank row entries, and checks for duplicates.
void adjustPathSubsGridColumns(int aWidth)
bool convertLibrary(const wxString &aLibrary, const wxString &legacyFilepath, const wxString &newFilepath)
SYMBOL_LIB_TABLE_GRID * global_model() const
SYMBOL_LIB_TABLE * m_globalTable
void onSizeGrid(wxSizeEvent &event) override
void onConvertLegacyLibraries(wxCommandEvent &event) override
SYMBOL_LIB_TABLE_GRID * project_model() const
void moveDownHandler(wxCommandEvent &event) override
void populateEnvironReadOnlyTable()
Populate the readonly environment variable table with names and values by examining all the full_uri ...
WX_GRID * m_cur_grid
changed based on tab choice
DIALOG_EDIT_LIBRARY_TABLES * m_parent
bool TransferDataFromWindow() override
void appendRowHandler(wxCommandEvent &event) override
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Container for project specific data.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
static SCH_FILE_T EnumFromStr(const wxString &aFileType)
Return the #SCH_FILE_T from the corresponding plugin type name: "kicad", "legacy",...
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath)
Return a plugin type given a symbol library using the file extension of aLibPath.
Helper object to release a SCH_PLUGIN in the context of a potential thrown exception through its dest...
virtual void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr)
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
virtual void SaveSymbol(const wxString &aLibraryPath, const LIB_SYMBOL *aSymbol, const STRING_UTF8_MAP *aProperties=nullptr)
Write aSymbol to an existing library located at aLibraryPath.
virtual void SymbolLibOptions(STRING_UTF8_MAP *aListToAppendTo) const
Append supported SCH_PLUGIN options to aListToAppenTo along with internationalized descriptions.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
A name/value tuple with unique names and optional values.
The symbol library editor main window.
DIALOG_EDIT_LIBRARY_TABLES * m_dialog
virtual void optionsEditor(int aRow) override
SYMBOL_GRID_TRICKS(DIALOG_EDIT_LIBRARY_TABLES *aParent, WX_GRID *aGrid)
virtual void paste_text(const wxString &cb_text) override
handle specialized clipboard text, with leading "(sym_lib_table" or spreadsheet formatted text.
Build a wxGridTableBase by wrapping an SYMBOL_LIB_TABLE object.
void SetValue(int aRow, int aCol, const wxString &aValue) override
LIB_TABLE_ROW * at(size_t aIndex) override
LIB_TABLE_ROWS_ITER erase(LIB_TABLE_ROWS_ITER aFirst, LIB_TABLE_ROWS_ITER aLast) override
LIB_TABLE_ROWS_ITER begin() override
LIB_TABLE_ROWS_ITER insert(LIB_TABLE_ROWS_ITER aIterator, LIB_TABLE_ROW *aRow) override
LIB_TABLE_ROW * makeNewRow() override
void push_back(LIB_TABLE_ROW *aRow) override
size_t size() const override
SYMBOL_LIB_TABLE_GRID(const SYMBOL_LIB_TABLE &aTableToEdit)
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
bool Refresh() override
Attempt to reload the library.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
virtual void Parse(LIB_TABLE_LEXER *aLexer) override
Parse the #LIB_TABLE_LEXER s-expression library table format into the appropriate LIB_TABLE_ROW objec...
static const wxString & GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
int OKOrCancelDialog(wxWindow *aParent, const wxString &aWarning, const wxString &aMessage, const wxString &aDetailedMessage, const wxString &aOKLabel, const wxString &aCancelLabel, bool *aApplyToAll)
Display a warning dialog with aMessage and returns the user response.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
This file is part of the common library.
@ ID_END_EESCHEMA_ID_LIST
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
@ FRAME_SCH_SYMBOL_EDITOR
const std::string LegacySymbolLibFileExtension
wxString DatabaseLibFileWildcard()
wxString LegacySymbolLibFileWildcard()
wxString KiCadSymbolLibFileWildcard()
wxString AllSymbolLibFilesWildcard()
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
LIB_TABLE_ROWS::iterator LIB_TABLE_ROWS_ITER
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
@ ID_PANEL_SYM_LIB_LEGACY
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
#define SEXPR_SYMBOL_LIB_FILE_VERSION
This file contains the file format version information for the s-expression schematic and symbol libr...
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
A filename or source description, a problem input line, a line number, a byte offset,...
Container that describes file type info for the add a library options.
bool m_IsFile
Whether the library is a folder or a file.
wxString m_Description
Description shown in the file picker dialog.
wxString m_FileFilter
Filter used for file pickers if m_IsFile is true.
SCH_IO_MGR::SCH_FILE_T m_Plugin
wxString m_FolderSearchExtension
In case of folders it stands for extensions of files stored inside.
Definition of file extensions used in Kicad.