!7 set flag DynModule. sclass GazelleTree { S line; *() {} *(S *line) {} toString { ret line; } } cmodule TestRuleEngine2 > DynSCP { S input, processedInput; transient ReliableSingleThread rstCalc = dm_rstWithPostDelay(this, r calc, 500); transient int maxResults = 500; transient bool skipBadPredictions = true; transient JTree jTree; transient GazelleTree root; S switchableFields() { ret "skipBadPredictions maxResults"; } start { hideFields = litset('rule, 'mr); } visualize { JComponent tf = dm_textField('input); onChangeAndNow(tf, rstCalc); ret northCenterAndSouthWithMargins( centerAndEastWithMargin( tf, jbutton("Make rule...", rThread makeRule)), jDynamicTree(root), rightAlignedButtons( tableDependentButton(table(), "Mark good", rMark('good)), tableDependentButton(table(), "Mark bad", rMark('bad)), tableDependentButton(table(), "Mark funny", rMark('funny)) )); } Runnable rMark(fS judgement) { ret rThread { /*Entry e = selected(); print("Selected: " + e); e.judgement = judgement; fireDataChanged(); saveEntry(e);*/ }; } void calc { S input = this.input; root = new GazelleTree(input); setComponent(jscroll(jDynamicTree(root))); processedInput = input; } }