package com.xrosstools.xunit.editor.model; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.eclipse.ui.views.properties.TextPropertyDescriptor; import com.xrosstools.xunit.BehaviorType; public class UnitNodeConnection implements UnitConstants, PropertyChangeListener, IPropertySource, Serializable{ private boolean firstHalf; private UnitNodePanel byPassed; private String label; private UnitNode source; private UnitNode target; private String srcPropName; private PropertyChangeSupport listeners = new PropertyChangeSupport(this); public static UnitNodeConnection linkStart(UnitNode source, UnitNode target){ return new UnitNodeConnection(source, target, null, null, true); } public static UnitNodeConnection linkStart(UnitNode source, UnitNode target, String label){ return new UnitNodeConnection(source, target, label, null, true); } public static UnitNodeConnection linkStart(UnitNode source, UnitNode target, UnitNodePanel byPassed){ if(byPassed == null) return null; return new UnitNodeConnection(source, target, null, byPassed, true); } public static UnitNodeConnection linkEnd(UnitNode source, UnitNode target){ return new UnitNodeConnection(source, target, null, null, false); } public static void remove(UnitNode source, UnitNode target){ if(source == null || target == null) return; for(UnitNodeConnection conn: source.getOutputs()){ if(conn.getTarget() == target){ source.removeOutput(conn); } } } public static void remove(UnitNode source, UnitNode target, String label){ if(source == null || target == null) return; for(UnitNodeConnection conn: source.getOutputs()){ if(conn.getTarget() == target){ if(label == conn.getLabel() || conn.getLabel() != null && conn.getLabel().equals(label)){ source.removeOutput(conn); } } } } public static boolean contains(UnitNode source, UnitNode target){ if(source == null || target == null) return false; for(UnitNodeConnection conn: source.getOutputs()) if(conn.getTarget() == target) return true; return false; } public UnitNodeConnection(UnitNode source, UnitNode target, String label, UnitNodePanel byPassed, boolean firstHalf){ if(source == null || target == null || contains(source, target)) return; this.source =source; this.target = target; this.byPassed = byPassed; this.label = label; this.firstHalf = firstHalf; source.addOutput(this); target.addInput(this); } public IPropertyDescriptor[] getPropertyDescriptors() { if(label == null && srcPropName == null) return new IPropertyDescriptor[0]; IPropertyDescriptor[] descriptors; descriptors = new IPropertyDescriptor[] { new TextPropertyDescriptor(PROP_LABEL, PROP_LABEL), }; return descriptors; } public Object getPropertyValue(Object propName) { if (PROP_LABEL.equals(propName)) return label; return null; } public void setPropertyValue(Object propName, Object value){ if (!PROP_LABEL.equals(propName)) return; setLabel((String)value); if(propName == null || !isValidatorLink()) return; ((IPropertySource)source).setPropertyValue(srcPropName, label); } public Object getEditableValue(){ return this; } public boolean isPropertySet(Object propName){ return true; } public void resetPropertyValue(Object propName){ } public void setLabel(String label){ this.label = label; this.firePropertyChange(PROP_LABEL, null, label); } public String getLabel(){ return label; } public UnitNode getSource() { return source; } public void setSource(UnitNode source) { this.source = source; } public UnitNode getTarget() { return target; } public void setTarget(UnitNode target) { this.target = target; } public boolean isFirstHalf() { return firstHalf; } public void setFirstHalf(boolean firstHalf) { this.firstHalf = firstHalf; } public UnitNodePanel getByPassed(){ return byPassed; } public PropertyChangeSupport getListeners() { return listeners; } public void setListeners(PropertyChangeSupport listeners) { this.listeners = listeners; } protected void firePropertyChange(String propertyName, Object oldValue, Object newValue){ listeners.firePropertyChange(propertyName, oldValue, newValue); } private boolean isValidatorLink(){ return source != null && source.getType() == BehaviorType.validator; } public void setPropName(String propName){ this.srcPropName = propName; if(source != null) source.addPropertyChangeListener(this); propertyChange(null); } public void propertyChange(PropertyChangeEvent event) { if(!isValidatorLink()) return; setLabel((String)((IPropertySource)source).getPropertyValue(srcPropName)); } }