view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FromToTableHelperPanel.java @ 9222:5a0e8d76582e

uinfo.salix regional workflow
author gernotbelger
date Wed, 04 Jul 2018 13:06:28 +0200
parents 1f94b3673ed3
children
line wrap: on
line source
/** 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);
        }

        if (mData == null || mData.opts == null) {
            this.table.setEmptyMessage(flys.error_feed_no_data());
            return;
        }

        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.setEmptyMessage("");
        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;
    }
}

http://dive4elements.wald.intevation.org