sclass SimpleCRUD {
Class cc;
JTable table;
JPanel buttons, panel;
*(Class *cc) {}
SimpleCRUD show() {
make();
showFrame(plural(shortClassName(cc)), panel);
this;
}
JPanel make() {
db();
swing {
table = makeConceptsTable(cc);
panel = centerAndSouth(table, buttons = jRightAlignedLine(
jbutton("Add...", r { newConcept() }),
tableDependButton(table, jbutton("Edit", r {
editConcept(selectedConcept())
})),
tableDependButton(table, jbutton("Delete", r {
final A c = selectedConcept();
withDBLock(r { c.delete() });
}))));
tablePopupMenuItem(table, "Edit...", voidfunc(int row) {
editConcept((A) getConcept(toLong(getTableCell(table, row, 0))))
});
}
ret panel;
}
void newConcept {
final Map map = makeComponents(null);
Runnable r = r { saveData(cnew(cc), map) };
showFormTitled("New " + shortClassName(cc), arrayPlus(mapToObjectArray(map), r));
}
void editConcept(final A c) {
if (c == null) ret;
final Map map = makeComponents(c);
Runnable r = r { saveData(c, map) };
showFormTitled("Edit " + shortClassName(cc) + " #" + c.id, arrayPlus(mapToObjectArray(map), r));
}
A selectedConcept() {
ret (A) getConcept(toLong(selectedTableCell(table, 0)));
}
Map makeComponents(A c) {
Map map = litorderedmap();
makeComponents(c, map);
ret map;
}
// override the following two methods to customize edit window
void makeComponents(A c, Map map) {
for (S field : conceptFieldsInOrder(cc))
map.put(field, jTextField(structureOrText_crud(getOpt(c, field))));
}
void saveData(A c, Map components) {
for (S field : keys(components))
if (components.get(field) instanceof JTextField)
cset(c, field, convertToField(getTextTrim((JTextField) components.get(field)), cc, field));
}
}