view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualDatePointsEditor.java @ 7597:fca46ce8e4f5

(issue1225) Implement Magic labels. There is now a new value in the chartsettings "Suggested Label" which is hidden in the property editor. A suggested label is the label that combines the label's of all processors that wrote data to an axis. This suggested label is set as the label when the user has not overwritten the label.
author Andre Heinecke <aheinecke@intevation.de>
date Mon, 25 Nov 2013 14:58:14 +0100
parents ea9eef426962
children 4ead7919e709
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * 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.chart;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;

import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.grid.CellEditValueFormatter;
import com.smartgwt.client.widgets.grid.CellEditValueParser;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

import org.dive4elements.river.client.client.event.RedrawRequestHandler;
import org.dive4elements.river.client.shared.model.Collection;
import org.dive4elements.river.client.shared.model.CollectionItem;
import org.dive4elements.river.client.shared.model.Property;
import org.dive4elements.river.client.shared.model.PropertyGroup;
import org.dive4elements.river.client.shared.model.Settings;
import org.dive4elements.river.client.shared.model.StringProperty;

import java.util.Date;
import java.util.List;

/**
 * UI to enter point data and save it to an PointArtifact.
 */
public class ManualDatePointsEditor
extends      ManualPointsEditor
{

    public ManualDatePointsEditor(Collection collection,
        RedrawRequestHandler handler, String outputModeName
    ) {
        super (collection, handler, outputModeName);
    }


    /** Create and setup/add the ui. */
    @Override
    public void createUI() {
        Button accept = new Button(MSG.label_ok());
        Button cancel = new Button(MSG.label_cancel());
        cancel.addClickHandler(this);

        accept.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent e) {
                okClicked();
            }
        });

        HLayout buttons = new HLayout();
        buttons.addMember(accept);
        buttons.addMember(cancel);
        buttons.setAlign(Alignment.CENTER);
        buttons.setHeight(30);

        VLayout layout = new VLayout();
        listGrid = new ListGrid();
        listGrid.setWidth100();
        listGrid.setHeight("*");
        listGrid.setCanSort(false);
        listGrid.setCanEdit(true);
        listGrid.setShowHeaderContextMenu(false);

        CellFormatter doubleFormat = new CellFormatter() {
            @Override
            public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
                if(value != null) {
                    NumberFormat nf = NumberFormat.getDecimalFormat();
                    try {
                        double d = Double.valueOf(value.toString()).doubleValue();
                        return nf.format(d);
                    } catch (Exception e) {
                        return value.toString();
                    }
                } else {
                   return null;
                }
            }};

        CellFormatter dateFormat = new CellFormatter() {
            @Override
            public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
                if(value != null && !value.toString().equals("")) {
                    try {
                        DateTimeFormat df =
                            DateTimeFormat.getFormat("dd.MM.yyyy");
                        Date d = df.parse(value.toString());
                        DateTimeFormat df2 =
                            DateTimeFormat.getFormat(
                                DateTimeFormat.PredefinedFormat.DATE_MEDIUM);
                        return df2.format(d);

                    }
                    catch(IllegalArgumentException iae) {
                        SC.warn(MSG.error_invalid_date());
                        record.setAttribute(DatePointRecord.ATTRIBUTE_X, "");
                        return "";
                    }
                }
                else {
                   return null;
                }
            }};


        CellEditValueParser cevp = new CellEditValueParser() {
            @Override
            public Object parse(Object value, ListGridRecord record, int rowNum, int colNum) {
                if (value == null)
                    return null;
                try {
                    NumberFormat nf = NumberFormat.getDecimalFormat();
                    double d = nf.parse(value.toString());
                    return (new Double(d)).toString();
                }
                catch(NumberFormatException nfe) {
                    return value;
                }
            }
        };

        CellEditValueFormatter cevf = new CellEditValueFormatter() {
            @Override
            public Object format(Object value, ListGridRecord record, int rowNum, int colNum) {
                if (value != null) {
                    NumberFormat nf = NumberFormat.getDecimalFormat();
                    try {
                        double d = Double.valueOf(value.toString()).doubleValue();
                        return nf.format(d);
                    } catch (Exception e) {
                        return value.toString();
                    }
                }
                return null;
            }
        };

        // Use X and Y as default fallback.
        String xAxis = "X";
        String yAxis = "Y";

        // Get header text from collection settings.
        Settings settings = this.collection.getSettings(outputModeName);
        List<Property> axes = settings.getSettings("axes");
        if(axes != null) {
            for (Property p: axes) {
                PropertyGroup pg = (PropertyGroup)p;
                StringProperty id =
                    (StringProperty)pg.getPropertyByName("id");
                if(id.getValue().equals("X")) {
                    StringProperty name =
                        (StringProperty)pg.getPropertyByName("label");
                    xAxis = name.getValue();
                }
                else if (yAxis.equals("Y")) {
                    StringProperty name =
                        (StringProperty)pg.getPropertyByName("label");
                    yAxis = name.getValue();
                }
            }
        }
        ListGridField xField =
            new ListGridField(PointRecord.ATTRIBUTE_X, xAxis);
        xField.setType(ListGridFieldType.TEXT);
        xField.setCellFormatter(dateFormat);

        ListGridField yField =
            new ListGridField(PointRecord.ATTRIBUTE_Y, yAxis);
        yField.setType(ListGridFieldType.FLOAT);
        yField.setCellFormatter(doubleFormat);
        yField.setEditValueParser(cevp);
        yField.setEditValueFormatter(cevf);

        ListGridField nameField = new ListGridField(PointRecord.ATTRIBUTE_NAME,
            MSG.pointname());
        final ListGridField removeField  =
            new ListGridField("_removeRecord", MSG.removepoint()){{
                setType(ListGridFieldType.ICON);
                setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature());
                setCanEdit(false);
                setCanFilter(false);
                setCanSort(false);
                setCanGroupBy(false);
                setCanFreeze(false);
                setWidth(25);
        }};

        ListGridField activeField = new ListGridField(
            PointRecord.ATTRIBUTE_ACTIVE, MSG.selection());
        activeField.setType(ListGridFieldType.BOOLEAN);
        activeField.setDefaultValue(true);

        listGrid.setFields(new ListGridField[] {activeField, xField, yField,
            nameField, removeField});

        listGrid.addRecordClickHandler(new RecordClickHandler() {
                @Override
                public void onRecordClick(final RecordClickEvent event) {
                    // Just handle remove-clicks
                    if(!event.getField().getName().equals(removeField.getName())) {
                        return;
                    }
                    event.getViewer().removeData(event.getRecord());
                }
            });

        // Find the artifacts uuid.
        findManualPointsUUID();
        CollectionItem item = collection.getItem(uuid);

        // Add points to grid.
        if (item != null) {
            String jsonData = item.getData().get(outputModeName + "." + POINT_DATA);
            JSONArray jsonArray = (JSONArray) JSONParser.parse(jsonData);
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONArray point = (JSONArray) jsonArray.get(i);
                listGrid.addData(datePointRecordFromJSON(point));
            }
        }
        else {
            GWT.log("No item found for " + uuid);
        }

        IButton button = new IButton(MSG.newpoint());
        button.setTop(250);
        button.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                listGrid.startEditingNew();
            }
        });

        layout.addMember(listGrid);
        layout.addMember(button);

        addItem(layout);

        addItem(buttons);
        setWidth(380);
        setHeight(470);
        centerInPage();
    }


    /** Create JSON representation of the points present in the list grid. */
    @Override
    protected JSONArray jsonArrayFromListGrid() {
        JSONArray list = new JSONArray();
        int idx = 0;

        for(ListGridRecord record : listGrid.getRecords()) {
            if (record instanceof DatePointRecord) {
                JSONArray data = new JSONArray();

                DatePointRecord point = (DatePointRecord) record;
                String dateString = point.getX();
                DateTimeFormat df = DateTimeFormat.getFormat(
                    DateTimeFormat.PredefinedFormat.DATE_MEDIUM);

                Date d = df.parse(dateString);
                double dv = d.getTime();

                data.set(0, new JSONNumber(dv));
                data.set(1, new JSONNumber(point.getY()));
                data.set(2, new JSONString(point.getName()));
                data.set(3, JSONBoolean.getInstance(point.isActive()));

                list.set(idx, data);
                idx++;
            }
            else {
                JSONArray data = new JSONArray();

                String nameString = record.getAttributeAsString(PointRecord.ATTRIBUTE_NAME);
                // Apply default name if none set.
                if (nameString == null || nameString.equals("")) {
                    String xString = record.getAttributeAsString(
                        PointRecord.ATTRIBUTE_X);
                    String yString = record.getAttributeAsString(
                        PointRecord.ATTRIBUTE_Y);
                    nameString = xString + "/" + yString;
                }

                String dateString = record.getAttributeAsString(PointRecord.ATTRIBUTE_X);
                DateTimeFormat df = DateTimeFormat.getFormat(
                    DateTimeFormat.PredefinedFormat.DATE_MEDIUM);

                Date d = df.parse(dateString);
                double dv = d.getTime();
                data.set(0, new JSONNumber(dv));
                data.set(1, new JSONNumber(record.
                    getAttributeAsDouble(PointRecord.ATTRIBUTE_Y)));
                data.set(2, new JSONString(nameString));
                data.set(3, JSONBoolean.getInstance(record.getAttributeAsBoolean(
                    PointRecord.ATTRIBUTE_ACTIVE)));

                list.set(idx, data);
                idx++;
            }
        }
        return list;
    }

    /** From a JSON-encoded point, create a PointRecord. */
    public DatePointRecord datePointRecordFromJSON(JSONArray jsonArray) {
        JSONNumber  x = (JSONNumber)  jsonArray.get(0);
        JSONNumber  y = (JSONNumber)  jsonArray.get(1);
        JSONString  s = (JSONString)  jsonArray.get(2);
        JSONBoolean b = (JSONBoolean) jsonArray.get(3);

        Date d = new Date (Long.valueOf(x.toString()).longValue());
        DateTimeFormat df = DateTimeFormat.getFormat(
            DateTimeFormat.PredefinedFormat.DATE_MEDIUM);

        return new DatePointRecord(b.booleanValue(), df.format(d),
            y.doubleValue(), s.stringValue());
    }


    /** Return false if x or y attribute is missing. */
    @Override
    protected boolean isDialogValid() {
        boolean valid = true;
        for (ListGridRecord record : listGrid.getRecords()) {
            if (record.getAttributeAsString(PointRecord.ATTRIBUTE_X) == null ||
                record.getAttributeAsString(
                    DatePointRecord.ATTRIBUTE_X).equals("") ||
                record.getAttributeAsDouble(PointRecord.ATTRIBUTE_Y) == null) {
                return false;
            }
        }
        if (listGrid.hasErrors()) {
            valid = false;
        }
        return valid;
    }


    /** Simple record to store points. */
    public class DatePointRecord extends ListGridRecord {
        protected static final String ATTRIBUTE_X = "X";
        protected static final String ATTRIBUTE_Y = "Y";
        protected static final String ATTRIBUTE_NAME = "name";
        protected static final String ATTRIBUTE_ACTIVE = "active";

        private DatePointRecord() {;}

        public DatePointRecord(boolean b, String x, double y, String name) {
            setActive(b);
            setName(name);
            setX(x);
            setY(y);
        }

        public void setActive(boolean b) {
            setAttribute(ATTRIBUTE_ACTIVE, b);
        }

        public boolean isActive() {
            return getAttributeAsBoolean(ATTRIBUTE_ACTIVE);
        }

        public void setName(String name) {
            setAttribute(ATTRIBUTE_NAME, name);
        }

        public String getName() {
            return getAttributeAsString(ATTRIBUTE_NAME);
        }

        public void setX(String x) {
            setAttribute(ATTRIBUTE_X, x);
        }

        public void setY(double y) {
            setAttribute(ATTRIBUTE_Y, y);
        }

        public String getX() {
            return getAttributeAsString(ATTRIBUTE_X);
        }

        public double getY() {
            return getAttributeAsDouble(ATTRIBUTE_Y);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org