package org.archstudio.archipelago2.ext.structures.logics;
import java.awt.geom.Point2D;
import org.archstudio.bna.IBNAModel;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.IThing;
import org.archstudio.bna.IThingPeer;
import org.archstudio.bna.constants.KeyType;
import org.archstudio.bna.constants.MouseType;
import org.archstudio.bna.facets.IHasAnchorPoint;
import org.archstudio.bna.facets.IHasWorld;
import org.archstudio.bna.facets.peers.IHasInnerViewPeer;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.logics.tracking.ThingValueTrackingLogic;
import org.archstudio.bna.things.shapes.SplineThing;
import org.archstudio.bna.ui.IBNAAllEventsListener2;
import org.archstudio.bna.ui.IBNAKeyListener2;
import org.archstudio.bna.ui.IBNAMouseClickListener2;
import org.archstudio.bna.ui.IBNAMouseMoveListener2;
import org.archstudio.bna.utils.Assemblies;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.bna.utils.BNAUtils2;
import org.archstudio.bna.utils.BNAUtils2.ThingReference;
import org.archstudio.bna.utils.BNAUtils2.ThingsAtLocation;
import org.archstudio.bna.utils.DefaultCoordinate;
import org.archstudio.sysutils.SystemUtils;
import org.archstudio.sysutils.UIDGenerator;
import org.archstudio.xadl.XadlUtils;
import org.archstudio.xadl.bna.facets.IHasObjRef;
import org.archstudio.xadl.bna.utils.XArchADTOperations;
import org.archstudio.xadl3.structure_3_0.Structure_3_0Package;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.RGB;
import com.google.common.base.Preconditions;
public class CreateMappingLogic extends AbstractThingLogic implements IBNAKeyListener2,
IBNAMouseMoveListener2, IBNAMouseClickListener2, IBNAAllEventsListener2 {
IXArchADT xarch = null;
ObjRef outerInterfaceRef = null;
ObjRef subStructureRef = null;
IBNAView splineView = null;
IBNAWorld splineWorld = null;
IBNAModel splineModel = null;
SplineThing splineThing = null;
IBNAView subStructureView = null;
public CreateMappingLogic(IBNAWorld world) {
super(world);
}
public void beginEditing(IBNAView splineView, IXArchADT xarch, ObjRef outerInterfaceRef,
ObjRef subStructureRef) {
endEditing();
this.xarch = Preconditions.checkNotNull(xarch);
this.outerInterfaceRef = Preconditions.checkNotNull(outerInterfaceRef);
this.subStructureRef = Preconditions.checkNotNull(subStructureRef);
this.splineView = Preconditions.checkNotNull(splineView);
this.splineWorld = splineView.getBNAWorld();
this.splineModel = splineWorld.getBNAModel();
ThingValueTrackingLogic valueLogic =
splineWorld.getThingLogicManager().addThingLogic(ThingValueTrackingLogic.class);
// Find the brick and world within it.
ObjRef brickRef = xarch.getParent(outerInterfaceRef);
IThing brickThing =
SystemUtils.firstOrNull(valueLogic.getThings(IHasObjRef.OBJREF_KEY, brickRef));
if (brickThing == null) {
endEditing();
return;
}
IHasWorld worldThing = Assemblies.getPart(splineModel, brickThing, Assemblies.WORLD_KEY);
if (worldThing == null) {
endEditing();
return;
}
// Find the view of the world.
IThingPeer<IHasWorld> worldThingPeer = splineView.getThingPeer(worldThing);
if (!(worldThingPeer instanceof IHasInnerViewPeer)) {
endEditing();
return;
}
subStructureView = ((IHasInnerViewPeer<IHasWorld>) worldThingPeer).getInnerView();
// Find the outer interface thing.
IThing ifaceThing =
SystemUtils.firstOrNull(valueLogic.getThings(IHasObjRef.OBJREF_KEY, outerInterfaceRef));
if (ifaceThing == null) {
endEditing();
return;
}
if (!(ifaceThing instanceof IHasAnchorPoint)) {
endEditing();
return;
}
// Create the spline thing.
splineThing = splineModel.addThing(new SplineThing(null));
// splineModel.moveAfter(splineThing, ifaceThing);
splineThing.setEdgeColor(new RGB(255, 0, 0));
splineThing.setEndpoint1(((IHasAnchorPoint) ifaceThing).getAnchorPoint());
}
private void endEditing() {
if (splineView != null) {
model.removeThing(splineThing);
xarch = null;
outerInterfaceRef = null;
subStructureRef = null;
splineView = null;
splineWorld = null;
splineModel = null;
splineThing = null;
subStructureView = null;
}
}
@Override
public void mouseMove(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
if (splineView != null) {
Point2D localPoint =
BNAUtils.toPoint2D(thingsAtLocation.getOriginalLocation().getLocalPoint());
Point2D worldPoint = splineView.getCoordinateMapper().localToWorld(localPoint);
splineThing.setEndpoint2(worldPoint);
}
}
@Override
public void mouseDown(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {}
@Override
public void mouseUp(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {}
@Override
public void mouseClick(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
if (splineView != null) {
try {
DefaultCoordinate thisViewCoordinate =
DefaultCoordinate.forLocal(thingsAtLocation.getOriginalLocation().getLocalPoint(),
subStructureView.getCoordinateMapper());
ThingsAtLocation reference =
BNAUtils2.getThingsAtLocation(subStructureView, thisViewCoordinate);
if (reference.getThingAtLocation() != null) {
ThingReference thingReference = reference.getThingAtLocation();
IThing objRefThing =
Assemblies.getThingWithProperty(subStructureView.getBNAWorld().getBNAModel(),
thingReference.getThing(), IHasObjRef.OBJREF_KEY);
ObjRef innerInterfaceRef =
objRefThing != null ? objRefThing.get(IHasObjRef.OBJREF_KEY) : null;
if (innerInterfaceRef != null && XadlUtils.isInstanceOf(xarch, innerInterfaceRef,
Structure_3_0Package.Literals.INTERFACE)) {
ObjRef newInterfaceMappingRef =
XadlUtils.create(xarch, Structure_3_0Package.Literals.INTERFACE_MAPPING);
xarch.set(newInterfaceMappingRef, "id", UIDGenerator.generateUID());
XadlUtils.setName(xarch, newInterfaceMappingRef, "[New Interface-Interface Mapping]");
xarch.set(newInterfaceMappingRef,
Structure_3_0Package.Literals.INTERFACE_MAPPING__OUTER_INTERFACE_LINK.getName(),
outerInterfaceRef);
xarch.set(newInterfaceMappingRef,
Structure_3_0Package.Literals.INTERFACE_MAPPING__INNER_INTERFACE_LINK.getName(),
innerInterfaceRef);
XArchADTOperations.add("Add Interface Mapping", xarch, subStructureRef,
Structure_3_0Package.Literals.SUB_STRUCTURE__INTERFACE_MAPPING.getName(),
newInterfaceMappingRef);
}
}
} finally {
endEditing();
}
}
}
@Override
public void keyPressed(IBNAView view, KeyType type, KeyEvent e) {}
@Override
public void keyReleased(IBNAView view, KeyType type, KeyEvent e) {
if (e.character == SWT.ESC) {
endEditing();
}
}
}