switchable S caseID;
switchable float tableFontSize = 0; // 0 for default
transient Concepts cc = db_mainConcepts();
transient Class conceptClass;
transient SimpleCRUD_v2 crud;
transient bool addCountToName = true, addCountToName_installed;
transient bool useInternalFramesForForms = true;
void start_DynCRUD {
ifndef NoMainConcepts // set flag to save space
if (cc == db_mainConcepts())
dbWithCase(caseID); // So we can do stuff in overridden start methods
endifndef
crud = makeCRUD(); // so we can customize early
if (addCountToName) addCountToName();
}
JComponent visualizeWithCountInTab() {
JComponent c = visualize();
bindToComponent(table(), r updateTabTitle);
onConceptChange(cc, r updateTabTitle);
ret c;
}
void updateTabTitle {
updateEnclosingTabTitleWithCount(table(), conceptCount());
}
visualize {
if (crud == null) start_DynCRUD();
if (useInternalFramesForForms)
crud.showAForm = (title, parts) -> {
//formLayouter1_yPlus = 35;
JComponent form = makeForm_customLayout_b(true, formLayouter1b(), parts);
dm_showExtraFrame(title, withRightAndBottomMargin(form),
/*usePreferredSizeInitially := true*/);
ret form;
};
crud.idWidth = 0;
crud.tableFontSize = zeroToNull(tableFontSize);
ret withMargin(crud.make_dontStartBots());
}
SimpleCRUD_v2 makeCRUD() {
ret SimpleCRUD_v2(cc, conceptClass);
}
JTable table() { ret crud?.table; }
A selected() { ret crud?.selectedConcept(); }
A getItem(int row) { ret crud?.getItem(row); }
// call these in visualize() only (after calling super.visualize())
void addButton(JComponent button) {
if (crud != null) addComponent(crud.buttons, button);
}
void addButton(S name, Runnable action) { addButton(jbutton(name, action)); }
void addSelectionDependentButton(S name, O action) {
addButton(tableDependentButton(table(), name, toRunnable(action)));
}
void makeSortable() { // broken?
addRowSorter(table());
rowSorter_setComparatorForAllColumns(table(), alphaNumComparator());
}
S searchTerm() {
ret crud == null || crud.tableSearcher == null ? null : gtt(crud.tableSearcher.tfInput);
}
void addCountToName {
if (addCountToName_installed) ret;
addCountToName_installed = true;
onConceptChangeAndNow(cc, rEnter { setModuleName(dm_originalModuleName() + " (" + nObjects(conceptCount()) + ")") });
}
Concepts conceptsObject() {
ret crud.concepts;
}
// overwrite for compact modules to work
L list(Class c) {
ret conceptsObject().list(c);
}
L list(Concepts cc, Class c) {
ret cc.list(c);
}
// API
L concepts() enter { ret list(conceptClass); }
L data() { ret concepts(); }
L list() { ret concepts(); }
L conceptsOfType(S type) enter { ret conceptsObject().list(type); }
// TODO: use index
L conceptsOfTypeWhere(S type, O[] params) enter {
ret filterConcepts(conceptsOfType(type), params);
}
int conceptCount() enter { ret countConcepts(cc, conceptClass); }
void deleteAll() enter {
deleteConcepts(cc, conceptClass);
}
void addDialog() enter { crud.newConcept(); }
A uniqConcept(O... params) {
ret uniq_sync(cc, conceptClass, params);
}
Pair uniqConcept2(O... params) {
ret uniq2_sync(cc, conceptClass, params);
}
int cset(Concept c, O... values) {
ret _cset(c, values);
}