!7 sclass Tab { S name, moduleID; } compact module Tabs { new L tabs_actual; transient L tabs; transient JTabbedPane jtabs; start { tabs = notifyingList(tabs_actual, r change + r updateTabs); dm_vmBus_onMessage_q('moduleStarted, voidfunc(S moduleID) { addTabForModule(moduleID) }); dm_vmBus_onMessage_q('moduleDeleted, voidfunc(O module) { removeTabForModule(dm_moduleID(module)) }); } visualize { jtabs = jtabs(); updateTabs(); ret withButtonsAbove(jtabs, "+", rThread dm_newEditor); } void updateTabs q { fillJTabs(jtabs, syncCollect name(tabs)); } void addTabForModule(S moduleID) { if (!containsWhere(tabs, +moduleID)) tabs.add(nu(Tab, name := dm_moduleName(moduleID), +moduleID)); } void removeTabForModule(S moduleID) { removeWhere(tabs, +moduleID); } }