/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
 * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
 * Copyright (C) 1992-2017 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 wildcards_and_files_ext.cpp
 */
#include <wildcards_and_files_ext.h>

/**
 * Format wildcard extension to support case sensitive file dialogs.
 *
 * The file extension wildcards of the GTK+ file dialog are case sensitive so using all lower
 * case characters means that only file extensions that are all lower case will show up in the
 * file dialog.  The GTK+ file dialog does support regular expressions so the file extension
 * is converted to a regular expression ( sch -> [sS][cC][hH] ) when wxWidgets is built against
 * GTK+.  Please make sure you call this function when adding new file wildcards.
 *
 * @note When calling wxFileDialog with a default file defined, make sure you include the
 *       file extension along with the file name.  Otherwise, on GTK+ builds, the file
 *       dialog will append the wildcard regular expression as the file extension which is
 *       surely not what you want.
 *
 * @param aWildcard is the extension part of the wild card.
 *
 * @return the build appropriate file dialog wildcard filter.
 */
static wxString FormatWildcardExt( const wxString& aWildcard )
{
    wxString wc;
#if defined( __WXGTK__ )

    for( auto ch : aWildcard )
    {
        if( wxIsalpha( ch ) )
            wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );
        else
            wc += ch;
    }

    return wc;
#else
    wc = aWildcard;

    return wc;
#endif
}


const std::string SchematicSymbolFileExtension( "sym" );
const std::string SchematicLibraryFileExtension( "lib" );
const std::string SchematicBackupFileExtension( "bak" );

const std::string VrmlFileExtension( "wrl" );

const std::string ProjectFileExtension( "pro" );
const std::string SchematicFileExtension( "sch" );
const std::string NetlistFileExtension( "net" );
const std::string ComponentFileExtension( "cmp" );
const std::string GerberFileExtension( "gbr" );
const std::string GerberJobFileExtension( "gbrjob" );
const std::string HtmlFileExtension( "html" );

const std::string LegacyPcbFileExtension( "brd" );
const std::string KiCadPcbFileExtension( "kicad_pcb" );
const std::string PageLayoutDescrFileExtension( "kicad_wks" );

const std::string PdfFileExtension( "pdf" );
const std::string MacrosFileExtension( "mcr" );
const std::string DrillFileExtension( "drl" );
const std::string SVGFileExtension( "svg" );
const std::string ReportFileExtension( "rpt" );
const std::string FootprintPlaceFileExtension( "pos" );
const std::string KiCadLib3DShapesPathExtension( "3dshapes" );  ///< 3D shapes default libpath

const std::string KiCadFootprintLibPathExtension( "pretty" );   ///< KICAD PLUGIN libpath
const std::string LegacyFootprintLibPathExtension( "mod" );
const std::string EagleFootprintLibPathExtension( "lbr" );

const std::string KiCadFootprintFileExtension( "kicad_mod" );
const std::string GedaPcbFootprintLibFileExtension( "fp" );
const std::string SpecctraDsnFileExtension( "dsn" );
const std::string IpcD356FileExtension( "d356" );


const wxString AllFilesWildcard( _( "All files (*)|*" ) );


wxString SchematicSymbolFileWildcard()
{
    return _( "KiCad drawing symbol files (*.sym)|*." ) + FormatWildcardExt( "sym" );
}


wxString SchematicLibraryFileWildcard()
{
    return _( "KiCad symbol library files (*.lib)|*." ) + FormatWildcardExt( "lib" );
}


wxString ProjectFileWildcard()
{
    return _( "KiCad project files (*.pro)|*." ) + FormatWildcardExt( "pro" );
}


wxString SchematicFileWildcard()
{
    return _( "KiCad schematic files (*.sch)|*." ) + FormatWildcardExt( "sch" );
}


wxString EagleSchematicFileWildcard()
{
    return _( "Eagle XML schematic files (*.sch)|*." ) + FormatWildcardExt( "sch" );
}


wxString EagleFilesWildcard()
{
    return _( "Eagle XML files (*.sch *.brd)|*." ) +
           FormatWildcardExt( "sch" ) + ";*." + FormatWildcardExt( "brd" );
}


wxString NetlistFileWildcard()
{
    return _( "KiCad netlist files (*.net)|*." ) + FormatWildcardExt( "net" );
}


wxString GerberFileWildcard()
{
    return _( "Gerber files (*.pho)|*." ) + FormatWildcardExt( "pho" );
}


wxString LegacyPcbFileWildcard()
{
    return _( "KiCad printed circuit board files (*.brd)|*." ) + FormatWildcardExt( "brd" );
}


wxString EaglePcbFileWildcard()
{
    return _( "Eagle ver. 6.x XML PCB files (*.brd)|*." ) + FormatWildcardExt( "brd" );
}


wxString PCadPcbFileWildcard()
{
    return _( "P-Cad 200x ASCII PCB files (*.pcb)|*." ) + FormatWildcardExt( "pcb" );
}


wxString PcbFileWildcard()
{
    return _( "KiCad printed circuit board files (*.kicad_pcb)|*." ) +
    FormatWildcardExt( "kicad_pcb" );
}


wxString KiCadFootprintLibFileWildcard()
{
    return _( "KiCad footprint files (*.kicad_mod)|*." ) + FormatWildcardExt( "kicad_mod" );
}


wxString KiCadFootprintLibPathWildcard()
{
    return _( "KiCad footprint library paths (*.pretty)|*." ) + FormatWildcardExt( "pretty" );
}


wxString LegacyFootprintLibPathWildcard()
{
    return _( "Legacy footprint library files (*.mod)|*." ) + FormatWildcardExt( "mod" );
}


wxString EagleFootprintLibPathWildcard()
{
    return _( "Eagle ver. 6.x XML library files (*.lbr)|*." ) + FormatWildcardExt( "lbr" );
}


wxString GedaPcbFootprintLibFileWildcard()
{
    return _( "Geda PCB footprint library files (*.fp)|*." ) + FormatWildcardExt( "fp" );
}


wxString PageLayoutDescrFileWildcard()
{
    return _( "Page layout design files (*.kicad_wks)|*." ) + FormatWildcardExt( "kicad_wks" );
}


// Wildcard for cvpcb component to footprint link file
wxString ComponentFileWildcard()
{
    return _( "KiCad symbol footprint link files (*.cmp)|*." ) + FormatWildcardExt( "cmp" );
}


// Wildcard for reports and fabrication documents
wxString DrillFileWildcard()
{
    return _( "Drill files (*.drl)|*." ) + FormatWildcardExt( "drl" );
}


wxString SVGFileWildcard()
{
    return _( "SVG files (*.svg)|*." ) + FormatWildcardExt( "svg" );
}


wxString HtmlFileWildcard()
{
    return _( "HTML files (*.html)|*." ) + FormatWildcardExt( "htm" ) + ";*.," +
           FormatWildcardExt( "html" );
}


wxString CsvFileWildcard()
{
    return _( "CSV Files (*.csv)|*." ) + FormatWildcardExt( "csv" );
}


wxString PdfFileWildcard()
{
    return _( "Portable document format files (*.pdf)|*." ) + FormatWildcardExt( "pdf" );
}


wxString PSFileWildcard()
{
    return _( "PostScript files (.ps)|*." ) + FormatWildcardExt( "ps" );
}


wxString ReportFileWildcard()
{
    return _( "Report files (*.rpt)|*." ) + FormatWildcardExt( "rpt" );
}


wxString FootprintPlaceFileWildcard()
{
    return _( "Footprint place files (*.pos)|*." ) + FormatWildcardExt( "pos" );
}


wxString Shapes3DFileWildcard()
{
    return _( "VRML and X3D files (*.wrl *.x3d)|*." ) + FormatWildcardExt( "wrl" ) +
           ";*." + FormatWildcardExt( "x3d" );
}


wxString IDF3DFileWildcard()
{
    return _( "IDFv3 footprint files (*.idf)|*." ) + FormatWildcardExt( "idf" );
}


wxString TextFileWildcard()
{
    return _( "Text files (*.txt)|*." ) + FormatWildcardExt( "txt" );
}


wxString ModLegacyExportFileWildcard()
{
    return _( "Legacy footprint export files (*.emp)|*." ) + FormatWildcardExt( "emp" );
}


wxString ErcFileWildcard()
{
    return _( "Electronic rule check file (.erc)|*." ) + FormatWildcardExt( "erc" );
}


wxString SpiceLibraryFileWildcard()
{
    return _( "Spice library file (*.lib)|*." ) + FormatWildcardExt( "lib" );
}


wxString SpiceNetlistFileWildcard()
{
    return _( "SPICE netlist file (.cir)|*." ) + FormatWildcardExt( "cir" );
}


wxString CadstarNetlistFileWildcard()
{
    return _( "CadStar netlist file (.frp)|*." ) + FormatWildcardExt( "frp" );
}


wxString EquFileWildcard()
{
    return _( "Symbol footprint association files (*.equ)|*." ) + FormatWildcardExt( "equ" );
}


wxString ZipFileWildcard()
{
    return _( "Zip file (*.zip)|*." ) + FormatWildcardExt( "zip" );
}


wxString GencadFileWildcard()
{
    return _( "GenCAD 1.4 board files (.cad)|*." ) + FormatWildcardExt( "cad" );
}


wxString DxfFileWildcard()
{
    return _( "DXF Files (*.dxf)|*." ) + FormatWildcardExt( "dxf" );
}


wxString GerberJobFileWildcard()
{
    return _( "Gerber job file (*.gbrjob)|*." ) + FormatWildcardExt( "gbrjob" ) +
           ";.gbrjob";
}


wxString SpecctraDsnFileWildcard()
{
    return _( "Specctra DSN file (*.dsn)|*." ) + FormatWildcardExt( "dsn" );
}


wxString IpcD356FileWildcard()
{
    return _( "IPC-D-356 Test Files (.d356)|*." ) + FormatWildcardExt( "d356" );
}


wxString WorkbookFileWildcard()
{
    return _( "Workbook file (*.wbk)|*." ) + FormatWildcardExt( "wbk" );
}


wxString PngFileWildcard()
{
    return _( "PNG file (*.png)|*." ) + FormatWildcardExt( "png" );
}