/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.editor.properties; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IPropertyListener; import de.rcenvironment.core.component.validation.api.ComponentValidationMessage; import de.rcenvironment.core.component.validation.api.ComponentValidationMessage.Type; import de.rcenvironment.core.component.validation.api.ComponentValidationMessageStore; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.gui.workflow.editor.WorkflowEditor; /** * {@link WorkflowNodePropertySection} with capabilities to validate controls. * * <p> * For information about how the validation works, see {@link WorkflowNodeValidatorSupport}. * </p> * * @author Jascha Riedel * @author Christian Weiss */ public abstract class ValidatingWorkflowNodePropertySection extends WorkflowNodePropertySection { private static final String CONTROL_COLORIZED_KEY = "property.control.colorized"; private static final String CONTROL_COLOR_KEY = "property.control.color"; // private final WorkflowNodeValidityStateListener validatorStateListener = createErrorStateUpdateListener(); // private final WorkflowNodeValidationSupport validationSupport = new WorkflowNodeValidationSupport(); private String componentId; private final ComponentValidationMessageStore messageStore = ComponentValidationMessageStore.getInstance(); private IPropertyListener propertyListener = new IPropertyListener() { @Override public void propertyChanged(Object obj, int property) { if (property == WorkflowEditor.PROP_WORKFLOW_VAILDATION_FINISHED) { updateErrorStates(); } } }; public ValidatingWorkflowNodePropertySection() { } @Override protected final void afterInitializingModelBinding() { componentId = ((WorkflowNode) getConfiguration()).getIdentifier(); updateErrorStates(); afterInitializingModelBindingWithValidation(); getPart().addPropertyListener(propertyListener); } protected void afterInitializingModelBindingWithValidation() { /* empty default implementation */ } @Override protected final void beforeTearingDownModelBinding() { try { beforeTearingDownModelBindingWithValidation(); } finally { getPart().removePropertyListener(propertyListener); } } protected void beforeTearingDownModelBindingWithValidation() { /* empty default implementation */ } protected void updateErrorStates() { final List<ComponentValidationMessage> messages = messageStore.getMessagesByComponentId(componentId); updateErrorStates(messages); } /** * The controls are traversed to highlight those which are linked to error messages represented * by {@link ComponentValidationMessage}s. * * @param messages the {@link ComponentValidationMessage}s determined through validation */ protected void updateErrorStates(final List<ComponentValidationMessage> messages) { updateErrorStates(messages, getComposite()); } /** * The controls are traversed to highlight those which are linked to error messages represented * by {@link ComponentValidationMessage}s. * * @param messages the {@link ComponentValidationMessage}s determined through validation * @param parent the actual parent composite */ protected void updateErrorStates(final List<ComponentValidationMessage> messages, final Composite parent) { if (parent != null && !parent.isDisposed()) { for (final Control control : parent.getChildren()) { if (control.isDisposed()) { continue; } if (control instanceof Composite) { updateErrorStates(messages, (Composite) control); } final String key = (String) control.getData(CONTROL_PROPERTY_KEY); if (key != null) { boolean valid = true; for (final ComponentValidationMessage message : messages) { if (key.equals(message.getProperty())) { control.setData(CONTROL_COLORIZED_KEY, true); if (control.getData(CONTROL_COLOR_KEY) == null) { control.setData(CONTROL_COLOR_KEY, control.getBackground()); } if (message.getType() == Type.WARNING) { control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); } else { control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); } control.setToolTipText(message.getRelativeMessage()); valid = false; break; } } final Boolean colorized = (Boolean) control.getData(CONTROL_COLORIZED_KEY); if (valid && Boolean.TRUE.equals(colorized)) { control.setData(CONTROL_COLORIZED_KEY, false); control.setBackground((Color) control.getData(CONTROL_COLOR_KEY)); control.setData(CONTROL_COLOR_KEY, null); control.setToolTipText(""); } } } } } @Override public void refreshSection() { super.refreshSection(); refreshBeforeValidation(); updateErrorStates(); } protected void refreshBeforeValidation() { /* empty default implementation */ } }