package org.archstudio.archipelago2.ext.structures.logics;
import java.awt.geom.Point2D;
import java.util.List;
import org.archstudio.archipelago2.Archipelago2Preferences;
import org.archstudio.archipelago2.Archipelago2Utils;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.constants.StickyMode;
import org.archstudio.bna.facets.IHasAnchorPoint;
import org.archstudio.bna.facets.IHasInternalWorldPoint;
import org.archstudio.bna.facets.IHasMutableSelected;
import org.archstudio.bna.facets.IHasMutableToolTip;
import org.archstudio.bna.facets.IHasToolTip;
import org.archstudio.bna.logics.coordinating.DynamicStickPointLogic;
import org.archstudio.bna.logics.coordinating.ReparentToThingIDLogic;
import org.archstudio.bna.logics.coordinating.ReparentToThingIDLogic.ReparentParams;
import org.archstudio.bna.logics.events.ListenToSubWorldEventsLogic;
import org.archstudio.bna.things.shapes.MappingThing;
import org.archstudio.bna.utils.Assemblies;
import org.archstudio.bna.utils.BNAPath;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.bna.utils.BNAUtils2;
import org.archstudio.bna.utils.UserEditableUtils;
import org.archstudio.sysutils.Finally;
import org.archstudio.xadl.bna.facets.IHasXArchID;
import org.archstudio.xadl.bna.logics.mapping.AbstractXADLToBNAPathLogic;
import org.archstudio.xadl.bna.logics.mapping.MaintainMappingLogic;
import org.archstudio.xadl.bna.logics.mapping.SynchronizeThingIDAndObjRefLogic;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Point;
public class MapMappingsLogic extends AbstractXADLToBNAPathLogic<MappingThing>
implements IPropertyChangeListener {
protected final DynamicStickPointLogic stickLogic;
protected final SynchronizeThingIDAndObjRefLogic syncLogic;
protected final ReparentToThingIDLogic reparentLogic;
public MapMappingsLogic(IBNAWorld world, IXArchADT xarch, ObjRef rootObjRef, String objRefPath,
String description) {
super(world, xarch, rootObjRef, objRefPath);
stickLogic = logics.addThingLogic(DynamicStickPointLogic.class);
syncLogic = logics.addThingLogic(SynchronizeThingIDAndObjRefLogic.class);
reparentLogic = logics.addThingLogic(ReparentToThingIDLogic.class);
logics.addThingLogic(MaintainMappingLogic.class);
logics.addThingLogic(ListenToSubWorldEventsLogic.class);
syncValue("id", null, null, BNAPath.create(), IHasXArchID.XARCH_ID_KEY, true);
syncValue("name", null, "[no name]", BNAPath.create(), IHasToolTip.TOOL_TIP_KEY, false);
setValue(BNAPath.create(), stickLogic.getStickyModeKey(IHasAnchorPoint.ANCHOR_POINT_KEY),
StickyMode.CENTER);
// Set the inner world objRef and interface objRef on the MappingSplineThing.
syncValue("innerInterfaceLink", null, null, BNAPath.create(),
MaintainMappingLogic.INTERNAL_OBJREF_KEY, false);
setAncestorObjRef(BNAPath.create(),
syncLogic.syncObjRefKeyToThingIDKey(IHasInternalWorldPoint.INTERNAL_WORLD_KEY), 1);
// Set the outer interface objRef.
syncValue("outerInterfaceLink", null, null, BNAPath.create(), syncLogic
.syncObjRefKeyToThingIDKey(stickLogic.getStickyThingKey(IHasAnchorPoint.ANCHOR_POINT_KEY)),
true);
setProgressInfo(description);
Archipelago2Utils
.weakListenToPropertyChanges(Archipelago2Preferences.getActivatorPreferenceStore(), this);
}
@Override
protected MappingThing addThing(List<ObjRef> descendantRefs, ObjRef objRef) {
ObjRef brickRef = descendantRefs.get(descendantRefs.size() - 3);
Point location = BNAUtils2.getNewThingSpot(world, true);
MappingThing thing = Assemblies.createMapping(world, null, null);
thing.setAnchorPoint(new Point2D.Double(location.x - 50, location.y + 50));
thing.setInternalPoint(new Point2D.Double(location.x + 50, location.y - 50));
// Re-stack the interface mapping on the top of the brick (i.e., under the interface).
thing.set(syncLogic.syncObjRefKeyToThingIDKey(ReparentToThingIDLogic.REPARENT_TO_THING_KEY),
brickRef);
thing.set(ReparentToThingIDLogic.REPARENT_TO_THING_PARAMS_KEY,
new ReparentParams(BNAPath.create(Assemblies.WORLD_KEY), true));
UserEditableUtils.addEditableQualities(thing, IHasMutableToolTip.USER_MAY_EDIT_TOOL_TIP,
IHasMutableSelected.USER_MAY_SELECT);
return thing;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
try (Finally lock = BNAUtils.lock()) {
for (MappingThing thing : getAddedThings()) {
applyPreferences(thing);
}
}
}
public void applyPreferences(MappingThing thing) {
thing.setLineWidth(Archipelago2Preferences.getLineWidth());
}
}