comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/CollisionLoadYearPanel.java @ 9075:89740fe82196

Extract Table from Panel
author gernotbelger
date Fri, 18 May 2018 17:42:34 +0200
parents 766890addcb2
children 22d8928895a1
comparison
equal deleted inserted replaced
9074:766890addcb2 9075:89740fe82196
7 */ 7 */
8 8
9 package org.dive4elements.river.client.client.ui.sinfo; 9 package org.dive4elements.river.client.client.ui.sinfo;
10 10
11 import java.util.ArrayList; 11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List; 12 import java.util.List;
14 import java.util.Map;
15 import java.util.Map.Entry;
16 import java.util.SortedMap;
17 import java.util.TreeMap;
18 13
19 import org.dive4elements.river.client.client.FLYSConstants; 14 import org.dive4elements.river.client.client.FLYSConstants;
20 import org.dive4elements.river.client.client.ui.AbstractUIProvider; 15 import org.dive4elements.river.client.client.ui.AbstractUIProvider;
21 import org.dive4elements.river.client.client.ui.ParameterMatrix.Column; 16 import org.dive4elements.river.client.client.ui.TableHelper;
17 import org.dive4elements.river.client.client.ui.TableHelper.IColumnClickHandler;
22 import org.dive4elements.river.client.shared.model.Data; 18 import org.dive4elements.river.client.shared.model.Data;
23 import org.dive4elements.river.client.shared.model.DataItem; 19 import org.dive4elements.river.client.shared.model.DataItem;
24 import org.dive4elements.river.client.shared.model.DataList; 20 import org.dive4elements.river.client.shared.model.DataList;
25 import org.dive4elements.river.client.shared.model.DefaultData; 21 import org.dive4elements.river.client.shared.model.DefaultData;
26 import org.dive4elements.river.client.shared.model.DefaultDataItem; 22 import org.dive4elements.river.client.shared.model.DefaultDataItem;
27 import org.dive4elements.river.client.shared.model.MultiAttributeData;
28 import org.dive4elements.river.client.shared.model.MultiDataItem;
29 23
30 import com.google.gwt.core.client.GWT; 24 import com.google.gwt.core.client.GWT;
31 import com.google.gwt.i18n.client.NumberFormat; 25 import com.google.gwt.i18n.client.NumberFormat;
32 import com.smartgwt.client.data.Record;
33 import com.smartgwt.client.types.Alignment;
34 import com.smartgwt.client.types.ListGridFieldType;
35 import com.smartgwt.client.widgets.Canvas; 26 import com.smartgwt.client.widgets.Canvas;
36 import com.smartgwt.client.widgets.Label; 27 import com.smartgwt.client.widgets.Label;
37 import com.smartgwt.client.widgets.form.DynamicForm; 28 import com.smartgwt.client.widgets.form.DynamicForm;
38 import com.smartgwt.client.widgets.form.fields.TextItem; 29 import com.smartgwt.client.widgets.form.fields.TextItem;
39 import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; 30 import com.smartgwt.client.widgets.form.validator.IsIntegerValidator;
40 import com.smartgwt.client.widgets.grid.ListGrid; 31 import com.smartgwt.client.widgets.grid.ListGrid;
41 import com.smartgwt.client.widgets.grid.ListGridField;
42 import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
43 import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
44 import com.smartgwt.client.widgets.layout.HLayout; 32 import com.smartgwt.client.widgets.layout.HLayout;
45 import com.smartgwt.client.widgets.layout.VLayout; 33 import com.smartgwt.client.widgets.layout.VLayout;
46 34
47 public class CollisionLoadYearPanel extends AbstractUIProvider { 35 public class CollisionLoadYearPanel extends AbstractUIProvider {
48 36
49 public interface IColumnClickHandler {
50 void columnClicked(String value);
51 }
52
53 private enum PinType {
54 none, from, to
55 }
56
57 private final FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); 37 private final FLYSConstants MESSAGES = GWT.create(FLYSConstants.class);
58 38
59 private TextItem yearsItem; 39 private TextItem yearsItem;
60 40
61 private final List<String> validYears = new ArrayList<String>(); 41 private List<String> validYears = new ArrayList<String>();
62 42
63 private ListGrid table; 43 private ListGrid table;
64 44
65 public CollisionLoadYearPanel() { 45 public CollisionLoadYearPanel() {
66 } 46 }
95 } 75 }
96 76
97 @Override 77 @Override
98 public Canvas create(final DataList data) { 78 public Canvas create(final DataList data) {
99 final VLayout layout = new VLayout(); 79 final VLayout layout = new VLayout();
80 final IColumnClickHandler fromHandler = new IColumnClickHandler() { // add to external class
100 81
101 final Canvas helper = createHelper(data); 82 @Override
83 public void columnClicked(final String value) {
84 appendYear(value);
85 }
86 };
102 87
103 this.helperContainer.addMember(helper); 88 final TableHelper helper = new TableHelper(data, "years", this.MSG, fromHandler);
89 final Canvas table = helper.getTable();
90 this.validYears = helper.getKeycolEntries();
91
92 this.helperContainer.addMember(table);
104 93
105 final Canvas submit = getNextButton(); 94 final Canvas submit = getNextButton();
106 final Canvas widget = createWidget(data); 95 final Canvas widget = createWidget(data);
107 96
108 layout.addMember(widget); 97 layout.addMember(widget);
109 layout.addMember(submit); 98 layout.addMember(submit);
110 99
111 return layout; 100 return layout;
112 }
113
114 private Canvas createHelper(final DataList dataList) {
115 this.table = new ListGrid();
116 this.table.setShowHeaderContextMenu(false);
117 this.table.setWidth100();
118 this.table.setShowRecordComponents(true);
119 this.table.setShowRecordComponentsByCell(true);
120 this.table.setHeight100();
121 this.table.setEmptyMessage(this.MSG.empty_table());
122 this.table.setCanReorderFields(false);
123
124 final MultiAttributeData mData = findDefinition(dataList, "years");
125 final Map<String, Map<String, String>> meta = mData.getMeta();
126
127 final Map<String, String> tableInfo = meta.get("meta_tableinfo");
128 final String keyColumnName = tableInfo.get("keycol");
129
130 final IColumnClickHandler fromHandler = new IColumnClickHandler() { // add to external class
131
132 @Override
133 public void columnClicked(final String value) {
134 appendYear(value);
135 }
136 };
137
138 final SortedMap<Integer, ListGridField> fields = new TreeMap<Integer, ListGridField>();
139
140 for (final Entry<String, Map<String, String>> entry : meta.entrySet()) {
141
142 final String colName = entry.getKey();
143 if (colName.startsWith("meta_"))
144 continue;
145
146 final Map<String, String> values = entry.getValue();
147
148 final int order = Integer.parseInt(values.get("order"));
149
150 final ListGridField field = createField(colName, keyColumnName, values, fromHandler);
151
152 fields.put(order, field);
153 }
154
155 for (final DataItem dataItem : mData.opts) {
156 final MultiDataItem item = (MultiDataItem) dataItem;
157
158 final Map<String, String> valueMap = item.getValue();
159 // final String columnName = mData.getLabel();
160 final Record newRecord = new Record();
161 for (final Entry<String, String> entry : valueMap.entrySet()) {
162 final String key = entry.getKey();
163 final String value = entry.getValue();
164 newRecord.setAttribute(key, value);
165
166 if (key.equals(keyColumnName))
167 this.validYears.add(value);
168 }
169
170 this.table.addData(newRecord);
171 }
172
173 this.table.setFields(fields.values().toArray(new ListGridField[fields.size()]));
174
175 return this.table;
176 }
177
178 private MultiAttributeData findDefinition(final DataList dataList, final String paranemterName) {
179
180 for (final Data data : dataList.getAll()) {
181
182 final String label = data.getLabel();
183 if (label.equals(paranemterName) && data instanceof MultiAttributeData)
184 return (MultiAttributeData) data;
185 }
186
187 return null;
188 }
189
190 private ListGridField createField(final String colName, final String keyColumnName, final Map<String, String> values,
191 final IColumnClickHandler fromHandler) {
192
193 final String translation = getMeta(values, "translation", colName);
194
195 final ListGridField field = new ListGridField(colName, translation);
196
197 final String width = getMeta(values, "width", "99");
198 field.setWidth(width);
199
200 final ListGridFieldType type = getMeta(values, "type", ListGridFieldType.TEXT, ListGridFieldType.class);
201 field.setType(type);
202
203 final Alignment alignment = getMeta(values, "alignment", Alignment.LEFT, Alignment.class);
204 field.setAlign(alignment);
205
206 final PinType pinType = getMeta(values, "pin", PinType.none, PinType.class);
207 switch (pinType) {
208 case from: {
209 final String baseUrl = GWT.getHostPageBaseURL();
210 field.setCellIcon(baseUrl + this.MESSAGES.markerGreen());
211 field.addRecordClickHandler(new RecordClickHandler() {
212 @Override
213 public void onRecordClick(final RecordClickEvent e) {
214 final Record r = e.getRecord();
215 fromHandler.columnClicked(r.getAttribute(keyColumnName));
216 }
217 });
218 }
219 break;
220
221 case to:
222 break;
223
224 case none:
225 default:
226 break;
227 }
228
229 return field;
230 }
231
232 private String getMeta(final Map<String, String> values, final String key, final String defaultValue) {
233
234 final String value = values.get(key);
235 if (value == null || value.isEmpty())
236 return defaultValue;
237
238 return value;
239 }
240
241 private <TYPE extends Enum<TYPE>> TYPE getMeta(final Map<String, String> values, final String key, final TYPE defaultValue, final Class<TYPE> enumType) {
242
243 final String value = values.get(key);
244 if (value == null || value.isEmpty())
245 return defaultValue;
246
247 try {
248 return Enum.valueOf(enumType, value);
249 }
250 catch (final Exception e) {
251 e.printStackTrace();
252 return defaultValue;
253 }
254 }
255
256 private Map<String, Column> columns;
257 private List<String> columnNames;
258 private List<String> valueNames;
259 private Map<String, List<String>> attributes;
260 private Map<String, List<String>> selected;
261
262 public void addColumn(final MultiAttributeData options) {
263 GWT.log("Add Columns for MultiAttribute data");
264
265 this.columns = new HashMap<String, Column>();
266 this.columnNames = new ArrayList<String>();
267 this.valueNames = new ArrayList<String>();
268 this.selected = new HashMap<String, List<String>>();
269 this.attributes = new HashMap<String, List<String>>();
270
271 final String groupTitle = options.getLabel();
272
273 final Column col = new Column(groupTitle);
274 final DataItem[] items = options.getItems();
275
276 if (items == null) {
277 GWT.log("No items found in StringOptionsData '" + groupTitle + "'");
278 return;
279 }
280
281 final MultiDataItem mItem = (MultiDataItem) items[0];
282 for (final Map.Entry<String, String> entry : mItem.getValue().entrySet()) {
283 if (entry.getKey().equals("art:value") || entry.getKey().equals("art:label")) {
284 continue;
285 }
286 this.attributes.put(entry.getKey(), new ArrayList<String>());
287 }
288 for (final DataItem item : items) {
289 GWT.log("multidataitem: " + item.getLabel());
290 final String title = item.getLabel();
291
292 if (this.valueNames.indexOf(title) < 0) {
293 this.valueNames.add(title);
294 }
295 final MultiDataItem mi = (MultiDataItem) item;
296 final Map<String, String> vs = mi.getValue();
297 for (final Map.Entry<String, String> e : vs.entrySet()) {
298 if (e.getKey().equals("art:value") || e.getKey().equals("art:label")) {
299 continue;
300 }
301 final List<String> data = this.attributes.get(e.getKey());
302 data.add(e.getValue());
303 }
304 col.addValue(item.getLabel(), mi.getValue().get("art:value"));
305 }
306
307 this.columnNames.add(groupTitle);
308 this.columns.put(groupTitle, col);
309 } 101 }
310 102
311 public Canvas createWidget(final DataList data) { 103 public Canvas createWidget(final DataList data) {
312 final VLayout layout = new VLayout(); 104 final VLayout layout = new VLayout();
313 105

http://dive4elements.wald.intevation.org