1 /*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
6 * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26 /**
27 * @file wildcards_and_files_ext.cpp
28 * Definition of file extensions used in Kicad.
29 */
30 #include <regex>
31 #include <wildcards_and_files_ext.h>
32 #include <wx/filedlg.h>
33 #include <wx/regex.h>
34 #include <wx/translation.h>
35
compareFileExtensions(const std::string & aExtension,const std::vector<std::string> & aReference,bool aCaseSensitive)36 bool compareFileExtensions( const std::string& aExtension,
37 const std::vector<std::string>& aReference, bool aCaseSensitive )
38 {
39 // Form the regular expression string by placing all possible extensions into it as alternatives
40 std::string regexString = "(";
41 bool first = true;
42 for( const auto& ext : aReference )
43 {
44 // The | separate goes between the extensions
45 if( !first )
46 regexString += "|";
47 else
48 first = false;
49
50 regexString += ext;
51 }
52 regexString += ")";
53
54 // Create the regex and see if it matches
55 std::regex extRegex( regexString, aCaseSensitive ? std::regex::ECMAScript : std::regex::icase );
56 return std::regex_match( aExtension, extRegex );
57 }
58
59
formatWildcardExt(const wxString & aWildcard)60 wxString formatWildcardExt( const wxString& aWildcard )
61 {
62 wxString wc;
63 #if defined( __WXGTK__ )
64
65 for( auto ch : aWildcard )
66 {
67 if( wxIsalpha( ch ) )
68 wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );
69 else
70 wc += ch;
71 }
72
73 return wc;
74 #else
75 wc = aWildcard;
76
77 return wc;
78 #endif
79 }
80
81
AddFileExtListToFilter(const std::vector<std::string> & aExts)82 wxString AddFileExtListToFilter( const std::vector<std::string>& aExts )
83 {
84 if( aExts.size() == 0 )
85 {
86 // The "all files" wildcard is different on different systems
87 wxString filter;
88 filter << " (" << wxFileSelectorDefaultWildcardStr << ")|"
89 << wxFileSelectorDefaultWildcardStr;
90 return filter;
91 }
92
93 wxString files_filter = " (";
94
95 // Add extensions to the info message:
96 for( const std::string& ext : aExts )
97 {
98 if( files_filter.length() > 2 )
99 files_filter << "; ";
100
101 files_filter << "*." << ext;
102 }
103
104 files_filter << ")|*.";
105
106 // Add extensions to the filter list, using a formatted string (GTK specific):
107 bool first = true;
108 for( const auto& ext : aExts )
109 {
110 if( !first )
111 files_filter << ";*.";
112
113 first = false;
114
115 files_filter << formatWildcardExt( ext );
116 }
117
118 return files_filter;
119 }
120
121 const std::string BackupFileSuffix( "-bak" );
122
123 const std::string KiCadSymbolLibFileExtension( "kicad_sym" );
124 const std::string SchematicSymbolFileExtension( "sym" );
125 const std::string LegacySymbolLibFileExtension( "lib" );
126 const std::string LegacySymbolDocumentFileExtension( "dcm" );
127
128 const std::string VrmlFileExtension( "wrl" );
129
130 const std::string ProjectFileExtension( "kicad_pro" );
131 const std::string LegacyProjectFileExtension( "pro" );
132 const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );
133 const std::string LegacySchematicFileExtension( "sch" );
134 const std::string KiCadSchematicFileExtension( "kicad_sch" );
135 const std::string NetlistFileExtension( "net" );
136 const std::string FootprintAssignmentFileExtension( "cmp" );
137 const std::string GerberFileExtension( "gbr" );
138 const std::string GerberJobFileExtension( "gbrjob" );
139 const std::string HtmlFileExtension( "html" );
140 const std::string EquFileExtension( "equ" );
141 const std::string HotkeyFileExtension( "hotkeys" );
142
143 const std::string ArchiveFileExtension( "zip" );
144
145 const std::string LegacyPcbFileExtension( "brd" );
146 const std::string KiCadPcbFileExtension( "kicad_pcb" );
147 const std::string DrawingSheetFileExtension( "kicad_wks" );
148 const std::string DesignRulesFileExtension( "kicad_dru" );
149
150 const std::string PdfFileExtension( "pdf" );
151 const std::string MacrosFileExtension( "mcr" );
152 const std::string DrillFileExtension( "drl" );
153 const std::string SVGFileExtension( "svg" );
154 const std::string ReportFileExtension( "rpt" );
155 const std::string FootprintPlaceFileExtension( "pos" );
156
157 const std::string KiCadFootprintLibPathExtension( "pretty" ); // this is a directory
158 const std::string LegacyFootprintLibPathExtension( "mod" ); // this is a file
159 const std::string EagleFootprintLibPathExtension( "lbr" ); // this is a file
160 const std::string GedaPcbFootprintLibFileExtension( "fp" ); // this is a file
161
162 const std::string KiCadFootprintFileExtension( "kicad_mod" );
163 const std::string SpecctraDsnFileExtension( "dsn" );
164 const std::string SpecctraSessionFileExtension( "ses" );
165 const std::string IpcD356FileExtension( "d356" );
166 const std::string WorkbookFileExtension( "wbk" );
167
168 const std::string PngFileExtension( "png" );
169 const std::string JpegFileExtension( "jpg" );
170 const std::string TextFileExtension( "txt" );
171
172
IsProtelExtension(const wxString & ext)173 bool IsProtelExtension( const wxString& ext )
174 {
175 static wxRegEx protelRE( wxT( "(gm1)|(g[tb][lapos])|(g\\d\\d*)" ), wxRE_ICASE );
176
177 return protelRE.Matches( ext );
178 }
179
180
AllFilesWildcard()181 wxString AllFilesWildcard()
182 {
183 return _( "All files" ) + AddFileExtListToFilter( {} );
184 }
185
186
SchematicSymbolFileWildcard()187 wxString SchematicSymbolFileWildcard()
188 {
189 return _( "KiCad drawing symbol files" ) + AddFileExtListToFilter( { "sym" } );
190 }
191
192
KiCadSymbolLibFileWildcard()193 wxString KiCadSymbolLibFileWildcard()
194 {
195 return _( "KiCad symbol library files" )
196 + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
197 }
198
199
LegacySymbolLibFileWildcard()200 wxString LegacySymbolLibFileWildcard()
201 {
202 return _( "KiCad legacy symbol library files" ) + AddFileExtListToFilter( { "lib" } );
203 }
204
205
AllSymbolLibFilesWildcard()206 wxString AllSymbolLibFilesWildcard()
207 {
208 return _( "All KiCad symbol library files" )
209 + AddFileExtListToFilter( { KiCadSymbolLibFileExtension, "lib" } );
210 }
211
212
ProjectFileWildcard()213 wxString ProjectFileWildcard()
214 {
215 return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
216 }
217
218
LegacyProjectFileWildcard()219 wxString LegacyProjectFileWildcard()
220 {
221 return _( "KiCad legacy project files" )
222 + AddFileExtListToFilter( { LegacyProjectFileExtension } );
223 }
224
225
AllProjectFilesWildcard()226 wxString AllProjectFilesWildcard()
227 {
228 return _( "All KiCad project files" )
229 + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
230 }
231
232
AllSchematicFilesWildcard()233 wxString AllSchematicFilesWildcard()
234 {
235 return _( "All KiCad schematic files" )
236 + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
237 }
238
239
LegacySchematicFileWildcard()240 wxString LegacySchematicFileWildcard()
241 {
242 return _( "KiCad legacy schematic files" )
243 + AddFileExtListToFilter( { LegacySchematicFileExtension } );
244 }
245
246
KiCadSchematicFileWildcard()247 wxString KiCadSchematicFileWildcard()
248 {
249 return _( "KiCad s-expression schematic files" )
250 + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
251 }
252
253
AltiumSchematicFileWildcard()254 wxString AltiumSchematicFileWildcard()
255 {
256 return _( "Altium schematic files" ) + AddFileExtListToFilter( { "SchDoc" } );
257 }
258
259
CadstarSchematicArchiveFileWildcard()260 wxString CadstarSchematicArchiveFileWildcard()
261 {
262 return _( "CADSTAR Schematic Archive files" ) + AddFileExtListToFilter( { "csa" } );
263 }
264
265
CadstarArchiveFilesWildcard()266 wxString CadstarArchiveFilesWildcard()
267 {
268 return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
269 }
270
271
EagleSchematicFileWildcard()272 wxString EagleSchematicFileWildcard()
273 {
274 return _( "Eagle XML schematic files" ) + AddFileExtListToFilter( { "sch" } );
275 }
276
277
EagleFilesWildcard()278 wxString EagleFilesWildcard()
279 {
280 return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
281 }
282
283
NetlistFileWildcard()284 wxString NetlistFileWildcard()
285 {
286 return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
287 }
288
289
GerberFileWildcard()290 wxString GerberFileWildcard()
291 {
292 return _( "Gerber files" ) + AddFileExtListToFilter( { "pho" } );
293 }
294
295
LegacyPcbFileWildcard()296 wxString LegacyPcbFileWildcard()
297 {
298 return _( "KiCad printed circuit board files" ) + AddFileExtListToFilter( { "brd" } );
299 }
300
301
EaglePcbFileWildcard()302 wxString EaglePcbFileWildcard()
303 {
304 return _( "Eagle ver. 6.x XML PCB files" ) + AddFileExtListToFilter( { "brd" } );
305 }
306
CadstarPcbArchiveFileWildcard()307 wxString CadstarPcbArchiveFileWildcard()
308 {
309 return _( "CADSTAR PCB Archive files" ) + AddFileExtListToFilter( { "cpa" } );
310 }
311
PCadPcbFileWildcard()312 wxString PCadPcbFileWildcard()
313 {
314 return _( "P-Cad 200x ASCII PCB files" ) + AddFileExtListToFilter( { "pcb" } );
315 }
316
AltiumDesignerPcbFileWildcard()317 wxString AltiumDesignerPcbFileWildcard()
318 {
319 return _( "Altium Designer PCB files" ) + AddFileExtListToFilter( { "PcbDoc" } );
320 }
321
AltiumCircuitStudioPcbFileWildcard()322 wxString AltiumCircuitStudioPcbFileWildcard()
323 {
324 return _( "Altium Circuit Studio PCB files" ) + AddFileExtListToFilter( { "CSPcbDoc" } );
325 }
326
AltiumCircuitMakerPcbFileWildcard()327 wxString AltiumCircuitMakerPcbFileWildcard()
328 {
329 return _( "Altium Circuit Maker PCB files" ) + AddFileExtListToFilter( { "CMPcbDoc" } );
330 }
331
FabmasterPcbFileWildcard()332 wxString FabmasterPcbFileWildcard()
333 {
334 return _( "Fabmaster PCB files" ) + AddFileExtListToFilter( { "txt", "fab" } );
335 }
336
PcbFileWildcard()337 wxString PcbFileWildcard()
338 {
339 return _( "KiCad printed circuit board files" ) +
340 AddFileExtListToFilter( { KiCadPcbFileExtension } );
341 }
342
343
KiCadFootprintLibFileWildcard()344 wxString KiCadFootprintLibFileWildcard()
345 {
346 return _( "KiCad footprint files" )
347 + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
348 }
349
350
KiCadFootprintLibPathWildcard()351 wxString KiCadFootprintLibPathWildcard()
352 {
353 return _( "KiCad footprint library paths" )
354 + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
355 }
356
357
LegacyFootprintLibPathWildcard()358 wxString LegacyFootprintLibPathWildcard()
359 {
360 return _( "Legacy footprint library files" ) + AddFileExtListToFilter( { "mod" } );
361 }
362
363
EagleFootprintLibPathWildcard()364 wxString EagleFootprintLibPathWildcard()
365 {
366 return _( "Eagle ver. 6.x XML library files" ) + AddFileExtListToFilter( { "lbr" } );
367 }
368
369
GedaPcbFootprintLibFileWildcard()370 wxString GedaPcbFootprintLibFileWildcard()
371 {
372 return _( "Geda PCB footprint library files" ) + AddFileExtListToFilter( { "fp" } );
373 }
374
375
DrawingSheetFileWildcard()376 wxString DrawingSheetFileWildcard()
377 {
378 return _( "Drawing sheet files" )
379 + AddFileExtListToFilter( { DrawingSheetFileExtension } );
380 }
381
382
383 // Wildcard for cvpcb symbol to footprint link file
FootprintAssignmentFileWildcard()384 wxString FootprintAssignmentFileWildcard()
385 {
386 return _( "KiCad symbol footprint link files" )
387 + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
388 }
389
390
391 // Wildcard for reports and fabrication documents
DrillFileWildcard()392 wxString DrillFileWildcard()
393 {
394 return _( "Drill files" )
395 + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
396 }
397
398
SVGFileWildcard()399 wxString SVGFileWildcard()
400 {
401 return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
402 }
403
404
HtmlFileWildcard()405 wxString HtmlFileWildcard()
406 {
407 return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
408 }
409
410
CsvFileWildcard()411 wxString CsvFileWildcard()
412 {
413 return _( "CSV Files" ) + AddFileExtListToFilter( { "csv" } );
414 }
415
416
PdfFileWildcard()417 wxString PdfFileWildcard()
418 {
419 return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
420 }
421
422
PSFileWildcard()423 wxString PSFileWildcard()
424 {
425 return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
426 }
427
428
ReportFileWildcard()429 wxString ReportFileWildcard()
430 {
431 return _( "Report files" ) + AddFileExtListToFilter( { "rpt" } );
432 }
433
434
FootprintPlaceFileWildcard()435 wxString FootprintPlaceFileWildcard()
436 {
437 return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
438 }
439
440
Shapes3DFileWildcard()441 wxString Shapes3DFileWildcard()
442 {
443 return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
444 }
445
446
IDF3DFileWildcard()447 wxString IDF3DFileWildcard()
448 {
449 return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
450 }
451
452
TextFileWildcard()453 wxString TextFileWildcard()
454 {
455 return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
456 }
457
458
ModLegacyExportFileWildcard()459 wxString ModLegacyExportFileWildcard()
460 {
461 return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
462 }
463
464
ErcFileWildcard()465 wxString ErcFileWildcard()
466 {
467 return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
468 }
469
470
SpiceLibraryFileWildcard()471 wxString SpiceLibraryFileWildcard()
472 {
473 return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
474 }
475
476
SpiceNetlistFileWildcard()477 wxString SpiceNetlistFileWildcard()
478 {
479 return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
480 }
481
482
CadstarNetlistFileWildcard()483 wxString CadstarNetlistFileWildcard()
484 {
485 return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
486 }
487
488
EquFileWildcard()489 wxString EquFileWildcard()
490 {
491 return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
492 }
493
494
ZipFileWildcard()495 wxString ZipFileWildcard()
496 {
497 return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
498 }
499
500
GencadFileWildcard()501 wxString GencadFileWildcard()
502 {
503 return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );
504 }
505
506
DxfFileWildcard()507 wxString DxfFileWildcard()
508 {
509 return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
510 }
511
512
GerberJobFileWildcard()513 wxString GerberJobFileWildcard()
514 {
515 return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
516 }
517
518
SpecctraDsnFileWildcard()519 wxString SpecctraDsnFileWildcard()
520 {
521 return _( "Specctra DSN file" )
522 + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
523 }
524
525
SpecctraSessionFileWildcard()526 wxString SpecctraSessionFileWildcard()
527 {
528 return _( "Specctra Session file" )
529 + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
530 }
531
532
IpcD356FileWildcard()533 wxString IpcD356FileWildcard()
534 {
535 return _( "IPC-D-356 Test Files" )
536 + AddFileExtListToFilter( { IpcD356FileExtension } );
537 }
538
539
WorkbookFileWildcard()540 wxString WorkbookFileWildcard()
541 {
542 return _( "Workbook file" )
543 + AddFileExtListToFilter( { WorkbookFileExtension } );
544 }
545
546
PngFileWildcard()547 wxString PngFileWildcard()
548 {
549 return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
550 }
551
552
JpegFileWildcard()553 wxString JpegFileWildcard()
554 {
555 return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
556 }
557
558
HotkeyFileWildcard()559 wxString HotkeyFileWildcard()
560 {
561 return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
562 }
563