!7 sclass Entry { S type, text; } cmodule DialogEditor { transient JPanel stack; L entries = synchroList(); start { onChange(r { if (empty(entries) || nempty(last(entries).text)) { entries.add(new Entry); change(); } }); } visualize { stack = dynamicVStack2(); for (Entry e : cloneList(entries)) addAndValidate(stack, makeLine(e)); ret jscroll_trackWidth(stack); } JPanel makeLine(Entry e) { JComboBox cb = jcombobox(ai_lineTypes(), e.type); JTextField tf = jtextfield(e.text); onChange(cb, r { e.type = selectedItem(cb); change(); }); onChange(tf, r { e.text = gtt(tf); change(); }); ret westAndCenterWithMargin(cb, tf); } }