package org.archstudio.archipelago2.ext.structures.logics;
import org.archstudio.archipelago2.ext.structures.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.structure_3_0.Brick;
import org.archstudio.xadl3.structure_3_0.Structure;
import org.archstudio.xadl3.structure_3_0.Structure_3_0Package;
import org.archstudio.xadl3.structure_3_0.SubStructure;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.archstudio.xarchadt.XArchADTProxy;
import org.eclipse.jface.action.IMenuManager;
public class UpdateSubStructureLogic extends AbstractThingLogic
implements IBNADragAndDropListener2, IBNAMenuListener2, IBNAAllEventsListener2 {
protected final IXArchADT xarch;
public UpdateSubStructureLogic(IBNAWorld world, IXArchADT xarch) {
super(world);
this.xarch = xarch;
}
protected ObjRef getBrickRef(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, Structure_3_0Package.Literals.BRICK)) {
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 brickRef = getBrickRef(thingRef.getView(), thingRef.getThing());
if (brickRef != null) {
if (data.getDataTypes().isEmpty()) {
data.setDropType(DNDActionType.LINK);
return;
}
ObjRef structureRef = data.getData(ObjRef.class);
if (XadlUtils.isInstanceOf(xarch, structureRef,
Structure_3_0Package.Literals.STRUCTURE)) {
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 brickRef = getBrickRef(thingRef.getView(), thingRef.getThing());
if (brickRef != null) {
ObjRef structureRef = data.getData(ObjRef.class);
if (XadlUtils.isInstanceOf(xarch, structureRef,
Structure_3_0Package.Literals.STRUCTURE)) {
SubStructure subStructure =
XArchADTProxy.create(xarch, Structure_3_0Package.Literals.SUB_STRUCTURE);
subStructure.setId(UIDGenerator.generateUID());
subStructure.setInnerStructureLink(XArchADTProxy.<Structure>proxy(xarch, structureRef));
Brick brick = XArchADTProxy.proxy(xarch, brickRef);
brick.setSubStructure(subStructure);
}
}
}
}
}
@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 brickRef = getBrickRef(thingRef.getView(), thingRef.getThing());
if (brickRef != null) {
Brick brick = XArchADTProxy.proxy(xarch, brickRef);
if (brick.getSubStructure() != null) {
MenuContributor.addClearSubStructureAction(menuManager, xarch, brickRef);
}
}
}
}
}
}