static void fillJMenu(final JMenu m, O... x) { ifdef fillJMenu_debug //print("fillJMenu " + m); if (x == null) ret; for i over x: { O o = x[i], y = get(x, i+1); if (o instanceof L) fillJMenu(m, asArray((L) o)); else if (eqOneOf(o, "***", "---", "===", "")) m.addSeparator(); ifclass LiveValue else if (o instanceof LiveValue && o/LiveValue.getType() == S.class && isRunnableX(y)) { final LiveValue lv = cast o; final JMenuItem mi = jmenuItem(or2(lv!, "..."), y); bindLiveValueListenerToComponent(mi, lv, r { S s = lv!; if (isCurlyBracketed(s)) { setEnabled(mi, false); s = unCurlyBracket(s); } else setEnabled(mi, true); setText(mi, s); revalidate(m); }); print("bound live value " + lv + " to menu item " + mi); m.add(mi); ++i; } endif else if (o instanceof S && isRunnableX(y)) { m.add(jmenuItem((S) o, y)); ++i; } else if (o instanceof JMenuItem) m.add((JMenuItem) o); // "call" might use wrong method else if (o instanceof S || o instanceof Action || o instanceof Component) call(m, "add", o); else print("Unknown menu item: " + o); } }