package org.archstudio.bna.logics.coordinating; import java.awt.geom.Point2D; import org.archstudio.bna.IBNAWorld; import org.archstudio.bna.IThing; import org.archstudio.bna.constants.StickyMode; import org.archstudio.bna.facets.IHasStickyShape; import org.archstudio.bna.keys.IThingKey; import org.archstudio.bna.keys.IThingMetakey; import org.archstudio.bna.keys.IThingRefKey; import org.archstudio.bna.keys.ThingMetakey; import org.archstudio.bna.keys.ThingRefMetakey; import org.archstudio.bna.logics.AbstractKeyCoordinatingThingLogic; import org.archstudio.bna.utils.BNAUtils; public class DynamicStickPointLogic extends AbstractKeyCoordinatingThingLogic { private static final String STICKY_MODE_KEY_NAME = ".stickyMode"; private static final String STICKY_THING_ID_KEY_NAME = ".&stickyThingID"; protected final StickPointLogic stickLogic; public DynamicStickPointLogic(IBNAWorld world) { super(world, false); stickLogic = logics.addThingLogic(StickPointLogic.class); } public IThingKey<StickyMode> getStickyModeKey(IThingKey<Point2D> pointKey) { BNAUtils.checkLock(); IThingKey<StickyMode> stickyModeKey = ThingMetakey.create(STICKY_MODE_KEY_NAME, pointKey); track(stickyModeKey); return stickyModeKey; } public IThingRefKey<IHasStickyShape> getStickyThingKey(IThingKey<Point2D> pointKey) { BNAUtils.checkLock(); IThingRefKey<IHasStickyShape> stickyThingKey = ThingRefMetakey.create(STICKY_THING_ID_KEY_NAME, pointKey); track(stickyThingKey); return stickyThingKey; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override protected void update(IThing thing, IThingKey<?> key) { if (key instanceof IThingMetakey) { IThingKey<Point2D> pointKey = ((IThingMetakey) key).getKey(); StickyMode stickyMode = thing.get(getStickyModeKey(pointKey)); IHasStickyShape stickyThing = getStickyThingKey(pointKey).get(thing, model); if (stickyMode != null && stickyThing != null) { stickLogic.stick(thing, pointKey, stickyMode, stickyThing); } else { stickLogic.unstick(thing, pointKey); } } } }