Check sheet file extension when editing, and add if missing when reading.

Fixes https://gitlab.com/kicad/code/kicad/issues/4107
This commit is contained in:
Jeff Young 2020-04-22 21:00:48 +01:00
parent 5bc6ad9786
commit 615ad9abfc
3 changed files with 54 additions and 16 deletions

View File

@ -242,20 +242,29 @@ bool DIALOG_SCH_SHEET_PROPS::TransferDataFromWindow()
wxString newRelativeNativeFilename = m_fields->at( SHEETFILENAME ).GetText(); wxString newRelativeNativeFilename = m_fields->at( SHEETFILENAME ).GetText();
// Ensure filepath is not empty. (In normal use will be caught by grid validators,
// but unedited data from existing files can be bad.)
if( newRelativeNativeFilename.IsEmpty() ) if( newRelativeNativeFilename.IsEmpty() )
{ {
wxMessageBox( _( "A sheet cannot have an empty filename" ) ); wxMessageBox( _( "A sheet must have a file specified." ) );
return false; return false;
} }
// Ensure the filename extension is OK // Ensure the filename extension is OK. (In normaly use will be caught by grid
// validators, but unedited data from existing files can be bad.)
wxFileName fn( newRelativeNativeFilename ); wxFileName fn( newRelativeNativeFilename );
fn.SetExt( LegacySchematicFileExtension );
if( fn.GetExt() != "sch" )
{
wxMessageBox( _( "Sheet file must have a '.sch' extension." ) );
return false;
}
wxString newRelativeFilename = fn.GetFullPath(); wxString newRelativeFilename = fn.GetFullPath();
// Inside Eeschema, filenames are stored using unix notation // Inside Eeschema, filenames are stored using unix notation
newRelativeFilename.Replace( wxT( "\\" ), wxT( "/" ) ); newRelativeFilename.Replace( wxT( "\\" ), wxT( "/" ) );
wxString oldFilename = m_sheet->GetFields()[ SHEETFILENAME ].GetText(); wxString oldFilename = m_sheet->GetFields()[ SHEETFILENAME ].GetText();
oldFilename.Replace( wxT( "\\" ), wxT( "/" ) ); oldFilename.Replace( wxT( "\\" ), wxT( "/" ) );
@ -263,9 +272,7 @@ bool DIALOG_SCH_SHEET_PROPS::TransferDataFromWindow()
if( filename_changed ) if( filename_changed )
{ {
bool ok = onSheetFilenameChanged( newRelativeFilename ); if( !onSheetFilenameChanged( newRelativeFilename ) )
if( !ok )
return false; return false;
} }
@ -323,7 +330,6 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
// Relative file names are relative to the path of the current sheet. This allows for // Relative file names are relative to the path of the current sheet. This allows for
// nesting of schematic files in subfolders. // nesting of schematic files in subfolders.
wxFileName fileName( aNewFilename ); wxFileName fileName( aNewFilename );
fileName.SetExt( LegacySchematicFileExtension );
if( !fileName.IsAbsolute() ) if( !fileName.IsAbsolute() )
{ {
@ -331,8 +337,12 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
wxCHECK_MSG( currentScreen, false, "Invalid sheet path object." ); wxCHECK_MSG( currentScreen, false, "Invalid sheet path object." );
wxFileName currentSheetFileName = currentScreen->GetFileName(); wxFileName currentSheetFileName = currentScreen->GetFileName();
wxCHECK_MSG( fileName.Normalize( wxPATH_NORM_ALL, currentSheetFileName.GetPath() ), false,
"Cannot normalize new sheet schematic file path." ); if( !fileName.Normalize( wxPATH_NORM_ALL, currentSheetFileName.GetPath() ) )
{
wxFAIL_MSG( "Cannot normalize new sheet schematic file path." );
return false;
}
} }
wxString newAbsoluteFilename = fileName.GetFullPath(); wxString newAbsoluteFilename = fileName.GetFullPath();
@ -374,7 +384,6 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
if( !IsOK( this, msg ) ) if( !IsOK( this, msg ) )
return false; return false;
} }
else // New file. else // New file.
{ {
@ -541,10 +550,39 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
void DIALOG_SCH_SHEET_PROPS::OnGridCellChanging( wxGridEvent& event ) void DIALOG_SCH_SHEET_PROPS::OnGridCellChanging( wxGridEvent& event )
{ {
bool success = true;
wxGridCellEditor* editor = m_grid->GetCellEditor( event.GetRow(), event.GetCol() ); wxGridCellEditor* editor = m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
wxControl* control = editor->GetControl(); wxControl* control = editor->GetControl();
wxTextEntry* textControl = dynamic_cast<wxTextEntry*>( control );
if( control && control->GetValidator() && !control->GetValidator()->Validate( control ) ) // Short-circuit the validator's more generic "can't be empty" message for the
// two mandatory fields:
if( event.GetRow() == SHEETNAME && event.GetCol() == FDC_VALUE )
{
if( textControl && textControl->IsEmpty() )
{
wxMessageBox( _( "A sheet must have a name." ) );
success = false;
}
}
else if( event.GetRow() == SHEETFILENAME && event.GetCol() == FDC_VALUE )
{
if( textControl && textControl->IsEmpty() )
{
wxMessageBox( _( "A sheet must have a file specified." ) );
success = false;
}
else if( textControl && !textControl->GetValue().EndsWith( wxT( ".sch" ) ) )
{
wxMessageBox( _( "Sheet filename must have a '.sch' extension." ) );
success = false;
}
}
if( success && control && control->GetValidator() )
success = control->GetValidator()->Validate( control );
if( !success )
{ {
event.Veto(); event.Veto();
m_delayedFocusRow = event.GetRow(); m_delayedFocusRow = event.GetRow();

View File

@ -664,6 +664,7 @@ void SCH_LEGACY_PLUGIN::loadHierarchy( SCH_SHEET* aSheet )
// stores the file name and extension. Add the project path to the file name and // stores the file name and extension. Add the project path to the file name and
// extension to compare when calling SCH_SHEET::SearchHierarchy(). // extension to compare when calling SCH_SHEET::SearchHierarchy().
wxFileName fileName = aSheet->GetFileName(); wxFileName fileName = aSheet->GetFileName();
fileName.SetExt( "sch" );
if( !fileName.IsAbsolute() ) if( !fileName.IsAbsolute() )
fileName.MakeAbsolute( m_currentPath.top() ); fileName.MakeAbsolute( m_currentPath.top() );

View File

@ -116,11 +116,10 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
wxFileName fileName( aFileName ); wxFileName fileName( aFileName );
if( !fileName.IsAbsolute() ) if( !fileName.IsAbsolute() && !fileName.MakeAbsolute() )
{ {
wxCHECK_MSG( fileName.MakeAbsolute(), false, wxFAIL_MSG( wxString::Format( "Cannot make file name \"%s\" path absolute.", aFileName ) );
wxString::Format( "Cannot make file name \"%s\" path absolute.", return false;
aFileName ) );
} }
wxString fullFilename = fileName.GetFullPath(); wxString fullFilename = fileName.GetFullPath();