View Javadoc
1   /*
2    * MoneyWise: Finance Application
3    * Copyright 2012-2026. Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License.  You may obtain a copy
7    * of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14   * License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  package io.github.tonywasher.joceanus.moneywise.ui.panel;
18  
19  import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20  import io.github.tonywasher.joceanus.oceanus.profile.OceanusProfile;
21  import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
22  import io.github.tonywasher.joceanus.metis.ui.MetisErrorPanel;
23  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
24  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
25  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
26  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit.MoneyWiseDepositList;
27  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositRate;
28  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositRate.MoneyWiseDepositRateList;
29  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
30  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAssetCategory;
31  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
32  import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
33  import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseAssetTable;
34  import io.github.tonywasher.joceanus.moneywise.ui.dialog.MoneyWiseDepositDialog;
35  import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
36  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
37  import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
38  import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditEntry;
39  import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
40  import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
41  import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
42  
43  import java.util.Iterator;
44  
45  /**
46   * MoneyWise Deposit Table.
47   */
48  public class MoneyWiseDepositTable
49          extends MoneyWiseAssetTable<MoneyWiseDeposit> {
50      /**
51       * The Rate UpdateEntry.
52       */
53      private final PrometheusEditEntry<MoneyWiseDepositRate> theRateEntry;
54  
55      /**
56       * The Deposit dialog.
57       */
58      private final MoneyWiseDepositDialog theActiveDeposit;
59  
60      /**
61       * The edit list.
62       */
63      private MoneyWiseDepositList theDeposits;
64  
65      /**
66       * Constructor.
67       *
68       * @param pView    the view
69       * @param pEditSet the editSet
70       * @param pError   the error panel
71       */
72      MoneyWiseDepositTable(final MoneyWiseView pView,
73                            final PrometheusEditSet pEditSet,
74                            final MetisErrorPanel pError) {
75          /* Store parameters */
76          super(pView, pEditSet, pError, MoneyWiseBasicDataType.DEPOSIT);
77  
78          /* register the info/rateEntries */
79          getEditSet().registerType(MoneyWiseBasicDataType.DEPOSITINFO);
80          theRateEntry = getEditSet().registerType(MoneyWiseBasicDataType.DEPOSITRATE);
81  
82          /* Access Gui factory */
83          final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
84  
85          /* Create a Deposit panel */
86          theActiveDeposit = new MoneyWiseDepositDialog(myGuiFactory, pView, pEditSet, this);
87          declareItemPanel(theActiveDeposit);
88  
89          /* Finish the table */
90          finishTable(true, true, true);
91  
92          /* Add listeners */
93          theActiveDeposit.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> handlePanelState());
94      }
95  
96      @Override
97      protected boolean isItemEditing() {
98          return theActiveDeposit.isEditing();
99      }
100 
101     @Override
102     protected void refreshData() throws OceanusException {
103         /* Obtain the active profile */
104         OceanusProfile myTask = getView().getActiveTask();
105         myTask = myTask.startTask("Deposits");
106 
107         /* Access list */
108         final MoneyWiseDataSet myData = getView().getData();
109         final MoneyWiseDepositList myBase = myData.getDeposits();
110         theDeposits = myBase.deriveEditList(getEditSet());
111         getTable().setItems(theDeposits.getUnderlyingList());
112 
113         /* Get the Deposit rates list */
114         MoneyWiseDepositRateList myRates = myData.getDepositRates();
115         myRates = myRates.deriveEditList(getEditSet());
116         theRateEntry.setDataList(myRates);
117 
118         /* Notify panel of refresh */
119         theActiveDeposit.refreshData();
120         restoreSelected();
121 
122         /* Complete the task */
123         myTask.end();
124     }
125 
126     @Override
127     public void cancelEditing() {
128         super.cancelEditing();
129         theActiveDeposit.setEditable(false);
130     }
131 
132     /**
133      * Select Deposit.
134      *
135      * @param pDeposit the Deposit to select
136      */
137     void selectDeposit(final MoneyWiseDeposit pDeposit) {
138         /* Check whether we need to showAll */
139         checkShowAll(pDeposit);
140 
141         /* If we are changing the selection */
142         final MoneyWiseDeposit myCurrent = theActiveDeposit.getSelectedItem();
143         if (!MetisDataDifference.isEqual(myCurrent, pDeposit)) {
144             /* Select the row and ensure that it is visible */
145             getTable().selectRow(pDeposit);
146         }
147     }
148 
149     @Override
150     protected void handleRewind() {
151         /* Only action if we are not editing */
152         if (!theActiveDeposit.isEditing()) {
153             /* Handle the reWind */
154             setEnabled(true);
155             super.handleRewind();
156         }
157 
158         /* Adjust for changes */
159         notifyChanges();
160     }
161 
162     /**
163      * Handle panel state.
164      */
165     private void handlePanelState() {
166         /* Only action if we are not editing */
167         if (!theActiveDeposit.isEditing()) {
168             /* handle the edit transition */
169             setEnabled(true);
170             final MoneyWiseDeposit myDeposit = theActiveDeposit.getSelectedItem();
171             updateTableData();
172             if (myDeposit != null) {
173                 getTable().selectRow(myDeposit);
174             } else {
175                 restoreSelected();
176             }
177         } else {
178             getTable().cancelEditing();
179         }
180 
181         /* Note changes */
182         notifyChanges();
183     }
184 
185     @Override
186     protected void buildCategoryMenu(final MoneyWiseDeposit pDeposit,
187                                      final TethysUIScrollMenu<MoneyWiseAssetCategory> pMenu) {
188         /* Build the menu */
189         theActiveDeposit.buildCategoryMenu(pMenu, pDeposit);
190     }
191 
192     @Override
193     protected void buildParentMenu(final MoneyWiseDeposit pDeposit,
194                                    final TethysUIScrollMenu<MoneyWisePayee> pMenu) {
195         /* Build the menu */
196         theActiveDeposit.buildParentMenu(pMenu, pDeposit);
197     }
198 
199     @Override
200     protected void buildCurrencyMenu(final MoneyWiseDeposit pDeposit,
201                                      final TethysUIScrollMenu<MoneyWiseCurrency> pMenu) {
202         /* Build the menu */
203         theActiveDeposit.buildCurrencyMenu(pMenu, pDeposit);
204     }
205 
206     @Override
207     protected void addNewItem() {
208         /* Protect against Exceptions */
209         try {
210             /* Make sure that we have finished editing */
211             cancelEditing();
212 
213             /* Create a new profile */
214             final OceanusProfile myTask = getView().getNewProfile("addNewItem");
215 
216             /* Create the new asset */
217             myTask.startTask("buildItem");
218             final MoneyWiseDeposit myDeposit = theDeposits.addNewItem();
219             myDeposit.setDefaults();
220 
221             /* Set as new and adjust map */
222             myTask.startTask("incrementVersion");
223             myDeposit.setNewVersion();
224             myDeposit.adjustMapForItem();
225             getEditSet().incrementVersion();
226 
227             /* Validate the new item */
228             myTask.startTask("validate");
229             myDeposit.validate();
230 
231             /* update panel */
232             myTask.startTask("setItem");
233             theActiveDeposit.setNewItem(myDeposit);
234 
235             /* Lock the table */
236             setTableEnabled(false);
237             myTask.end();
238 
239             /* Handle Exceptions */
240         } catch (OceanusException e) {
241             /* Build the error */
242             final OceanusException myError = new MoneyWiseDataException("Failed to create new deposit", e);
243 
244             /* Show the error */
245             setError(myError);
246         }
247     }
248 
249     @Override
250     protected Iterator<PrometheusDataItem> nameSpaceIterator() {
251         return assetNameSpaceIterator();
252     }
253 }
254