package org.whole.lang.flowchart.factories; import org.whole.lang.commons.factories.CommonsEntityAdapterFactory; import org.whole.lang.events.IChangeEventHandler; import org.whole.lang.events.IdentityChangeEventHandler; import org.whole.lang.factories.DefaultEntityRegistryConfiguration; import org.whole.lang.factories.IEntityRegistry; import org.whole.lang.flowchart.model.Flowchart; import org.whole.lang.flowchart.model.Transitions; import org.whole.lang.flowchart.reflect.FlowchartEntityDescriptorEnum; import org.whole.lang.flowchart.reflect.FlowchartFeatureDescriptorEnum; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.IEntity; import org.whole.lang.reflect.FeatureDescriptor; import org.whole.lang.util.EntityUtils; /** * @generator Whole */ public class FlowchartDefaultEntityRegistryConfiguration extends DefaultEntityRegistryConfiguration { public void apply(IEntityRegistry er) { super.apply(er); FlowchartEntityFactory ef = FlowchartEntityFactory.instance(er); er.put(ef.create(FlowchartEntityDescriptorEnum.Entry, ef.createPixels(0), ef.createPixels(0), ef.createPixels(16), ef.createPixels(16), ef.createText("entry") )); er.put(ef.create(FlowchartEntityDescriptorEnum.Exit, ef.createPixels(0), ef.createPixels(0), ef.createPixels(16), ef.createPixels(16), ef.createText("exit") )); er.put(ef.create(FlowchartEntityDescriptorEnum.Block, ef.createPixels(0), ef.createPixels(0), ef.createPixels(50), ef.createPixels(40), ef.createText("block") )); er.put(ef.create(FlowchartEntityDescriptorEnum.Choice, ef.createPixels(0), ef.createPixels(0), ef.createPixels(40), ef.createPixels(30), ef.createText("choice") )); Transitions joinTransitions = ef.createTransitions(0); er.put(ef.create(FlowchartEntityDescriptorEnum.Join, ef.createPixels(0), ef.createPixels(0), ef.createPixels(50), ef.createPixels(16), ef.createText("join"), joinTransitions )); Flowchart flowchart = ef.create(FlowchartEntityDescriptorEnum.Flowchart, ef.createNodes(0), ef.createTransitions(0) ); er.put(flowchart); flowchart.wAddChangeEventHandler(new IdentityChangeEventHandler() { private static final long serialVersionUID = 1L; public void notifyChanged(IEntity source, FeatureDescriptor fd, IEntity oldValue, IEntity newValue) { if (FlowchartFeatureDescriptorEnum.transitions.equals(fd)) { newValue.wAddChangeEventHandler(new IdentityChangeEventHandler() { private static final long serialVersionUID = 1L; @Override public void notifyRemoved(IEntity source, FeatureDescriptor featureDesc, int index, IEntity oldValue) { super.notifyRemoved(source, featureDesc, index, oldValue); if (Matcher.match(FlowchartEntityDescriptorEnum.Flowchart, source.wGetParent()) && EntityUtils.isNotResolver(oldValue)) { removeCrossReferences(oldValue, FlowchartFeatureDescriptorEnum.target); removeCrossReferences(oldValue, FlowchartFeatureDescriptorEnum.source); } } private void removeCrossReferences(IEntity transition, FeatureDescriptor fd) { IEntity referrer = transition.wGet(fd); for (int i=referrer.wSize(), size=i+referrer.wAdjacentSize(); i<size; i++) { IEntity adjacent = referrer.wGet(i); if (EntityUtils.isComposite(adjacent) && adjacent.wContains(transition)) referrer.wGet(i).wRemove(transition); else if (adjacent == transition) // referece modifier check not needed referrer.wSet(i, CommonsEntityAdapterFactory.createResolver(adjacent.wGetEntityDescriptor())); } } }); } } }); //FIXME workaround for misbehaving event handling on composite entities with relationship modifier. // AbstractEntity.notifyAdded() should have notified the composite owner's event handler (Join), // consequently we redirect any change event of the composite to the owner entity. joinTransitions.wAddChangeEventHandler(new IdentityChangeEventHandler() { private static final long serialVersionUID = 1L; @Override public void notifyAdded(IEntity source, FeatureDescriptor featureDesc, int index, IEntity newValue) { IEntity targetJoin = newValue.wGet(FlowchartFeatureDescriptorEnum.target); IChangeEventHandler changeEventHandler = targetJoin.wGetModel().getCompoundModel().getChangeEventHandler(); changeEventHandler.notifyChanged(targetJoin, FlowchartFeatureDescriptorEnum.targetTransitions, source, source); } @Override public void notifyRemoved(IEntity source, FeatureDescriptor featureDesc, int index, IEntity newValue) { IEntity targetJoin = newValue.wGet(FlowchartFeatureDescriptorEnum.target); IChangeEventHandler changeEventHandler = targetJoin.wGetModel().getCompoundModel().getChangeEventHandler(); changeEventHandler.notifyChanged(targetJoin, FlowchartFeatureDescriptorEnum.targetTransitions, source, source); } }); } }