comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FromToTableHelperPanel.java @ 9076:22d8928895a1

dynamic input table epochSelect
author gernotbelger
date Tue, 22 May 2018 11:58:30 +0200
parents gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableHelper.java@89740fe82196
children 1f94b3673ed3
comparison
equal deleted inserted replaced
9075:89740fe82196 9076:22d8928895a1
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
2 * Software engineering by
3 * Björnsen Beratende Ingenieure GmbH
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
5 *
6 * This file is Free Software under the GNU AGPL (>=v3)
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details.
9 */
10 package org.dive4elements.river.client.client.ui;
11
12 import java.util.ArrayList;
13 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
19 import org.dive4elements.river.client.client.FLYSConstants;
20 import org.dive4elements.river.client.shared.model.Data;
21 import org.dive4elements.river.client.shared.model.DataItem;
22 import org.dive4elements.river.client.shared.model.DataList;
23 import org.dive4elements.river.client.shared.model.MultiAttributeData;
24 import org.dive4elements.river.client.shared.model.MultiDataItem;
25
26 import com.google.gwt.core.client.GWT;
27 import com.smartgwt.client.data.Record;
28 import com.smartgwt.client.types.Alignment;
29 import com.smartgwt.client.types.ListGridFieldType;
30 import com.smartgwt.client.widgets.Canvas;
31 import com.smartgwt.client.widgets.grid.ListGrid;
32 import com.smartgwt.client.widgets.grid.ListGridField;
33 import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
34 import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
35
36 /**
37 * @author Domenico Nardi Tironi
38 *
39 */
40 public class FromToTableHelperPanel {
41
42 public interface IColumnClickHandler {
43 void columnClicked(String value);
44 }
45
46 private enum PinType {
47 none, from, to
48 }
49
50 private final ListGrid table;
51
52 private final DataList dataList;
53
54 private final FLYSConstants flys;
55
56 private final List<String> keyColEntries = new ArrayList<String>();
57
58 public FromToTableHelperPanel(final DataList dataList, final String definitionStr, final FLYSConstants flys, final IColumnClickHandler fromHandler,
59 final IColumnClickHandler toHandler) {
60 this.flys = flys;
61 this.dataList = dataList;
62 this.table = new ListGrid();
63 this.table.setShowHeaderContextMenu(false);
64 this.table.setWidth100();
65 this.table.setShowRecordComponents(true);
66 this.table.setShowRecordComponentsByCell(true);
67 this.table.setHeight100();
68 this.table.setEmptyMessage(flys.empty_table());
69 this.table.setCanReorderFields(false);
70
71 final MultiAttributeData mData = findDefinition(definitionStr);
72 final Map<String, Map<String, String>> meta = mData.getMeta();
73
74 final Map<String, String> tableInfo = meta.get("meta_tableinfo");
75 final String keyColumnName = tableInfo.get("keycol");
76
77 final SortedMap<Integer, ListGridField> fields = new TreeMap<Integer, ListGridField>();
78
79 for (final Entry<String, Map<String, String>> entry : meta.entrySet()) {
80
81 final String colName = entry.getKey();
82 if (colName.startsWith("meta_"))
83 continue;
84
85 final Map<String, String> values = entry.getValue();
86
87 final int order = Integer.parseInt(values.get("order"));
88
89 final ListGridField field = createField(colName, keyColumnName, values, fromHandler, toHandler);
90
91 fields.put(order, field);
92 }
93
94 for (final DataItem dataItem : mData.opts) {
95 final MultiDataItem item = (MultiDataItem) dataItem;
96
97 final Map<String, String> valueMap = item.getValue();
98
99 final Record newRecord = new Record();
100 for (final Entry<String, String> entry : valueMap.entrySet()) {
101 final String key = entry.getKey();
102 final String value = entry.getValue();
103 newRecord.setAttribute(key, value);
104
105 if (key.equals(keyColumnName))
106 this.keyColEntries.add(value);
107 }
108
109 this.table.addData(newRecord);
110 }
111
112 this.table.setFields(fields.values().toArray(new ListGridField[fields.size()]));
113 }
114
115 public Canvas getTable() {
116 return this.table;
117 }
118
119 private MultiAttributeData findDefinition(final String paranemterName) {
120
121 for (final Data data : this.dataList.getAll()) {
122
123 final String label = data.getLabel();
124 if (label.equals(paranemterName) && data instanceof MultiAttributeData)
125 return (MultiAttributeData) data;
126 }
127
128 return null;
129 }
130
131 private ListGridField createField(final String colName, final String keyColumnName, final Map<String, String> values, final IColumnClickHandler fromHandler,
132 final IColumnClickHandler toHandler) {
133
134 final String translation = getMeta(values, "translation", colName);
135
136 final ListGridField field = new ListGridField(colName, translation);
137
138 final String width = getMeta(values, "colwidth", "99");
139 field.setWidth(width);
140
141 final ListGridFieldType type = getMeta(values, "type", ListGridFieldType.TEXT, ListGridFieldType.class);
142 field.setType(type);
143
144 final Alignment alignment = getMeta(values, "alignment", Alignment.LEFT, Alignment.class);
145 field.setAlign(alignment);
146
147 final PinType pinType = getMeta(values, "pin", PinType.none, PinType.class);
148 switch (pinType) {
149 case from: {
150 makePin(keyColumnName, fromHandler, field, this.flys.markerGreen());
151 }
152 break;
153
154 case to: {
155 makePin(keyColumnName, toHandler, field, this.flys.markerRed());
156 }
157 break;
158 case none:
159 default:
160 break;
161 }
162
163 return field;
164 }
165
166 private void makePin(final String keyColumnName, final IColumnClickHandler handler, final ListGridField field, final String markerStr) {
167 final String baseUrl = GWT.getHostPageBaseURL();
168 field.setCellIcon(baseUrl + markerStr);
169 field.addRecordClickHandler(new RecordClickHandler() {
170 @Override
171 public void onRecordClick(final RecordClickEvent e) {
172 final Record r = e.getRecord();
173 handler.columnClicked(r.getAttribute(keyColumnName));
174 }
175 });
176 }
177
178 private String getMeta(final Map<String, String> values, final String key, final String defaultValue) {
179
180 final String value = values.get(key);
181 if (value == null || value.isEmpty())
182 return defaultValue;
183
184 return value;
185 }
186
187 private <TYPE extends Enum<TYPE>> TYPE getMeta(final Map<String, String> values, final String key, final TYPE defaultValue, final Class<TYPE> enumType) {
188
189 final String value = values.get(key);
190 if (value == null || value.isEmpty())
191 return defaultValue;
192
193 try {
194 return Enum.valueOf(enumType, value);
195 }
196 catch (final Exception e) {
197 e.printStackTrace();
198 return defaultValue;
199 }
200 }
201
202 public List<String> getKeycolEntries() {
203 return this.keyColEntries;
204 }
205 }

http://dive4elements.wald.intevation.org