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 :