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.basic.MoneyWiseBasicDataType;
25 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
26 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPayeeBucket;
27 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPayeeBucket.MoneyWiseAnalysisPayeeBucketList;
28 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter;
29 import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter.MoneyWiseAnalysisPayeeFilter;
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 MoneyWisePayeeAnalysisSelect
47 implements MoneyWiseAnalysisFilterSelection, 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<MoneyWiseAnalysisPayeeBucket> theButton;
67
68
69
70
71 private final TethysUIScrollMenu<MoneyWiseAnalysisPayeeBucket> thePayeeMenu;
72
73
74
75
76 private MoneyWiseAnalysisPayeeBucketList 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 MoneyWisePayeeAnalysisSelect(final TethysUIFactory<?> pFactory) {
94
95 theButton = pFactory.buttonFactory().newScrollButton(MoneyWiseAnalysisPayeeBucket.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 MoneyWiseAnalysisPayeeFilter 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 MoneyWiseAnalysis pAnalysis) {
179
180 thePayees = pAnalysis.getPayees();
181
182
183 MoneyWiseAnalysisPayeeBucket 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 MoneyWiseAnalysisFilter<?, ?> pFilter) {
198
199 if (pFilter instanceof MoneyWiseAnalysisPayeeFilter) {
200
201 final MoneyWiseAnalysisPayeeFilter myFilter = (MoneyWiseAnalysisPayeeFilter) pFilter;
202
203
204 MoneyWiseAnalysisPayeeBucket myPayee = myFilter.getBucket();
205
206
207 myPayee = thePayees.getMatchingPayee(myPayee.getPayee());
208
209
210 theState.setThePayee(myPayee);
211 theState.setDateRange(myFilter.getDateRange());
212 theState.applyState();
213 }
214 }
215
216
217
218
219 private void handleNewPayee() {
220
221 if (theState.setPayee(theButton.getValue())) {
222 theState.applyState();
223 theEventManager.fireEvent(PrometheusDataEvent.SELECTIONCHANGED);
224 }
225 }
226
227
228
229
230 private void buildPayeeMenu() {
231
232 thePayeeMenu.removeAllItems();
233
234
235 TethysUIScrollItem<MoneyWiseAnalysisPayeeBucket> myActive = null;
236 final MoneyWiseAnalysisPayeeBucket myCurr = theState.getPayee();
237
238
239 final Iterator<MoneyWiseAnalysisPayeeBucket> myIterator = thePayees.iterator();
240 while (myIterator.hasNext()) {
241 final MoneyWiseAnalysisPayeeBucket myBucket = myIterator.next();
242
243
244 final TethysUIScrollItem<MoneyWiseAnalysisPayeeBucket> myItem = thePayeeMenu.addItem(myBucket);
245
246
247 if (myBucket.equals(myCurr)) {
248
249 myActive = myItem;
250 }
251 }
252
253
254 if (myActive != null) {
255 myActive.scrollToItem();
256 }
257 }
258
259
260
261
262 private final class MoneyWisePayeeState {
263
264
265
266 private MoneyWiseAnalysisPayeeBucket thePayee;
267
268
269
270
271 private OceanusDateRange theDateRange;
272
273
274
275
276 private MoneyWiseAnalysisPayeeFilter theFilter;
277
278
279
280
281 private MoneyWisePayeeState() {
282 }
283
284
285
286
287
288
289 private MoneyWisePayeeState(final MoneyWisePayeeState pState) {
290
291 thePayee = pState.getPayee();
292 theDateRange = pState.getDateRange();
293 theFilter = pState.getFilter();
294 }
295
296
297
298
299
300
301 private MoneyWiseAnalysisPayeeBucket getPayee() {
302 return thePayee;
303 }
304
305
306
307
308
309
310 private OceanusDateRange getDateRange() {
311 return theDateRange;
312 }
313
314
315
316
317
318
319 private MoneyWiseAnalysisPayeeFilter getFilter() {
320 return theFilter;
321 }
322
323
324
325
326
327
328
329 private boolean setPayee(final MoneyWiseAnalysisPayeeBucket pPayee) {
330
331 if (!MetisDataDifference.isEqual(pPayee, thePayee)) {
332 setThePayee(pPayee);
333 return true;
334 }
335 return false;
336 }
337
338
339
340
341
342
343 private void setThePayee(final MoneyWiseAnalysisPayeeBucket pPayee) {
344
345 thePayee = pPayee;
346 if (thePayee != null) {
347 theFilter = new MoneyWiseAnalysisPayeeFilter(thePayee);
348 theFilter.setDateRange(theDateRange);
349 } else {
350 theFilter = null;
351 }
352 }
353
354
355
356
357
358
359 private void setDateRange(final OceanusDateRange pRange) {
360
361 theDateRange = pRange;
362 if (theFilter != null) {
363 theFilter.setDateRange(theDateRange);
364 }
365 }
366
367
368
369
370 private void applyState() {
371
372 setEnabled(true);
373 theButton.setValue(thePayee);
374 }
375 }
376 }