/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.internal.ui.editor.validation;
import gov.redhawk.ui.validation.ValidatingService;
import java.util.List;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.databinding.EObjectObservableValue;
import org.eclipse.emf.databinding.IEMFObservable;
import org.eclipse.jface.databinding.swt.ISWTObservable;
import org.eclipse.jface.databinding.viewers.IViewerObservable;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.forms.IMessageManager;
public class ValidatingService34 implements ValidatingService {
@Override
public void analyzeDiagnostic(final DataBindingContext dataBindingContext, final Diagnostic diagnostic, final IMessageManager messageManager) {
IObservableList< ? > bindingList = dataBindingContext.getBindings();
bindingList.getRealm().exec(new Runnable() {
@Override
public void run() {
boolean atLeastOneErroneousBinding = false;
for (final Object o : dataBindingContext.getBindings()) {
final Binding binding = (Binding) o;
Object observed = null;
Object valueType = null;
final IObservable model = binding.getModel();
final IObservable target = binding.getTarget();
IObservable viewObservable = null;
if (target instanceof ISWTObservable || target instanceof IViewerObservable) {
viewObservable = target;
} else if (model instanceof ISWTObservable || model instanceof IViewerObservable) {
viewObservable = model;
}
Control control = getBoundControl(viewObservable);
if (model instanceof IEMFObservable) {
IEMFObservable observable = (IEMFObservable) model;
observed = observable.getObserved();
valueType = observable.getStructuralFeature();
} else if (target instanceof IEMFObservable) {
IEMFObservable observable = (IEMFObservable) target;
observed = observable.getObserved();
valueType = observable.getStructuralFeature();
} else if (model instanceof EObjectObservableValue) {
EObjectObservableValue emfObservable = (EObjectObservableValue) model;
observed = emfObservable.getObserved();
valueType = emfObservable.getValueType();
} else if (target instanceof EObjectObservableValue) {
EObjectObservableValue emfObservable = (EObjectObservableValue) target;
observed = emfObservable.getObserved();
valueType = emfObservable.getValueType();
}
if (observed != null && valueType != null && control != null) {
if (checkBindingFor34(observed, valueType, viewObservable, control, diagnostic, messageManager)) {
atLeastOneErroneousBinding = true;
}
}
}
if (!atLeastOneErroneousBinding) {
// add an error message anyways
messageManager.addMessage(diagnostic, diagnostic.getMessage(), null, ValidatingService.KEY_MAP.getMessageProviderKey(diagnostic.getSeverity()));
}
}
});
}
private Control getBoundControl(IObservable observable) {
if (observable instanceof ISWTObservable) {
Widget widget = ((ISWTObservable) observable).getWidget();
if (widget instanceof Control && !(widget instanceof Button)) {
return (Control) widget;
}
} else if (observable instanceof IViewerObservable) {
return ((IViewerObservable) observable).getViewer().getControl();
}
return null;
}
private boolean checkBindingFor34(Object observed, Object valueType, IObservable observable, final Control control, final Diagnostic diagnostic,
final IMessageManager messageManager) {
final List< ? > diagnosticData = diagnostic.getData();
if (diagnosticData.size() >= 2) {
if (diagnosticData.get(0) == observed) {
if (diagnosticData.get(1) == valueType) {
messageManager.addMessage(observable, diagnostic.getMessage(), null,
ValidatingService.KEY_MAP.getMessageProviderKey(diagnostic.getSeverity()), control);
return true;
}
}
}
return false;
}
}