!7 sclass Tab { S name; } compact module Tabs { new L tabs_actual; transient L tabs; transient JTabbedPane jtabs; start { tabs = notifyingList(tabs_actual, r change + r updateTabs); } visualize { jtabs = jtabs(); updateTabs(); ret withButtonsAbove(jtabs, "+", rThread { inputText("Name for new tab", vf addTab) }); } void updateTabs q { fillJTabs(jtabs, syncCollect name(tabs)); } // API void addTab(S name) { tabs.add(nu(Tab, +name)); } }