!7 sclass VoiceOutput > DynTextArea { S voice; void start { if (empty(voice)) setField(voice := first(cereprocVoices())); } JComponent visualize() { bindComboBoxToLiveValue_debug.set(true); JComponent c = super.visualize(); enableWordWrapForTextArea(textArea); jPreemptEnterKey(textArea, rThread sayIt); ret centerAndSouthWithMargins(c, centerAndEastWithMarginInbetween(withLabel("Voice:", jLiveValueComboBox(cereprocVoices(), dm_fieldLiveValue('voice))), jbutton("Say", rThread sayIt))); } void say(S s) { { temp enter(); setText(s); } sayIt(); } void sayIt { S s = trim(getText()); if (empty(s) || empty(voice)) ret; if (isCereprocVoice(voice)) cereproc(voice, s); else print("Missing voice: " + voice); } void clear() { setText(""); } }