diff --git a/common/scintilla_tricks.cpp b/common/scintilla_tricks.cpp index 9398367045..75dafd93a8 100644 --- a/common/scintilla_tricks.cpp +++ b/common/scintilla_tricks.cpp @@ -54,6 +54,12 @@ SCINTILLA_TRICKS::SCINTILLA_TRICKS( wxStyledTextCtrl* aScintilla, const wxString m_te->SetScrollWidth( 1 ); m_te->SetScrollWidthTracking( true ); + if( m_singleLine ) + { + m_te->SetUseVerticalScrollBar( false ); + m_te->SetUseHorizontalScrollBar( false ); + } + setupStyles(); // Set up autocomplete @@ -65,6 +71,7 @@ SCINTILLA_TRICKS::SCINTILLA_TRICKS( wxStyledTextCtrl* aScintilla, const wxString // Hook up events m_te->Bind( wxEVT_STC_UPDATEUI, &SCINTILLA_TRICKS::onScintillaUpdateUI, this ); + m_te->Bind( wxEVT_STC_MODIFIED, &SCINTILLA_TRICKS::onModified, this ); // Handle autocomplete m_te->Bind( wxEVT_STC_CHARADDED, &SCINTILLA_TRICKS::onChar, this ); @@ -170,6 +177,31 @@ void SCINTILLA_TRICKS::onChar( wxStyledTextEvent& aEvent ) } +void SCINTILLA_TRICKS::onModified( wxStyledTextEvent& aEvent ) +{ + if( m_singleLine ) + { + wxString text = m_te->GetText(); + + if( text.Contains( wxS( "\n" ) ) || text.Contains( wxS( "\r" ) ) ) + { + // Scintilla won't allow us to call SetText() from within this event processor, + // so we have to delay the processing. + CallAfter( [this]() + { + wxString text = m_te->GetText(); + int currpos = m_te->GetCurrentPos(); + + text.Replace( wxS( "\n" ), wxS( "" ) ); + text.Replace( wxS( "\r" ), wxS( "" ) ); + m_te->SetText( text ); + m_te->GotoPos( currpos-1 ); + } ); + } + } +} + + void SCINTILLA_TRICKS::onCharHook( wxKeyEvent& aEvent ) { wxString c = aEvent.GetUnicodeKey(); @@ -267,6 +299,13 @@ void SCINTILLA_TRICKS::onCharHook( wxKeyEvent& aEvent ) str = data.GetText(); ConvertSmartQuotesAndDashes( &str ); + + if( m_singleLine ) + { + str.Replace( wxS( "\n" ), wxEmptyString ); + str.Replace( wxS( "\r" ), wxEmptyString ); + } + m_te->BeginUndoAction(); m_te->AddText( str ); m_te->EndUndoAction(); diff --git a/eeschema/dialogs/dialog_field_properties.cpp b/eeschema/dialogs/dialog_field_properties.cpp index 68f55b7e1e..2661d869a4 100644 --- a/eeschema/dialogs/dialog_field_properties.cpp +++ b/eeschema/dialogs/dialog_field_properties.cpp @@ -160,15 +160,13 @@ void DIALOG_FIELD_PROPERTIES::init() m_CommonConvert->Show( false ); m_CommonUnit->Show( false ); - // Predefined fields cannot contain some chars, or cannot be empty, - // and need a SCH_FIELD_VALIDATOR (m_StyledTextCtrl cannot use a SCH_FIELD_VALIDATOR). - bool use_validator = m_fieldId == REFERENCE_FIELD - || m_fieldId == FOOTPRINT_FIELD - || m_fieldId == DATASHEET_FIELD - || m_fieldId == SHEETNAME_V - || m_fieldId == SHEETFILENAME_V; - - if( use_validator ) + // Predefined fields cannot contain some chars and cannot be empty, so they need a + // SCH_FIELD_VALIDATOR (m_StyledTextCtrl cannot use a SCH_FIELD_VALIDATOR). + if( m_fieldId == REFERENCE_FIELD + || m_fieldId == FOOTPRINT_FIELD + || m_fieldId == DATASHEET_FIELD + || m_fieldId == SHEETNAME_V + || m_fieldId == SHEETFILENAME_V ) { m_TextCtrl->SetValidator( FIELD_VALIDATOR( m_fieldId, &m_text ) ); SetInitialFocus( m_TextCtrl ); @@ -190,9 +188,8 @@ void DIALOG_FIELD_PROPERTIES::init() GetSizer()->SetSizeHints( this ); - // Adjust the height of the scintilla text editor after the first layout - // To show only one line - // (multiline text are is supported in fields and will be removed) + // Adjust the height of the scintilla editor after the first layout to show a single line + // (multiline text is not supported in fields and will be removed) if( m_StyledTextCtrl->IsShown() ) { wxSize maxSize = m_StyledTextCtrl->GetSize(); diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index f7ad13baca..72c7a0404a 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -677,10 +677,7 @@ void SCH_FIELD::OnScintillaCharAdded( SCINTILLA_TRICKS* aScintillaTricks, int start = scintilla->WordStartPosition( pos, true ); wxString partial; - // Currently, '\n' is not allowed in fields. So remove it when entered - // TODO: see if we must close the dialog. However this is not obvious, as - // if a \n is typed (and removed) when a text is selected, this text is deleted - // (in fact replaced by \n, that is removed by the filter) + // Multi-line fields are not allowed. So remove '\n' if entered. if( key == '\n' ) { wxString text = scintilla->GetText(); diff --git a/include/scintilla_tricks.h b/include/scintilla_tricks.h index a749f497d9..b5dd771f95 100644 --- a/include/scintilla_tricks.h +++ b/include/scintilla_tricks.h @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2020-2022 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2020-2023 KiCad Developers, see change_log.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 @@ -60,6 +60,7 @@ protected: void onCharHook( wxKeyEvent& aEvent ); void onChar( wxStyledTextEvent& aEvent ); + void onModified( wxStyledTextEvent& aEvent ); void onScintillaUpdateUI( wxStyledTextEvent& aEvent ); void onThemeChanged( wxSysColourChangedEvent &aEvent );