package org.archstudio.archipelago2.ext.statecharts.logics; import java.awt.Dimension; import java.util.List; import org.archstudio.archipelago2.Archipelago2Preferences; import org.archstudio.archipelago2.Archipelago2Utils; import org.archstudio.archipelago2.ext.statecharts.things.FinalStateThing; import org.archstudio.bna.IBNAWorld; import org.archstudio.bna.facets.IHasColor; import org.archstudio.bna.facets.IHasEdgeColor; import org.archstudio.bna.facets.IHasMutableReferencePoint; import org.archstudio.bna.facets.IHasMutableSelected; import org.archstudio.bna.facets.IHasSecondaryColor; import org.archstudio.bna.facets.IHasToolTip; import org.archstudio.bna.keys.IThingRefKey; import org.archstudio.bna.keys.ThingRefKey; import org.archstudio.bna.logics.coordinating.MirrorBoundingBoxLogic; import org.archstudio.bna.logics.coordinating.MirrorValueLogic; 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.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import com.google.common.base.Function; public class MapFinalStateLogic extends AbstractXADLToBNAPathLogic<FinalStateThing> implements IPropertyChangeListener { public static final IThingRefKey<IHasEdgeColor> CENTER_KEY = ThingRefKey.create("assembly-center"); protected final MirrorValueLogic mirrorLogic; protected final MirrorBoundingBoxLogic boundsLogic; protected Dimension defaultSize = new Dimension(4 * 24 / 3, 4 * 24 / 3); public MapFinalStateLogic(IBNAWorld world, IXArchADT xarch, ObjRef rootObjRef, String objRefPath, String description) { super(world, xarch, rootObjRef, objRefPath); mirrorLogic = logics.addThingLogic(MirrorValueLogic.class); boundsLogic = logics.addThingLogic(MirrorBoundingBoxLogic.class); syncValue("id", null, null, BNAPath.create(), IHasXArchID.XARCH_ID_KEY, true); syncValue("name", null, "[no name]", BNAPath.create(), IHasToolTip.TOOL_TIP_KEY, true); setProgressInfo(description); Archipelago2Utils .weakListenToPropertyChanges(Archipelago2Preferences.getActivatorPreferenceStore(), this); } @Override protected FinalStateThing addThing(List<ObjRef> descendantRefs, ObjRef objRef) { Point location = BNAUtils2.getNewThingSpot(world, true); FinalStateThing thing = model.addThing(new FinalStateThing(null), Assemblies.getLayer(model, Assemblies.Layer.MIDDLE)); thing.setBoundingBox( new Rectangle(location.x, location.y, defaultSize.width, defaultSize.height)); thing.setColor(new RGB(32, 32, 32)); Assemblies.markRoot(thing); mirrorLogic.mirrorValue(thing, IHasColor.COLOR_KEY, thing, IHasSecondaryColor.SECONDARY_COLOR_KEY, new Function<RGB, RGB>() { @Override @Nullable public RGB apply(@Nullable RGB input) { return BNAUtils.adjustBrightness(input, 2f); } }); UserEditableUtils.addEditableQualities(thing, IHasMutableSelected.USER_MAY_SELECT, IHasMutableReferencePoint.USER_MAY_MOVE); return thing; } @Override public void applyDefaults(FinalStateThing thing) { super.applyDefaults(thing); applyPreferences(thing); } @Override public void propertyChange(PropertyChangeEvent event) { try (Finally lock = BNAUtils.lock()) { for (FinalStateThing thing : getAddedThings()) { applyPreferences(thing); } } } public void applyPreferences(FinalStateThing thing) { thing.setLineWidth(1 + Archipelago2Preferences.getLineWidth()); } }