1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.ui.dialog;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
20 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetBase;
21 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit.MoneyWiseDepositList;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositCategory;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositCategory.MoneyWiseDepositCategoryList;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
29 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoClass;
30 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAssetCategory;
31 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
32 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency.MoneyWiseCurrencyList;
33 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseDepositCategoryClass;
34 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
35 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseIcon;
36 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseUIResource;
37 import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseUIAssetTable;
38 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
39 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
40 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
41 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
42 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
43 import io.github.tonywasher.joceanus.prometheus.ui.fieldset.PrometheusFieldSet;
44 import io.github.tonywasher.joceanus.prometheus.ui.fieldset.PrometheusFieldSetEvent;
45 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
46 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIControl.TethysUIIconMapSet;
47 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
48 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUICharArrayEditField;
49 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUICharArrayTextAreaField;
50 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUIDateButtonField;
51 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUIIconButtonField;
52 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUIMoneyEditField;
53 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUIScrollButtonField;
54 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIDataEditField.TethysUIStringEditField;
55 import io.github.tonywasher.joceanus.tethys.api.field.TethysUIFieldFactory;
56 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollItem;
57 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
58 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu.TethysUIScrollSubMenu;
59
60 import java.util.HashMap;
61 import java.util.Iterator;
62 import java.util.Map;
63
64
65
66
67 public class MoneyWiseUIDepositDialog
68 extends MoneyWiseUIAssetDialog<MoneyWiseDeposit> {
69
70
71
72 private static final String TAB_RATES = MoneyWiseUIResource.DEPOSITPANEL_TAB_RATES.getValue();
73
74
75
76
77 private final PrometheusFieldSet<MoneyWiseDeposit> theFieldSet;
78
79
80
81
82 private final MoneyWiseUIDepositRateTable theRates;
83
84
85
86
87 private Boolean theClosedState = Boolean.FALSE;
88
89
90
91
92
93
94
95
96
97 public MoneyWiseUIDepositDialog(final TethysUIFactory<?> pFactory,
98 final MoneyWiseView pView,
99 final PrometheusEditSet pEditSet,
100 final MoneyWiseUIAssetTable<MoneyWiseDeposit> pOwner) {
101
102 super(pFactory, pEditSet, pOwner);
103
104
105 theFieldSet = getFieldSet();
106 theFieldSet.setReporter(pOwner::showValidateError);
107
108
109 buildMainPanel(pFactory);
110
111
112 buildAccountPanel(pFactory);
113
114
115 buildNotesPanel(pFactory);
116
117
118 theRates = new MoneyWiseUIDepositRateTable(pView, getEditSet(), pOwner.getErrorPanel());
119 theFieldSet.newTable(TAB_RATES, theRates);
120
121
122 theRates.getEventRegistrar().addEventListener(e -> {
123 updateActions();
124 fireStateChanged();
125 });
126 }
127
128
129
130
131
132
133 private void buildMainPanel(final TethysUIFactory<?> pFactory) {
134
135 final TethysUIFieldFactory myFields = pFactory.fieldFactory();
136 final TethysUIStringEditField myName = myFields.newStringField();
137 final TethysUIStringEditField myDesc = myFields.newStringField();
138
139
140 final TethysUIScrollButtonField<MoneyWiseAssetCategory> myCategoryButton = myFields.newScrollField(MoneyWiseAssetCategory.class);
141 final TethysUIScrollButtonField<MoneyWisePayee> myParentButton = myFields.newScrollField(MoneyWisePayee.class);
142 final TethysUIScrollButtonField<MoneyWiseCurrency> myCurrencyButton = myFields.newScrollField(MoneyWiseCurrency.class);
143 final TethysUIIconButtonField<Boolean> myClosedButton = myFields.newIconField(Boolean.class);
144
145
146 theFieldSet.addField(PrometheusDataResource.DATAITEM_FIELD_NAME, myName, MoneyWiseDeposit::getName);
147 theFieldSet.addField(PrometheusDataResource.DATAITEM_FIELD_DESC, myDesc, MoneyWiseDeposit::getDesc);
148 theFieldSet.addField(MoneyWiseBasicResource.CATEGORY_NAME, myCategoryButton, MoneyWiseDeposit::getCategory);
149 theFieldSet.addField(MoneyWiseBasicResource.ASSET_PARENT, myParentButton, MoneyWiseDeposit::getParent);
150 theFieldSet.addField(MoneyWiseStaticDataType.CURRENCY, myCurrencyButton, MoneyWiseDeposit::getAssetCurrency);
151 theFieldSet.addField(MoneyWiseBasicResource.ASSET_CLOSED, myClosedButton, MoneyWiseDeposit::isClosed);
152
153
154 myCategoryButton.setMenuConfigurator(c -> buildCategoryMenu(c, getItem()));
155 myParentButton.setMenuConfigurator(c -> buildParentMenu(c, getItem()));
156 myCurrencyButton.setMenuConfigurator(c -> buildCurrencyMenu(c, getItem()));
157 final Map<Boolean, TethysUIIconMapSet<Boolean>> myMapSets = MoneyWiseIcon.configureLockedIconButton(pFactory);
158 myClosedButton.setIconMapSet(() -> myMapSets.get(theClosedState));
159
160
161 myName.setValidator(this::isValidName);
162 myDesc.setValidator(this::isValidDesc);
163 }
164
165
166
167
168
169
170 private void buildAccountPanel(final TethysUIFactory<?> pFactory) {
171
172 theFieldSet.newPanel(TAB_ACCOUNT);
173
174
175 final TethysUIFieldFactory myFields = pFactory.fieldFactory();
176 final TethysUIDateButtonField myMaturity = myFields.newDateField();
177 final TethysUICharArrayEditField mySortCode = myFields.newCharArrayField();
178 final TethysUICharArrayEditField myAccount = myFields.newCharArrayField();
179 final TethysUICharArrayEditField myReference = myFields.newCharArrayField();
180 final TethysUIMoneyEditField myOpening = myFields.newMoneyField();
181
182
183 theFieldSet.addField(MoneyWiseAccountInfoClass.MATURITY, myMaturity, MoneyWiseDeposit::getMaturity);
184 theFieldSet.addField(MoneyWiseAccountInfoClass.SORTCODE, mySortCode, MoneyWiseDeposit::getSortCode);
185 theFieldSet.addField(MoneyWiseAccountInfoClass.ACCOUNT, myAccount, MoneyWiseDeposit::getAccount);
186 theFieldSet.addField(MoneyWiseAccountInfoClass.REFERENCE, myReference, MoneyWiseDeposit::getReference);
187 theFieldSet.addField(MoneyWiseAccountInfoClass.OPENINGBALANCE, myOpening, MoneyWiseDeposit::getOpeningBalance);
188
189
190 myOpening.setDeemedCurrency(() -> getItem().getCurrency());
191
192
193 mySortCode.setValidator(this::isValidSortCode);
194 myAccount.setValidator(this::isValidAccount);
195 myReference.setValidator(this::isValidReference);
196 }
197
198
199
200
201
202
203 private void buildNotesPanel(final TethysUIFactory<?> pFactory) {
204
205 final TethysUIFieldFactory myFields = pFactory.fieldFactory();
206 final TethysUICharArrayTextAreaField myNotes = myFields.newCharArrayAreaField();
207
208
209 theFieldSet.newTextArea(TAB_NOTES, MoneyWiseAccountInfoClass.NOTES, myNotes, MoneyWiseDeposit::getNotes);
210
211
212 myNotes.setValidator(this::isValidNotes);
213 }
214
215 @Override
216 public void refreshData() {
217
218 final MoneyWiseDeposit myItem = getItem();
219 if (myItem != null) {
220 final MoneyWiseDepositList myDeposits = getDataList(MoneyWiseBasicDataType.DEPOSIT, MoneyWiseDepositList.class);
221 setItem(myDeposits.findItemById(myItem.getIndexedId()));
222 }
223
224
225 theRates.refreshData();
226
227
228 setEditable(false);
229 }
230
231 @Override
232 protected void adjustFields(final boolean isEditable) {
233
234 final MoneyWiseDeposit myDeposit = getItem();
235 final boolean bIsClosed = myDeposit.isClosed();
236 final boolean bIsActive = myDeposit.isActive();
237 final boolean bIsRelevant = myDeposit.isRelevant();
238 final boolean bIsChangeable = !bIsActive && isEditable;
239
240
241 final boolean bShowClosed = bIsClosed || (bIsActive && !bIsRelevant);
242 theFieldSet.setFieldVisible(MoneyWiseBasicResource.ASSET_CLOSED, bShowClosed);
243
244
245 final boolean bEditClosed = bIsClosed
246 ? !myDeposit.getParent().isClosed()
247 : !bIsRelevant;
248 theFieldSet.setFieldEditable(MoneyWiseBasicResource.ASSET_CLOSED, isEditable && bEditClosed);
249 theClosedState = bEditClosed;
250
251
252 final boolean bShowDesc = isEditable || myDeposit.getDesc() != null;
253 theFieldSet.setFieldVisible(PrometheusDataResource.DATAITEM_FIELD_DESC, bShowDesc);
254
255
256 final boolean bShowSortCode = isEditable || myDeposit.getSortCode() != null;
257 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.SORTCODE, bShowSortCode);
258 final boolean bShowAccount = isEditable || myDeposit.getAccount() != null;
259 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.ACCOUNT, bShowAccount);
260 final boolean bShowReference = isEditable || myDeposit.getReference() != null;
261 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.REFERENCE, bShowReference);
262 final boolean bHasOpening = myDeposit.getOpeningBalance() != null;
263 final boolean bShowOpening = bIsChangeable || bHasOpening;
264 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.OPENINGBALANCE, bShowOpening);
265 final boolean bShowNotes = isEditable || myDeposit.getNotes() != null;
266 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.NOTES, bShowNotes);
267
268
269 final boolean bShowMaturity = MoneyWiseDepositCategoryClass.BOND.equals(myDeposit.getCategoryClass());
270 theFieldSet.setFieldVisible(MoneyWiseAccountInfoClass.MATURITY, bShowMaturity);
271 theFieldSet.setFieldEditable(MoneyWiseAccountInfoClass.MATURITY, isEditable && !bIsClosed);
272
273
274 theFieldSet.setFieldEditable(MoneyWiseBasicResource.CATEGORY_NAME, bIsChangeable);
275 theFieldSet.setFieldEditable(MoneyWiseStaticDataType.CURRENCY, bIsChangeable && !bHasOpening);
276 theFieldSet.setFieldEditable(MoneyWiseAccountInfoClass.OPENINGBALANCE, bIsChangeable);
277
278
279 theFieldSet.setFieldEditable(MoneyWiseBasicResource.ASSET_PARENT, isEditable && !bIsClosed);
280 }
281
282 @Override
283 protected void updateField(final PrometheusFieldSetEvent pUpdate) throws OceanusException {
284
285 final MetisDataFieldId myField = pUpdate.getFieldId();
286 final MoneyWiseDeposit myDeposit = getItem();
287
288
289 if (PrometheusDataResource.DATAITEM_FIELD_NAME.equals(myField)) {
290
291 myDeposit.setName(pUpdate.getValue(String.class));
292 } else if (PrometheusDataResource.DATAITEM_FIELD_DESC.equals(myField)) {
293
294 myDeposit.setDescription(pUpdate.getValue(String.class));
295 } else if (MoneyWiseBasicResource.CATEGORY_NAME.equals(myField)) {
296
297 myDeposit.setCategory(pUpdate.getValue(MoneyWiseDepositCategory.class));
298 myDeposit.autoCorrect();
299 } else if (MoneyWiseBasicResource.ASSET_PARENT.equals(myField)) {
300
301 myDeposit.setParent(pUpdate.getValue(MoneyWisePayee.class));
302 } else if (MoneyWiseStaticDataType.CURRENCY.equals(myField)) {
303
304 myDeposit.setAssetCurrency(pUpdate.getValue(MoneyWiseCurrency.class));
305 } else if (MoneyWiseBasicResource.ASSET_CLOSED.equals(myField)) {
306
307 myDeposit.setClosed(pUpdate.getValue(Boolean.class));
308 } else if (MoneyWiseAccountInfoClass.MATURITY.equals(myField)) {
309
310 myDeposit.setMaturity(pUpdate.getValue(OceanusDate.class));
311 } else if (MoneyWiseAccountInfoClass.SORTCODE.equals(myField)) {
312
313 myDeposit.setSortCode(pUpdate.getValue(char[].class));
314 } else if (MoneyWiseAccountInfoClass.ACCOUNT.equals(myField)) {
315
316 myDeposit.setAccount(pUpdate.getValue(char[].class));
317 } else if (MoneyWiseAccountInfoClass.REFERENCE.equals(myField)) {
318
319 myDeposit.setReference(pUpdate.getValue(char[].class));
320 } else if (MoneyWiseAccountInfoClass.OPENINGBALANCE.equals(myField)) {
321
322 myDeposit.setOpeningBalance(pUpdate.getValue(OceanusMoney.class));
323 } else if (MoneyWiseAccountInfoClass.NOTES.equals(myField)) {
324
325 myDeposit.setNotes(pUpdate.getValue(char[].class));
326 }
327 }
328
329 @Override
330 protected void declareGoToItems(final boolean pUpdates) {
331 final MoneyWiseDeposit myItem = getItem();
332 final MoneyWiseAssetBase myParent = myItem.getParent();
333 if (!pUpdates) {
334 final MoneyWiseDepositCategory myCategory = myItem.getCategory();
335 final MoneyWiseCurrency myCurrency = myItem.getAssetCurrency();
336 declareGoToItem(myCategory);
337 declareGoToItem(myCurrency);
338 }
339 declareGoToItem(myParent);
340 }
341
342 @Override
343 public void setEditable(final boolean isEditable) {
344
345 theRates.setEditable(isEditable);
346
347
348 super.setEditable(isEditable);
349 }
350
351 @Override
352 protected void refreshAfterUpdate() {
353
354 super.refreshAfterUpdate();
355
356
357 theRates.refreshAfterUpdate();
358 }
359
360
361
362
363
364
365
366 public void buildCategoryMenu(final TethysUIScrollMenu<MoneyWiseAssetCategory> pMenu,
367 final MoneyWiseDeposit pDeposit) {
368
369 pMenu.removeAllItems();
370
371
372 final MoneyWiseDepositCategory myCurr = pDeposit.getCategory();
373 TethysUIScrollItem<MoneyWiseAssetCategory> myActive = null;
374
375
376 final MoneyWiseDepositCategoryList myCategories = getDataList(MoneyWiseBasicDataType.DEPOSITCATEGORY, MoneyWiseDepositCategoryList.class);
377
378
379 final Map<String, TethysUIScrollSubMenu<MoneyWiseAssetCategory>> myMap = new HashMap<>();
380
381
382 final Iterator<MoneyWiseDepositCategory> myIterator = myCategories.iterator();
383 while (myIterator.hasNext()) {
384 final MoneyWiseDepositCategory myCategory = myIterator.next();
385
386
387 final boolean bIgnore = myCategory.isDeleted() || myCategory.isCategoryClass(MoneyWiseDepositCategoryClass.PARENT);
388 if (bIgnore) {
389 continue;
390 }
391
392
393 final MoneyWiseDepositCategory myParent = myCategory.getParentCategory();
394 final String myParentName = myParent.getName();
395 final TethysUIScrollSubMenu<MoneyWiseAssetCategory> myMenu = myMap.computeIfAbsent(myParentName, pMenu::addSubMenu);
396
397
398 final TethysUIScrollItem<MoneyWiseAssetCategory> myItem = myMenu.getSubMenu().addItem(myCategory, myCategory.getSubCategory());
399
400
401 if (myCategory.equals(myCurr)) {
402 myActive = myItem;
403 }
404 }
405
406
407 if (myActive != null) {
408 myActive.scrollToItem();
409 }
410 }
411
412
413
414
415
416
417
418 public void buildParentMenu(final TethysUIScrollMenu<MoneyWisePayee> pMenu,
419 final MoneyWiseDeposit pDeposit) {
420
421 pMenu.removeAllItems();
422
423
424 final MoneyWiseDepositCategoryClass myType = pDeposit.getCategoryClass();
425 final MoneyWisePayee myCurr = pDeposit.getParent();
426 TethysUIScrollItem<MoneyWisePayee> myActive = null;
427
428
429 final MoneyWisePayeeList myPayees = getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class);
430
431
432 final Iterator<MoneyWisePayee> myIterator = myPayees.iterator();
433 while (myIterator.hasNext()) {
434 final MoneyWisePayee myPayee = myIterator.next();
435
436
437 boolean bIgnore = myPayee.isDeleted() || !myPayee.getCategoryClass().canParentDeposit(myType);
438 bIgnore |= myPayee.isClosed();
439 if (bIgnore) {
440 continue;
441 }
442
443
444 final TethysUIScrollItem<MoneyWisePayee> myItem = pMenu.addItem(myPayee);
445
446
447 if (myPayee.equals(myCurr)) {
448
449 myActive = myItem;
450 }
451 }
452
453
454 if (myActive != null) {
455 myActive.scrollToItem();
456 }
457 }
458
459
460
461
462
463
464
465 public void buildCurrencyMenu(final TethysUIScrollMenu<MoneyWiseCurrency> pMenu,
466 final MoneyWiseDeposit pDeposit) {
467
468 pMenu.removeAllItems();
469
470
471 final MoneyWiseCurrency myCurr = pDeposit.getAssetCurrency();
472 TethysUIScrollItem<MoneyWiseCurrency> myActive = null;
473
474
475 final MoneyWiseCurrencyList myCurrencies = getDataList(MoneyWiseStaticDataType.CURRENCY, MoneyWiseCurrencyList.class);
476
477
478 final Iterator<MoneyWiseCurrency> myIterator = myCurrencies.iterator();
479 while (myIterator.hasNext()) {
480 final MoneyWiseCurrency myCurrency = myIterator.next();
481
482
483 final boolean bIgnore = myCurrency.isDeleted() || !myCurrency.getEnabled();
484 if (bIgnore) {
485 continue;
486 }
487
488
489 final TethysUIScrollItem<MoneyWiseCurrency> myItem = pMenu.addItem(myCurrency);
490
491
492 if (myCurrency.equals(myCurr)) {
493
494 myActive = myItem;
495 }
496 }
497
498
499 if (myActive != null) {
500 myActive.scrollToItem();
501 }
502 }
503 }