/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.openshift.internal.common.ui.databinding;
import org.eclipse.core.databinding.ValidationStatusProvider;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Control;
/**
* @author André Dietisheim
*/
public class ValidationStatusControlDecoration {
private IObservableValue validationStatus;
public ValidationStatusControlDecoration(ValidationStatusProvider provider) {
this.validationStatus = provider.getValidationStatus();
}
public void showFor(Control control, int position) {
ControlDecoration decoration = createDecoration(control, position);
IValueChangeListener validationStatusListener = onValidationStatusChanged(decoration);
validationStatus.addValueChangeListener(validationStatusListener);
control.addDisposeListener(onControlDisposed(validationStatusListener));
}
private ControlDecoration createDecoration(Control control, int position) {
ControlDecoration controlDecoration = new ControlDecoration(control, position);
FieldDecoration fieldDecoration =
FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
controlDecoration.setImage(fieldDecoration.getImage());
if (validationStatus.getValue() instanceof IStatus) {
showDecoration(controlDecoration, (IStatus) validationStatus.getValue());
}
return controlDecoration;
}
private DisposeListener onControlDisposed(final IValueChangeListener validationStatusListener) {
return new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
validationStatus.removeValueChangeListener(validationStatusListener);
}
};
}
private IValueChangeListener onValidationStatusChanged(final ControlDecoration controlDecoration) {
return new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
if (!(event.diff.getNewValue() instanceof IStatus)) {
return;
}
IStatus validationStatus = (IStatus) event.diff.getNewValue();
showDecoration(controlDecoration, validationStatus);
}
};
}
private void showDecoration(final ControlDecoration controlDecoration, IStatus validationStatus) {
if (validationStatus.isOK()) {
controlDecoration.hide();
} else {
controlDecoration.show();
}
}
}