Skip to content
Snippets Groups Projects
Commit bec9d22d authored by Simon Barner's avatar Simon Barner
Browse files

PropertySectionBase.TextToDoubleValidator -> databinding.NumberValidator

* Rename singleton instance to NUMBER_VALIDATOR
* Use java.text.NumberFormat instead of the one from com.ibm.icu
* Disallow using 1000er group separator into to avoid confusions
  with decimal separator
* Accept empty input, as well as leading and trailing spaces

Issue-Ref: 3582
Issue-Url: https://af3-developer.fortiss.org/issues/3582
parent 57e1002f
No related branches found
No related tags found
1 merge request!38Double input format validation: check if the entire string was parsed
...@@ -5,3 +5,4 @@ AbstractTextCellDatabindingEditingSupport.java 8728e78f399a63c11f020fa447c002f42 ...@@ -5,3 +5,4 @@ AbstractTextCellDatabindingEditingSupport.java 8728e78f399a63c11f020fa447c002f42
FloatValidator.java 7a32cb83604838ae17d3da751ce003731a055b05 GREEN FloatValidator.java 7a32cb83604838ae17d3da751ce003731a055b05 GREEN
IntValidator.java de2d93012a863ab26118453413ca09e7764124a8 GREEN IntValidator.java de2d93012a863ab26118453413ca09e7764124a8 GREEN
NumberPositiveZeroValidator.java 4f555462dc532a2e88f2842701a48e3991f7ef9d GREEN NumberPositiveZeroValidator.java 4f555462dc532a2e88f2842701a48e3991f7ef9d GREEN
NumberValidator.java 28871dc5823ad14466273995599d3cd74fe69512 YELLOW
/*-------------------------------------------------------------------------+
| Copyright 2018 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.kernel.ui.databinding;
import static org.eclipse.core.databinding.validation.ValidationStatus.cancel;
import static org.eclipse.core.databinding.validation.ValidationStatus.ok;
import java.text.NumberFormat;
import java.text.ParsePosition;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
/** Validates if a given input is a valid {@link Number}. */
public class NumberValidator implements IValidator {
/** Singleton instance. */
public static final NumberValidator NUMBER_VALIDATOR = new NumberValidator();
/** The number format used in the current locale. */
private final NumberFormat format;
/** Constructor. */
protected NumberValidator() {
format = NumberFormat.getNumberInstance();
format.setGroupingUsed(false);
}
/** {@inheritDoc} */
@Override
public IStatus validate(Object value) {
String input = value != null ? value.toString().trim() : "";
if(input.isEmpty()) {
return ok();
}
ParsePosition p = new ParsePosition(0);
format.parse(input, p);
int errorIndex = p.getErrorIndex();
// In case the input as a valid prefix, the error index will not indicate a problem.
// Therefore, check if the entire input was parsed.
if(errorIndex == -1 && p.getIndex() < input.length()) {
errorIndex = p.getIndex();
}
return errorIndex == -1 ? ok()
: cancel("Double number format validation failed at position " + errorIndex + ".");
}
}
...@@ -8,7 +8,7 @@ ModelEditorBindingBase.java 4c5ac569c0b6e7678fc8191096b26dfd09fdcb98 GREEN ...@@ -8,7 +8,7 @@ ModelEditorBindingBase.java 4c5ac569c0b6e7678fc8191096b26dfd09fdcb98 GREEN
ModelElementHandlerBase.java 384727748f125c9d43f19d9c0eba4ba1be5a7a26 GREEN ModelElementHandlerBase.java 384727748f125c9d43f19d9c0eba4ba1be5a7a26 GREEN
MultiEObjectActionBase.java 9e237d8ea640c4194e4877af4a9cfce88698e543 GREEN MultiEObjectActionBase.java 9e237d8ea640c4194e4877af4a9cfce88698e543 GREEN
NamedCommentedModelElementHandlerBase.java 681b98b50b362f01abb7a36f108f4f11b9e51829 GREEN NamedCommentedModelElementHandlerBase.java 681b98b50b362f01abb7a36f108f4f11b9e51829 GREEN
PropertySectionBase.java c545ad187b8fcff8fc9e592a923b7c0b1522133b YELLOW PropertySectionBase.java 247ddc3eee4737ae36623d138ee397da6d93fdf6 YELLOW
TutorialStepUIAtomicBase.java cea2a158158b476de2108d2309afcf47f217b6d9 GREEN TutorialStepUIAtomicBase.java cea2a158158b476de2108d2309afcf47f217b6d9 GREEN
TutorialStepUIAtomicWithWhitelistBase.java a9788ae514f62d27169c737ef59fb583234b5d43 GREEN TutorialStepUIAtomicWithWhitelistBase.java a9788ae514f62d27169c737ef59fb583234b5d43 GREEN
TutorialStepUICompositeBase.java 8225210eacb5b88de47d78280c5819f572f00ffa GREEN TutorialStepUICompositeBase.java 8225210eacb5b88de47d78280c5819f572f00ffa GREEN
......
...@@ -21,20 +21,17 @@ import static org.eclipse.core.databinding.conversion.NumberToStringConverter.fr ...@@ -21,20 +21,17 @@ import static org.eclipse.core.databinding.conversion.NumberToStringConverter.fr
import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toBigDecimal; import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toBigDecimal;
import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toDouble; import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toDouble;
import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toInteger; import static org.eclipse.core.databinding.conversion.StringToNumberConverter.toInteger;
import static org.eclipse.core.databinding.validation.ValidationStatus.cancel; import static org.fortiss.tooling.kernel.ui.databinding.NumberValidator.NUMBER_VALIDATOR;
import static org.eclipse.core.databinding.validation.ValidationStatus.ok;
import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.DECORATION_KEY; import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.DECORATION_KEY;
import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.performComplexTextBinding; import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.performComplexTextBinding;
import static org.fortiss.tooling.kernel.ui.util.WidgetsFactory.createTextWithUndo; import static org.fortiss.tooling.kernel.ui.util.WidgetsFactory.createTextWithUndo;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.ParsePosition;
import org.conqat.ide.commons.ui.databinding.validate.NumberPositiveValidator; import org.conqat.ide.commons.ui.databinding.validate.NumberPositiveValidator;
import org.conqat.ide.commons.ui.databinding.validate.TextToIntegerValidator; import org.conqat.ide.commons.ui.databinding.validate.TextToIntegerValidator;
import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPart;
...@@ -69,35 +66,6 @@ import com.ibm.icu.text.NumberFormat; ...@@ -69,35 +66,6 @@ import com.ibm.icu.text.NumberFormat;
*/ */
public abstract class PropertySectionBase extends AbstractPropertySection { public abstract class PropertySectionBase extends AbstractPropertySection {
/** Validates if a given input is a valid {@link Number}. */
private static class TextToDoubleValidator implements IValidator {
/** Singleton instance. */
public static final TextToDoubleValidator INSTANCE = new TextToDoubleValidator();
/** The number format used in the current locale. */
private final NumberFormat format = NumberFormat.getNumberInstance();
/** {@inheritDoc} */
@Override
public IStatus validate(Object value) {
assert (value != null);
ParsePosition p = new ParsePosition(0);
String input = value.toString();
format.parse(input, p);
int errorIndex = p.getErrorIndex();
// In case the input as a valid prefix, the error index will not indicate a problem.
// Therefore, check if the entire input was parsed.
if(errorIndex == -1 && p.getIndex() < input.length()) {
errorIndex = p.getIndex();
}
return errorIndex == -1 ? ok() : cancel(
"Double number format validation failed at position " + errorIndex + ".");
}
}
/** Label width. */ /** Label width. */
public static final int PROPERTIES_LABEL_WIDTH = 150; public static final int PROPERTIES_LABEL_WIDTH = 150;
...@@ -342,10 +310,10 @@ public abstract class PropertySectionBase extends AbstractPropertySection { ...@@ -342,10 +310,10 @@ public abstract class PropertySectionBase extends AbstractPropertySection {
*/ */
protected void bindBigDecimalValue(Control text, IObservableValue<?> observedValue, protected void bindBigDecimalValue(Control text, IObservableValue<?> observedValue,
IValidator numberValidator) { IValidator numberValidator) {
// TextToDoubleValidator checks format of fractional numbers and is hence also suitable for // DoubleValidator checks format of fractional numbers and is hence also suitable for
// BigDecimals // BigDecimals
performComplexTextBinding(dbc, text, observedValue, fromBigDecimal(), toBigDecimal(), performComplexTextBinding(dbc, text, observedValue, fromBigDecimal(), toBigDecimal(),
TextToDoubleValidator.INSTANCE, numberValidator); NUMBER_VALIDATOR, numberValidator);
} }
/** /**
...@@ -357,10 +325,10 @@ public abstract class PropertySectionBase extends AbstractPropertySection { ...@@ -357,10 +325,10 @@ public abstract class PropertySectionBase extends AbstractPropertySection {
NumberFormat nf = NumberFormat.getNumberInstance(); NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(maxFractionDigits); nf.setMaximumFractionDigits(maxFractionDigits);
// TextToDoubleValidator checks format of fractional numbers and is hence also suitable for // DoubleValidator checks format of fractional numbers and is hence also suitable for
// BigDecimals // BigDecimals
performComplexTextBinding(dbc, text, observedValue, fromBigDecimal(nf), toBigDecimal(nf), performComplexTextBinding(dbc, text, observedValue, fromBigDecimal(nf), toBigDecimal(nf),
TextToDoubleValidator.INSTANCE, numberValidator); NUMBER_VALIDATOR, numberValidator);
} }
/** /**
...@@ -387,7 +355,7 @@ public abstract class PropertySectionBase extends AbstractPropertySection { ...@@ -387,7 +355,7 @@ public abstract class PropertySectionBase extends AbstractPropertySection {
protected void bindDoubleValue(Control text, IObservableValue<?> observedValue, protected void bindDoubleValue(Control text, IObservableValue<?> observedValue,
IValidator numberValidator) { IValidator numberValidator) {
performComplexTextBinding(dbc, text, observedValue, fromDouble(false), toDouble(false), performComplexTextBinding(dbc, text, observedValue, fromDouble(false), toDouble(false),
TextToDoubleValidator.INSTANCE, numberValidator); NUMBER_VALIDATOR, numberValidator);
} }
/** /**
...@@ -400,7 +368,7 @@ public abstract class PropertySectionBase extends AbstractPropertySection { ...@@ -400,7 +368,7 @@ public abstract class PropertySectionBase extends AbstractPropertySection {
NumberFormat nf = NumberFormat.getNumberInstance(); NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(maxFractionDigits); nf.setMaximumFractionDigits(maxFractionDigits);
performComplexTextBinding(dbc, text, observedValue, fromDouble(nf, false), performComplexTextBinding(dbc, text, observedValue, fromDouble(nf, false),
toDouble(nf, false), TextToDoubleValidator.INSTANCE, numberValidator); toDouble(nf, false), NUMBER_VALIDATOR, numberValidator);
} }
/** Binds a positive integer value. */ /** Binds a positive integer value. */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment