!7 sclass 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_fieldLabel('computerID)), jbutton("Say", rThread sayIt)), dm_rightAlignedFieldCheckBox('enabled))); } // API void say(S s) enter { { lock lock; setText(s); } if (printStackTraces) printStackTrace(); sayIt(); } void sayIt enter { if (!enabled || !isComputerID(computerID)) ret; S s = trim(getText()); if (empty(s)) ret; dm_evalOnOtherMachine(computerID, 'dm_say, s); } void clear() { setText(""); } void setVoice(S voice) {} void preload(S s) {} }