!include once #1027578 // Named asclass DynVoiceMultiCRUD extends DynModule { srecord Table(S tabName, S name, Class conceptClass) {} transient L tables; transient L swingCRUDs; transient L voiceCRUDs; start { tables = makeTables(); startCRUDs(); } // override me L
makeTables() { ret ll(); } void startCRUDs { swingCRUDs = map(tables, t -> CRUD(t.conceptClass)); voiceCRUDs = map(tables, t -> NameBasedVoiceCRUD(t.conceptClass, t.name)); } int idx(Class c) { ret indexOfPred(tables, t -> t.conceptClass == c); } !include #1027563 // Undo Manager S answer(S s) { ret dm_q(() -> { print("answering: " + s); try answer undoActions(s); try answer moreActions(s); for (NameBasedVoiceCRUD crud : nonNulls(voiceCRUDs)) { crud.addUndo = (IVF1) lambda1 addUndo; try answer crud.answer(s); } null; }); } // override me S moreActions(S s) { null; } visual { JComponent c = jtabs(pairsToParams(mapPairsToList(zipTwoListsToPairs(tables, swingCRUDs), (t, crud) -> pair(t.tabName, crud.visualize())))); if (nempty(swingCRUDs)) addComponent(first(swingCRUDs).crud.buttons, jbutton("Talk to raw backend", rThread talkToMe)); ret c; } void talkToMe enter { dm_showConversationPopupForModule(); } // e.g. for concept ScenarioCondition > Named { Scenario scenario; } void addDependency(Class c1, S field) { int i1 = idx(c1); Class c2 = fieldType(c1, field); int i2 = idx(c2); NameBasedVoiceCRUD originalCRUD2 = voiceCRUDs.get(i2); NameBasedVoiceCRUD crud = voiceCRUDs.get(i1); crud.select = value -> { crud.select_base(value); voiceCRUDs.set(i2, value == null ? null : NameBasedVoiceCRUD(originalCRUD2.conceptClass, originalCRUD2.concept, field, value)); }; crud.select(null); } }