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.MoneyWisePayee;
26  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
27  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAssetCategory;
28  import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
29  import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseAssetTable;
30  import io.github.tonywasher.joceanus.moneywise.ui.dialog.MoneyWisePayeeDialog;
31  import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
32  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
33  import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
34  import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
35  import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
36  import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
37  
38  import java.util.Iterator;
39  
40  /**
41   * MoneyWise Payee Table.
42   */
43  public class MoneyWisePayeeTable
44          extends MoneyWiseAssetTable<MoneyWisePayee> {
45      /**
46       * The Payee dialog.
47       */
48      private final MoneyWisePayeeDialog theActivePayee;
49  
50      /**
51       * The edit list.
52       */
53      private MoneyWisePayeeList thePayees;
54  
55      /**
56       * Constructor.
57       *
58       * @param pView    the view
59       * @param pEditSet the editSet
60       * @param pError   the error panel
61       */
62      MoneyWisePayeeTable(final MoneyWiseView pView,
63                          final PrometheusEditSet pEditSet,
64                          final MetisErrorPanel pError) {
65          /* Store parameters */
66          super(pView, pEditSet, pError, MoneyWiseBasicDataType.PAYEE);
67  
68          /* register the infoEntry */
69          getEditSet().registerType(MoneyWiseBasicDataType.PAYEEINFO);
70  
71          /* Access Gui factory */
72          final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
73  
74          /* Create a payee panel */
75          theActivePayee = new MoneyWisePayeeDialog(myGuiFactory, pEditSet, this);
76          declareItemPanel(theActivePayee);
77  
78          /* Finish the table */
79          finishTable(false, false, true);
80  
81          /* Add listeners */
82          theActivePayee.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> handlePanelState());
83      }
84  
85      @Override
86      protected boolean isItemEditing() {
87          return theActivePayee.isEditing();
88      }
89  
90      @Override
91      protected void refreshData() throws OceanusException {
92          /* Obtain the active profile */
93          OceanusProfile myTask = getView().getActiveTask();
94          myTask = myTask.startTask("Payees");
95  
96          /* Access list */
97          final MoneyWiseDataSet myData = getView().getData();
98          final MoneyWisePayeeList myBase = myData.getPayees();
99          thePayees = myBase.deriveEditList(getEditSet());
100         getTable().setItems(thePayees.getUnderlyingList());
101 
102         /* Notify panel of refresh */
103         theActivePayee.refreshData();
104         restoreSelected();
105 
106         /* Complete the task */
107         myTask.end();
108     }
109 
110     @Override
111     public void cancelEditing() {
112         super.cancelEditing();
113         theActivePayee.setEditable(false);
114     }
115 
116     /**
117      * Select payee.
118      *
119      * @param pPayee the payee to select
120      */
121     void selectPayee(final MoneyWisePayee pPayee) {
122         /* Check whether we need to showAll */
123         checkShowAll(pPayee);
124 
125         /* If we are changing the selection */
126         final MoneyWisePayee myCurrent = theActivePayee.getSelectedItem();
127         if (!MetisDataDifference.isEqual(myCurrent, pPayee)) {
128             /* Select the row and ensure that it is visible */
129             getTable().selectRow(pPayee);
130         }
131     }
132 
133     @Override
134     protected void handleRewind() {
135         /* Only action if we are not editing */
136         if (!theActivePayee.isEditing()) {
137             /* Handle the reWind */
138             setEnabled(true);
139             super.handleRewind();
140         }
141 
142         /* Adjust for changes */
143         notifyChanges();
144     }
145 
146     /**
147      * Handle panel state.
148      */
149     private void handlePanelState() {
150         /* Only action if we are not editing */
151         if (!theActivePayee.isEditing()) {
152             /* handle the edit transition */
153             setEnabled(true);
154             final MoneyWisePayee myPayee = theActivePayee.getSelectedItem();
155             updateTableData();
156             if (myPayee != null) {
157                 getTable().selectRow(myPayee);
158             } else {
159                 restoreSelected();
160             }
161         } else {
162             getTable().cancelEditing();
163         }
164 
165         /* Note changes */
166         notifyChanges();
167     }
168 
169     @Override
170     protected void buildCategoryMenu(final MoneyWisePayee pPayee,
171                                      final TethysUIScrollMenu<MoneyWiseAssetCategory> pMenu) {
172         /* Build the menu */
173         theActivePayee.buildPayeeTypeMenu(pMenu, pPayee);
174     }
175 
176     @Override
177     protected void addNewItem() {
178         /* Protect against Exceptions */
179         try {
180             /* Make sure that we have finished editing */
181             cancelEditing();
182 
183             /* Create a new profile */
184             final OceanusProfile myTask = getView().getNewProfile("addNewItem");
185 
186             /* Create the new asset */
187             myTask.startTask("buildItem");
188             final MoneyWisePayee myPayee = thePayees.addNewItem();
189             myPayee.setDefaults();
190 
191             /* Set as new and adjust map */
192             myTask.startTask("incrementVersion");
193             myPayee.setNewVersion();
194             myPayee.adjustMapForItem();
195             getEditSet().incrementVersion();
196 
197             /* Validate the new item */
198             myTask.startTask("validate");
199             myPayee.validate();
200 
201             /* update panel */
202             myTask.startTask("setItem");
203             theActivePayee.setNewItem(myPayee);
204 
205             /* Lock the table */
206             setTableEnabled(false);
207             myTask.end();
208 
209             /* Handle Exceptions */
210         } catch (OceanusException e) {
211             /* Build the error */
212             final OceanusException myError = new MoneyWiseDataException("Failed to create new payee", e);
213 
214             /* Show the error */
215             setError(myError);
216         }
217     }
218 
219     @Override
220     protected Iterator<PrometheusDataItem> nameSpaceIterator() {
221         return assetNameSpaceIterator();
222     }
223 }