diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FromToTableHelperPanel.java	Tue May 22 11:58:30 2018 +0200
@@ -0,0 +1,205 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ *  Björnsen Beratende Ingenieure GmbH
+ *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+package org.dive4elements.river.client.client.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.dive4elements.river.client.client.FLYSConstants;
+import org.dive4elements.river.client.shared.model.Data;
+import org.dive4elements.river.client.shared.model.DataItem;
+import org.dive4elements.river.client.shared.model.DataList;
+import org.dive4elements.river.client.shared.model.MultiAttributeData;
+import org.dive4elements.river.client.shared.model.MultiDataItem;
+
+import com.google.gwt.core.client.GWT;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
+
+/**
+ * @author Domenico Nardi Tironi
+ *
+ */
+public class FromToTableHelperPanel {
+
+    public interface IColumnClickHandler {
+        void columnClicked(String value);
+    }
+
+    private enum PinType {
+        none, from, to
+    }
+
+    private final ListGrid table;
+
+    private final DataList dataList;
+
+    private final FLYSConstants flys;
+
+    private final List<String> keyColEntries = new ArrayList<String>();
+
+    public FromToTableHelperPanel(final DataList dataList, final String definitionStr, final FLYSConstants flys, final IColumnClickHandler fromHandler,
+            final IColumnClickHandler toHandler) {
+        this.flys = flys;
+        this.dataList = dataList;
+        this.table = new ListGrid();
+        this.table.setShowHeaderContextMenu(false);
+        this.table.setWidth100();
+        this.table.setShowRecordComponents(true);
+        this.table.setShowRecordComponentsByCell(true);
+        this.table.setHeight100();
+        this.table.setEmptyMessage(flys.empty_table());
+        this.table.setCanReorderFields(false);
+
+        final MultiAttributeData mData = findDefinition(definitionStr);
+        final Map<String, Map<String, String>> meta = mData.getMeta();
+
+        final Map<String, String> tableInfo = meta.get("meta_tableinfo");
+        final String keyColumnName = tableInfo.get("keycol");
+
+        final SortedMap<Integer, ListGridField> fields = new TreeMap<Integer, ListGridField>();
+
+        for (final Entry<String, Map<String, String>> entry : meta.entrySet()) {
+
+            final String colName = entry.getKey();
+            if (colName.startsWith("meta_"))
+                continue;
+
+            final Map<String, String> values = entry.getValue();
+
+            final int order = Integer.parseInt(values.get("order"));
+
+            final ListGridField field = createField(colName, keyColumnName, values, fromHandler, toHandler);
+
+            fields.put(order, field);
+        }
+
+        for (final DataItem dataItem : mData.opts) {
+            final MultiDataItem item = (MultiDataItem) dataItem;
+
+            final Map<String, String> valueMap = item.getValue();
+
+            final Record newRecord = new Record();
+            for (final Entry<String, String> entry : valueMap.entrySet()) {
+                final String key = entry.getKey();
+                final String value = entry.getValue();
+                newRecord.setAttribute(key, value);
+
+                if (key.equals(keyColumnName))
+                    this.keyColEntries.add(value);
+            }
+
+            this.table.addData(newRecord);
+        }
+
+        this.table.setFields(fields.values().toArray(new ListGridField[fields.size()]));
+    }
+
+    public Canvas getTable() {
+        return this.table;
+    }
+
+    private MultiAttributeData findDefinition(final String paranemterName) {
+
+        for (final Data data : this.dataList.getAll()) {
+
+            final String label = data.getLabel();
+            if (label.equals(paranemterName) && data instanceof MultiAttributeData)
+                return (MultiAttributeData) data;
+        }
+
+        return null;
+    }
+
+    private ListGridField createField(final String colName, final String keyColumnName, final Map<String, String> values, final IColumnClickHandler fromHandler,
+            final IColumnClickHandler toHandler) {
+
+        final String translation = getMeta(values, "translation", colName);
+
+        final ListGridField field = new ListGridField(colName, translation);
+
+        final String width = getMeta(values, "colwidth", "99");
+        field.setWidth(width);
+
+        final ListGridFieldType type = getMeta(values, "type", ListGridFieldType.TEXT, ListGridFieldType.class);
+        field.setType(type);
+
+        final Alignment alignment = getMeta(values, "alignment", Alignment.LEFT, Alignment.class);
+        field.setAlign(alignment);
+
+        final PinType pinType = getMeta(values, "pin", PinType.none, PinType.class);
+        switch (pinType) {
+        case from: {
+            makePin(keyColumnName, fromHandler, field, this.flys.markerGreen());
+        }
+            break;
+
+        case to: {
+            makePin(keyColumnName, toHandler, field, this.flys.markerRed());
+        }
+            break;
+        case none:
+        default:
+            break;
+        }
+
+        return field;
+    }
+
+    private void makePin(final String keyColumnName, final IColumnClickHandler handler, final ListGridField field, final String markerStr) {
+        final String baseUrl = GWT.getHostPageBaseURL();
+        field.setCellIcon(baseUrl + markerStr);
+        field.addRecordClickHandler(new RecordClickHandler() {
+            @Override
+            public void onRecordClick(final RecordClickEvent e) {
+                final Record r = e.getRecord();
+                handler.columnClicked(r.getAttribute(keyColumnName));
+            }
+        });
+    }
+
+    private String getMeta(final Map<String, String> values, final String key, final String defaultValue) {
+
+        final String value = values.get(key);
+        if (value == null || value.isEmpty())
+            return defaultValue;
+
+        return value;
+    }
+
+    private <TYPE extends Enum<TYPE>> TYPE getMeta(final Map<String, String> values, final String key, final TYPE defaultValue, final Class<TYPE> enumType) {
+
+        final String value = values.get(key);
+        if (value == null || value.isEmpty())
+            return defaultValue;
+
+        try {
+            return Enum.valueOf(enumType, value);
+        }
+        catch (final Exception e) {
+            e.printStackTrace();
+            return defaultValue;
+        }
+    }
+
+    public List<String> getKeycolEntries() {
+        return this.keyColEntries;
+    }
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org