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