package org.archstudio.bna.logics.events;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.constants.MouseType;
import org.archstudio.bna.facets.IHasMutableReferencePoint;
import org.archstudio.bna.facets.IHasReferencePoint;
import org.archstudio.bna.logics.AbstractThingLogic;
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.ThingsAtLocation;
import org.archstudio.bna.utils.DefaultCoordinate;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
public class DragMoveEventsLogic extends AbstractThingLogic implements IBNAMouseClickListener2, IBNAMouseMoveListener2 {
DragMoveEvent currentEvent = null;
public DragMoveEventsLogic(IBNAWorld world) {
super(world);
}
@Override
public void mouseDown(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
BNAUtils.checkLock();
if (evt.button == 1 && (evt.stateMask & SWT.MODIFIER_MASK) == 0
&& thingsAtLocation.getThingAtLocation() != null) {
IHasReferencePoint relativeMovableThing = Assemblies.getEditableThing(model, thingsAtLocation.getThing(),
IHasReferencePoint.class, IHasMutableReferencePoint.USER_MAY_MOVE);
if (relativeMovableThing != null) {
Composite composite = view.getBNAUI().getComposite();
composite.setCursor(composite.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
fireDragStartedEvent(currentEvent = new DragMoveEvent(view, evt, relativeMovableThing,
DefaultCoordinate.forLocal(new Point(evt.x, evt.y), view.getCoordinateMapper())));
}
}
}
@Override
public void mouseMove(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
BNAUtils.checkLock();
if (currentEvent != null) {
fireDragMoveEvent(currentEvent = new DragMoveEvent(currentEvent, evt, location));
}
}
@Override
public void mouseUp(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
BNAUtils.checkLock();
if (currentEvent != null) {
Composite composite = view.getBNAUI().getComposite();
composite.setCursor(composite.getDisplay().getSystemCursor(SWT.CURSOR_ARROW));
fireDragFinishedEvent(currentEvent = new DragMoveEvent(currentEvent, evt,
DefaultCoordinate.forLocal(new Point(evt.x, evt.y), view.getCoordinateMapper())));
currentEvent = null;
}
}
protected void fireDragStartedEvent(DragMoveEvent evt) {
for (IDragMoveListener logic : logics.getThingLogics(IDragMoveListener.class)) {
logic.dragStarted(evt);
}
}
protected void fireDragMoveEvent(DragMoveEvent evt) {
for (IDragMoveListener logic : logics.getThingLogics(IDragMoveListener.class)) {
logic.dragMoved(evt);
}
}
protected void fireDragFinishedEvent(DragMoveEvent evt) {
for (IDragMoveListener logic : logics.getThingLogics(IDragMoveListener.class)) {
logic.dragFinished(evt);
}
}
@Override
public void mouseClick(IBNAView view, MouseType type, MouseEvent evt, ICoordinate location,
ThingsAtLocation thingsAtLocation) {
}
}