1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.atlas.ui.panel;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
21 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateConfig;
22 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
23 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimal;
24 import io.github.tonywasher.joceanus.oceanus.event.OceanusEvent;
25 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
26 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
27 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
28 import io.github.tonywasher.joceanus.oceanus.profile.OceanusProfile;
29 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
30 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
31 import io.github.tonywasher.joceanus.metis.ui.MetisAction;
32 import io.github.tonywasher.joceanus.metis.ui.MetisErrorPanel;
33 import io.github.tonywasher.joceanus.metis.ui.MetisIcon;
34 import io.github.tonywasher.joceanus.metis.viewer.MetisViewerEntry;
35 import io.github.tonywasher.joceanus.metis.viewer.MetisViewerManager;
36 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.analyse.MoneyWiseXAnalysisManager;
37 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisDataType;
38 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEvent;
39 import io.github.tonywasher.joceanus.moneywise.atlas.ui.controls.MoneyWiseXAnalysisSelect;
40 import io.github.tonywasher.joceanus.moneywise.atlas.ui.controls.MoneyWiseXAnalysisSelect.MoneyWiseXStatementSelect;
41 import io.github.tonywasher.joceanus.moneywise.atlas.ui.dialog.MoneyWiseXTransactionDialog;
42 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter;
43 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetDirection;
44 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
45 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
46 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
47 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
48 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransTag;
49 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
50 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction.MoneyWiseTransactionList;
51 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoClass;
52 import io.github.tonywasher.joceanus.moneywise.data.validate.MoneyWiseValidateTransaction;
53 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseAnalysisColumnSet;
54 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseIcon;
55 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseUIResource;
56 import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseBaseTable;
57 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
58 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
59 import io.github.tonywasher.joceanus.prometheus.ui.PrometheusActionButtons;
60 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
61 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
62 import io.github.tonywasher.joceanus.prometheus.views.PrometheusUIEvent;
63 import io.github.tonywasher.joceanus.prometheus.views.PrometheusViewerEntryId;
64 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIComponent;
65 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIButton;
66 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIControl.TethysUIIconMapSet;
67 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
68 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
69 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBorderPaneManager;
70 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIPaneFactory;
71 import io.github.tonywasher.joceanus.tethys.api.table.TethysUITableManager;
72
73 import java.util.Map;
74
75
76
77
78 public class MoneyWiseXEventTable
79 extends MoneyWiseBaseTable<MoneyWiseXAnalysisEvent> {
80
81
82
83 private final MetisViewerEntry theViewerAnalysis;
84
85
86
87
88 private final MetisViewerEntry theViewerFilter;
89
90
91
92
93 private final MoneyWiseXTransactionDialog theActiveTran;
94
95
96
97
98 private final TethysUIButton theNewButton;
99
100
101
102
103 private final MoneyWiseXAnalysisManager theAnalysisMgr;
104
105
106
107
108 private final MoneyWiseXAnalysisSelect theSelect;
109
110
111
112
113 private final PrometheusActionButtons theActionButtons;
114
115
116
117
118 private final PrometheusEditSet theEditSet;
119
120
121
122
123 private final MetisErrorPanel theError;
124
125
126
127
128 private OceanusDateRange theRange;
129
130
131
132
133 private MoneyWiseXAnalysisFilter<?, ?> theFilter;
134
135
136
137
138 private MoneyWiseTransactionList theTransactions;
139
140
141
142
143 private MoneyWiseAnalysisColumnSet theColumnSet;
144
145
146
147
148
149
150
151
152
153
154
155 MoneyWiseXEventTable(final MoneyWiseView pView,
156 final PrometheusEditSet pEditSet,
157 final MoneyWiseXAnalysisManager pAnalysisMgr,
158 final MetisErrorPanel pError,
159 final MetisViewerEntry pFilter,
160 final MetisViewerEntry pAnalysis) {
161
162 super(pView, pEditSet, pError, MoneyWiseXAnalysisDataType.EVENT);
163
164
165 theEditSet = pEditSet;
166 theAnalysisMgr = pAnalysisMgr;
167 theError = pError;
168
169
170 theViewerAnalysis = pAnalysis;
171 theViewerFilter = pFilter;
172
173
174 final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
175 final TethysUITableManager<MetisDataFieldId, MoneyWiseXAnalysisEvent> myTable = getTable();
176
177
178 theNewButton = myGuiFactory.buttonFactory().newButton();
179 MetisIcon.configureNewIconButton(theNewButton);
180
181
182 theSelect = new MoneyWiseXAnalysisSelect(myGuiFactory, pView, theAnalysisMgr, theNewButton);
183
184
185 theActionButtons = new PrometheusActionButtons(myGuiFactory, getEditSet());
186
187
188 theActiveTran = new MoneyWiseXTransactionDialog(myGuiFactory, pEditSet, theSelect, this);
189 declareItemPanel(theActiveTran);
190
191
192 myTable.setDisabled(MoneyWiseXAnalysisEvent::isDisabled)
193 .setComparator(MoneyWiseXAnalysisEvent::compareTo);
194
195
196 myTable.declareDateColumn(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE)
197 .setDateConfigurator((r, c) -> handleDateEvent(c))
198 .setCellValueFactory(this::getFilteredDate)
199 .setEditable(true)
200 .setCellEditable(r -> !r.isHeader() && !r.isReconciled())
201 .setColumnWidth(WIDTH_DATE)
202 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setDate, r, v));
203
204
205 myTable.declareScrollColumn(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, MoneyWiseTransAsset.class)
206 .setMenuConfigurator(this::buildAccountMenu)
207 .setCellValueFactory(MoneyWiseXAnalysisEvent::getAccount)
208 .setEditable(true)
209 .setCellEditable(r -> !r.isHeader() && !r.isReconciled())
210 .setColumnWidth(WIDTH_NAME)
211 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setAccount, r, v));
212
213
214 myTable.declareScrollColumn(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseTransCategory.class)
215 .setMenuConfigurator(this::buildCategoryMenu)
216 .setCellValueFactory(MoneyWiseXAnalysisEvent::getCategory)
217 .setEditable(true)
218 .setCellEditable(r -> !r.isHeader() && !r.isReconciled())
219 .setColumnWidth(WIDTH_NAME)
220 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setCategory, r, v));
221
222
223 final Map<Boolean, TethysUIIconMapSet<MoneyWiseAssetDirection>> myDirMapSets = MoneyWiseIcon.configureDirectionIconButton(myGuiFactory);
224 myTable.declareIconColumn(MoneyWiseBasicResource.TRANSACTION_DIRECTION, MoneyWiseAssetDirection.class)
225 .setIconMapSet(r -> myDirMapSets.get(determineDirectionState(r)))
226 .setCellValueFactory(MoneyWiseXEventTable::getFilteredDirection)
227 .setEditable(true)
228 .setCellEditable(r -> !r.isHeader() && !r.isReconciled() && r.canSwitchDirection())
229 .setColumnWidth(WIDTH_ICON)
230 .setOnCommit((r, v) -> updateField(this::setDirection, r, v));
231
232
233 myTable.declareScrollColumn(MoneyWiseBasicResource.TRANSACTION_PARTNER, MoneyWiseTransAsset.class)
234 .setMenuConfigurator(this::buildPartnerMenu)
235 .setCellValueFactory(MoneyWiseXAnalysisEvent::getPartner)
236 .setEditable(true)
237 .setCellEditable(r -> !r.isHeader() && !r.isReconciled())
238 .setColumnWidth(WIDTH_NAME)
239 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setPartner, r, v));
240
241
242 final Map<Boolean, TethysUIIconMapSet<Boolean>> myRecMapSets = MoneyWiseIcon.configureReconciledIconButton(myGuiFactory);
243 myTable.declareIconColumn(MoneyWiseBasicResource.TRANSACTION_RECONCILED, Boolean.class)
244 .setIconMapSet(r -> myRecMapSets.get(determineReconciledState(r)))
245 .setCellValueFactory(MoneyWiseXAnalysisEvent::isReconciled)
246 .setEditable(true)
247 .setCellEditable(r -> !r.isHeader() && !r.isLocked())
248 .setColumnWidth(WIDTH_ICON)
249 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setReconciled, r, v));
250
251
252 myTable.declareStringColumn(MoneyWiseTransInfoClass.COMMENTS)
253 .setCellValueFactory(MoneyWiseXEventTable::getFilteredComments)
254 .setEditable(true)
255 .setCellEditable(r -> !r.isHeader())
256 .setColumnWidth(WIDTH_DESC)
257 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setComments, r, v));
258
259
260 myTable.declareMoneyColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT)
261 .setCellValueFactory(MoneyWiseXAnalysisEvent::getAmount)
262 .setEditable(true)
263 .setColumnWidth(WIDTH_MONEY)
264 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setAmount, r, v));
265
266
267 myTable.declareListColumn(MoneyWiseTransInfoClass.TRANSTAG, MoneyWiseTransTag.class)
268 .setSelectables(c -> theActiveTran.buildTransactionTags())
269 .setCellValueFactory(MoneyWiseXAnalysisEvent::getTransactionTags)
270 .setEditable(true)
271 .setColumnWidth(WIDTH_NAME)
272 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setTransactionTags, r, v));
273
274
275 myTable.declareStringColumn(MoneyWiseTransInfoClass.REFERENCE)
276 .setCellValueFactory(MoneyWiseXAnalysisEvent::getReference)
277 .setEditable(true)
278 .setColumnWidth(WIDTH_DESC)
279 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setReference, r, v));
280
281
282 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.TAXCREDIT)
283 .setCellValueFactory(MoneyWiseXAnalysisEvent::getTaxCredit)
284 .setEditable(true)
285 .setColumnWidth(WIDTH_MONEY)
286 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setTaxCredit, r, v));
287
288
289 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.EMPLOYEENATINS)
290 .setCellValueFactory(MoneyWiseXAnalysisEvent::getEmployeeNatIns)
291 .setEditable(true)
292 .setColumnWidth(WIDTH_MONEY)
293 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setEmployeeNatIns, r, v));
294
295
296 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.EMPLOYERNATINS)
297 .setCellValueFactory(MoneyWiseXAnalysisEvent::getEmployerNatIns)
298 .setEditable(true)
299 .setColumnWidth(WIDTH_MONEY)
300 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setEmployerNatIns, r, v));
301
302
303 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.DEEMEDBENEFIT)
304 .setCellValueFactory(MoneyWiseXAnalysisEvent::getDeemedBenefit)
305 .setEditable(true)
306 .setColumnWidth(WIDTH_MONEY)
307 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setDeemedBenefit, r, v));
308
309
310 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.WITHHELD)
311 .setCellValueFactory(MoneyWiseXAnalysisEvent::getWithheld)
312 .setEditable(true)
313 .setColumnWidth(WIDTH_MONEY)
314 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setWithheld, r, v));
315
316
317 myTable.declareUnitsColumn(MoneyWiseTransInfoClass.ACCOUNTDELTAUNITS)
318 .setCellValueFactory(MoneyWiseXAnalysisEvent::getAccountDeltaUnits)
319 .setEditable(true)
320 .setColumnWidth(WIDTH_UNITS)
321 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setAccountDeltaUnits, r, v));
322
323
324 myTable.declareUnitsColumn(MoneyWiseTransInfoClass.PARTNERDELTAUNITS)
325 .setCellValueFactory(MoneyWiseXAnalysisEvent::getPartnerDeltaUnits)
326 .setEditable(true)
327 .setColumnWidth(WIDTH_UNITS)
328 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setPartnerDeltaUnits, r, v));
329
330
331 myTable.declareRatioColumn(MoneyWiseTransInfoClass.DILUTION)
332 .setCellValueFactory(MoneyWiseXAnalysisEvent::getDilution)
333 .setEditable(true)
334 .setColumnWidth(WIDTH_UNITS)
335 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setDilution, r, v));
336
337
338 myTable.declareScrollColumn(MoneyWiseTransInfoClass.RETURNEDCASHACCOUNT, MoneyWiseTransAsset.class)
339 .setMenuConfigurator(this::buildReturnedMenu)
340 .setCellValueFactory(MoneyWiseXAnalysisEvent::getReturnedCashAccount)
341 .setEditable(true)
342 .setCellEditable(r -> !r.isReconciled())
343 .setColumnWidth(WIDTH_NAME)
344 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setReturnedCashAccount, r, v));
345
346
347 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.RETURNEDCASH)
348 .setCellValueFactory(MoneyWiseXAnalysisEvent::getReturnedCash)
349 .setEditable(true)
350 .setColumnWidth(WIDTH_MONEY)
351 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setReturnedCash, r, v));
352
353
354 myTable.declareMoneyColumn(MoneyWiseTransInfoClass.PARTNERAMOUNT)
355 .setCellValueFactory(MoneyWiseXAnalysisEvent::getPartnerAmount)
356 .setEditable(true)
357 .setColumnWidth(WIDTH_MONEY)
358 .setOnCommit((r, v) -> updateField(MoneyWiseXAnalysisEvent::setPartnerAmount, r, v));
359
360
361 myTable.declareRawDecimalColumn(MoneyWiseTransDataId.DEBIT)
362 .setCellValueFactory(this::getFilteredDebit)
363 .setEditable(false)
364 .setColumnWidth(WIDTH_MONEY);
365
366
367 myTable.declareRawDecimalColumn(MoneyWiseTransDataId.CREDIT)
368 .setCellValueFactory(this::getFilteredCredit)
369 .setEditable(false)
370 .setColumnWidth(WIDTH_MONEY);
371
372
373 myTable.declareRawDecimalColumn(MoneyWiseTransDataId.BALANCE)
374 .setCellValueFactory(this::getFilteredBalance)
375 .setEditable(false)
376 .setColumnWidth(WIDTH_MONEY);
377
378
379 final TethysUIIconMapSet<MetisAction> myActionMapSet = MetisIcon.configureStatusIconButton(myGuiFactory);
380 myTable.declareIconColumn(PrometheusDataResource.DATAITEM_TOUCH, MetisAction.class)
381 .setIconMapSet(r -> myActionMapSet)
382 .setCellValueFactory(MoneyWiseXEventTable::getFilteredAction)
383 .setName(MoneyWiseUIResource.STATICDATA_ACTIVE.getValue())
384 .setEditable(true)
385 .setCellEditable(r -> !r.isHeader() && !r.isReconciled())
386 .setColumnWidth(WIDTH_ICON)
387 .setOnCommit((r, v) -> updateField(this::deleteRow, r, v));
388
389
390 pView.getEventRegistrar().addEventListener(e -> refreshData());
391 theActionButtons.getEventRegistrar().addEventListener(this::handleActionButtons);
392 theNewButton.getEventRegistrar().addEventListener(e -> addNewItem());
393 theError.getEventRegistrar().addEventListener(e -> handleErrorPane());
394 theSelect.getEventRegistrar().addEventListener(PrometheusDataEvent.SELECTIONCHANGED, e -> handleFilterSelection());
395 theSelect.getEventRegistrar().addEventListener(PrometheusDataEvent.SAVETOFILE, e -> writeCSVToFile(pView.getGuiFactory()));
396 theActiveTran.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> handlePanelState());
397
398
399 theActionButtons.setVisible(false);
400 theFilter = theSelect.getFilter();
401
402
403 adjustColumns(theSelect.showColumns()
404 ? theSelect.getColumns()
405 : MoneyWiseAnalysisColumnSet.BALANCE);
406 }
407
408
409
410
411
412
413 MoneyWiseXAnalysisSelect getSelect() {
414 return theSelect;
415 }
416
417
418
419
420
421
422 PrometheusActionButtons getActionButtons() {
423 return theActionButtons;
424 }
425
426
427
428
429
430
431
432
433 protected void setDirection(final MoneyWiseXAnalysisEvent pRow,
434 final Object pValue) throws OceanusException {
435 pRow.switchDirection();
436 }
437
438 @Override
439 protected boolean isItemEditing() {
440 return theActiveTran.isEditing();
441 }
442
443
444
445
446
447
448 private void handleDateEvent(final OceanusDateConfig pConfig) {
449 pConfig.setEarliestDate(theRange == null
450 ? null
451 : theRange.getStart());
452 pConfig.setLatestDate(theRange == null
453 ? null
454 : theRange.getEnd());
455 }
456
457 @Override
458 public boolean isFieldChanged(final MetisDataFieldId pField,
459 final MoneyWiseXAnalysisEvent pItem) {
460 if (pField.equals(MoneyWiseTransDataId.DEBIT)
461 || pField.equals(MoneyWiseTransDataId.CREDIT)
462 || pField.equals(MoneyWiseTransDataId.BALANCE)) {
463 return false;
464 }
465 return super.isFieldChanged(pField, pItem);
466 }
467
468
469
470
471
472
473
474 private static boolean determineReconciledState(final MoneyWiseXAnalysisEvent pEvent) {
475 return pEvent.isLocked();
476 }
477
478
479
480
481
482
483
484 private static boolean determineDirectionState(final MoneyWiseXAnalysisEvent pEvent) {
485 return pEvent.isReconciled();
486 }
487
488
489
490
491 protected void determineFocus() {
492
493 getTable().requestFocus();
494 }
495
496
497
498
499
500
501
502 private OceanusDecimal getFilteredDebit(final MoneyWiseXAnalysisEvent pEvent) {
503 return theFilter.getDebitForEvent(pEvent);
504 }
505
506
507
508
509
510
511
512 private OceanusDecimal getFilteredCredit(final MoneyWiseXAnalysisEvent pEvent) {
513 return theFilter.getCreditForEvent(pEvent);
514 }
515
516
517
518
519
520
521
522 private OceanusDecimal getFilteredBalance(final MoneyWiseXAnalysisEvent pEvent) {
523 return pEvent.isHeader() ? theFilter.getStartingBalance() : theFilter.getBalanceForEvent(pEvent);
524 }
525
526
527
528
529
530
531
532 private OceanusDate getFilteredDate(final MoneyWiseXAnalysisEvent pEvent) {
533 return pEvent.isHeader() ? theRange.getStart() : pEvent.getDate();
534 }
535
536
537
538
539
540
541
542 private static String getFilteredComments(final MoneyWiseXAnalysisEvent pEvent) {
543 return pEvent.isHeader() ? MoneyWiseUIResource.STATEMENT_OPENINGBALANCE.getValue() : pEvent.getComments();
544 }
545
546
547
548
549
550
551
552 private static MoneyWiseAssetDirection getFilteredDirection(final MoneyWiseXAnalysisEvent pEvent) {
553 return pEvent.isHeader() ? null : pEvent.getDirection();
554 }
555
556
557
558
559
560
561
562 private static MetisAction getFilteredAction(final MoneyWiseXAnalysisEvent pEvent) {
563 return (pEvent.isHeader() || pEvent.isReconciled()) ? MetisAction.DO : MetisAction.DELETE;
564 }
565
566 @Override
567 protected void selectItem(final MoneyWiseXAnalysisEvent pEvent) {
568 final MoneyWiseXAnalysisEvent myEvent = pEvent != null && !pEvent.isHeader() ? pEvent : null;
569 theActiveTran.setItem(myEvent);
570 }
571
572
573
574
575
576
577 void selectStatement(final MoneyWiseXStatementSelect pSelect) {
578
579 theSelect.selectStatement(pSelect);
580
581
582 theFilter = theSelect.getFilter();
583
584
585 adjustColumns(theSelect.showColumns()
586 ? theSelect.getColumns()
587 : MoneyWiseAnalysisColumnSet.BALANCE);
588
589
590 updateList();
591 }
592
593
594
595
596 private void handleErrorPane() {
597
598 final boolean isError = theError.hasError();
599
600
601 theSelect.setVisible(!isError);
602
603
604 getTable().setEnabled(!isError);
605
606
607 theActionButtons.setEnabled(!isError);
608 }
609
610 @Override
611 protected void refreshData() {
612
613 OceanusProfile myTask = getView().getActiveTask();
614 myTask = myTask.startTask("refreshData");
615
616
617
618
619
620 theFilter = theSelect.getFilter();
621
622
623 updateList();
624
625
626 myTask.end();
627 }
628
629
630
631
632 private void handleFilterSelection() {
633
634 theFilter = theSelect.getFilter();
635
636
637 adjustColumns(theSelect.showColumns()
638 ? theSelect.getColumns()
639 : MoneyWiseAnalysisColumnSet.BALANCE);
640
641
642 final OceanusDateRange myRange = theSelect.getRange();
643 if (MetisDataDifference.isEqual(myRange, theRange)) {
644
645 theViewerFilter.setObject(theFilter);
646 updateTableData();
647 } else {
648
649 updateList();
650 }
651 }
652
653
654 @Override
655 protected boolean isFiltered(final MoneyWiseXAnalysisEvent pRow) {
656
657 if (theFilter == null) {
658 return false;
659 }
660
661
662 if (pRow.isHeader()) {
663 return MoneyWiseAnalysisColumnSet.BALANCE.equals(theColumnSet);
664 }
665
666
667 return super.isFiltered(pRow) && !theFilter.filterEvent(pRow);
668 }
669
670 @Override
671 public void notifyChanges() {
672
673 final boolean hasUpdates = hasUpdates();
674 final boolean isItemEditing = theActiveTran.isEditing();
675
676
677 theActionButtons.setEnabled(true);
678 theActionButtons.setVisible(hasUpdates && !isItemEditing);
679 theSelect.setEnabled(!isItemEditing);
680 theNewButton.setEnabled(!isItemEditing);
681
682
683 if (!isItemEditing) {
684 setEnabled(true);
685 } else {
686 setTableEnabled(false);
687 }
688
689
690 super.notifyChanges();
691 }
692
693
694
695
696 private void updateList() {
697
698 theTransactions = theEditSet.getDataList(MoneyWiseBasicDataType.TRANSACTION, MoneyWiseTransactionList.class);
699
700
701
702 if (theTransactions != null) {
703 MoneyWiseTransaction myHeader = theTransactions.findItemById(AnalysisHeader.ID_VALUE);
704 if (myHeader == null) {
705
706 myHeader = new AnalysisHeader(theTransactions);
707 theTransactions.add(myHeader);
708 }
709
710
711 theActiveTran.refreshData();
712 theActiveTran.updateEditors(theRange);
713
714
715 theTransactions.getValidator().setRange(theRange);
716 theTransactions.getValidator().setEditSet(theEditSet);
717 }
718
719
720 getTable().setItems(theAnalysisMgr.getAnalysis().getEvents().getUnderlyingList());
721 theActionButtons.setEnabled(true);
722 theSelect.setEnabled(!hasUpdates());
723
724
725 theViewerFilter.setObject(theFilter);
726 theViewerAnalysis.setTreeObject(getEditSet());
727 restoreSelected();
728 }
729
730 @Override
731 public void cancelEditing() {
732 super.cancelEditing();
733 theActiveTran.setEditable(false);
734 }
735
736
737
738
739
740
741 void selectEvent(final MoneyWiseXAnalysisEvent pEvent) {
742
743 getTable().selectRow(pEvent);
744 }
745
746 @Override
747 protected void handleRewind() {
748
749 if (!theActiveTran.isEditing()) {
750
751 setEnabled(true);
752 super.handleRewind();
753 }
754
755
756 notifyChanges();
757 }
758
759
760
761
762
763
764 private void handleActionButtons(final OceanusEvent<PrometheusUIEvent> pEvent) {
765
766 cancelEditing();
767
768
769 theEditSet.processCommand(pEvent.getEventId(), theError);
770
771
772 notifyChanges();
773 }
774
775
776
777
778 private void handlePanelState() {
779
780 if (!theActiveTran.isEditing()) {
781
782 setEnabled(true);
783 final MoneyWiseXAnalysisEvent myEvent = theActiveTran.getSelectedItem();
784 updateTableData();
785 if (myEvent != null) {
786 getTable().selectRow(myEvent);
787 } else {
788 restoreSelected();
789 }
790 } else {
791 getTable().cancelEditing();
792 }
793
794
795 notifyChanges();
796 }
797
798
799
800
801
802
803
804 private void buildAccountMenu(final MoneyWiseXAnalysisEvent pEvent,
805 final TethysUIScrollMenu<MoneyWiseTransAsset> pMenu) {
806
807 theActiveTran.buildAccountMenu(pMenu, pEvent);
808 }
809
810
811
812
813
814
815
816 private void buildPartnerMenu(final MoneyWiseXAnalysisEvent pEvent,
817 final TethysUIScrollMenu<MoneyWiseTransAsset> pMenu) {
818
819 theActiveTran.buildPartnerMenu(pMenu, pEvent);
820 }
821
822
823
824
825
826
827
828 private void buildCategoryMenu(final MoneyWiseXAnalysisEvent pEvent,
829 final TethysUIScrollMenu<MoneyWiseTransCategory> pMenu) {
830
831 theActiveTran.buildCategoryMenu(pMenu, pEvent);
832 }
833
834
835
836
837
838
839
840 private void buildReturnedMenu(final MoneyWiseXAnalysisEvent pEvent,
841 final TethysUIScrollMenu<MoneyWiseTransAsset> pMenu) {
842
843 theActiveTran.buildReturnedAccountMenu(pMenu, pEvent);
844 }
845
846
847
848
849 private void addNewItem() {
850
851 cancelEditing();
852
853
854 final OceanusProfile myTask = getView().getNewProfile("addNewItem");
855
856
857 myTask.startTask("buildItem");
858 final MoneyWiseValidateTransaction myBuilder = (MoneyWiseValidateTransaction) theTransactions.getValidator();
859 final MoneyWiseTransaction myTrans = theFilter.buildNewTransaction(myBuilder);
860
861
862 if (myTrans != null) {
863
864 myTask.startTask("addToList");
865 theTransactions.add(myTrans);
866 myTrans.setNewVersion();
867
868
869 myTask.startTask("incrementVersion");
870 getEditSet().incrementVersion();
871
872
873 myTask.startTask("validate");
874 myTrans.validate();
875
876
877 myTask.startTask("setItem");
878 theActiveTran.setNewItem(theAnalysisMgr.getAnalysis().getEvents().newTransaction(myTrans));
879 setTableEnabled(false);
880 }
881
882
883 myTask.end();
884 }
885
886
887
888
889
890
891 private void adjustColumns(final MoneyWiseAnalysisColumnSet pSet) {
892
893 if (pSet.equals(theColumnSet)) {
894 return;
895 }
896
897
898 final TethysUITableManager<MetisDataFieldId, MoneyWiseXAnalysisEvent> myTable = getTable();
899 hideAllColumns();
900
901
902 switch (pSet) {
903 case BALANCE:
904 myTable.getColumn(MoneyWiseTransInfoClass.COMMENTS).setVisible(true);
905 myTable.getColumn(MoneyWiseTransDataId.DEBIT).setVisible(true);
906 myTable.getColumn(MoneyWiseTransDataId.CREDIT).setVisible(true);
907 myTable.getColumn(MoneyWiseTransDataId.BALANCE).setVisible(true);
908 break;
909 case STANDARD:
910 myTable.getColumn(MoneyWiseTransInfoClass.COMMENTS).setVisible(true);
911 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
912 myTable.getColumn(MoneyWiseTransInfoClass.TRANSTAG).setVisible(true);
913 myTable.getColumn(MoneyWiseTransInfoClass.REFERENCE).setVisible(true);
914 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERAMOUNT).setVisible(true);
915 break;
916 case SALARY:
917 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
918 myTable.getColumn(MoneyWiseTransInfoClass.TAXCREDIT).setVisible(true);
919 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYEENATINS).setVisible(true);
920 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYERNATINS).setVisible(true);
921 myTable.getColumn(MoneyWiseTransInfoClass.DEEMEDBENEFIT).setVisible(true);
922 myTable.getColumn(MoneyWiseTransInfoClass.WITHHELD).setVisible(true);
923 break;
924 case INTEREST:
925 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
926 myTable.getColumn(MoneyWiseTransInfoClass.TAXCREDIT).setVisible(true);
927 myTable.getColumn(MoneyWiseTransInfoClass.WITHHELD).setVisible(true);
928 break;
929 case DIVIDEND:
930 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
931 myTable.getColumn(MoneyWiseTransInfoClass.TAXCREDIT).setVisible(true);
932 myTable.getColumn(MoneyWiseTransInfoClass.ACCOUNTDELTAUNITS).setVisible(true);
933 break;
934 case SECURITY:
935 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
936 myTable.getColumn(MoneyWiseTransInfoClass.ACCOUNTDELTAUNITS).setVisible(true);
937 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERDELTAUNITS).setVisible(true);
938 myTable.getColumn(MoneyWiseTransInfoClass.DILUTION).setVisible(true);
939 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASHACCOUNT).setVisible(true);
940 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASH).setVisible(true);
941 break;
942 case ALL:
943 default:
944 myTable.getColumn(MoneyWiseTransInfoClass.COMMENTS).setVisible(true);
945 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(true);
946 myTable.getColumn(MoneyWiseTransInfoClass.TRANSTAG).setVisible(true);
947 myTable.getColumn(MoneyWiseTransInfoClass.REFERENCE).setVisible(true);
948 myTable.getColumn(MoneyWiseTransInfoClass.TAXCREDIT).setVisible(true);
949 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYERNATINS).setVisible(true);
950 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYEENATINS).setVisible(true);
951 myTable.getColumn(MoneyWiseTransInfoClass.DEEMEDBENEFIT).setVisible(true);
952 myTable.getColumn(MoneyWiseTransInfoClass.WITHHELD).setVisible(true);
953 myTable.getColumn(MoneyWiseTransInfoClass.ACCOUNTDELTAUNITS).setVisible(true);
954 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERDELTAUNITS).setVisible(true);
955 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERAMOUNT).setVisible(true);
956 myTable.getColumn(MoneyWiseTransInfoClass.DILUTION).setVisible(true);
957 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASHACCOUNT).setVisible(true);
958 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASH).setVisible(true);
959 break;
960 }
961
962
963 theColumnSet = pSet;
964 }
965
966
967
968
969 private void hideAllColumns() {
970 final TethysUITableManager<MetisDataFieldId, MoneyWiseXAnalysisEvent> myTable = getTable();
971 myTable.getColumn(MoneyWiseTransDataId.DEBIT).setVisible(false);
972 myTable.getColumn(MoneyWiseTransDataId.CREDIT).setVisible(false);
973 myTable.getColumn(MoneyWiseTransDataId.BALANCE).setVisible(false);
974 myTable.getColumn(MoneyWiseTransInfoClass.COMMENTS).setVisible(false);
975 myTable.getColumn(MoneyWiseBasicResource.TRANSACTION_AMOUNT).setVisible(false);
976 myTable.getColumn(MoneyWiseTransInfoClass.TRANSTAG).setVisible(false);
977 myTable.getColumn(MoneyWiseTransInfoClass.REFERENCE).setVisible(false);
978 myTable.getColumn(MoneyWiseTransInfoClass.TAXCREDIT).setVisible(false);
979 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYERNATINS).setVisible(false);
980 myTable.getColumn(MoneyWiseTransInfoClass.EMPLOYEENATINS).setVisible(false);
981 myTable.getColumn(MoneyWiseTransInfoClass.DEEMEDBENEFIT).setVisible(false);
982 myTable.getColumn(MoneyWiseTransInfoClass.WITHHELD).setVisible(false);
983 myTable.getColumn(MoneyWiseTransInfoClass.ACCOUNTDELTAUNITS).setVisible(false);
984 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERDELTAUNITS).setVisible(false);
985 myTable.getColumn(MoneyWiseTransInfoClass.PARTNERAMOUNT).setVisible(false);
986 myTable.getColumn(MoneyWiseTransInfoClass.DILUTION).setVisible(false);
987 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASHACCOUNT).setVisible(false);
988 myTable.getColumn(MoneyWiseTransInfoClass.RETURNEDCASH).setVisible(false);
989 }
990
991
992
993
994
995 private static class AnalysisHeader
996 extends MoneyWiseTransaction {
997
998
999
1000 static final int ID_VALUE = 1;
1001
1002
1003
1004
1005
1006
1007 protected AnalysisHeader(final MoneyWiseTransactionList pList) {
1008 super(pList);
1009 setHeader(true);
1010 setIndexedId(ID_VALUE);
1011 }
1012 }
1013
1014
1015
1016
1017 private enum MoneyWiseTransDataId
1018 implements MetisDataFieldId {
1019
1020
1021
1022 DEBIT(MoneyWiseUIResource.STATEMENT_COLUMN_DEBIT),
1023
1024
1025
1026
1027 CREDIT(MoneyWiseUIResource.STATEMENT_COLUMN_CREDIT),
1028
1029
1030
1031
1032 BALANCE(MoneyWiseUIResource.STATEMENT_COLUMN_BALANCE);
1033
1034
1035
1036
1037 private final String theValue;
1038
1039
1040
1041
1042
1043
1044 MoneyWiseTransDataId(final MetisDataFieldId pKeyName) {
1045 theValue = pKeyName.getId();
1046 }
1047
1048 @Override
1049 public String getId() {
1050 return theValue;
1051 }
1052
1053 @Override
1054 public String toString() {
1055 return getId();
1056 }
1057 }
1058
1059
1060
1061
1062 public static class MoneyWiseXStatementPanel
1063 implements TethysUIComponent, OceanusEventProvider<PrometheusDataEvent> {
1064
1065
1066
1067 private static final String NLS_DATAENTRY = MoneyWiseUIResource.REGISTER_DATAENTRY.getValue();
1068
1069
1070
1071
1072 private static final String NLS_FILTERDATAENTRY = MoneyWiseUIResource.FILTER_DATAENTRY.getValue();
1073
1074
1075
1076
1077 private static final String NLS_TRANSDATAENTRY = MoneyWiseUIResource.TRANSACTION_DATAENTRY.getValue();
1078
1079
1080
1081
1082 private final OceanusEventManager<PrometheusDataEvent> theEventManager;
1083
1084
1085
1086
1087 private final PrometheusEditSet theEditSet;
1088
1089
1090
1091
1092 private final MetisViewerEntry theViewerAnalysis;
1093
1094
1095
1096
1097 private final MetisErrorPanel theError;
1098
1099
1100
1101
1102 private final MoneyWiseXEventTable theTable;
1103
1104
1105
1106
1107 private final TethysUIBorderPaneManager thePanel;
1108
1109
1110
1111
1112
1113
1114
1115 public MoneyWiseXStatementPanel(final MoneyWiseView pView,
1116 final MoneyWiseXAnalysisManager pAnalysisMgr) {
1117
1118 theEditSet = new PrometheusEditSet(pView);
1119
1120
1121 theEventManager = new OceanusEventManager<>();
1122
1123
1124 final MetisViewerManager myViewer = pView.getViewerManager();
1125 final MetisViewerEntry mySection = pView.getViewerEntry(PrometheusViewerEntryId.VIEW);
1126 final MetisViewerEntry myRegister = myViewer.newEntry(mySection, NLS_DATAENTRY);
1127 final MetisViewerEntry myViewerFilter = myViewer.newEntry(myRegister, NLS_FILTERDATAENTRY);
1128 theViewerAnalysis = myViewer.newEntry(myRegister, NLS_TRANSDATAENTRY);
1129 theViewerAnalysis.setTreeObject(theEditSet);
1130
1131
1132 theError = pView.getToolkit().getToolkit().newErrorPanel(theViewerAnalysis);
1133
1134
1135 theTable = new MoneyWiseXEventTable(pView, theEditSet, pAnalysisMgr, theError, myViewerFilter, theViewerAnalysis);
1136
1137
1138 final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
1139
1140
1141 final TethysUIPaneFactory myPanes = myGuiFactory.paneFactory();
1142 final TethysUIBorderPaneManager myHeader = myPanes.newBorderPane();
1143 myHeader.setCentre(theTable.getSelect());
1144 myHeader.setNorth(theError);
1145 myHeader.setEast(theTable.getActionButtons());
1146
1147
1148 thePanel = myPanes.newBorderPane();
1149 thePanel.setNorth(myHeader);
1150 thePanel.setCentre(theTable);
1151
1152
1153 theError.getEventRegistrar().addEventListener(e -> handleErrorPane());
1154 theTable.getActionButtons().getEventRegistrar().addEventListener(this::handleActionButtons);
1155 theTable.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> notifyChanges());
1156 theTable.getEventRegistrar().addEventListener(PrometheusDataEvent.GOTOWINDOW, theEventManager::cascadeEvent);
1157 }
1158
1159 @Override
1160 public TethysUIComponent getUnderlying() {
1161 return thePanel;
1162 }
1163
1164 @Override
1165 public void setEnabled(final boolean pEnabled) {
1166 thePanel.setEnabled(pEnabled);
1167 }
1168
1169 @Override
1170 public void setVisible(final boolean pVisible) {
1171 thePanel.setVisible(pVisible);
1172 }
1173
1174 @Override
1175 public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
1176 return theEventManager.getEventRegistrar();
1177 }
1178
1179
1180
1181
1182
1183
1184 public void selectStatement(final MoneyWiseXStatementSelect pSelect) {
1185 theTable.selectStatement(pSelect);
1186 }
1187
1188
1189
1190
1191 private void handleErrorPane() {
1192
1193 final boolean isError = theError.hasError();
1194
1195
1196 theTable.getSelect().setVisible(!isError);
1197
1198
1199 theTable.setEnabled(!isError);
1200
1201
1202 theTable.getActionButtons().setEnabled(!isError);
1203 }
1204
1205
1206
1207
1208
1209
1210 private void handleActionButtons(final OceanusEvent<PrometheusUIEvent> pEvent) {
1211
1212 theTable.cancelEditing();
1213
1214
1215 theEditSet.processCommand(pEvent.getEventId(), theError);
1216
1217
1218 theTable.notifyChanges();
1219 }
1220
1221
1222
1223
1224 public void determineFocus() {
1225
1226 theTable.determineFocus();
1227
1228
1229 theViewerAnalysis.setFocus();
1230 }
1231
1232
1233
1234
1235 private void notifyChanges() {
1236
1237 theEventManager.fireEvent(PrometheusDataEvent.ADJUSTVISIBILITY);
1238 }
1239
1240
1241
1242
1243
1244
1245 public boolean hasUpdates() {
1246 return theTable.hasUpdates();
1247 }
1248
1249
1250
1251
1252
1253
1254 public boolean hasSession() {
1255 return theTable.hasUpdates();
1256 }
1257
1258
1259
1260
1261
1262
1263 public boolean hasErrors() {
1264 return theTable.hasErrors();
1265 }
1266 }
1267 }