!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; } // c2 is the dependent concept (ScenarioCondition) void addDependency(Class c2, S field) { Class c1 = fieldType(c2, field); int i1 = idx(c1), i2 = idx(c2); NameBasedVoiceCRUD originalCRUD2 = voiceCRUDs.get(i2); S conceptName = originalCRUD2.concept; NameBasedVoiceCRUD crud = voiceCRUDs.get(i1); printVars("addDependency", +c1, +c2, +conceptName, +field, +i1, +i2); crud.select = value -> { printVars("addDependency", +value, +i2); crud.select_base((Concept) value); voiceCRUDs.set(i2, value == null ? null : NameBasedVoiceCRUD(c2, conceptName, field, value)); }; crud.select(null); } }