!7 sclass ModuleList extends DynCalculatedList { start { dm_vmBus_onMessage('moduleDeleted, rstUpdate()); } O getModule(S item) { ret item == null ? null : callCreator('getModuleByID, firstIntAsString(item)); } visualize { JList list = assertNotNull("JList", (JList) super.visualize()); onDoubleClickOrEnter(list, voidfunc(fS s) { dm_showModule(getModule(s)) }); for (final Pair> p : dm_moduleMenuItems()) listPopupMenuItem(list, p.a, voidfunc(fS s) { thread { callF(p.b, getModule(s)); } }); ret list; } LS calc() { ret map(func(final O m) -> S { "[" + dm_moduleID(m) + "] " + or2(pcallF(func -> S { dm_moduleName(m) }), "?") }, modulesToList()); } L modulesToList() { ret dm_listStems(); } }