!7 sS background = #1009931; static JDesktopPane desktop; static JTextField tfInput; static L onModuleListChange = synchroList(); //static L modules; p-noconsole { autoRestart(5); db(); //modules = listWithMultiNotify(onModuleListChange); desktop = jTiledBackgroundDesktopPane(background); autoFixDesktopPane(desktop); onFrameClosing(showMaximizedFrame(desktop), r { for (Module m) if (m.vis != null) pcall { m.unvisualize(); } cleanKill(); }); final JInternalFrame f = showCenteredInternalFrame(desktop, "Hello", 700, 150, setFontSize(20, tfInput = jcenteredtextfield("Find me some stuff"))); packInternalFrameVertically(f); centerInternalFrame(f); swing { f.setLocation(f.getX(), 40); } cset(uniq(ModuleClasses), on := true); for (Module m : conceptsWhere(Module, on := true)) startModule(m); } svoid startModule(Module m) { //addIfNotThere(modules, m); lock m.lock; if (m.started) ret; m.started = true; m.start(); if (m.visible) showModule(m); } svoid showModule(final Module m) { startModule(m); lock m.lock; m.visible = true; if (m.vis == null) m.vis = m.visualize(); swing { Rect r = m.frameRect; if (r == null) randomRect(desktop.getWidth(), desktop.getHeight(), 10, 150, 100); if (r == null) r = Rect(10, 10, 200, 100); print("Showing frame at " + r); S frameTitle = humanizeFormLabel(shortClassName(m)); onInternalFrameClosing(showInternalFrame(desktop, frameTitle, r.x, r.y, r.w, r.h, m.vis), r { cset(m, visible := false); m.unvisualize(); }); } } concept Module { transient Component vis; transient bool started; transient Lock lock = lock(); bool on = true, visible; Rect frameRect; JComponent visualize() { ret jCenteredMultiLineLabel(sfu(this)); } void unvisualize() {} void start() {} void cleanMeUp() { JInternalFrame f = getInternalFrame(vis); if (f != null) frameRect = toRect(getBounds(f)); } } sclass InterestingStringModule extends Module { S theString; } sclass InputToInterestingString extends Module { transient java.util.Timer timer; void start { timer = doEvery(1000, r { S s = getTextTrim(tfInput); if (!hasModuleWithFields(InterestingStringModule, theString := s)) startModule(nu(InterestingStringModule, theString := s)); }); } void cleanMeUp() { cancelTimer(timer); } } sclass ModuleCount extends Module { JLabel label; void start() { onModuleListChange.add(r { if (label != null) setText(label, lstr(modules)); }); } JComponent visualize() { label = setFontSize(30, jcenteredlabel(lstr(modules))); ret label; } void unvisualize() { label = null; } } sclass ModuleClasses extends Module { transient L> classes; void start() { classes = myNonAbstractClassesImplementing(Module); } JComponent visualize() { JList list = jlist(map shortClassName(classes)); listPopupMenuItem(list, "Instantiate", voidfunc(fS s) { thread { pcall-messagebox { showModule((Module) nu(classForName("main$" + s))); } } }); ret list; } }