view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FromToTableHelperPanel.java @ 9416:05405292a7ca

Navigationtheme panel now shows themes of dWt and WQ charts grayed out, if the current station is outside the valid range of the theme.
author gernotbelger
date Thu, 16 Aug 2018 16:28:03 +0200
parents 5a0e8d76582e
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