1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.lethe.ui.controls;
18
19 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
20 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateResource;
21 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
22 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
23 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
24 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
25 import io.github.tonywasher.joceanus.metis.ui.MetisIcon;
26 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.base.MoneyWiseAnalysisAttribute;
27 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
28 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisType;
29 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter;
30 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter.MoneyWiseAnalysisAllFilter;
31 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisView;
32 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseAnalysisColumnSet;
33 import io.github.tonywasher.joceanus.moneywise.ui.MoneyWiseUIResource;
34 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
35 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
36 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIArrowIconId;
37 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIComponent;
38 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIEvent;
39 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIButton;
40 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIButtonFactory;
41 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIDateRangeSelector;
42 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIScrollButtonManager;
43 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIControlFactory;
44 import io.github.tonywasher.joceanus.tethys.api.control.TethysUILabel;
45 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
46 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
47 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBoxPaneManager;
48 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUICardPaneManager;
49 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIPaneFactory;
50
51 import java.util.EnumMap;
52 import java.util.Map;
53 import java.util.Map.Entry;
54
55
56
57
58 public class MoneyWiseAnalysisSelect
59 implements OceanusEventProvider<PrometheusDataEvent>, TethysUIComponent {
60
61
62
63 private static final String NLS_RANGE = MoneyWiseUIResource.ANALYSIS_PROMPT_RANGE.getValue();
64
65
66
67
68 private static final String NLS_FILTER = MoneyWiseUIResource.ANALYSIS_PROMPT_FILTER.getValue();
69
70
71
72
73 private static final String NLS_FILTERTYPE = MoneyWiseUIResource.ANALYSIS_PROMPT_FILTERTYPE.getValue();
74
75
76
77
78 private static final String NLS_COLUMNS = MoneyWiseUIResource.ANALYSIS_PROMPT_COLUMNSET.getValue();
79
80
81
82
83 private static final String NLS_BUCKET = MoneyWiseUIResource.ANALYSIS_PROMPT_BUCKET.getValue();
84
85
86
87
88 private static final String NLS_TITLE = MoneyWiseUIResource.ANALYSIS_TITLE.getValue();
89
90
91
92
93 private static final String NLS_NONE = MoneyWiseUIResource.ANALYSIS_BUCKET_NONE.getValue();
94
95
96
97
98 private static final String NLS_FILTERTITLE = MoneyWiseUIResource.ANALYSIS_FILTER_TITLE.getValue();
99
100
101
102
103 private static final String NLS_RANGETITLE = OceanusDateResource.TITLE_BOX.getValue();
104
105
106
107
108 private final OceanusEventManager<PrometheusDataEvent> theEventManager;
109
110
111
112
113 private final MoneyWiseView theView;
114
115
116
117
118 private final TethysUIBoxPaneManager thePanel;
119
120
121
122
123 private final TethysUIButton theRangeButton;
124
125
126
127
128 private final TethysUIButton theFilterButton;
129
130
131
132
133 private final TethysUIScrollButtonManager<MoneyWiseAnalysisType> theFilterTypeButton;
134
135
136
137
138 private final TethysUIScrollButtonManager<MoneyWiseAnalysisAttribute> theBucketButton;
139
140
141
142
143 private final TethysUIScrollButtonManager<MoneyWiseAnalysisColumnSet> theColumnButton;
144
145
146
147
148 private final TethysUILabel theBucketLabel;
149
150
151
152
153 private final TethysUILabel theColumnLabel;
154
155
156
157
158 private final TethysUIBoxPaneManager theFilterDetail;
159
160
161
162
163 private final TethysUIDateRangeSelector theRangeSelect;
164
165
166
167
168 private final TethysUIBoxPaneManager theFilterSelect;
169
170
171
172
173 private final MoneyWiseDepositAnalysisSelect theDepositSelect;
174
175
176
177
178 private final MoneyWiseCashAnalysisSelect theCashSelect;
179
180
181
182
183 private final MoneyWiseLoanAnalysisSelect theLoanSelect;
184
185
186
187
188 private final MoneyWiseSecurityAnalysisSelect theSecuritySelect;
189
190
191
192
193 private final MoneyWisePortfolioAnalysisSelect thePortfolioSelect;
194
195
196
197
198 private final MoneyWisePayeeAnalysisSelect thePayeeSelect;
199
200
201
202
203 private final MoneyWiseTransCategoryAnalysisSelect theCategorySelect;
204
205
206
207
208 private final MoneyWiseTaxBasisAnalysisSelect theTaxBasisSelect;
209
210
211
212
213 private final MoneyWiseTransTagSelect theTagSelect;
214
215
216
217
218 private final MoneyWiseAllSelect theAllSelect;
219
220
221
222
223 private final TethysUICardPaneManager<MoneyWiseAnalysisFilterSelection> theCardPanel;
224
225
226
227
228 private final MoneyWiseAnalysisView theAnalysisView;
229
230
231
232
233 private final Map<MoneyWiseAnalysisType, MoneyWiseAnalysisFilterSelection> theMap;
234
235
236
237
238 private final TethysUIScrollMenu<MoneyWiseAnalysisType> theTypeMenu;
239
240
241
242
243 private final TethysUIScrollMenu<MoneyWiseAnalysisAttribute> theBucketMenu;
244
245
246
247
248 private final TethysUIScrollMenu<MoneyWiseAnalysisColumnSet> theColumnMenu;
249
250
251
252
253 private MoneyWiseAnalysis theAnalysis;
254
255
256
257
258 private MoneyWiseAnalysisState theState;
259
260
261
262
263 private MoneyWiseAnalysisState theSavePoint;
264
265
266
267
268 private boolean isRefreshing;
269
270
271
272
273 private boolean isRangeVisible;
274
275
276
277
278 private boolean isFilterVisible;
279
280
281
282
283
284
285
286
287
288 public MoneyWiseAnalysisSelect(final TethysUIFactory<?> pFactory,
289 final MoneyWiseView pView,
290 final MoneyWiseAnalysisView pAnalysisView,
291 final TethysUIButton pNewButton) {
292
293 theView = pView;
294 theAnalysisView = pAnalysisView;
295
296
297 theEventManager = new OceanusEventManager<>();
298
299
300 final TethysUIButtonFactory<?> myButtons = pFactory.buttonFactory();
301 theRangeButton = myButtons.newButton();
302 theRangeButton.setIcon(TethysUIArrowIconId.DOWN);
303 theRangeButton.setTextAndIcon();
304
305
306 theFilterButton = myButtons.newButton();
307 theFilterButton.setIcon(TethysUIArrowIconId.DOWN);
308 theFilterButton.setTextAndIcon();
309
310
311 theFilterTypeButton = myButtons.newScrollButton(MoneyWiseAnalysisType.class);
312
313
314 final TethysUIControlFactory myControls = pFactory.controlFactory();
315 theColumnLabel = myControls.newLabel(NLS_COLUMNS);
316 theColumnButton = myButtons.newScrollButton(MoneyWiseAnalysisColumnSet.class);
317
318
319 theBucketLabel = myControls.newLabel(NLS_BUCKET);
320 theBucketButton = myButtons.newScrollButton(MoneyWiseAnalysisAttribute.class);
321
322
323 theRangeSelect = myButtons.newDateRangeSelector();
324 theRangeSelect.setBorderTitle(NLS_RANGETITLE);
325
326
327 theMap = new EnumMap<>(MoneyWiseAnalysisType.class);
328
329
330 theDepositSelect = new MoneyWiseDepositAnalysisSelect(pFactory);
331 theCashSelect = new MoneyWiseCashAnalysisSelect(pFactory);
332 theLoanSelect = new MoneyWiseLoanAnalysisSelect(pFactory);
333 theSecuritySelect = new MoneyWiseSecurityAnalysisSelect(pFactory);
334 thePortfolioSelect = new MoneyWisePortfolioAnalysisSelect(pFactory);
335 thePayeeSelect = new MoneyWisePayeeAnalysisSelect(pFactory);
336 theCategorySelect = new MoneyWiseTransCategoryAnalysisSelect(pFactory);
337 theTaxBasisSelect = new MoneyWiseTaxBasisAnalysisSelect(pFactory);
338 theTagSelect = new MoneyWiseTransTagSelect(pFactory);
339 theAllSelect = new MoneyWiseAllSelect(pFactory);
340
341
342 final TethysUIPaneFactory myPanes = pFactory.paneFactory();
343 theCardPanel = myPanes.newCardPane();
344
345
346 theFilterDetail = buildFilterDetail(pFactory);
347
348
349 theFilterSelect = buildFilterSelect(pFactory);
350
351
352 final TethysUIBoxPaneManager myPanel = buildControlPanel(pFactory, pNewButton);
353
354
355 thePanel = myPanes.newVBoxPane();
356 thePanel.addNode(myPanel);
357 thePanel.addNode(theRangeSelect);
358 thePanel.addNode(theFilterSelect);
359
360
361 theRangeSelect.setVisible(false);
362 theFilterSelect.setVisible(false);
363
364
365 theState = new MoneyWiseAnalysisState();
366 theState.showColumns(true);
367 final MoneyWiseStatementSelect mySelect = new MoneyWiseStatementSelect(theRangeSelect, new MoneyWiseAnalysisAllFilter());
368 selectStatement(mySelect);
369
370
371 theTypeMenu = theFilterTypeButton.getMenu();
372 theBucketMenu = theBucketButton.getMenu();
373 theColumnMenu = theColumnButton.getMenu();
374
375
376 OceanusEventRegistrar<TethysUIEvent> myRegistrar = theFilterTypeButton.getEventRegistrar();
377 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleFilterType());
378 theFilterTypeButton.setMenuConfigurator(e -> buildAnalysisTypeMenu());
379 myRegistrar = theBucketButton.getEventRegistrar();
380 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewBucket());
381 theBucketButton.setMenuConfigurator(e -> buildBucketMenu());
382 myRegistrar = theColumnButton.getEventRegistrar();
383 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewColumns());
384 theColumnButton.setMenuConfigurator(e -> buildColumnsMenu());
385 theAnalysisView.getEventRegistrar().addEventListener(e -> setAnalysisView());
386
387
388 theRangeButton.getEventRegistrar().addEventListener(e -> setRangeVisibility(!isRangeVisible));
389 theFilterButton.getEventRegistrar().addEventListener(e -> setFilterVisibility(!isFilterVisible));
390 theRangeSelect.getEventRegistrar().addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewRange());
391
392
393 theDepositSelect.getEventRegistrar().addEventListener(e -> buildDepositFilter());
394 theCashSelect.getEventRegistrar().addEventListener(e -> buildCashFilter());
395 theLoanSelect.getEventRegistrar().addEventListener(e -> buildLoanFilter());
396 theSecuritySelect.getEventRegistrar().addEventListener(e -> buildSecurityFilter());
397 thePortfolioSelect.getEventRegistrar().addEventListener(e -> buildPortfolioFilter());
398 thePayeeSelect.getEventRegistrar().addEventListener(e -> buildPayeeFilter());
399 theCategorySelect.getEventRegistrar().addEventListener(e -> buildCategoryFilter());
400 theTaxBasisSelect.getEventRegistrar().addEventListener(e -> buildTaxBasisFilter());
401 theTagSelect.getEventRegistrar().addEventListener(e -> buildTagFilter());
402 }
403
404 @Override
405 public TethysUIComponent getUnderlying() {
406 return thePanel;
407 }
408
409 @Override
410 public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
411 return theEventManager.getEventRegistrar();
412 }
413
414
415
416
417
418
419 public OceanusDateRange getRange() {
420 return theState.getRange();
421 }
422
423
424
425
426
427
428 public MoneyWiseAnalysis getAnalysis() {
429 return theAnalysis;
430 }
431
432
433
434
435
436
437 public MoneyWiseAnalysisFilter<?, ?> getFilter() {
438 return theState.getFilter();
439 }
440
441
442
443
444
445
446 public MoneyWiseAnalysisColumnSet getColumns() {
447 return theState.getColumns();
448 }
449
450
451
452
453
454
455 public boolean showColumns() {
456 return theState.showColumns();
457 }
458
459
460
461
462
463
464
465
466 private TethysUIBoxPaneManager buildControlPanel(final TethysUIFactory<?> pFactory,
467 final TethysUIButton pNewButton) {
468
469 final TethysUIBoxPaneManager myPanel = pFactory.paneFactory().newHBoxPane();
470
471
472 final TethysUILabel myRangeLabel = pFactory.controlFactory().newLabel(NLS_RANGE);
473
474
475 final TethysUIButton mySave = pFactory.buttonFactory().newButton();
476 MetisIcon.configureSaveIconButton(mySave);
477
478
479 myPanel.setBorderTitle(NLS_TITLE);
480 myPanel.addNode(myRangeLabel);
481 myPanel.addNode(theRangeButton);
482 myPanel.addSpacer();
483 myPanel.addNode(theFilterDetail);
484 myPanel.addSpacer();
485 myPanel.addNode(mySave);
486 myPanel.addNode(pNewButton);
487
488
489 final OceanusEventRegistrar<TethysUIEvent> myRegistrar = mySave.getEventRegistrar();
490 myRegistrar.addEventListener(e -> theEventManager.fireEvent(PrometheusDataEvent.SAVETOFILE));
491
492
493 return myPanel;
494 }
495
496
497
498
499
500
501
502 private TethysUIBoxPaneManager buildFilterDetail(final TethysUIFactory<?> pFactory) {
503
504 final TethysUIBoxPaneManager myPanel = pFactory.paneFactory().newHBoxPane();
505
506
507 final TethysUILabel myFilterLabel = pFactory.controlFactory().newLabel(NLS_FILTER);
508
509
510 myPanel.addNode(myFilterLabel);
511 myPanel.addNode(theFilterButton);
512 myPanel.addSpacer();
513 myPanel.addNode(theBucketLabel);
514 myPanel.addNode(theColumnLabel);
515 myPanel.addNode(theBucketButton);
516 myPanel.addNode(theColumnButton);
517
518
519 return myPanel;
520 }
521
522
523
524
525
526
527
528 private TethysUIBoxPaneManager buildFilterSelect(final TethysUIFactory<?> pFactory) {
529
530 final TethysUIBoxPaneManager myPanel = pFactory.paneFactory().newHBoxPane();
531
532
533 final TethysUILabel myTypeLabel = pFactory.controlFactory().newLabel(NLS_FILTERTYPE);
534
535
536 theCardPanel.addCard(MoneyWiseAnalysisType.DEPOSIT.name(), theDepositSelect);
537 theCardPanel.addCard(MoneyWiseAnalysisType.CASH.name(), theCashSelect);
538 theCardPanel.addCard(MoneyWiseAnalysisType.LOAN.name(), theLoanSelect);
539 theCardPanel.addCard(MoneyWiseAnalysisType.SECURITY.name(), theSecuritySelect);
540 theCardPanel.addCard(MoneyWiseAnalysisType.PORTFOLIO.name(), thePortfolioSelect);
541 theCardPanel.addCard(MoneyWiseAnalysisType.PAYEE.name(), thePayeeSelect);
542 theCardPanel.addCard(MoneyWiseAnalysisType.CATEGORY.name(), theCategorySelect);
543 theCardPanel.addCard(MoneyWiseAnalysisType.TAXBASIS.name(), theTaxBasisSelect);
544 theCardPanel.addCard(MoneyWiseAnalysisType.TRANSTAG.name(), theTagSelect);
545 theCardPanel.addCard(MoneyWiseAnalysisType.ALL.name(), theAllSelect);
546
547
548 theMap.put(MoneyWiseAnalysisType.DEPOSIT, theDepositSelect);
549 theMap.put(MoneyWiseAnalysisType.CASH, theCashSelect);
550 theMap.put(MoneyWiseAnalysisType.LOAN, theLoanSelect);
551 theMap.put(MoneyWiseAnalysisType.SECURITY, theSecuritySelect);
552 theMap.put(MoneyWiseAnalysisType.PORTFOLIO, thePortfolioSelect);
553 theMap.put(MoneyWiseAnalysisType.PAYEE, thePayeeSelect);
554 theMap.put(MoneyWiseAnalysisType.CATEGORY, theCategorySelect);
555 theMap.put(MoneyWiseAnalysisType.TAXBASIS, theTaxBasisSelect);
556 theMap.put(MoneyWiseAnalysisType.TRANSTAG, theTagSelect);
557 theMap.put(MoneyWiseAnalysisType.ALL, theAllSelect);
558
559
560 myPanel.setBorderTitle(NLS_FILTERTITLE);
561 myPanel.addNode(myTypeLabel);
562 myPanel.addNode(theFilterTypeButton);
563 myPanel.addSpacer();
564 myPanel.addNode(theCardPanel);
565
566
567 return myPanel;
568 }
569
570
571
572
573
574
575 public void selectStatement(final MoneyWiseStatementSelect pSelect) {
576
577 isRefreshing = true;
578
579
580 final TethysUIDateRangeSelector mySelect = pSelect.getRangeSelect();
581 if (mySelect != null) {
582 theRangeSelect.setSelection(mySelect);
583 theRangeSelect.lockPeriod(false);
584 theState.setRange(mySelect);
585
586
587 theAnalysisView.setRange(mySelect.getRange());
588 theAnalysis = theAnalysisView.getAnalysis();
589 setAnalysis();
590 }
591
592
593 final MoneyWiseAnalysisFilter<?, ?> myFilter = pSelect.getFilter();
594 final MoneyWiseAnalysisType myType = myFilter.getAnalysisType();
595 final MoneyWiseAnalysisFilterSelection myPanel = theMap.get(myType);
596
597
598 theCardPanel.selectCard(myType.name());
599 myPanel.setFilter(myFilter);
600
601
602 theState.determineState(myPanel);
603
604
605 isRefreshing = false;
606 }
607
608
609
610
611 public void refreshData() {
612
613 final OceanusDateRange myRange = theView.getRange();
614 theRangeSelect.setOverallRange(myRange);
615
616
617 theAnalysisView.refreshData();
618
619
620 checkType();
621 }
622
623
624
625
626 private void setAnalysis() {
627
628 if (theAnalysis != null) {
629
630 theDepositSelect.setAnalysis(theAnalysis);
631 theCashSelect.setAnalysis(theAnalysis);
632 theLoanSelect.setAnalysis(theAnalysis);
633 theSecuritySelect.setAnalysis(theAnalysis);
634 thePortfolioSelect.setAnalysis(theAnalysis);
635 theCategorySelect.setAnalysis(theAnalysis);
636 thePayeeSelect.setAnalysis(theAnalysis);
637 theTaxBasisSelect.setAnalysis(theAnalysis);
638 theTagSelect.setAnalysis(theAnalysis);
639 theAllSelect.setAnalysis(theAnalysis);
640
641
642 updateFilter();
643 }
644 }
645
646
647
648
649 private void updateFilter() {
650
651 final MoneyWiseAnalysisType myType = theState.getType();
652 final MoneyWiseAnalysisFilterSelection myPanel = theMap.get(myType);
653
654
655 if (myPanel != null) {
656 final MoneyWiseAnalysisFilter<?, ?> myFilter = myPanel.getFilter();
657 myFilter.setCurrentAttribute(theState.getBucket());
658 theState.setFilter(myFilter);
659 }
660
661
662 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
663 }
664
665
666
667
668 protected void createSavePoint() {
669
670 theSavePoint = new MoneyWiseAnalysisState(theState);
671 }
672
673
674
675
676 protected void restoreSavePoint() {
677
678 theState = new MoneyWiseAnalysisState(theSavePoint);
679
680
681 theState.applyState();
682 }
683
684 @Override
685 public void setEnabled(final boolean bEnabled) {
686
687 if (isAvailable()) {
688
689 theRangeButton.setEnabled(bEnabled);
690
691
692 theFilterDetail.setVisible(true);
693 theFilterButton.setEnabled(bEnabled);
694 theColumnButton.setEnabled(bEnabled);
695 theBucketButton.setEnabled(bEnabled);
696
697
698 if (!bEnabled) {
699
700 setRangeVisibility(false);
701 setFilterVisibility(false);
702 }
703
704
705 } else {
706
707 theRangeButton.setEnabled(false);
708
709
710 setRangeVisibility(false);
711 setFilterVisibility(false);
712 theFilterDetail.setVisible(false);
713 theRangeSelect.setEnabled(bEnabled);
714 }
715 }
716
717 @Override
718 public void setVisible(final boolean pVisible) {
719 thePanel.setVisible(pVisible);
720 }
721
722
723
724
725
726
727 private boolean isAvailable() {
728
729 for (MoneyWiseAnalysisFilterSelection myEntry : theMap.values()) {
730
731 if (myEntry.isAvailable()) {
732
733 return true;
734 }
735 }
736
737
738 return false;
739 }
740
741
742
743
744 private void checkType() {
745
746 MoneyWiseAnalysisType myType = theState.getType();
747
748
749 if (myType != null) {
750
751 final MoneyWiseAnalysisFilterSelection myPanel = theMap.get(myType);
752 if (myPanel.isAvailable()) {
753
754 final MoneyWiseAnalysisFilter<?, ?> myFilter = myPanel.getFilter();
755 theState.setFilter(myFilter);
756 return;
757 }
758 }
759
760
761 for (Entry<MoneyWiseAnalysisType, MoneyWiseAnalysisFilterSelection> myEntry : theMap.entrySet()) {
762
763 final MoneyWiseAnalysisFilterSelection myPanel = myEntry.getValue();
764 if (myPanel.isAvailable()) {
765
766 myType = myEntry.getKey();
767
768
769 theCardPanel.selectCard(myType.name());
770
771
772 final MoneyWiseAnalysisFilter<?, ?> myFilter = myPanel.getFilter();
773 final MoneyWiseAnalysisAttribute myDefault = myType.getDefaultValue();
774 if (myFilter != null) {
775 myFilter.setCurrentAttribute(myDefault);
776 }
777
778
779 theState.setAnalysisType(myType);
780 theState.setFilter(myFilter);
781 theState.setBucket(myDefault);
782 theState.applyState();
783
784
785 return;
786 }
787 }
788
789
790 theState.setFilter(null);
791 theState.setAnalysisType(null);
792 theState.setBucket(null);
793 }
794
795
796
797
798 private void buildAnalysisTypeMenu() {
799
800 theTypeMenu.removeAllItems();
801
802
803 for (Entry<MoneyWiseAnalysisType, MoneyWiseAnalysisFilterSelection> myEntry : theMap.entrySet()) {
804
805 if (myEntry.getValue().isAvailable()) {
806
807 theTypeMenu.addItem(myEntry.getKey());
808 }
809 }
810 }
811
812
813
814
815 private void buildBucketMenu() {
816
817 theBucketMenu.removeAllItems();
818
819
820 final MoneyWiseAnalysisFilter<?, ?> myFilter = theState.getFilter();
821 for (MoneyWiseAnalysisAttribute myAttr : theState.getType().getValues()) {
822
823 if (myAttr.isCounter()
824 && myFilter.isRelevantCounter(myAttr)) {
825
826 theBucketMenu.addItem(myAttr);
827 }
828 }
829
830
831 theBucketMenu.addNullItem(NLS_NONE);
832 }
833
834
835
836
837 private void buildColumnsMenu() {
838
839 theColumnMenu.removeAllItems();
840
841
842 final boolean hasBalances = theState.getType().hasBalances();
843
844
845 for (MoneyWiseAnalysisColumnSet mySet : MoneyWiseAnalysisColumnSet.values()) {
846
847 if (hasBalances
848 || !mySet.isBalance()) {
849
850 theColumnMenu.addItem(mySet);
851 }
852 }
853 }
854
855
856
857
858 private void buildDepositFilter() {
859 applyFilter(theDepositSelect.getFilter());
860 }
861
862
863
864
865 private void buildCashFilter() {
866 applyFilter(theCashSelect.getFilter());
867 }
868
869
870
871
872 private void buildLoanFilter() {
873 applyFilter(theLoanSelect.getFilter());
874 }
875
876
877
878
879 private void buildSecurityFilter() {
880 applyFilter(theSecuritySelect.getFilter());
881 }
882
883
884
885
886 private void buildPortfolioFilter() {
887 applyFilter(thePortfolioSelect.getFilter());
888 }
889
890
891
892
893 private void buildPayeeFilter() {
894 applyFilter(thePayeeSelect.getFilter());
895 }
896
897
898
899
900 private void buildCategoryFilter() {
901 applyFilter(theCategorySelect.getFilter());
902 }
903
904
905
906
907 private void buildTaxBasisFilter() {
908 applyFilter(theTaxBasisSelect.getFilter());
909 }
910
911
912
913
914 private void buildTagFilter() {
915 applyFilter(theTagSelect.getFilter());
916 }
917
918
919
920
921
922
923 private void applyFilter(final MoneyWiseAnalysisFilter<?, ?> pFilter) {
924
925 if (!isRefreshing) {
926 final MoneyWiseAnalysisAttribute myBucket = theState.getBucket();
927 if (pFilter.isRelevantCounter(myBucket)) {
928 pFilter.setCurrentAttribute(theState.getBucket());
929 } else {
930 theState.setBucket(pFilter.getCurrentAttribute());
931 }
932 theState.setFilter(pFilter);
933 theState.applyState();
934 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
935 }
936 }
937
938
939
940
941 private void setAnalysisView() {
942
943 if (!isRefreshing) {
944
945 theAnalysis = theAnalysisView.getAnalysis();
946 setAnalysis();
947
948
949 checkType();
950 theState.applyState();
951
952
953 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
954 }
955 }
956
957
958
959
960 private void handleNewRange() {
961
962 if (isRefreshing) {
963 return;
964 }
965
966
967 if (theState.setRange(theRangeSelect)) {
968
969 isRefreshing = true;
970
971
972 theAnalysisView.setRange(getRange());
973 theAnalysis = theAnalysisView.getAnalysis();
974 setAnalysis();
975
976
977 checkType();
978 theState.applyState();
979
980
981 isRefreshing = false;
982 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
983 }
984 }
985
986
987
988
989
990
991 private void setRangeVisibility(final boolean pVisible) {
992 theRangeButton.setIcon(pVisible
993 ? TethysUIArrowIconId.UP
994 : TethysUIArrowIconId.DOWN);
995 theRangeSelect.setVisible(pVisible);
996 isRangeVisible = pVisible;
997 }
998
999
1000
1001
1002
1003
1004 private void setFilterVisibility(final boolean pVisible) {
1005 theFilterButton.setIcon(pVisible
1006 ? TethysUIArrowIconId.UP
1007 : TethysUIArrowIconId.DOWN);
1008 theFilterSelect.setVisible(pVisible);
1009 isFilterVisible = pVisible;
1010 }
1011
1012
1013
1014
1015 private void handleNewBucket() {
1016
1017 if (isRefreshing) {
1018 return;
1019 }
1020
1021 final MoneyWiseAnalysisAttribute myBucket = theBucketButton.getValue();
1022 if (theState.setBucket(myBucket)) {
1023 final MoneyWiseAnalysisFilter<?, ?> myFilter = theState.getFilter();
1024 if (myBucket != null) {
1025 myFilter.setCurrentAttribute(myBucket);
1026 }
1027 theState.applyState();
1028 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
1029 }
1030 }
1031
1032
1033
1034
1035 private void handleNewColumns() {
1036
1037 if (isRefreshing) {
1038 return;
1039 }
1040
1041
1042 final MoneyWiseAnalysisColumnSet mySet = theColumnButton.getValue();
1043 if (theState.setColumns(mySet)) {
1044 theState.applyState();
1045 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
1046 }
1047 }
1048
1049
1050
1051
1052 private void handleFilterType() {
1053
1054 if (isRefreshing) {
1055 return;
1056 }
1057
1058
1059 final MoneyWiseAnalysisType myType = theFilterTypeButton.getValue();
1060 if (theState.setAnalysisType(myType)) {
1061
1062 final boolean showingBalances = !theState.showColumns();
1063 if (showingBalances && !myType.hasBalances()) {
1064
1065 theState.showColumns(true);
1066 }
1067
1068
1069 theCardPanel.selectCard(myType.name());
1070
1071
1072 final MoneyWiseAnalysisFilterSelection myPanel = theMap.get(myType);
1073 final MoneyWiseAnalysisFilter<?, ?> myFilter = myPanel.getFilter();
1074 myFilter.setCurrentAttribute(myType.getDefaultValue());
1075
1076
1077 theState.setFilter(myFilter);
1078 theState.setBucket(myFilter.getCurrentAttribute());
1079 theState.applyState();
1080 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
1081 }
1082 }
1083
1084
1085
1086
1087 private final class MoneyWiseAnalysisState {
1088
1089
1090
1091 private OceanusDateRange theRange;
1092
1093
1094
1095
1096 private MoneyWiseAnalysisType theType;
1097
1098
1099
1100
1101 private MoneyWiseAnalysisAttribute theBucket;
1102
1103
1104
1105
1106 private MoneyWiseAnalysisColumnSet theColumns;
1107
1108
1109
1110
1111 private MoneyWiseAnalysisFilter<?, ?> theFilter;
1112
1113
1114
1115
1116 private boolean showColumns;
1117
1118
1119
1120
1121 private MoneyWiseAnalysisState() {
1122 theRange = null;
1123 theFilter = null;
1124 theType = null;
1125 theBucket = null;
1126 theColumns = MoneyWiseAnalysisColumnSet.STANDARD;
1127 showColumns = true;
1128 }
1129
1130
1131
1132
1133
1134
1135 private MoneyWiseAnalysisState(final MoneyWiseAnalysisState pState) {
1136 theRange = pState.getRange();
1137 theFilter = pState.getFilter();
1138 theType = pState.getType();
1139 theBucket = pState.getBucket();
1140 theColumns = pState.getColumns();
1141 showColumns = pState.showColumns();
1142 }
1143
1144
1145
1146
1147
1148
1149 private OceanusDateRange getRange() {
1150 return theRange;
1151 }
1152
1153
1154
1155
1156
1157
1158 private MoneyWiseAnalysisType getType() {
1159 return theType;
1160 }
1161
1162
1163
1164
1165
1166
1167 private MoneyWiseAnalysisAttribute getBucket() {
1168 return theBucket;
1169 }
1170
1171
1172
1173
1174
1175
1176 private MoneyWiseAnalysisColumnSet getColumns() {
1177 return theColumns;
1178 }
1179
1180
1181
1182
1183
1184
1185 private MoneyWiseAnalysisFilter<?, ?> getFilter() {
1186 return theFilter;
1187 }
1188
1189
1190
1191
1192
1193
1194 private boolean showColumns() {
1195 return showColumns;
1196 }
1197
1198
1199
1200
1201
1202
1203 private void determineState(final MoneyWiseAnalysisFilterSelection pFilter) {
1204
1205 theRange = theRangeSelect.getRange();
1206 theFilter = pFilter.getFilter();
1207 theType = theFilter.getAnalysisType();
1208 theBucket = theFilter.getCurrentAttribute();
1209 showColumns = theBucket == null;
1210 applyState();
1211 }
1212
1213
1214
1215
1216
1217
1218
1219 private boolean setRange(final TethysUIDateRangeSelector pSelect) {
1220
1221 final OceanusDateRange myRange = pSelect.getRange();
1222 if (!MetisDataDifference.isEqual(myRange, theRange)) {
1223 theRange = myRange;
1224 return true;
1225 }
1226 return false;
1227 }
1228
1229
1230
1231
1232
1233
1234
1235 private boolean setAnalysisType(final MoneyWiseAnalysisType pType) {
1236 if (!MetisDataDifference.isEqual(pType, theType)) {
1237 theType = pType;
1238 return true;
1239 }
1240 return false;
1241 }
1242
1243
1244
1245
1246
1247
1248
1249 private boolean setBucket(final MoneyWiseAnalysisAttribute pBucket) {
1250 if (!MetisDataDifference.isEqual(pBucket, theBucket)) {
1251
1252 if (pBucket == null) {
1253 showColumns = true;
1254 } else {
1255 theBucket = pBucket;
1256 }
1257 return true;
1258 }
1259 return false;
1260 }
1261
1262
1263
1264
1265
1266
1267
1268 private boolean setColumns(final MoneyWiseAnalysisColumnSet pColumnSet) {
1269 if (!MetisDataDifference.isEqual(pColumnSet, theColumns)) {
1270
1271 if (pColumnSet.equals(MoneyWiseAnalysisColumnSet.BALANCE)) {
1272 showColumns = false;
1273 } else {
1274 theColumns = pColumnSet;
1275 }
1276 return true;
1277 }
1278 return false;
1279 }
1280
1281
1282
1283
1284
1285
1286 private void setFilter(final MoneyWiseAnalysisFilter<?, ?> pFilter) {
1287 theFilter = pFilter;
1288 }
1289
1290
1291
1292
1293 private void applyState() {
1294
1295 setEnabled(true);
1296 theRangeButton.setText(theRange.toString());
1297 theFilterButton.setText((theFilter == null)
1298 ? null
1299 : theFilter.getName());
1300 theFilterTypeButton.setValue(theType);
1301 theBucketButton.setValue(theBucket);
1302 theColumnButton.setValue(theColumns);
1303 showColumns(showColumns);
1304 }
1305
1306
1307
1308
1309
1310
1311 private void showColumns(final boolean pShow) {
1312
1313 theColumnLabel.setVisible(pShow);
1314 theColumnButton.setVisible(pShow);
1315
1316
1317 theBucketLabel.setVisible(!pShow);
1318 theBucketButton.setVisible(!pShow);
1319
1320
1321 showColumns = pShow;
1322 }
1323 }
1324
1325
1326
1327
1328 public static final class MoneyWiseStatementSelect {
1329
1330
1331
1332 private final TethysUIDateRangeSelector theRangeSelect;
1333
1334
1335
1336
1337 private final MoneyWiseAnalysisFilter<?, ?> theFilter;
1338
1339
1340
1341
1342
1343
1344
1345 public MoneyWiseStatementSelect(final TethysUIDateRangeSelector pRangeSelect,
1346 final MoneyWiseAnalysisFilter<?, ?> pFilter) {
1347
1348 theRangeSelect = pRangeSelect;
1349 theFilter = pFilter;
1350 }
1351
1352
1353
1354
1355
1356
1357 public TethysUIDateRangeSelector getRangeSelect() {
1358 return theRangeSelect;
1359 }
1360
1361
1362
1363
1364
1365
1366 public MoneyWiseAnalysisFilter<?, ?> getFilter() {
1367 return theFilter;
1368 }
1369 }
1370 }