1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.data.MetisDataItem.MetisDataFieldId;
23 import io.github.tonywasher.joceanus.metis.ui.MetisErrorPanel;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCashCategory;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCashCategory.MoneyWiseCashCategoryList;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCategoryBase;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
29 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCashCategoryClass;
30 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCashCategoryType;
31 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
32 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
33 import io.github.tonywasher.joceanus.moneywise.ui.base.MoneyWiseCategoryTable;
34 import io.github.tonywasher.joceanus.moneywise.ui.dialog.MoneyWiseCashCategoryDialog;
35 import io.github.tonywasher.joceanus.moneywise.views.MoneyWiseView;
36 import io.github.tonywasher.joceanus.prometheus.views.PrometheusDataEvent;
37 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
38 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
39 import io.github.tonywasher.joceanus.tethys.api.menu.TethysUIScrollMenu;
40 import io.github.tonywasher.joceanus.tethys.api.table.TethysUITableManager;
41
42 import java.util.List;
43
44
45
46
47 public class MoneyWiseCashCategoryTable
48 extends MoneyWiseCategoryTable<MoneyWiseCashCategory, MoneyWiseCashCategoryType> {
49
50
51
52 private final MoneyWiseCashCategoryDialog theActiveCategory;
53
54
55
56
57 private MoneyWiseCashCategoryList theCategories;
58
59
60
61
62
63
64
65
66 MoneyWiseCashCategoryTable(final MoneyWiseView pView,
67 final PrometheusEditSet pEditSet,
68 final MetisErrorPanel pError) {
69
70 super(pView, pEditSet, pError, MoneyWiseCashCategory.class, MoneyWiseBasicDataType.CASHCATEGORY);
71
72
73 final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
74
75
76 theActiveCategory = new MoneyWiseCashCategoryDialog(myGuiFactory, pEditSet, this);
77 declareItemPanel(theActiveCategory);
78
79
80 theActiveCategory.getEventRegistrar().addEventListener(PrometheusDataEvent.ADJUSTVISIBILITY, e -> handlePanelState());
81 }
82
83 @Override
84 protected void addCategoryTypeColumn() {
85 final TethysUITableManager<MetisDataFieldId, MoneyWiseCashCategory> myTable = getTable();
86 myTable.declareScrollColumn(MoneyWiseStaticDataType.CASHTYPE, MoneyWiseCashCategoryType.class)
87 .setMenuConfigurator(this::buildCategoryTypeMenu)
88 .setCellValueFactory(MoneyWiseCashCategory::getCategoryType)
89 .setEditable(true)
90 .setCellEditable(r -> !r.isActive())
91 .setColumnWidth(WIDTH_NAME)
92 .setOnCommit((r, v) -> updateField(MoneyWiseCategoryBase::setCategoryType, r, v));
93 }
94
95 @Override
96 protected boolean isItemEditing() {
97 return theActiveCategory.isEditing();
98 }
99
100 @Override
101 protected List<MoneyWiseCashCategory> getCategories() {
102 return theCategories == null ? null : theCategories.getUnderlyingList();
103 }
104
105 @Override
106 protected boolean isChildCategory(final MoneyWiseCashCategoryType pCategoryType) {
107 return !pCategoryType.getCashClass().isParentCategory();
108 }
109
110 @Override
111 protected void refreshData() throws OceanusException {
112
113 OceanusProfile myTask = getView().getActiveTask();
114 myTask = myTask.startTask("CashCategories");
115
116
117 final MoneyWiseDataSet myData = getView().getData();
118 final MoneyWiseCashCategoryList myBase = myData.getCashCategories();
119 theCategories = myBase.deriveEditList(getEditSet());
120 getTable().setItems(theCategories.getUnderlyingList());
121
122
123 MoneyWiseCashCategory myParent = getParent();
124 if (myParent != null) {
125
126 myParent = theCategories.findItemById(myParent.getIndexedId());
127 updateParent(myParent);
128 }
129
130
131 theActiveCategory.refreshData();
132 restoreSelected();
133
134
135 myTask.end();
136 }
137
138 @Override
139 public void cancelEditing() {
140 super.cancelEditing();
141 theActiveCategory.setEditable(false);
142 }
143
144
145
146
147
148
149 void selectCategory(final MoneyWiseCashCategory pCategory) {
150
151 final MoneyWiseCashCategory myCurrent = theActiveCategory.getSelectedItem();
152 if (!MetisDataDifference.isEqual(myCurrent, pCategory)) {
153
154 MoneyWiseCashCategory myParent = pCategory.getParentCategory();
155 if (!MetisDataDifference.isEqual(getParent(), myParent)) {
156 if (myParent != null) {
157 myParent = theCategories.findItemById(myParent.getIndexedId());
158 }
159 selectParent(myParent);
160 }
161
162
163 getTable().selectRow(pCategory);
164 }
165 }
166
167 @Override
168 protected void handleRewind() {
169
170 if (!theActiveCategory.isEditing()) {
171
172 setEnabled(true);
173 super.handleRewind();
174 }
175
176
177 notifyChanges();
178 }
179
180
181
182
183 private void handlePanelState() {
184
185 if (!theActiveCategory.isEditing()) {
186
187 setEnabled(true);
188 final MoneyWiseCashCategory myCategory = theActiveCategory.getSelectedItem();
189 updateTableData();
190 if (myCategory != null) {
191 getTable().selectRow(myCategory);
192 } else {
193 restoreSelected();
194 }
195 } else {
196 getTable().cancelEditing();
197 }
198
199
200 notifyChanges();
201 }
202
203 @Override
204 protected void buildCategoryTypeMenu(final MoneyWiseCashCategory pCategory,
205 final TethysUIScrollMenu<MoneyWiseCashCategoryType> pMenu) {
206
207 theActiveCategory.buildCategoryTypeMenu(pMenu, pCategory);
208 }
209
210 @Override
211 protected void addNewItem() {
212
213 try {
214
215 cancelEditing();
216
217
218 final OceanusProfile myTask = getView().getNewProfile("addNewItem");
219
220
221 myTask.startTask("buildItem");
222 final MoneyWiseCashCategory myCategory = theCategories.addNewItem();
223 myCategory.setDefaults(getParent());
224
225
226 myTask.startTask("incrementVersion");
227 myCategory.setNewVersion();
228 myCategory.adjustMapForItem();
229 getEditSet().incrementVersion();
230
231
232 myTask.startTask("validate");
233 myCategory.validate();
234
235
236 myTask.startTask("setItem");
237 theActiveCategory.setNewItem(myCategory);
238
239
240 setTableEnabled(false);
241 myTask.end();
242
243
244 } catch (OceanusException e) {
245
246 final OceanusException myError = new MoneyWiseDataException("Failed to create new category", e);
247
248
249 setError(myError);
250 }
251 }
252
253 @Override
254 protected boolean isFiltered(final MoneyWiseCashCategory pRow) {
255 final MoneyWiseCashCategory myParent = getParent();
256 return super.isFiltered(pRow) && (myParent == null
257 ? pRow.isCategoryClass(MoneyWiseCashCategoryClass.PARENT)
258 : myParent.equals(pRow.getParentCategory()));
259 }
260 }