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