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 JPanel inputButtons; visual jvsplit(0.2, jhsplit(jCenteredSection("Input", centerAndSouth(dm_wordWrapTextArea input(), withMargin(inputButtons = jRightAlignedButtons( "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(); } }