abstract sclass DynTextArea extends DynModule { S text; bool noGrab; // noGrab = don't save what user types transient bool enableUndo = true; transient JTextArea textArea; transient double grabInterval = 10.0; // how often text is grabbed from text area visualize { textArea = typeWriterTextArea(text); if (enableUndo) jEnableUndoRedo(textArea); ret awtEvery(textArea, grabInterval, r swingToData); } void swingToData { if (textArea != null && !noGrab) setText(main.getText(textArea)); } void unvisualize { swingToData(); super.unvisualize(); } // API void setText(S text) enter { if (eq(this.text, text)) ret; setField(+text); setTextKeepCaret(textArea, text); } void setText_big(S text) enter { if (eq(this.text, text)) ret; temp tempSetOpt(module(), noGrab := true); setField(+text); long time = sysNow(); Document doc = defaultStyledDocumentFromString(text); done2_always(time, "Make StyledDocument for " + nChars(text)); time = sysNow(); setDocument(textArea, doc); done2_always(time, "Apply StyledDocument"); } S getText() { swingToData(); ret text; } void clearText() { setText(""); } void printToText(O o) { setText(getText() + str(o) + "\n"); moveCaretToEnd(textArea); } }