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.metis.data.MetisDataDifference;
20 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
21 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxBasis;
22 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
23 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisDataResource;
24 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisAccountBucket;
25 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisBaseBucket;
26 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisBucket;
27 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisBucket.MoneyWiseAnalysisTaxBasisBucketList;
28 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter;
29 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter.MoneyWiseAnalysisTaxBasisFilter;
30 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
31 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
32 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
33 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
34 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
35 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIComponent;
36 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIConstant;
37 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIEvent;
38 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIButtonFactory;
39 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIScrollButtonManager;
40 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIControlFactory;
41 import io.github.tonywasher.joceanus.tethys.api.control.TethysUILabel;
42 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
43 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollItem;
44 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
45 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBoxPaneManager;
46
47 import java.util.Iterator;
48
49
50
51
52 public class MoneyWiseUITaxBasisAnalysisSelect
53 implements MoneyWiseUIAnalysisFilterSelection, OceanusEventProvider<PrometheusDataEvent> {
54
55
56
57 private static final String NLS_BASIS = MoneyWiseStaticDataType.TAXBASIS.getItemName();
58
59
60
61
62 private static final String NLS_ACCOUNT = MoneyWiseAnalysisDataResource.BUCKET_ACCOUNT.getValue();
63
64
65
66
67 private static final String NLS_ALL = "All";
68
69
70
71
72 private final OceanusEventManager<PrometheusDataEvent> theEventManager;
73
74
75
76
77 private final TethysUIBoxPaneManager thePanel;
78
79
80
81
82 private final TethysUIScrollButtonManager<MoneyWiseAnalysisTaxBasisBucket> theBasisButton;
83
84
85
86
87 private final TethysUIScrollButtonManager<MoneyWiseAnalysisTaxBasisAccountBucket> theAccountButton;
88
89
90
91
92 private final TethysUIScrollMenu<MoneyWiseAnalysisTaxBasisBucket> theTaxMenu;
93
94
95
96
97 private final TethysUIScrollMenu<MoneyWiseAnalysisTaxBasisAccountBucket> theAccountMenu;
98
99
100
101
102 private MoneyWiseAnalysisTaxBasisBucketList theTaxBases;
103
104
105
106
107 private MoneyWiseTaxBasisState theState;
108
109
110
111
112 private MoneyWiseTaxBasisState theSavePoint;
113
114
115
116
117
118
119 protected MoneyWiseUITaxBasisAnalysisSelect(final TethysUIFactory<?> pFactory) {
120
121 final TethysUIButtonFactory<?> myButtons = pFactory.buttonFactory();
122 theBasisButton = myButtons.newScrollButton(MoneyWiseAnalysisTaxBasisBucket.class);
123 theAccountButton = myButtons.newScrollButton(MoneyWiseAnalysisTaxBasisAccountBucket.class);
124
125
126 theEventManager = new OceanusEventManager<>();
127
128
129 final TethysUIControlFactory myControls = pFactory.controlFactory();
130 final TethysUILabel myBasisLabel = myControls.newLabel(NLS_BASIS + TethysUIConstant.STR_COLON);
131 final TethysUILabel myAccountLabel = myControls.newLabel(NLS_ACCOUNT + TethysUIConstant.STR_COLON);
132
133
134 thePanel = pFactory.paneFactory().newHBoxPane();
135 thePanel.addSpacer();
136 thePanel.addNode(myBasisLabel);
137 thePanel.addNode(theBasisButton);
138 thePanel.addStrut();
139 thePanel.addNode(myAccountLabel);
140 thePanel.addNode(theAccountButton);
141
142
143 theState = new MoneyWiseTaxBasisState();
144 theState.applyState();
145
146
147 theTaxMenu = theBasisButton.getMenu();
148 theAccountMenu = theAccountButton.getMenu();
149
150
151 OceanusEventRegistrar<TethysUIEvent> myRegistrar = theBasisButton.getEventRegistrar();
152 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewBasis());
153 theBasisButton.setMenuConfigurator(e -> buildBasisMenu());
154 myRegistrar = theAccountButton.getEventRegistrar();
155 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewAccount());
156 theAccountButton.setMenuConfigurator(e -> buildAccountMenu());
157 }
158
159 @Override
160 public TethysUIComponent getUnderlying() {
161 return thePanel;
162 }
163
164 @Override
165 public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
166 return theEventManager.getEventRegistrar();
167 }
168
169 @Override
170 public MoneyWiseAnalysisTaxBasisFilter getFilter() {
171 return theState.getFilter();
172 }
173
174 @Override
175 public boolean isAvailable() {
176 return theTaxBases != null
177 && !theTaxBases.isEmpty();
178 }
179
180
181
182
183 public void createSavePoint() {
184
185 theSavePoint = new MoneyWiseTaxBasisState(theState);
186 }
187
188
189
190
191 public void restoreSavePoint() {
192
193 theState = new MoneyWiseTaxBasisState(theSavePoint);
194
195
196 theState.applyState();
197 }
198
199 @Override
200 public void setEnabled(final boolean bEnabled) {
201
202 theBasisButton.setEnabled(bEnabled && isAvailable());
203 }
204
205 @Override
206 public void setVisible(final boolean pVisible) {
207 thePanel.setVisible(pVisible);
208 }
209
210
211
212
213
214
215 public void setAnalysis(final MoneyWiseAnalysis pAnalysis) {
216
217 theTaxBases = pAnalysis.getTaxBasis();
218
219
220 MoneyWiseAnalysisTaxBasisBaseBucket myBasis = theState.getTaxBasis();
221
222
223 myBasis = myBasis != null
224 ? theTaxBases.getMatchingBasis(myBasis)
225 : theTaxBases.getDefaultBasis();
226
227
228 theState.setTheTaxBasis(myBasis);
229 theState.setDateRange(pAnalysis.getDateRange());
230 theState.applyState();
231 }
232
233 @Override
234 public void setFilter(final MoneyWiseAnalysisFilter<?, ?> pFilter) {
235
236 if (pFilter instanceof MoneyWiseAnalysisTaxBasisFilter myFilter) {
237
238 MoneyWiseAnalysisTaxBasisBaseBucket myTaxBasis = myFilter.getBucket();
239
240
241 myTaxBasis = theTaxBases.getMatchingBasis(myTaxBasis);
242
243
244 theState.setTheTaxBasis(myTaxBasis);
245 theState.setDateRange(myFilter.getDateRange());
246 theState.applyState();
247 }
248 }
249
250
251
252
253 private void handleNewBasis() {
254
255 if (theState.setTaxBasis(theBasisButton.getValue())) {
256 theState.applyState();
257 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
258 }
259 }
260
261
262
263
264 private void handleNewAccount() {
265
266 if (theState.setTaxBasis(theAccountButton.getValue())) {
267 theState.applyState();
268 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
269 }
270 }
271
272
273
274
275 private void buildBasisMenu() {
276
277 theTaxMenu.removeAllItems();
278
279
280 TethysUIScrollItem<MoneyWiseAnalysisTaxBasisBucket> myActive = null;
281 final MoneyWiseAnalysisTaxBasisBucket myCurr = theState.getTaxBasis();
282
283
284 final Iterator<MoneyWiseAnalysisTaxBasisBucket> myIterator = theTaxBases.iterator();
285 while (myIterator.hasNext()) {
286 final MoneyWiseAnalysisTaxBasisBucket myBucket = myIterator.next();
287
288
289 final TethysUIScrollItem<MoneyWiseAnalysisTaxBasisBucket> myItem = theTaxMenu.addItem(myBucket);
290
291
292 if (myBucket.equals(myCurr)) {
293
294 myActive = myItem;
295 }
296 }
297
298
299 if (myActive != null) {
300 myActive.scrollToItem();
301 }
302 }
303
304
305
306
307 private void buildAccountMenu() {
308
309 theAccountMenu.removeAllItems();
310
311
312 final MoneyWiseAnalysisTaxBasisBucket myBasis = theState.getTaxBasis();
313 final MoneyWiseAnalysisTaxBasisAccountBucket myCurr = theState.getAccount();
314
315
316 TethysUIScrollItem<MoneyWiseAnalysisTaxBasisAccountBucket> myActive = theAccountMenu.addItem(null, NLS_ALL);
317
318
319 final Iterator<MoneyWiseAnalysisTaxBasisAccountBucket> myIterator = myBasis.accountIterator();
320 while (myIterator.hasNext()) {
321 final MoneyWiseAnalysisTaxBasisAccountBucket myBucket = myIterator.next();
322
323
324 final TethysUIScrollItem<MoneyWiseAnalysisTaxBasisAccountBucket> myItem = theAccountMenu.addItem(myBucket, myBucket.getSimpleName());
325
326
327 if (myBucket.equals(myCurr)) {
328
329 myActive = myItem;
330 }
331 }
332
333
334 if (myActive != null) {
335 myActive.scrollToItem();
336 }
337 }
338
339
340
341
342 private final class MoneyWiseTaxBasisState {
343
344
345
346 private MoneyWiseAnalysisTaxBasisBucket theBasis;
347
348
349
350
351 private MoneyWiseAnalysisTaxBasisAccountBucket theAccount;
352
353
354
355
356 private OceanusDateRange theDateRange;
357
358
359
360
361 private MoneyWiseAnalysisTaxBasisFilter theFilter;
362
363
364
365
366 private MoneyWiseTaxBasisState() {
367 }
368
369
370
371
372
373
374 private MoneyWiseTaxBasisState(final MoneyWiseTaxBasisState pState) {
375
376 theBasis = pState.getTaxBasis();
377 theAccount = pState.getAccount();
378 theDateRange = pState.getDateRange();
379 theFilter = pState.getFilter();
380 }
381
382
383
384
385
386
387 private MoneyWiseAnalysisTaxBasisBucket getTaxBasis() {
388 return theBasis;
389 }
390
391
392
393
394
395
396 private MoneyWiseAnalysisTaxBasisAccountBucket getAccount() {
397 return theAccount;
398 }
399
400
401
402
403
404
405 private OceanusDateRange getDateRange() {
406 return theDateRange;
407 }
408
409
410
411
412
413
414 private MoneyWiseAnalysisTaxBasisFilter getFilter() {
415 return theFilter;
416 }
417
418
419
420
421
422
423
424 private boolean setTaxBasis(final MoneyWiseAnalysisTaxBasisBaseBucket pTaxBasis) {
425
426 if (!MetisDataDifference.isEqual(pTaxBasis, theBasis)) {
427 setTheTaxBasis(pTaxBasis);
428 return true;
429 }
430 return false;
431 }
432
433
434
435
436
437
438 private void setTheTaxBasis(final MoneyWiseAnalysisTaxBasisBaseBucket pTaxBasis) {
439
440 if (pTaxBasis instanceof MoneyWiseAnalysisTaxBasisAccountBucket myAccount) {
441 theAccount = myAccount;
442 final MoneyWiseTaxBasis myTaxBasis = theAccount.getTaxBasis();
443 theBasis = theTaxBases.findItemById(myTaxBasis.getIndexedId());
444 theFilter = new MoneyWiseAnalysisTaxBasisFilter(theAccount);
445 theFilter.setDateRange(theDateRange);
446 } else {
447 theAccount = null;
448 theBasis = (MoneyWiseAnalysisTaxBasisBucket) pTaxBasis;
449 if (theBasis != null) {
450 theFilter = new MoneyWiseAnalysisTaxBasisFilter(theBasis);
451 theFilter.setDateRange(theDateRange);
452 } else {
453 theFilter = null;
454 }
455 }
456 }
457
458
459
460
461
462
463 private void setDateRange(final OceanusDateRange pRange) {
464
465 theDateRange = pRange;
466 if (theFilter != null) {
467 theFilter.setDateRange(theDateRange);
468 }
469 }
470
471
472
473
474 private void applyState() {
475
476 setEnabled(true);
477 theBasisButton.setValue(theBasis);
478 if (theAccount == null) {
479 theAccountButton.setValue(null, NLS_ALL);
480 } else {
481 theAccountButton.setValue(theAccount, theAccount.getSimpleName());
482 }
483 theAccountButton.setEnabled((theBasis != null) && theBasis.hasAccounts());
484 }
485 }
486 }