Mercurial > dive4elements > river
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