!7 cmodule VoiceOutput > DynTextArea { S computerID; bool enabled, printStackTraces; S switchableFields() { ret 'printStackTraces; } start { dm_vmBus_answerToMessage('voiceOutputModule, func { dm_moduleID() }); } visualize { JComponent ta = super.visualize(); enableWordWrapForTextArea(textArea); onCtrlEnter(textArea, rThread sayIt); ret centerAndSouthWithMargins(ta, jvstackWithSpacing( centerAndEastWithMargin(withLabel("Send to computer:", dm_fieldTextField('computerID)), jbutton("Say", rThread sayIt)), dm_rightAlignedFieldCheckBox('enabled))); } // API void say(S s) enter { { lock lock; setText(s); } if (printStackTraces) printStackTrace(); sayItIfEnabled(); } void sayItIfEnabled { if (enabled) sayIt(); } void sayIt enter { if (!isComputerID(computerID)) ret; S s = trim(getText()); if (empty(s)) ret; dm_evalOnOtherMachine(computerID, "dm_say(" + quote(s) + ");"); } void clear() { setText(""); } void setVoice(S voice) {} void preload(S s) {} }