sclass Tab { S name; } compact module Tabs { L tabs = notifyingList(r { dm_q(r updateTabs) }); transient JTabbedPane jtabs; visualize { jtabs = jtabs(); updateTabs(); ret withLeftAlignedButtonsAbove(jtabs, "+", rThread { inputText("Name for new tab", voidfunc(S s) { addTab(s) }) }, ); } void updateTabs { if (jtabs == null) ret; fillJTabs(jtabs, collect name(tabs)); } // API void addTab(S name) { tabs.add(nu(Tab, name)); } }