1 | sbool SimpleCRUD_searcher = true; |
2 | |
3 | sclass SimpleCRUD<A extends Concept> {
|
4 | Class<A> cc; |
5 | JTable table; |
6 | JPanel buttons, panel; |
7 | O renderer; // optional, func(A) -> Map |
8 | S hID = "ID"; |
9 | Set<S> excludeFieldsFromEditing; |
10 | |
11 | *(Class<A> *cc) {}
|
12 | |
13 | SimpleCRUD<A> show(S frameTitle) {
|
14 | make(); |
15 | showFrame(frameTitle, panel); |
16 | this; |
17 | } |
18 | |
19 | SimpleCRUD<A> show() {
|
20 | ret show(plural(shortClassName(cc))); |
21 | } |
22 | |
23 | SimpleCRUD<A> showMaximized() { show(); maximizeFrame(panel); ret this; }
|
24 | |
25 | JPanel make() {
|
26 | db(); |
27 | framesBot(); |
28 | // next line not in swing part to allow passing arguments |
29 | // from outside like showConceptsTable_afterUpdate |
30 | table = makeConceptsTable(cc, wrapRenderer(renderer)); |
31 | swing {
|
32 | panel = centerAndSouthWithMargin(SimpleCRUD_searcher ? tableWithSearcher(table, withMargin := true) : table, buttons = jRightAlignedLine( |
33 | jbutton("Add...", r { newConcept() }),
|
34 | tableDependButton(table, jbutton("Edit", r {
|
35 | editConcept(selectedConcept()) |
36 | })), |
37 | tableDependButton(table, jbutton("Delete", r {
|
38 | final L<A> l = selectedConcepts(); |
39 | withDBLock(r { for (A c : l) c.delete() });
|
40 | })))); |
41 | |
42 | O fEdit = voidfunc(int row) {
|
43 | editConcept((A) getConcept(toLong(getTableCell(table, row, 0)))) |
44 | }; |
45 | tablePopupMenuItem(table, "Edit...", fEdit); |
46 | onDoubleClick(table, fEdit); |
47 | } |
48 | ret panel; |
49 | } |
50 | |
51 | O wrapRenderer(fO renderer) {
|
52 | ret renderer == null ? null : func(A a) {
|
53 | putAll(litorderedmap(hID, str(a.id)), (Map) callF(renderer, a)) |
54 | }; |
55 | } |
56 | |
57 | void newConcept {
|
58 | final A c = unlisted(cc); |
59 | final Map<S, JComponent> map = makeComponents(c); |
60 | Runnable r = r {
|
61 | register(c); |
62 | saveData(c, map); |
63 | }; |
64 | showFormTitled("New " + shortClassName(cc), arrayPlus(mapToObjectArray(map), r));
|
65 | } |
66 | |
67 | void editConcept(final A c) {
|
68 | if (c == null) ret; |
69 | final Map<S, JComponent> map = makeComponents(c); |
70 | Runnable r = r { saveData(c, map) };
|
71 | showFormTitled("Edit " + shortClassName(cc) + " #" + c.id, arrayPlus(mapToObjectArray(map), r));
|
72 | } |
73 | |
74 | A selectedConcept() {
|
75 | ret (A) getConcept(toLong(selectedTableCell(table, 0))); |
76 | } |
77 | |
78 | L<A> selectedConcepts() {
|
79 | int[] rows = table.getSelectedRows(); |
80 | new L<A> l; |
81 | for (int row : rows) |
82 | l.add((A) getConcept(toLong(getTableCell(table, row, 0)))); |
83 | ret l; |
84 | } |
85 | |
86 | Map<S, JComponent> makeComponents(A c) {
|
87 | Map<S, JComponent> map = litorderedmap(); |
88 | makeComponents(c, map); |
89 | ret map; |
90 | } |
91 | |
92 | JComponent fieldComponent(A c, S field) {
|
93 | Class type = getFieldType(cc, field); |
94 | O value = getOpt(c, field); |
95 | //print("Field type: " + field + " => " + type);
|
96 | if (type == bool.class) |
97 | ret jCenteredCheckBox(isTrue(value)); |
98 | else try {
|
99 | ret autoComboBox(structureOrText_crud(value), new TreeSet<S>(map structureOrText_crud(collect(list(cc), field)))); |
100 | } catch e {
|
101 | printException(e); |
102 | ret jTextField(structureOrText_crud(value)); |
103 | } |
104 | } |
105 | |
106 | void saveComponent(A c, S field, JComponent comp) {
|
107 | comp = unwrap(comp); |
108 | if (comp instanceof JTextComponent) |
109 | cset(c, field, convertToField(getTextTrim((JTextComponent) comp), cc, field)); |
110 | else if (comp instanceof JComboBox) |
111 | cset(c, field, convertToField(getTextTrim((JComboBox) comp), cc, field)); |
112 | else if (comp instanceof JCheckBox) |
113 | cset(c, field, isChecked((JCheckBox) comp)); |
114 | ifclass ImageChooser |
115 | else if (comp instanceof ImageChooser) |
116 | cUpdatePNGFile(c, field, comp/ImageChooser.getImage(), false); |
117 | endif |
118 | } |
119 | |
120 | L<S> fields() {
|
121 | ret listWithoutSet([S field : conceptFieldsInOrder(cc) | fieldType(cc, field) != Concept.Ref.class], excludeFieldsFromEditing); |
122 | } |
123 | |
124 | // override the following two methods to customize edit window |
125 | |
126 | void makeComponents(A c, Map<S, JComponent> map) {
|
127 | for (S field : fields()) |
128 | map.put(field, fieldComponent(c, field)); |
129 | } |
130 | |
131 | void saveData(A c, Map<S, JComponent> components) {
|
132 | for (S field : keys(components)) |
133 | saveComponent(c, field, components.get(field)); |
134 | } |
135 | } |
Began life as a copy of #1006540
download show line numbers debug dex old transpilations
Travelled to 11 computer(s): bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1019715 |
| Snippet name: | SimpleCRUD - older version |
| Eternal ID of this version: | #1019715/1 |
| Text MD5: | a590fc349d23e561ce13bcb3f0de8a52 |
| Author: | stefan |
| Category: | javax / concepts / gui |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-11-23 15:42:14 |
| Source code size: | 4254 bytes / 135 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 485 / 522 |
| Referenced in: | [show references] |