zul/src/main/java/org/zkoss/zul/SimpleDoubleSpinnerConstraint.java

Summary

Maintainability
C
1 day
Test Coverage
/* SimpleDoubleSpinnerConstraint.java

{{IS_NOTE
    Purpose:
        
    Description:
        
    History:
        Dec 17, 2010 10:04:58 AM , Created by jumperchen
}}IS_NOTE

Copyright (C) 2010 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
}}IS_RIGHT
*/
package org.zkoss.zul;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zul.mesg.MZul;

/**
 * A simple double spinner constraint.
 * @author jumperchen
 * @since 5.0.6
 */
public class SimpleDoubleSpinnerConstraint extends SimpleConstraint {
    private Double _min;
    private Double _max;

    /** Constraints a constraint.
     *
     */
    public SimpleDoubleSpinnerConstraint() {
        super(0);
    }

    /** Constraints a constraint.
     *
     * @param flags a combination of {@link #NO_POSITIVE}, {@link #NO_NEGATIVE},
     * {@link #NO_ZERO}, and so on.
     */
    public SimpleDoubleSpinnerConstraint(int flags) {
        super(flags);
    }

    /** Constructs a constraint with a list of constraints separated by comma.
     *
     * @param constraint a list of constraints separated by comma.
     * Example: no positive, no zero
     */
    public SimpleDoubleSpinnerConstraint(String constraint) {
        super(constraint);
    }

    /**
     * Returns the minimum value.
     */
    public Double getMin() {
        return _min;
    }

    /**
     * Set the minimum value.
     */
    public void setMin(Double min) {
        _min = min;
    }

    /**
     * Returns the maximum value.
     */
    public Double getMax() {
        return _max;
    }

    /**
     * Set the maximum value.
     */
    public void setMax(Double max) {
        _max = max;
    }

    // super//
    protected int parseConstraint(String constraint) throws UiException {
        int minIndex = constraint.indexOf("min");
        int maxIndex = constraint.indexOf("max");

        try {
            if (minIndex >= 0 && maxIndex >= 0) { // have "min" & "max"
                if (maxIndex > minIndex) { // min first
                    _min = new Double(constraint.substring(minIndex + 3, maxIndex).trim());
                    _max = new Double(constraint.substring(maxIndex + 3).trim());
                } else { // max first
                    _min = new Double(constraint.substring(minIndex + 3).trim());
                    _max = new Double(constraint.substring(maxIndex + 3, minIndex).trim());
                }
                if (_min.compareTo(_max) > 0)
                    throw new UiException("Constraint error: " + _min + " > " + _max);
                return 0;
            } else if (minIndex >= 0) { // only have "min"
                _min = new Double(constraint.substring(minIndex + 3).trim());
                return 0;
            } else if (maxIndex >= 0) { // only have "max"
                _max = new Double(constraint.substring(maxIndex + 3).trim());
                return 0;
            }
        } catch (NumberFormatException e) {
            throw new UiException("Constraint error: " + constraint);
        }
        return super.parseConstraint(constraint);
    }

    public void validate(Component comp, Object value) throws WrongValueException {
        super.validate(comp, value);
        if (value instanceof Double) {
            final Double doubleValue = (Double) value;

            if (_min != null && _min.compareTo(doubleValue) > 0)
                throw outOfRangeValue(comp);
            if (_max != null && _max.compareTo(doubleValue) < 0)
                throw outOfRangeValue(comp);
        }
    }

    private WrongValueException outOfRangeValue(Component comp) {
        final String errmsg = getErrorMessage(comp);
        if (errmsg != null)
            return new WrongValueException(comp, errmsg);

        final String s = _min != null ? _max != null ? _min + " ~ " + _max : ">= " + _min : "<= " + _max;
        return new WrongValueException(comp, MZul.OUT_OF_RANGE, s);
    }

}