package com.rcpcompany.uibindings.internal.validators.constraints;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import com.rcpcompany.uibindings.IDecoratorProvider;
import com.rcpcompany.uibindings.IJavaDecoratorProvider;
import com.rcpcompany.uibindings.IUIBindingDecorator;
import com.rcpcompany.uibindings.IValueBinding;
import com.rcpcompany.uibindings.internal.decorators.FileNameControlDecorator;
import com.rcpcompany.uibindings.validators.ConstraintValidatorAdapter.Message;
import com.rcpcompany.uibindings.validators.IConstraintValidatorAdapterConstraint;
import com.rcpcompany.uibindings.validators.IConstraintValidatorAdapterConstraintProvider;
public class FileNameControlConstraintProvider implements IConstraintValidatorAdapterConstraintProvider {
@Override
public IConstraintValidatorAdapterConstraint getConstraint(IValueBinding binding) {
final IDecoratorProvider provider = binding.getDecoratorProvider();
if (!(provider instanceof IJavaDecoratorProvider)) return null;
final IUIBindingDecorator decorator = provider.getDecorator();
if (!(decorator instanceof FileNameControlDecorator)) return null;
final FileNameControlDecorator fnw = (FileNameControlDecorator) decorator;
fnw.initForValidation(binding);
return new FileNameConstraint(binding.getModelFeature(), fnw);
}
private static class FileNameConstraint implements IConstraintValidatorAdapterConstraint {
private final EStructuralFeature myFeature;
private final FileNameControlDecorator myDecorator;
private final IValidator myValidator;
/**
* Constructs and return a new constraint for the specified feature and decorator.
*
* @param feature the feature in question
* @param decorator the decorator to use to perform the validation itself
*/
public FileNameConstraint(EStructuralFeature feature, FileNameControlDecorator decorator) {
myFeature = feature;
myDecorator = decorator;
myValidator = decorator.getUIToModelAfterConvertValidator();
}
@Override
public Message validate(EObject obj, IObservableList messages) {
final Object value = obj.eGet(myFeature);
if (value == null) return null;
final IStatus status = myValidator.validate(value);
if (status.isOK()) return null;
/*
* Error found!! Check if the message is already present in the list
*/
for (final Object o : messages) {
final Message f = (Message) o;
if (f.getObject() == obj && f.getFeature() == myFeature && f.getMessage().equals(status.getMessage()))
return f;
}
/*
* Create new message
*/
final Message f = new Message(obj, myFeature, status);
messages.add(f);
return f;
}
}
}