36 wxWindow* aParent, std::shared_ptr<DRC_RE_CUSTOM_RULE_CONSTRAINT_DATA> aConstraintData ) :
42 wxBoxSizer* sizer =
new wxBoxSizer( wxVERTICAL );
44 m_textCtrl =
new wxStyledTextCtrl(
this, wxID_ANY );
45 m_textCtrl->SetToolTip(
_(
"Complete rule text in the DRC rule language" ) );
46 sizer->Add(
m_textCtrl, 1, wxEXPAND | wxALL, 5 );
54 [
this]( wxStyledTextEvent& )
65 []( wxKeyEvent& aEvent )
70 [
this]( wxStyledTextEvent& aEvent )
167 if( aEvent.GetModifiers() == wxMOD_CONTROL && aEvent.GetKey() ==
' ' )
178 enum class EXPR_CONTEXT_T :
int
186 std::stack<wxString> sexprs;
188 EXPR_CONTEXT_T context = EXPR_CONTEXT_T::NONE;
190 for(
int i = startPos; i < currentPos; ++i )
198 else if( context == EXPR_CONTEXT_T::STRING )
201 context = EXPR_CONTEXT_T::NONE;
205 partial = wxEmptyString;
206 context = EXPR_CONTEXT_T::STRING;
210 if( context == EXPR_CONTEXT_T::SEXPR_OPEN && !partial.IsEmpty() )
213 sexprs.push( partial );
216 partial = wxEmptyString;
217 context = EXPR_CONTEXT_T::SEXPR_OPEN;
221 if( !sexprs.empty() )
224 context = EXPR_CONTEXT_T::NONE;
228 if( context == EXPR_CONTEXT_T::SEXPR_OPEN && !partial.IsEmpty() )
231 sexprs.push( partial );
232 context = EXPR_CONTEXT_T::SEXPR_TOKEN;
233 partial = wxEmptyString;
237 context = EXPR_CONTEXT_T::NONE;
247 if( context == EXPR_CONTEXT_T::SEXPR_OPEN )
251 tokens = wxT(
"condition|constraint|layer|severity" );
253 else if( sexprs.top() == wxT(
"rule" ) )
256 tokens = wxT(
"condition|constraint|layer|severity" );
258 else if( sexprs.top() == wxT(
"constraint" ) )
261 tokens = wxT(
"min|max|opt" );
264 else if( context == EXPR_CONTEXT_T::SEXPR_TOKEN )
266 if( !sexprs.empty() && sexprs.top() == wxT(
"constraint" ) )
269 tokens = wxT(
"annular_width|"
273 "courtyard_clearance|"
276 "diff_pair_uncoupled|"
284 "min_resolved_spokes|"
285 "physical_clearance|"
286 "physical_hole_clearance|"
291 "thermal_relief_gap|"
292 "thermal_spoke_width|"
294 "track_segment_length|"
300 else if( !sexprs.empty() && sexprs.top() == wxT(
"layer" ) )
303 tokens = wxT(
"inner|outer" );
305 else if( !sexprs.empty() && sexprs.top() == wxT(
"severity" ) )
308 tokens = wxT(
"error|warning|ignore|exclusion" );
312 if( !tokens.IsEmpty() )