/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.utilbox.fields.validation; import static melnorme.utilbox.core.CoreUtil.list; import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.Indexable; import melnorme.utilbox.fields.Field; import melnorme.utilbox.fields.IFieldView; import melnorme.utilbox.status.IStatusMessage; public class ValidationField extends Field<IStatusMessage> implements ValidationSource { protected final ArrayList2<ValidationSource> validators = new ArrayList2<>(); protected IStatusMessage explicitStatus; public ValidationField() { super(null); validators.add(() -> explicitStatus); } @Override public IStatusMessage getValidationStatus() { return getFieldValue(); } public void updateValidation() { setFieldValue(ValidationSource.getHighestStatus(validators)); } public void setExplicitStatus(IStatusMessage explicitStatus) { this.explicitStatus = explicitStatus; updateValidation(); } /* ----------------- ----------------- */ /** * {@link #addFieldValidation2(boolean, IFieldView, ValidationSource)} */ public void addFieldValidation2(IFieldView<?> field, ValidationSource validationSource) { addFieldValidation2(true, field, validationSource); } /** * {@link #addFieldValidation2(boolean, Indexable, ValidationSource)} */ protected void addFieldValidation2(boolean init, IFieldView<?> field, ValidationSource validationSource) { addFieldValidation2(init, list(field), validationSource); } /** * Add a validation source derived from given field. * * Note: it is highly recommended that given validationSource calculation only depends from given fields, * otherwise a manual call to {@link #updateValidation()} will be required to update this validation field. * * @param init * @param field * @param validationSource */ public void addFieldValidation2(boolean init, Indexable<IFieldView<?>> fields, ValidationSource validationSource) { validators.add(validationSource); for (IFieldView<?> sourceField : fields) { sourceField.registerListener(init, (__) -> updateValidation()); } } public void addStatusField(boolean init, IFieldView<IStatusMessage> statusField) { addFieldValidation2(init, statusField, () -> statusField.getFieldValue()); } }