beaConcept BInput { S text; toString { ret "[\*id*/] Input " + quote(text); } } beaConcept BOutput { S text; toString { ret "[\*id*/] Output " + quote(text); } } asclass DynBEAReactor_textInOut > DynBEAReactor { S input, output; transient RightAlignedLine inputButtons; visual jvsplit(0.2, jhsplit(jCenteredSection("Input", centerAndSouth(center, withMargin(inputButtons = RightAlignedLine( dm_wordWrapTextArea input(), "Load input", rThreadEnter loadInput, "Load & process", rThreadEnter loadAndProcess))), dm_wordWrapTextAreaAsSection output()), super); @Override bool hasOutput() { ret hasConcept(BOutput); } void loadInput { setField(output := ""); deleteReactors(); deleteConcepts(BInput); uniq BInput(text := input); } void loadAndProcess { loadInput(); reactUntilOutput(); } }