abstract sclass DynTextArea extends DynModule { S text; bool noGrab; // noGrab = don't save what user types transient bool enableUndo = true; transient JTextArea textArea; visualize { textArea = typeWriterTextArea(text); if (enableUndo) jEnableUndoRedo(textArea); ret awtEvery(textArea, 10000, r swingToData); } void swingToData { if (textArea != null && !noGrab) setText(main.getText(textArea)); } void unvisualize { swingToData(); super.unvisualize(); } // API void setText(S text) enter { if (neq(this.text, text)) { setField(+text); setTextKeepCaret(textArea, text); } } S getText() { swingToData(); ret text; } void clearText() { setText(""); } void printToText(O o) { setText(getText() + str(o) + "\n"); moveCaretToEnd(textArea); } }