1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.ui.panel;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.profile.OceanusProfile;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
22 import io.github.tonywasher.joceanus.metis.ui.MetisAction;
23 import io.github.tonywasher.joceanus.metis.ui.MetisErrorPanel;
24 import io.github.tonywasher.joceanus.metis.ui.MetisIcon;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseRegion;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseRegion.MoneyWiseRegionList;
29 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
30 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseUIResource;
31 import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseBaseTable;
32 import io.github.tonywasher.joceanus.moneywise.ui.dialog.MoneyWiseRegionDialog;
33 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
34 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
35 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
36 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
37 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIButton;
38 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIControl.TethysUIIconMapSet;
39 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
40 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBoxPaneManager;
41 import io.github.tonywasher.joceanus.tethys.api.table.TethysUITableManager;
42
43
44
45
46 public class MoneyWiseRegionTable
47 extends MoneyWiseBaseTable<MoneyWiseRegion> {
48
49
50
51 private final TethysUIBoxPaneManager theFilterPanel;
52
53
54
55
56 private final MoneyWiseRegionDialog theActiveRegion;
57
58
59
60
61 private MoneyWiseRegionList theRegions;
62
63
64
65
66
67
68
69
70 MoneyWiseRegionTable(final MoneyWiseView pView,
71 final PrometheusEditSet pEditSet,
72 final MetisErrorPanel pError) {
73
74 super(pView, pEditSet, pError, MoneyWiseBasicDataType.REGION);
75
76
77 final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
78 final TethysUITableManager<MetisDataFieldId, MoneyWiseRegion> myTable = getTable();
79
80
81 final TethysUIButton myNewButton = myGuiFactory.buttonFactory().newButton();
82 MetisIcon.configureNewIconButton(myNewButton);
83
84
85 theFilterPanel = myGuiFactory.paneFactory().newHBoxPane();
86 theFilterPanel.addSpacer();
87 theFilterPanel.addNode(myNewButton);
88
89
90 theActiveRegion = new MoneyWiseRegionDialog(myGuiFactory, pEditSet, this);
91 declareItemPanel(theActiveRegion);
92
93
94 myTable.setDisabled(MoneyWiseRegion::isDisabled)
95 .setComparator(MoneyWiseRegion::compareTo);
96
97
98 myTable.declareStringColumn(PrometheusDataResource.DATAITEM_FIELD_NAME)
99 .setValidator(this::isValidName)
100 .setCellValueFactory(MoneyWiseRegion::getName)
101 .setEditable(true)
102 .setColumnWidth(WIDTH_NAME)
103 .setOnCommit((r, v) -> updateField(MoneyWiseRegion::setName, r, v));
104
105
106 myTable.declareStringColumn(PrometheusDataResource.DATAITEM_FIELD_DESC)
107 .setValidator(this::isValidDesc)
108 .setCellValueFactory(MoneyWiseRegion::getDesc)
109 .setEditable(true)
110 .setColumnWidth(WIDTH_DESC)
111 .setOnCommit((r, v) -> updateField(MoneyWiseRegion::setDescription, r, v));
112
113
114 final TethysUIIconMapSet<MetisAction> myActionMapSet = MetisIcon.configureStatusIconButton(pView.getGuiFactory());
115 myTable.declareIconColumn(PrometheusDataResource.DATAITEM_TOUCH, MetisAction.class)
116 .setIconMapSet(r -> myActionMapSet)
117 .setCellValueFactory(r -> r.isActive() ? MetisAction.ACTIVE : MetisAction.DELETE)
118 .setName(MoneyWiseUIResource.STATICDATA_ACTIVE.getValue())
119 .setEditable(true)
120 .setCellEditable(r -> !r.isActive())
121 .setColumnWidth(WIDTH_ICON)
122 .setOnCommit((r, v) -> updateField(this::deleteRow, r, v));
123
124
125 myNewButton.getEventRegistrar().addEventListener(e -> addNewItem());
126 theActiveRegion.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> handlePanelState());
127 }
128
129 @Override
130 protected boolean isItemEditing() {
131 return theActiveRegion.isEditing();
132 }
133
134
135
136
137
138
139 protected TethysUIBoxPaneManager getFilterPanel() {
140 return theFilterPanel;
141 }
142
143 @Override
144 protected void refreshData() throws OceanusException {
145
146 OceanusProfile myTask = getView().getActiveTask();
147 myTask = myTask.startTask("Regions");
148
149
150 final MoneyWiseDataSet myData = getView().getData();
151 final MoneyWiseRegionList myBase = myData.getRegions();
152 theRegions = myBase.deriveEditList(getEditSet());
153 getTable().setItems(theRegions.getUnderlyingList());
154
155
156 theActiveRegion.refreshData();
157 restoreSelected();
158
159
160 myTask.end();
161 }
162
163 @Override
164 public void cancelEditing() {
165 super.cancelEditing();
166 theActiveRegion.setEditable(false);
167 }
168
169
170
171
172
173
174 void selectRegion(final MoneyWiseRegion pRegion) {
175
176 getTable().selectRow(pRegion);
177 }
178
179 @Override
180 protected void handleRewind() {
181
182 if (!theActiveRegion.isEditing()) {
183
184 setEnabled(true);
185 super.handleRewind();
186 }
187
188
189 notifyChanges();
190 }
191
192
193
194
195 private void handlePanelState() {
196
197 if (!theActiveRegion.isEditing()) {
198
199 setEnabled(true);
200 final MoneyWiseRegion myRegion = theActiveRegion.getSelectedItem();
201 updateTableData();
202 if (myRegion != null) {
203 getTable().selectRow(myRegion);
204 } else {
205 restoreSelected();
206 }
207 } else {
208 getTable().cancelEditing();
209 }
210
211
212 notifyChanges();
213 }
214
215
216
217
218 private void addNewItem() {
219
220 try {
221
222 cancelEditing();
223
224
225 final OceanusProfile myTask = getView().getNewProfile("addNewItem");
226
227
228 myTask.startTask("buildItem");
229 final MoneyWiseRegion myRegion = theRegions.addNewItem();
230 myRegion.setDefaults();
231
232
233 myTask.startTask("incrementVersion");
234 myRegion.setNewVersion();
235 myRegion.adjustMapForItem();
236 getEditSet().incrementVersion();
237
238
239 myTask.startTask("validate");
240 myRegion.validate();
241
242
243 myTask.startTask("setItem");
244 theActiveRegion.setNewItem(myRegion);
245
246
247 setTableEnabled(false);
248 myTask.end();
249
250
251 } catch (OceanusException e) {
252
253 final OceanusException myError = new MoneyWiseDataException("Failed to create new region", e);
254
255
256 setError(myError);
257 }
258 }
259 }