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.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.data.statics.MoneyWiseStaticDataType;
25 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
26 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisDataResource;
27 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisAccountBucket;
28 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisBucket;
29 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisTaxBasisBucket.MoneyWiseAnalysisTaxBasisBucketList;
30 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter;
31 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter.MoneyWiseAnalysisTaxBasisFilter;
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 MoneyWiseTaxBasisAnalysisSelect
51 implements MoneyWiseAnalysisFilterSelection, 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 = MoneyWiseAnalysisDataResource.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<MoneyWiseAnalysisTaxBasisBucket> theBasisButton;
81
82
83
84
85 private final TethysUIScrollButtonManager<MoneyWiseAnalysisTaxBasisAccountBucket> theAccountButton;
86
87
88
89
90 private final TethysUIScrollMenu<MoneyWiseAnalysisTaxBasisBucket> theTaxMenu;
91
92
93
94
95 private final TethysUIScrollMenu<MoneyWiseAnalysisTaxBasisAccountBucket> theAccountMenu;
96
97
98
99
100 private MoneyWiseAnalysisTaxBasisBucketList 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 MoneyWiseTaxBasisAnalysisSelect(final TethysUIFactory<?> pFactory) {
118
119 final TethysUIButtonFactory<?> myButtons = pFactory.buttonFactory();
120 theBasisButton = myButtons.newScrollButton(MoneyWiseAnalysisTaxBasisBucket.class);
121 theAccountButton = myButtons.newScrollButton(MoneyWiseAnalysisTaxBasisAccountBucket.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 MoneyWiseAnalysisTaxBasisFilter 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 MoneyWiseAnalysis pAnalysis) {
214
215 theTaxBases = pAnalysis.getTaxBasis();
216
217
218 MoneyWiseAnalysisTaxBasisBucket 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 MoneyWiseAnalysisFilter<?, ?> pFilter) {
233
234 if (pFilter instanceof MoneyWiseAnalysisTaxBasisFilter) {
235
236 final MoneyWiseAnalysisTaxBasisFilter myFilter = (MoneyWiseAnalysisTaxBasisFilter) pFilter;
237
238
239 MoneyWiseAnalysisTaxBasisBucket myTaxBasis = myFilter.getBucket();
240
241
242 myTaxBasis = theTaxBases.getMatchingBasis(myTaxBasis);
243
244
245 theState.setTheTaxBasis(myTaxBasis);
246 theState.setDateRange(myFilter.getDateRange());
247 theState.applyState();
248 }
249 }
250
251
252
253
254 private void handleNewBasis() {
255
256 if (theState.setTaxBasis(theBasisButton.getValue())) {
257 theState.applyState();
258 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
259 }
260 }
261
262
263
264
265 private void handleNewAccount() {
266
267 if (theState.setTaxBasis(theAccountButton.getValue())) {
268 theState.applyState();
269 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
270 }
271 }
272
273
274
275
276 private void buildBasisMenu() {
277
278 theTaxMenu.removeAllItems();
279
280
281 TethysUIScrollItem<MoneyWiseAnalysisTaxBasisBucket> myActive = null;
282 final MoneyWiseAnalysisTaxBasisBucket myCurr = theState.getTaxBasis();
283
284
285 final Iterator<MoneyWiseAnalysisTaxBasisBucket> myIterator = theTaxBases.iterator();
286 while (myIterator.hasNext()) {
287 final MoneyWiseAnalysisTaxBasisBucket myBucket = myIterator.next();
288
289
290 final TethysUIScrollItem<MoneyWiseAnalysisTaxBasisBucket> myItem = theTaxMenu.addItem(myBucket);
291
292
293 if (myBucket.equals(myCurr)) {
294
295 myActive = myItem;
296 }
297 }
298
299
300 if (myActive != null) {
301 myActive.scrollToItem();
302 }
303 }
304
305
306
307
308 private void buildAccountMenu() {
309
310 theAccountMenu.removeAllItems();
311
312
313 final MoneyWiseAnalysisTaxBasisBucket myBasis = theState.getTaxBasis();
314 final MoneyWiseAnalysisTaxBasisAccountBucket myCurr = theState.getAccount();
315
316
317 TethysUIScrollItem<MoneyWiseAnalysisTaxBasisAccountBucket> myActive = theAccountMenu.addItem(null, NLS_ALL);
318
319
320 final Iterator<MoneyWiseAnalysisTaxBasisAccountBucket> myIterator = myBasis.accountIterator();
321 while (myIterator.hasNext()) {
322 final MoneyWiseAnalysisTaxBasisAccountBucket myBucket = myIterator.next();
323
324
325 final TethysUIScrollItem<MoneyWiseAnalysisTaxBasisAccountBucket> myItem = theAccountMenu.addItem(myBucket, myBucket.getSimpleName());
326
327
328 if (myBucket.equals(myCurr)) {
329
330 myActive = myItem;
331 }
332 }
333
334
335 if (myActive != null) {
336 myActive.scrollToItem();
337 }
338 }
339
340
341
342
343 private final class MoneyWiseTaxBasisState {
344
345
346
347 private MoneyWiseAnalysisTaxBasisBucket theBasis;
348
349
350
351
352 private MoneyWiseAnalysisTaxBasisAccountBucket theAccount;
353
354
355
356
357 private OceanusDateRange theDateRange;
358
359
360
361
362 private MoneyWiseAnalysisTaxBasisFilter theFilter;
363
364
365
366
367 private MoneyWiseTaxBasisState() {
368 }
369
370
371
372
373
374
375 private MoneyWiseTaxBasisState(final MoneyWiseTaxBasisState pState) {
376
377 theBasis = pState.getTaxBasis();
378 theAccount = pState.getAccount();
379 theDateRange = pState.getDateRange();
380 theFilter = pState.getFilter();
381 }
382
383
384
385
386
387
388 private MoneyWiseAnalysisTaxBasisBucket getTaxBasis() {
389 return theBasis;
390 }
391
392
393
394
395
396
397 private MoneyWiseAnalysisTaxBasisAccountBucket getAccount() {
398 return theAccount;
399 }
400
401
402
403
404
405
406 private OceanusDateRange getDateRange() {
407 return theDateRange;
408 }
409
410
411
412
413
414
415 private MoneyWiseAnalysisTaxBasisFilter getFilter() {
416 return theFilter;
417 }
418
419
420
421
422
423
424
425 private boolean setTaxBasis(final MoneyWiseAnalysisTaxBasisBucket pTaxBasis) {
426
427 if (!MetisDataDifference.isEqual(pTaxBasis, theBasis)) {
428 setTheTaxBasis(pTaxBasis);
429 return true;
430 }
431 return false;
432 }
433
434
435
436
437
438
439 private void setTheTaxBasis(final MoneyWiseAnalysisTaxBasisBucket pTaxBasis) {
440
441 if (pTaxBasis instanceof MoneyWiseAnalysisTaxBasisAccountBucket) {
442 theAccount = (MoneyWiseAnalysisTaxBasisAccountBucket) pTaxBasis;
443 theBasis = theAccount.getParent();
444 theFilter = new MoneyWiseAnalysisTaxBasisFilter(theAccount);
445 theFilter.setDateRange(theDateRange);
446 } else {
447 theAccount = null;
448 theBasis = 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 }