35#include <wx/stc/stc.h>
39 wxWindow* aParent, std::shared_ptr<DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA> aConstraintData ) :
45 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
47 m_textCtrl =
new wxStyledTextCtrl(
this, wxID_ANY );
48 sizer->Add(
m_textCtrl, 1, wxEXPAND | wxALL, 5 );
58 []( wxKeyEvent& aEvent )
63 [
this]( wxStyledTextEvent& aEvent )
100 (void) aValidationMessage;
115 return wxEmptyString;
121 if( aEvent.GetModifiers() == wxMOD_CONTROL && aEvent.GetKey() ==
' ' )
132 enum class EXPR_CONTEXT_T :
int
140 std::stack<wxString> sexprs;
142 EXPR_CONTEXT_T context = EXPR_CONTEXT_T::NONE;
144 for(
int i = startPos; i < currentPos; ++i )
152 else if( context == EXPR_CONTEXT_T::STRING )
155 context = EXPR_CONTEXT_T::NONE;
159 partial = wxEmptyString;
160 context = EXPR_CONTEXT_T::STRING;
164 if( context == EXPR_CONTEXT_T::SEXPR_OPEN && !partial.IsEmpty() )
167 sexprs.push( partial );
170 partial = wxEmptyString;
171 context = EXPR_CONTEXT_T::SEXPR_OPEN;
175 if( !sexprs.empty() )
178 context = EXPR_CONTEXT_T::NONE;
182 if( context == EXPR_CONTEXT_T::SEXPR_OPEN && !partial.IsEmpty() )
185 sexprs.push( partial );
186 context = EXPR_CONTEXT_T::SEXPR_TOKEN;
187 partial = wxEmptyString;
191 context = EXPR_CONTEXT_T::NONE;
201 if( context == EXPR_CONTEXT_T::SEXPR_OPEN )
206 tokens = wxT(
"rule|version" );
208 else if( sexprs.top() == wxT(
"rule" ) )
211 tokens = wxT(
"condition|constraint|layer|severity" );
213 else if( sexprs.top() == wxT(
"constraint" ) )
216 tokens = wxT(
"min|max|opt" );
219 else if( context == EXPR_CONTEXT_T::SEXPR_TOKEN )
221 if( !sexprs.empty() && sexprs.top() == wxT(
"constraint" ) )
224 tokens = wxT(
"annular_width|"
228 "courtyard_clearance|"
231 "diff_pair_uncoupled|"
239 "min_resolved_spokes|"
240 "physical_clearance|"
241 "physical_hole_clearance|"
246 "thermal_relief_gap|"
247 "thermal_spoke_width|"
249 "track_segment_length|"
255 else if( !sexprs.empty() && sexprs.top() == wxT(
"layer" ) )
258 tokens = wxT(
"inner|outer" );
260 else if( !sexprs.empty() && sexprs.top() == wxT(
"severity" ) )
263 tokens = wxT(
"error|warning|ignore|exclusion" );
267 if( !tokens.IsEmpty() )
283 if( rulesText.Trim().IsEmpty() )
285#if wxCHECK_VERSION( 3, 3, 2 )
286 m_tipWindow = wxTipWindow::New(
this,
_(
"No rule text to check." ) );
288 m_tipWindow =
new wxTipWindow(
this,
_(
"No rule text to check." ) );
298 std::vector<std::shared_ptr<DRC_RULE>> dummyRules;
301 parser.
Parse( dummyRules, &reporter );
305 reporter.
Report( wxString::Format(
_(
"ERROR at line %d, column %d: %s" ),
320 message =
_(
"Syntax check passed with warnings:\n" ) + reporter.
GetMessages();
324 message =
_(
"Syntax OK" );
327#if wxCHECK_VERSION( 3, 3, 2 )
bool TransferDataFromWindow() override
wxStyledTextCtrl * m_textCtrl
bool TransferDataToWindow() override
wxTipWindow * m_tipWindow
~DRC_RE_CUSTOM_RULE_PANEL() override
void onScintillaCharAdded(wxStyledTextEvent &aEvent)
bool ValidateInputs(int *aErrorCount, wxString *aValidationMessage) override
wxString GenerateRule(const RULE_GENERATION_CONTEXT &aContext) override
std::shared_ptr< DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA > m_constraintData
std::unique_ptr< SCINTILLA_TRICKS > m_scintillaTricks
wxButton * m_checkSyntaxBtn
DRC_RE_CUSTOM_RULE_PANEL(wxWindow *aParent, std::shared_ptr< DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA > aConstraintData)
void onCheckSyntax(wxCommandEvent &aEvent)
void Parse(std::vector< std::shared_ptr< DRC_RULE > > &aRules, REPORTER *aReporter)
virtual bool HasMessageOfSeverity(int aSeverityMask) const
Returns true if the reporter has one or more messages matching the specified severity mask.
virtual bool HasMessage() const
Returns true if any messages were reported.
A wrapper for reporting to a wxString object.
REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
const wxString & GetMessages() const
A filename or source description, a problem input line, a line number, a byte offset,...
int lineNumber
at which line number, 1 based index.
const wxString ParseProblem()
int byteIndex
at which byte offset within the line, 1 based index