teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@42: gernotbelger@9276: import java.util.Map; gernotbelger@9276: gernotbelger@9276: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9276: ingo@42: import com.google.gwt.core.client.GWT; ingo@42: import com.google.gwt.i18n.client.NumberFormat; ingo@42: import com.smartgwt.client.types.TitleOrientation; ingo@42: import com.smartgwt.client.widgets.form.DynamicForm; ingo@42: import com.smartgwt.client.widgets.form.fields.FormItem; ingo@42: import com.smartgwt.client.widgets.form.fields.StaticTextItem; ingo@42: import com.smartgwt.client.widgets.form.fields.TextItem; ingo@42: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; felix@5195: import com.smartgwt.client.widgets.form.fields.events.FocusHandler; ingo@42: gernotbelger@9276: public class DoubleArrayPanel extends DynamicForm { felix@1333: /** The message class that provides i18n strings. */ ingo@211: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); ingo@42: raimund@233: protected TextItem ti; ingo@42: gernotbelger@9404: private final StaticTextItem errorItem = new StaticTextItem("error"); gernotbelger@9404: rrenkert@5104: private String title; rrenkert@5104: felix@1333: /** The constant input field name. */ ingo@42: public static final String FIELD_NAME = "doublearray"; ingo@42: gernotbelger@9276: public DoubleArrayPanel(final String title, final double[] values, final BlurHandler handler) { felix@5195: this(title, values, handler, null, TitleOrientation.RIGHT); ingo@246: } ingo@246: ingo@42: /** ingo@42: * Creates a new form with a single input field that displays an array of ingo@42: * double values. ingo@42: * gernotbelger@9276: * @param name gernotbelger@9276: * The name of the TextItem. gernotbelger@9276: * @param title gernotbelger@9276: * The title of the TextItem. gernotbelger@9276: * @param values gernotbelger@9276: * The double values that should be displayed initially. gernotbelger@9276: * @param blurHandler gernotbelger@9276: * The BlurHandler that is used to valide the input. gernotbelger@9276: * @param focusHandler gernotbelger@9276: * The FocueHandler that is used to valide the input. ingo@42: */ gernotbelger@9404: gernotbelger@9276: public DoubleArrayPanel(final String title, final double[] values, final BlurHandler blurHandler, final FocusHandler focusHandler, gernotbelger@9404: final TitleOrientation titleOrientation, final String errorMsg) { gernotbelger@9404: rrenkert@5104: this.title = title; gernotbelger@9276: this.ti = new TextItem(FIELD_NAME); gernotbelger@9276: final StaticTextItem sti = new StaticTextItem("staticarray"); gernotbelger@9404: gernotbelger@9404: this.errorItem.setTitle(""); gernotbelger@9404: if (errorMsg != null) gernotbelger@9404: this.errorItem.setValue(errorMsg); gernotbelger@9404: gernotbelger@9404: this.errorItem.setShowTitle(false); gernotbelger@9404: this.errorItem.setVisible(true); gernotbelger@9550: // this.errorItem.setColSpan(); gernotbelger@9550: this.errorItem.setWidth("*"); // das ErrorItem soll den Rest ausfüllen gernotbelger@9404: sti.setShowTitle(false); gernotbelger@9404: sti.setValue(title); gernotbelger@9550: // sti.setColSpan(1); gernotbelger@9550: sti.setWidth(60); // hat irgendwie keine Auswirkung ingo@42: gernotbelger@9550: this.ti.setWidth(120); // Das Eingabefeld - Änderungen an der width funktionieren gernotbelger@9276: this.ti.setShowTitle(false); gernotbelger@9550: // this.ti.setColSpan(1); gernotbelger@9550: gernotbelger@9276: this.ti.addBlurHandler(blurHandler); rrenkert@5217: if (focusHandler != null) { gernotbelger@9276: this.ti.addFocusHandler(focusHandler); rrenkert@5217: } ingo@42: ingo@246: if (titleOrientation == TitleOrientation.RIGHT) { gernotbelger@9404: setFields(this.ti, sti, this.errorItem); gernotbelger@9276: } else { gernotbelger@9404: setFields(sti, this.ti, this.errorItem); ingo@246: } ingo@246: ingo@246: setTitleOrientation(titleOrientation); gernotbelger@9550: setNumCols(3); // default (Pegelname, Eingabefeld, ErrorMsg) ingo@42: ingo@42: if (values == null) { ingo@42: return; ingo@42: } ingo@42: gernotbelger@9276: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@42: gernotbelger@9276: final StringBuilder text = new StringBuilder(); gernotbelger@9276: boolean firstItem = true; ingo@42: gernotbelger@9276: for (final double val : values) { ingo@42: if (!firstItem) { ingo@42: text.append(" "); ingo@42: } ingo@42: ingo@42: text.append(f.format(val)); ingo@42: ingo@42: firstItem = false; ingo@42: } ingo@42: gernotbelger@9276: this.ti.setValue(text.toString()); gernotbelger@9404: gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: public DoubleArrayPanel(final String title, final double[] values, final BlurHandler blurHandler, final FocusHandler focusHandler, gernotbelger@9404: final TitleOrientation titleOrientation) { gernotbelger@9404: this(title, values, blurHandler, focusHandler, titleOrientation, null); ingo@42: } ingo@42: ingo@42: /** raimund@233: * This method takes the double array to set the values to the textbox. raimund@233: * gernotbelger@9276: * @param values gernotbelger@9276: * The double values. raimund@233: */ gernotbelger@9276: public void setValues(final double[] values) { gernotbelger@9276: final NumberFormat f = NumberFormat.getDecimalFormat(); raimund@233: gernotbelger@9276: if (values == null || values.length == 0) { gernotbelger@9276: this.ti.clearValue(); raimund@1369: return; raimund@1369: } gernotbelger@9276: final StringBuilder text = new StringBuilder(); gernotbelger@9276: boolean firstItem = true; raimund@238: if (values != null) { gernotbelger@9276: for (final double val : values) { raimund@238: if (!firstItem) { raimund@238: text.append(" "); raimund@238: } raimund@233: raimund@238: text.append(f.format(val)); raimund@238: raimund@238: firstItem = false; raimund@233: } raimund@233: } raimund@233: gernotbelger@9276: this.ti.clearValue(); gernotbelger@9276: this.ti.setValue(text.toString()); raimund@233: } raimund@233: ingo@580: /** ingo@580: * This method appends a double value to the current list of values. ingo@580: * gernotbelger@9276: * @param value gernotbelger@9276: * A new value. ingo@580: */ gernotbelger@9276: public void addValue(final double value) { gernotbelger@9276: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@580: gernotbelger@9276: String current = this.ti.getValueAsString(); ingo@580: ingo@590: if (current == null || current.length() == 0) { ingo@590: current = f.format(value); gernotbelger@9276: } else { ingo@590: current += " " + f.format(value); ingo@590: } ingo@580: gernotbelger@9276: this.ti.setValue(current); ingo@580: } ingo@580: gernotbelger@9404: public void setError(final String error) { gernotbelger@9404: this.errorItem.setValue(error); gernotbelger@9404: } gernotbelger@9404: gernotbelger@9276: public boolean validateForm() { gernotbelger@9276: return validateForm(this.ti); ingo@563: } ingo@563: raimund@233: /** ingo@42: * This method validates the entered text in the location input field. If ingo@42: * there are values that doesn't represent a valid location, an error is ingo@42: * displayed. ingo@42: * gernotbelger@9276: * @param item gernotbelger@9276: * The FormItem. ingo@42: */ christian@4131: @SuppressWarnings("unchecked") gernotbelger@9276: protected boolean validateForm(final FormItem item) { ingo@59: if (item instanceof StaticTextItem) { ingo@59: return true; ingo@59: } ingo@59: gernotbelger@9276: boolean valid = true; gernotbelger@9276: final String value = (String) item.getValue(); ingo@42: ingo@42: if (value == null) { ingo@42: return valid; ingo@42: } ingo@42: gernotbelger@9276: final String[] parts = value.split("\\s+"); ingo@42: ingo@42: if (parts == null) { ingo@42: return valid; ingo@42: } ingo@42: gernotbelger@9276: final NumberFormat nf = NumberFormat.getDecimalFormat(); christian@4131: @SuppressWarnings("rawtypes") gernotbelger@9276: final Map errors = getErrors(); ingo@42: ingo@42: try { gernotbelger@9276: for (final String part : parts) { ingo@573: ingo@573: if (part.length() == 0) { ingo@573: continue; ingo@573: } ingo@573: christian@4131: nf.parse(part); ingo@42: } ingo@42: ingo@42: errors.remove(item.getFieldName()); ingo@42: } gernotbelger@9276: catch (final NumberFormatException nfe) { gernotbelger@9276: errors.put(item.getFieldName(), this.MESSAGES.wrongFormat()); ingo@42: ingo@42: valid = false; ingo@42: } ingo@42: ingo@42: setErrors(errors, true); ingo@42: ingo@42: return valid; ingo@42: } ingo@42: ingo@42: /** ingo@42: * This method returns the double array that has been entered in ingo@42: * item. ingo@42: * gernotbelger@9276: * @param item gernotbelger@9276: * The item that contains the desired values. ingo@42: * ingo@42: * @return the values as double array. ingo@42: */ gernotbelger@9276: public double[] getInputValues(final FormItem item) { gernotbelger@9276: final String value = (String) item.getValue(); ingo@42: ingo@42: if (value == null) { ingo@42: return null; ingo@42: } ingo@42: gernotbelger@9276: final String[] parts = value.split("\\s+"); ingo@42: ingo@42: if (parts == null) { ingo@42: return null; ingo@42: } ingo@42: gernotbelger@9276: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@42: gernotbelger@9276: final double[] values = new double[parts.length]; ingo@571: ingo@42: int i = 0; gernotbelger@9276: OUTER: for (final String part : parts) { ingo@573: if (part.length() == 0) { ingo@573: continue; ingo@573: } ingo@573: ingo@42: try { gernotbelger@9276: final double x = f.parse(part); ingo@571: for (int j = 0; j < i; ++j) { ingo@571: if (values[j] == x) { ingo@571: continue OUTER; ingo@571: } ingo@571: } ingo@571: values[i++] = x; ingo@42: } gernotbelger@9276: catch (final NumberFormatException nfe) { ingo@42: // do nothing ingo@42: } ingo@42: } ingo@42: gernotbelger@9276: final double[] out = new double[i]; ingo@571: System.arraycopy(values, 0, out, 0, i); ingo@571: ingo@571: return out; ingo@42: } ingo@246: ingo@246: /** ingo@246: * Returns the double values of this panel. ingo@246: * ingo@246: * @return the double values of this panel. ingo@246: */ ingo@246: public double[] getInputValues() { gernotbelger@9276: return getInputValues(this.ti); ingo@246: } rrenkert@5104: rrenkert@5104: public String getItemTitle() { rrenkert@5104: return this.title; rrenkert@5104: } ingo@42: } ingo@42: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :