package org.archstudio.archipelago2.ext.statecharts.logics; import org.archstudio.archipelago2.ext.statecharts.utils.MenuContributor; import org.archstudio.bna.IBNAView; import org.archstudio.bna.IBNAWorld; import org.archstudio.bna.ICoordinate; import org.archstudio.bna.IThing; import org.archstudio.bna.constants.DNDActionType; import org.archstudio.bna.constants.DNDData; import org.archstudio.bna.constants.DNDType; import org.archstudio.bna.logics.AbstractThingLogic; import org.archstudio.bna.ui.IBNAAllEventsListener2; import org.archstudio.bna.ui.IBNADragAndDropListener2; import org.archstudio.bna.ui.IBNAMenuListener2; import org.archstudio.bna.utils.Assemblies; import org.archstudio.bna.utils.BNAUtils2.ThingReference; import org.archstudio.bna.utils.BNAUtils2.ThingsAtLocation; import org.archstudio.sysutils.UIDGenerator; import org.archstudio.xadl.XadlUtils; import org.archstudio.xadl.bna.facets.IHasObjRef; import org.archstudio.xadl3.statechart_1_0.State; import org.archstudio.xadl3.statechart_1_0.Statechart; import org.archstudio.xadl3.statechart_1_0.Statechart_1_0Package; import org.archstudio.xadl3.statechart_1_0.SubStatechart; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTProxy; import org.eclipse.jface.action.IMenuManager; public class UpdateSubStatechartLogic extends AbstractThingLogic implements IBNADragAndDropListener2, IBNAMenuListener2, IBNAAllEventsListener2 { protected final IXArchADT xarch; public UpdateSubStatechartLogic(IBNAWorld world, IXArchADT xarch) { super(world); this.xarch = xarch; } protected ObjRef getStateRef(IBNAView view, IThing thing) { IThing o = Assemblies.getThingWithProperty(view.getBNAWorld().getBNAModel(), thing, IHasObjRef.OBJREF_KEY); if (o != null) { ObjRef stateRef = o.get(IHasObjRef.OBJREF_KEY); if (XadlUtils.isInstanceOf(xarch, stateRef, Statechart_1_0Package.Literals.STATE)) { return stateRef; } } return null; } @Override public void drag(IBNAView view, DNDType type, DNDData data, ICoordinate location, ThingsAtLocation thingsAtLocation) { if (view.getBNAWorld() != world) { return; } if (thingsAtLocation.getBackgroundThingAtLocation() != null) { ThingReference thingRef = thingsAtLocation.getBackgroundThingAtLocation(); if (thingRef.getView().getBNAWorld() == world) { ObjRef stateRef = getStateRef(thingRef.getView(), thingRef.getThing()); if (stateRef != null) { if (data.getDataTypes().isEmpty()) { data.setDropType(DNDActionType.LINK); return; } ObjRef statechartRef = data.getData(ObjRef.class); if (XadlUtils.isInstanceOf(xarch, statechartRef, Statechart_1_0Package.Literals.STATECHART)) { data.setDropType(DNDActionType.LINK); return; } } } } } @Override public void drop(IBNAView view, DNDType type, DNDData data, ICoordinate location, ThingsAtLocation thingsAtLocation) { if (view.getBNAWorld() != world) { return; } if (thingsAtLocation.getBackgroundThingAtLocation() != null) { ThingReference thingRef = thingsAtLocation.getBackgroundThingAtLocation(); if (thingRef.getView().getBNAWorld() == world) { ObjRef stateRef = getStateRef(thingRef.getView(), thingRef.getThing()); if (stateRef != null) { ObjRef statechartRef = data.getData(ObjRef.class); if (XadlUtils.isInstanceOf(xarch, statechartRef, Statechart_1_0Package.Literals.STATECHART)) { SubStatechart subStatechart = XArchADTProxy.create(xarch, Statechart_1_0Package.Literals.SUB_STATECHART); subStatechart.setId(UIDGenerator.generateUID()); subStatechart.setInnerStatechart(XArchADTProxy.<Statechart>proxy(xarch, statechartRef)); State state = XArchADTProxy.proxy(xarch, stateRef); state.setSubStatechart(subStatechart); } } } } } @Override public void fillMenu(IBNAView view, ICoordinate location, ThingsAtLocation thingsAtLocation, IMenuManager menuManager) { if (view.getBNAWorld() != world) { return; } if (thingsAtLocation.getBackgroundThingAtLocation() != null) { ThingReference thingRef = thingsAtLocation.getBackgroundThingAtLocation(); if (thingRef.getView().getBNAWorld() == world) { ObjRef stateRef = getStateRef(thingRef.getView(), thingRef.getThing()); if (stateRef != null) { State state = XArchADTProxy.proxy(xarch, stateRef); if (state.getSubStatechart() != null) { MenuContributor.addClearSubStatechartAction(menuManager, xarch, stateRef); } } } } } }