Wayne Stambaugh 652b969193 GTK+ file dialog wildcard improvements.
The GTK+ file dialog is case sensitive however it does support regular
expressions.  Most of the file dialog wildcards are lower case so only
files with the lower case extensions will show up in the file dialog.
This code adds a method to convert file extensions of any case to the
appropriate (sch -> [sS][cC][hH]) regular expression on GTK+ builds so
all file extension case combinations will show up in the file dialog.

A note to developers: make sure to add a file extension when setting
when setting the default file argument.  If you do don't set an
extension, the GTK+ file dialog will happily append the regular
expression as the file extension which is surely not what you want.

There are still a few known places (mostly gerbview) where there are
some complex wildcard code that has not been converted.

Fixes lp:1720542

https://bugs.launchpad.net/kicad/+bug/1720542
2017-11-11 19:32:26 -05:00

252 lines
7.1 KiB
C++

/**
* @file pagelayout_editor/files.cpp
*/
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 CERN
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors.
*
* @author Jean-Pierre Charras, jp.charras at wanadoo.fr
*
* 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
*/
#include <fctsys.h>
#include <common.h>
#include <class_drawpanel.h>
#include <confirm.h>
#include <gestfich.h>
#include <macros.h>
#include <worksheet_shape_builder.h>
#include <pl_editor_frame.h>
#include <properties_frame.h>
#include <pl_editor_id.h>
#include <wildcards_and_files_ext.h>
void PL_EDITOR_FRAME::OnFileHistory( wxCommandEvent& event )
{
wxString filename;
filename = GetFileFromHistory( event.GetId(), _( "Page Layout Description File" ) );
if( filename != wxEmptyString )
{
if( GetScreen()->IsModify() && !IsOK( this,
_( "The current page layout has been modified.\n"
"Do you wish to discard the changes?" ) ) )
return;
m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() );
::wxSetWorkingDirectory( ::wxPathOnly( filename ) );
if( LoadPageLayoutDescrFile( filename ) )
{
wxString msg;
msg.Printf( _( "File <%s> loaded "), GetChars( filename ) );
SetStatusText( msg );
}
OnNewPageLayout();
}
}
/* File commands. */
void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event )
{
wxString msg;
int id = event.GetId();
wxString filename = GetCurrFileName();
WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance();
if( filename.IsEmpty() && id == wxID_SAVE )
id = wxID_SAVEAS;
switch( id )
{
case wxID_NEW:
case wxID_OPEN:
if( GetScreen()->IsModify() && !IsOK( this,
_( "The current page layout has been modified.\n"
"Do you wish to discard the changes?" ) ) )
return;
break;
default:
break;
}
switch( id )
{
case wxID_NEW:
pglayout.AllowVoidList( true );
SetCurrFileName( wxEmptyString );
pglayout.ClearList();
OnNewPageLayout();
break;
case ID_APPEND_DESCR_FILE:
{
wxFileDialog openFileDialog( this, _( "Append Existing Page Layout File" ),
wxEmptyString, wxEmptyString,
PageLayoutDescrFileWildcard(), wxFD_OPEN );
if( openFileDialog.ShowModal() == wxID_CANCEL )
return;
filename = openFileDialog.GetPath();
if( ! InsertPageLayoutDescrFile( filename ) )
{
msg.Printf( _( "Unable to load %s file" ), GetChars( filename ) );
wxMessageBox( msg );
}
else
{
GetScreen()->SetModify();
RebuildDesignTree();
m_canvas->Refresh();
msg.Printf( _( "File <%s> inserted" ), GetChars( filename ) );
SetStatusText( msg );
}
}
break;
case wxID_OPEN:
{
wxFileDialog openFileDialog( this, _( "Open" ), wxEmptyString, wxEmptyString,
PageLayoutDescrFileWildcard(), wxFD_OPEN );
if( openFileDialog.ShowModal() == wxID_CANCEL )
return;
filename = openFileDialog.GetPath();
if( ! LoadPageLayoutDescrFile( filename ) )
{
msg.Printf( _( "Unable to load %s file" ), GetChars( filename ) );
wxMessageBox( msg );
}
else
{
OnNewPageLayout();
msg.Printf( _( "File <%s> loaded" ), GetChars( filename ) );
SetStatusText( msg );
}
}
break;
case wxID_SAVE:
if( !SavePageLayoutDescrFile( filename ) )
{
msg.Printf( _( "Unable to write <%s>" ), GetChars( filename ) );
wxMessageBox( msg );
}
else
{
msg.Printf( _("File <%s> written"), GetChars( filename ) );
SetStatusText( msg );
}
break;
case wxID_SAVEAS:
{
wxFileDialog openFileDialog( this, _( "Save As" ), wxEmptyString, wxEmptyString,
PageLayoutDescrFileWildcard(), wxFD_SAVE );
if( openFileDialog.ShowModal() == wxID_CANCEL )
return;
filename = openFileDialog.GetPath();
// Ensure the file has the right extension:
// because a name like name.subname.subsubname is legal,
// add the right extension without replacing the wxFileName
// extension
wxFileName fn(filename);
if( fn.GetExt() != PageLayoutDescrFileExtension )
filename << wxT(".") << PageLayoutDescrFileExtension;
if( !SavePageLayoutDescrFile( filename ) )
{
msg.Printf( _("Unable to create <%s>"), GetChars( filename ) );
wxMessageBox( msg );
}
else
{
msg.Printf( _("File <%s> written"), GetChars( filename ) );
SetStatusText( msg );
if( GetCurrFileName().IsEmpty() )
SetCurrFileName( filename );
}
}
break;
default:
wxMessageBox( wxT( "File_io: unexpected command id" ) );
break;
}
}
bool PL_EDITOR_FRAME::LoadPageLayoutDescrFile( const wxString& aFullFileName )
{
if( wxFileExists( aFullFileName ) )
{
WORKSHEET_LAYOUT::GetTheInstance().SetPageLayout( aFullFileName );
SetCurrFileName( aFullFileName );
UpdateFileHistory( aFullFileName );
GetScreen()->ClrModify();
return true;
}
return false;
}
bool PL_EDITOR_FRAME::InsertPageLayoutDescrFile( const wxString& aFullFileName )
{
if( wxFileExists( aFullFileName ) )
{
const bool append = true;
SaveCopyInUndoList();
WORKSHEET_LAYOUT::GetTheInstance().SetPageLayout( aFullFileName, append );
return true;
}
return false;
}
bool PL_EDITOR_FRAME::SavePageLayoutDescrFile( const wxString& aFullFileName )
{
if( ! aFullFileName.IsEmpty() )
{
WORKSHEET_LAYOUT::GetTheInstance().Save( aFullFileName );
GetScreen()->ClrModify();
return true;
}
return false;
}