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