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.MoneyWiseXAnalysisPayeeBucket;
26 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisPayeeBucket.MoneyWiseXAnalysisPayeeBucketList;
27 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter;
28 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter.MoneyWiseXAnalysisPayeeFilter;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
30 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
31 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIComponent;
32 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIConstant;
33 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIEvent;
34 import io.github.tonywasher.joceanus.tethys.api.button.TethysUIScrollButtonManager;
35 import io.github.tonywasher.joceanus.tethys.api.control.TethysUILabel;
36 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
37 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollItem;
38 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
39 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBoxPaneManager;
40
41 import java.util.Iterator;
42
43
44
45
46 public class MoneyWiseXPayeeAnalysisSelect
47 implements MoneyWiseXAnalysisFilterSelection, OceanusEventProvider<PrometheusDataEvent> {
48
49
50
51 private static final String NLS_PAYEE = MoneyWiseBasicDataType.PAYEE.getItemName();
52
53
54
55
56 private final OceanusEventManager<PrometheusDataEvent> theEventManager;
57
58
59
60
61 private final TethysUIBoxPaneManager thePanel;
62
63
64
65
66 private final TethysUIScrollButtonManager<MoneyWiseXAnalysisPayeeBucket> theButton;
67
68
69
70
71 private final TethysUIScrollMenu<MoneyWiseXAnalysisPayeeBucket> thePayeeMenu;
72
73
74
75
76 private MoneyWiseXAnalysisPayeeBucketList thePayees;
77
78
79
80
81 private MoneyWisePayeeState theState;
82
83
84
85
86 private MoneyWisePayeeState theSavePoint;
87
88
89
90
91
92
93 protected MoneyWiseXPayeeAnalysisSelect(final TethysUIFactory<?> pFactory) {
94
95 theButton = pFactory.buttonFactory().newScrollButton(MoneyWiseXAnalysisPayeeBucket.class);
96
97
98 theEventManager = new OceanusEventManager<>();
99
100
101 final TethysUILabel myLabel = pFactory.controlFactory().newLabel(NLS_PAYEE + TethysUIConstant.STR_COLON);
102
103
104 thePanel = pFactory.paneFactory().newHBoxPane();
105 thePanel.addSpacer();
106 thePanel.addNode(myLabel);
107 thePanel.addNode(theButton);
108
109
110 theState = new MoneyWisePayeeState();
111 theState.applyState();
112
113
114 thePayeeMenu = theButton.getMenu();
115
116
117 final OceanusEventRegistrar<TethysUIEvent> myRegistrar = theButton.getEventRegistrar();
118 myRegistrar.addEventListener(TethysUIEvent.NEWVALUE, e -> handleNewPayee());
119 theButton.setMenuConfigurator(e -> buildPayeeMenu());
120 }
121
122 @Override
123 public TethysUIComponent getUnderlying() {
124 return thePanel;
125 }
126
127 @Override
128 public OceanusEventRegistrar<PrometheusDataEvent> getEventRegistrar() {
129 return theEventManager.getEventRegistrar();
130 }
131
132 @Override
133 public MoneyWiseXAnalysisPayeeFilter getFilter() {
134 return theState.getFilter();
135 }
136
137 @Override
138 public boolean isAvailable() {
139 return thePayees != null
140 && !thePayees.isEmpty();
141 }
142
143
144
145
146 public void createSavePoint() {
147
148 theSavePoint = new MoneyWisePayeeState(theState);
149 }
150
151
152
153
154 public void restoreSavePoint() {
155
156 theState = new MoneyWisePayeeState(theSavePoint);
157
158
159 theState.applyState();
160 }
161
162 @Override
163 public void setEnabled(final boolean bEnabled) {
164
165 theButton.setEnabled(bEnabled && isAvailable());
166 }
167
168 @Override
169 public void setVisible(final boolean pVisible) {
170 thePanel.setVisible(pVisible);
171 }
172
173
174
175
176
177
178 public void setAnalysis(final MoneyWiseXAnalysis pAnalysis) {
179
180 thePayees = pAnalysis.getPayees();
181
182
183 MoneyWiseXAnalysisPayeeBucket myPayee = theState.getPayee();
184
185
186 myPayee = myPayee != null
187 ? thePayees.getMatchingPayee(myPayee.getPayee())
188 : thePayees.getDefaultPayee();
189
190
191 theState.setThePayee(myPayee);
192 theState.setDateRange(pAnalysis.getDateRange());
193 theState.applyState();
194 }
195
196 @Override
197 public void setFilter(final MoneyWiseXAnalysisFilter<?, ?> pFilter) {
198
199 if (pFilter instanceof MoneyWiseXAnalysisPayeeFilter myFilter) {
200
201 MoneyWiseXAnalysisPayeeBucket myPayee = myFilter.getBucket();
202
203
204 myPayee = thePayees.getMatchingPayee(myPayee.getPayee());
205
206
207 theState.setThePayee(myPayee);
208 theState.setDateRange(myFilter.getDateRange());
209 theState.applyState();
210 }
211 }
212
213
214
215
216 private void handleNewPayee() {
217
218 if (theState.setPayee(theButton.getValue())) {
219 theState.applyState();
220 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
221 }
222 }
223
224
225
226
227 private void buildPayeeMenu() {
228
229 thePayeeMenu.removeAllItems();
230
231
232 TethysUIScrollItem<MoneyWiseXAnalysisPayeeBucket> myActive = null;
233 final MoneyWiseXAnalysisPayeeBucket myCurr = theState.getPayee();
234
235
236 final Iterator<MoneyWiseXAnalysisPayeeBucket> myIterator = thePayees.iterator();
237 while (myIterator.hasNext()) {
238 final MoneyWiseXAnalysisPayeeBucket myBucket = myIterator.next();
239
240
241 final TethysUIScrollItem<MoneyWiseXAnalysisPayeeBucket> myItem = thePayeeMenu.addItem(myBucket);
242
243
244 if (myBucket.equals(myCurr)) {
245
246 myActive = myItem;
247 }
248 }
249
250
251 if (myActive != null) {
252 myActive.scrollToItem();
253 }
254 }
255
256
257
258
259 private final class MoneyWisePayeeState {
260
261
262
263 private MoneyWiseXAnalysisPayeeBucket thePayee;
264
265
266
267
268 private OceanusDateRange theDateRange;
269
270
271
272
273 private MoneyWiseXAnalysisPayeeFilter theFilter;
274
275
276
277
278 private MoneyWisePayeeState() {
279 }
280
281
282
283
284
285
286 private MoneyWisePayeeState(final MoneyWisePayeeState pState) {
287
288 thePayee = pState.getPayee();
289 theDateRange = pState.getDateRange();
290 theFilter = pState.getFilter();
291 }
292
293
294
295
296
297
298 private MoneyWiseXAnalysisPayeeBucket getPayee() {
299 return thePayee;
300 }
301
302
303
304
305
306
307 private OceanusDateRange getDateRange() {
308 return theDateRange;
309 }
310
311
312
313
314
315
316 private MoneyWiseXAnalysisPayeeFilter getFilter() {
317 return theFilter;
318 }
319
320
321
322
323
324
325
326 private boolean setPayee(final MoneyWiseXAnalysisPayeeBucket pPayee) {
327
328 if (!MetisDataDifference.isEqual(pPayee, thePayee)) {
329 setThePayee(pPayee);
330 return true;
331 }
332 return false;
333 }
334
335
336
337
338
339
340 private void setThePayee(final MoneyWiseXAnalysisPayeeBucket pPayee) {
341
342 thePayee = pPayee;
343 if (thePayee != null) {
344 theFilter = new MoneyWiseXAnalysisPayeeFilter(thePayee);
345 theFilter.setDateRange(theDateRange);
346 } else {
347 theFilter = null;
348 }
349 }
350
351
352
353
354
355
356 private void setDateRange(final OceanusDateRange pRange) {
357
358 theDateRange = pRange;
359 if (theFilter != null) {
360 theFilter.setDateRange(theDateRange);
361 }
362 }
363
364
365
366
367 private void applyState() {
368
369 setEnabled(true);
370 theButton.setValue(thePayee);
371 }
372 }
373 }