view flys-client/src/main/java/de/intevation/flys/client/client/widgets/KMSpinner.java @ 4205:0dd8963cec9c

Set also the width of the GaugeTree when resizing the GaugePanel GWT is no longer able to calculate and set the correct width of the GaugeTree since the GaugeTree is added via a Canvas wrapper. Therefore set the width manually when resizing the GaugeTree.
author Björn Ricks <bjoern.ricks@intevation.de>
date Mon, 22 Oct 2012 15:33:16 +0200
parents 4aa7216b329a
children
line wrap: on
line source
package de.intevation.flys.client.client.widgets;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;

import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.FormItemValueFormatter;
import com.smartgwt.client.widgets.form.FormItemValueParser;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.BlurEvent;
import com.smartgwt.client.widgets.form.fields.events.BlurHandler;
import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
import com.smartgwt.client.widgets.layout.HLayout;

import de.intevation.flys.client.shared.model.FacetRecord;

import java.util.ArrayList;
import java.util.List;

/**
 * SpinnerItem-like element with text label and up/down buttons.
 */
public class KMSpinner extends HLayout {
    protected List<KMSpinnerChangeListener> listeners = new ArrayList<KMSpinnerChangeListener>();

    protected Label label;
    protected FacetRecord facetRecord;
    protected double value;

    public KMSpinner(double initialValue, FacetRecord facetRecord) {
        super(2);
        this.facetRecord = facetRecord;
        this.value = initialValue;

        setWidth("99%");
        setHeight(18);

        // minusButton shall ask service for previous available cs.
        Button minusButton = new Button("-");
        minusButton.setWidth(18);
        minusButton.setHeight(18);
        minusButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
            public void onClick(ClickEvent evt) {
                fireChangedEvent(value - 0.1d, false);
            }
        });

        DynamicForm form = new DynamicForm();
        final TextItem kmField = new TextItem();
        kmField.setValue(initialValue);
        kmField.setWidth("*");
        kmField.setTitle("");
        kmField.setHeight(16);

        FormItemValueFormatter doubleFormat = new FormItemValueFormatter() {
            public String formatValue(Object value, Record record, DynamicForm form, FormItem item) {
                if (value != null) {
                    NumberFormat nf = NumberFormat.getDecimalFormat();
                    try {
                        double d = Double.valueOf(value.toString()).doubleValue();
                        return nf.format(d);
                    }
                    catch (Exception e) {
                        GWT.log("EditorValueFormatter exception: " + e.toString());

                        // Remove junk chars from input string
                        return doublefyString(value.toString());
                    }
                }
                else {
                    return null;
                }
            }
        };
        kmField.setEditorValueFormatter(doubleFormat);

        FormItemValueParser doubleParser = new FormItemValueParser() {
            public Object parseValue(String value, DynamicForm form, FormItem item) {
                if (value == null)
                    return null;
                try {
                    NumberFormat nf = NumberFormat.getDecimalFormat();
                    double d = nf.parse(value.toString());
                    return Double.toString(d);
                }
                catch(NumberFormatException nfe) {
                    return value;
                }
            }
        };
        kmField.setEditorValueParser(doubleParser);

        // Update on focus lost and enter-pressed.
        kmField.addBlurHandler(new BlurHandler() {
            @Override
            public void onBlur(BlurEvent be) {
                if (kmField.getValue() != null) {
                    try {
                        fireChangedEvent(Double.parseDouble(kmField.getValue().toString()), true);
                    }
                    catch(NumberFormatException nfe) {
                        GWT.log("entered string cannot be parsed to double.");
                    }
                }
            }
        });
        kmField.addKeyPressHandler(new KeyPressHandler() {
            @Override
            public void onKeyPress(KeyPressEvent kpe) {
                if (kpe.getKeyName().equals("Enter")) {
                    kmField.blurItem();
                }
            }
        });

        // TODO: i18n Now add all the validators, formatters, editors/parsers  etc.
        form.setFields(kmField);
        form.setTitle("");
        form.setTitlePrefix("");
        form.setTitleSuffix("");
        form.setTitleWidth(0);
        form.setWidth(50);
        form.setHeight(18);

        // PlusButton shall ask service for next available cs.
        Button plusButton = new Button("+");
        plusButton.setWidth(18);
        plusButton.setHeight(18);
        plusButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
            public void onClick(ClickEvent evt) {
                fireChangedEvent(value + 0.1d, true);
            }
        });

        this.addMember(minusButton);
        this.addMember(form);
        this.addMember(plusButton);
    }

    public void addChangeListener(KMSpinnerChangeListener listener) {
        this.listeners.add(listener);
    }

    protected void fireChangedEvent(double val, boolean up) {
        for(KMSpinnerChangeListener listener : listeners) {
            listener.spinnerValueEntered(this, val, facetRecord, up);
        }
    }

    /**
     * Remove junk chars from double string.
     * This method should work for most locales, but not for
     * exotic ones that do not use "." or "," as decimal
     * separator.
     * @return
     */
    protected String doublefyString(String str) {
        StringBuilder buf = new StringBuilder(str.length());

        for (int n = 0; n < str.length(); n++) {
            char c = str.charAt(n);
            if ((c >= '0' && c <= '9') || c == '.' || c == ',') {
                buf.append(c);
            }
        }

        return buf.toString();
    }
}

http://dive4elements.wald.intevation.org