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.MoneyWiseCategoryBase;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryList;
29 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
30 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
31 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryType;
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.MoneyWiseTransCategoryDialog;
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 MoneyWiseTransCategoryTable
48 extends MoneyWiseCategoryTable<MoneyWiseTransCategory, MoneyWiseTransCategoryType> {
49
50
51
52 private final MoneyWiseTransCategoryDialog theActiveCategory;
53
54
55
56
57 private MoneyWiseTransCategoryList theCategories;
58
59
60
61
62
63
64
65
66 MoneyWiseTransCategoryTable(final MoneyWiseView pView,
67 final PrometheusEditSet pEditSet,
68 final MetisErrorPanel pError) {
69
70 super(pView, pEditSet, pError, MoneyWiseTransCategory.class, MoneyWiseBasicDataType.TRANSCATEGORY);
71
72
73 final TethysUIFactory<?> myGuiFactory = pView.getGuiFactory();
74
75
76 theActiveCategory = new MoneyWiseTransCategoryDialog(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, MoneyWiseTransCategory> myTable = getTable();
86 myTable.declareScrollColumn(MoneyWiseStaticDataType.TRANSTYPE, MoneyWiseTransCategoryType.class)
87 .setMenuConfigurator(this::buildCategoryTypeMenu)
88 .setCellValueFactory(MoneyWiseTransCategory::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<MoneyWiseTransCategory> getCategories() {
102 return theCategories == null ? null : theCategories.getUnderlyingList();
103 }
104
105 @Override
106 protected boolean isChildCategory(final MoneyWiseTransCategoryType pCategoryType) {
107 return !pCategoryType.getCategoryClass().isSubTotal();
108 }
109
110 @Override
111 protected void refreshData() throws OceanusException {
112
113 OceanusProfile myTask = getView().getActiveTask();
114 myTask = myTask.startTask("TransactionCategories");
115
116
117 final MoneyWiseDataSet myData = getView().getData();
118 final MoneyWiseTransCategoryList myBase = myData.getTransCategories();
119 theCategories = myBase.deriveEditList(getEditSet());
120 getTable().setItems(theCategories.getUnderlyingList());
121
122
123 MoneyWiseTransCategory 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 MoneyWiseTransCategory pCategory) {
150
151 final MoneyWiseTransCategory myCurrent = theActiveCategory.getSelectedItem();
152 if (!MetisDataDifference.isEqual(myCurrent, pCategory)) {
153
154 MoneyWiseTransCategory 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 MoneyWiseTransCategory 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 MoneyWiseTransCategory pCategory,
205 final TethysUIScrollMenu<MoneyWiseTransCategoryType> 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 MoneyWiseTransCategory 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
234
235 myTask.startTask("setItem");
236 theActiveCategory.setNewItem(myCategory);
237
238
239 setTableEnabled(false);
240 myTask.end();
241
242
243 } catch (OceanusException e) {
244
245 final OceanusException myError = new MoneyWiseDataException("Failed to create new category", e);
246
247
248 setError(myError);
249 }
250 }
251
252 @Override
253 protected boolean isFiltered(final MoneyWiseTransCategory pRow) {
254 final MoneyWiseTransCategory myParent = getParent();
255 return super.isFiltered(pRow) && (myParent == null
256 ? pRow.getParentCategory() == null
257 || pRow.getParentCategory().isCategoryClass(MoneyWiseTransCategoryClass.TOTALS)
258 : myParent.equals(pRow.getParentCategory()));
259 }
260 }