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@9270: import java.util.Map; gernotbelger@9270: gernotbelger@9270: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9270: 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.Alignment; ingo@42: import com.smartgwt.client.widgets.form.DynamicForm; ingo@42: import com.smartgwt.client.widgets.form.fields.FloatItem; 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.events.BlurHandler; ingo@42: ingo@42: /** ingo@42: * This class creates a DynamicForm with three input fields. ingo@42: * ingo@42: * @author Ingo Weinzierl ingo@42: */ gernotbelger@9270: public class DoubleRangePanel extends DynamicForm { gernotbelger@9270: /** The message class that provides i18n strings. */ ingo@211: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); ingo@42: gernotbelger@9270: /** The constant name of the input field to enter the start of a distance. */ ingo@42: public static final String FIELD_FROM = "from"; ingo@42: gernotbelger@9270: /** The constant name of the input field to enter the end of a distance. */ ingo@42: public static final String FIELD_TO = "to"; ingo@42: gernotbelger@9270: /** gernotbelger@9270: * The constant name of the input field to enter the step width of a gernotbelger@9270: * distance. gernotbelger@9270: */ ingo@42: public static final String FIELD_WIDTH = "step"; ingo@42: raimund@233: /** The textboxes */ raimund@233: protected FloatItem fromItem; raimund@233: protected FloatItem toItem; raimund@233: protected FloatItem stepItem; raimund@233: ingo@1265: public DoubleRangePanel() { ingo@1265: } ingo@1265: teichmann@7748: public FloatItem getToItem() { gernotbelger@9270: return this.toItem; teichmann@7748: } teichmann@7748: 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@9270: * @param name gernotbelger@9270: * The name of the TextItem. gernotbelger@9270: * @param title gernotbelger@9270: * The title of the TextItem. gernotbelger@9270: * @param values gernotbelger@9270: * The double values that should be displayed initially. gernotbelger@9270: * @param handler gernotbelger@9270: * The BlurHandler that is used to valide the input. ingo@42: */ gernotbelger@9270: public DoubleRangePanel(final String titleFrom, final String titleTo, final String titleStep, final double from, final double to, final double step, gernotbelger@9270: final int width, final BlurHandler handler) { gernotbelger@9270: this(titleFrom, titleTo, titleStep, from, to, step, width, handler, "right"); ingo@787: } ingo@787: gernotbelger@9270: public DoubleRangePanel(final String titleFrom, final String titleTo, final String titleStep, final double from, final double to, final double step, gernotbelger@9270: final int width, final BlurHandler handler, final String labelOrientation) { gernotbelger@9270: this.fromItem = new FloatItem(FIELD_FROM); gernotbelger@9270: this.toItem = new FloatItem(FIELD_TO); gernotbelger@9270: this.stepItem = new FloatItem(FIELD_WIDTH); ingo@787: gernotbelger@9270: this.fromItem.addBlurHandler(handler); gernotbelger@9270: this.toItem.addBlurHandler(handler); gernotbelger@9270: this.stepItem.addBlurHandler(handler); ingo@42: gernotbelger@9270: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@42: gernotbelger@9270: this.fromItem.setValue(f.format(from)); gernotbelger@9270: this.toItem.setValue(f.format(to)); gernotbelger@9270: this.stepItem.setValue(f.format(step)); ingo@42: gernotbelger@9270: final StaticTextItem fromText = new StaticTextItem("staticFrom"); ingo@42: fromText.setValue(titleFrom); ingo@42: fromText.setShowTitle(false); gernotbelger@9270: this.fromItem.setShowTitle(false); ingo@42: gernotbelger@9270: final StaticTextItem toText = new StaticTextItem("staticTo"); ingo@42: toText.setValue(titleTo); ingo@42: toText.setShowTitle(false); gernotbelger@9270: this.toItem.setShowTitle(false); ingo@42: gernotbelger@9270: final StaticTextItem stepText = new StaticTextItem("staticStep"); ingo@42: stepText.setValue(titleStep); ingo@42: stepText.setShowTitle(false); gernotbelger@9270: this.stepItem.setShowTitle(false); ingo@42: gernotbelger@9270: final int itemWidth = width / 6; gernotbelger@9270: this.fromItem.setWidth(itemWidth); ingo@42: fromText.setWidth(itemWidth); gernotbelger@9270: this.toItem.setWidth(itemWidth); ingo@42: toText.setWidth(itemWidth); gernotbelger@9270: this.stepItem.setWidth(itemWidth); ingo@42: stepText.setWidth(itemWidth); ingo@42: ingo@787: if (labelOrientation.equals("right")) { gernotbelger@9270: setFields(this.fromItem, fromText, this.toItem, toText, this.stepItem, stepText); gernotbelger@9270: } else { gernotbelger@9270: setFields(fromText, this.fromItem, toText, this.toItem, stepText, this.stepItem); ingo@787: } ingo@787: ingo@42: setFixedColWidths(false); ingo@42: setNumCols(6); ingo@42: setWidth(width); ingo@42: setAlign(Alignment.CENTER); ingo@42: } ingo@42: ingo@42: /** raimund@233: * This method takes distances values and sets them to the textboxes raimund@233: * visualizied by this widget. raimund@233: * gernotbelger@9270: * @param from gernotbelger@9270: * The from value. gernotbelger@9270: * @param to gernotbelger@9270: * The to value. gernotbelger@9270: * @param steps gernotbelger@9270: * The max steps. raimund@233: */ gernotbelger@9270: public void setValues(final double from, final double to, final double steps) { gernotbelger@9270: final NumberFormat f = NumberFormat.getDecimalFormat(); raimund@233: gernotbelger@9270: this.fromItem.setValue(f.format(from)); gernotbelger@9270: this.toItem.setValue(f.format(to)); gernotbelger@9270: this.stepItem.setValue(f.format(steps)); raimund@233: } raimund@233: ingo@562: public boolean validateForm() { ingo@1490: try { gernotbelger@9270: return validateForm(this.fromItem) && validateForm(this.toItem) && validateForm(this.stepItem); ingo@1490: } gernotbelger@9270: catch (final NumberFormatException nfe) { ingo@1490: return false; ingo@1490: } ingo@562: } ingo@562: raimund@233: /** ingo@42: * This method validates the entered text in the input fields. If ingo@42: * there are values that doesn't represent a valid float, an error is ingo@42: * displayed. ingo@42: * felix@7745: * Also if negativeToAllowed is false, an error is registered if felix@7745: * the 'to' field contains a negative value. felix@7745: * gernotbelger@9270: * @param item gernotbelger@9270: * The FormItem. ingo@42: */ christian@4131: @SuppressWarnings("unchecked") gernotbelger@9270: protected boolean validateForm(final FormItem item) { ingo@59: if (item instanceof StaticTextItem) { ingo@59: return true; ingo@59: } ingo@59: ingo@42: boolean valid = true; ingo@42: gernotbelger@9270: final String v = (String) item.getValue(); ingo@42: gernotbelger@9270: final NumberFormat f = NumberFormat.getDecimalFormat(); christian@4131: @SuppressWarnings("rawtypes") gernotbelger@9270: final Map errors = getErrors(); ingo@42: ingo@42: try { ingo@562: if (v == null) { ingo@562: throw new NumberFormatException("empty"); ingo@562: } ingo@562: teichmann@7748: f.parse(v); ingo@42: ingo@42: errors.remove(item.getFieldName()); ingo@42: } gernotbelger@9270: catch (final NumberFormatException nfe) { gernotbelger@9270: errors.put(item.getFieldName(), this.MESSAGES.wrongFormat()); ingo@42: ingo@42: item.focusInItem(); 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: * Returns the double value of value. ingo@42: * ingo@42: * @return the double value of value. ingo@42: */ gernotbelger@9270: protected double getDouble(final String value) { gernotbelger@9270: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@42: gernotbelger@9270: final String[] splitted = StringArrayParseHelper.getArrayFromRawString(value); // Nullpointer? ingo@571: ingo@571: return f.parse(splitted[0]); ingo@42: } ingo@42: ingo@42: /** ingo@42: * Returns the start value. ingo@42: * ingo@42: * @return the start value. ingo@42: */ ingo@1490: public double getFrom() throws NullPointerException { gernotbelger@9270: final String v = getValueAsString(FIELD_FROM); ingo@42: ingo@42: return getDouble(v); ingo@42: } ingo@42: ingo@42: /** ingo@42: * Returns the end value. ingo@42: * ingo@42: * @return the end value. ingo@42: */ ingo@1490: public double getTo() throws NullPointerException { gernotbelger@9270: final String v = getValueAsString(FIELD_TO); ingo@42: ingo@42: return getDouble(v); ingo@42: } ingo@42: ingo@42: /** ingo@42: * Returns the step width. ingo@42: * ingo@42: * @return the step width. ingo@42: */ ingo@1490: public double getStep() throws NullPointerException { gernotbelger@9270: final String v = getValueAsString(FIELD_WIDTH); ingo@42: ingo@42: return getDouble(v); ingo@42: } ingo@580: ingo@580: /** ingo@580: * Sets the value of the field with name fieldname. ingo@580: * gernotbelger@9270: * @param value gernotbelger@9270: * The new value. gernotbelger@9270: * @param fieldname gernotbelger@9270: * The name of the field. ingo@580: */ gernotbelger@9270: public void setDoubleValue(final double value, final String fieldname) { gernotbelger@9270: final NumberFormat f = NumberFormat.getDecimalFormat(); ingo@580: setValue(fieldname, f.format(value)); ingo@580: } ingo@580: ingo@580: /** ingo@580: * Sets a new start value. ingo@580: * gernotbelger@9270: * @param value gernotbelger@9270: * The new start value. ingo@580: */ gernotbelger@9270: public void setFrom(final double value) { ingo@580: setDoubleValue(value, FIELD_FROM); ingo@580: } ingo@580: ingo@580: /** ingo@580: * Sets a new end value. ingo@580: * gernotbelger@9270: * @param value gernotbelger@9270: * The new end value. ingo@580: */ gernotbelger@9270: public void setTo(final double value) { ingo@580: setDoubleValue(value, FIELD_TO); ingo@580: } ingo@780: ingo@780: /** ingo@780: * Sets a new step width. ingo@780: * gernotbelger@9270: * @param value gernotbelger@9270: * The new step width. ingo@780: */ gernotbelger@9270: public void setStep(final double value) { ingo@780: setDoubleValue(value, FIELD_WIDTH); ingo@780: } ingo@42: } ingo@42: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :