package org.eclipse.gef.examples.shapes.parts; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.Ellipse; import org.eclipse.draw2d.EllipseAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.examples.shapes.model.CursorShape; import org.eclipse.gef.examples.shapes.model.Shape; import org.eclipse.swt.widgets.Display; import org.jnect.bodymodel.PositionedElement; public class CursorShapeEditPart extends AbstractGraphicalEditPart implements NodeEditPart { private ConnectionAnchor anchor; // adapter to connect model to jnect private Adapter positionChangeAdapter = new Adapter() { @Override public void notifyChanged(Notification notification) { Display.getDefault().syncExec(new Runnable() { @Override public void run() { refreshVisuals(); } }); } @Override public Notifier getTarget() { return getPositionedElement(); } @Override public void setTarget(Notifier newTarget) { // TODO Auto-generated method stub } @Override public boolean isAdapterForType(Object type) { // TODO Auto-generated method stub return false; } }; /** * Upon activation, add the change adapter to the positioned element */ public void activate() { if (!isActive()) { super.activate(); getPositionedElement().eAdapters().add(positionChangeAdapter); } } /* * (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ protected void createEditPolicies() { // the cursor should not be removable or should have any connections } /* * (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ protected IFigure createFigure() { IFigure f = createFigureForModel(); f.setOpaque(true); // non-transparent figure f.setBackgroundColor(ColorConstants.red); f.setSize(10, 10); return f; } /** * Return a new Ellipse which will be used as a cursor */ private IFigure createFigureForModel() { return new Ellipse(); } /** * Upon deactivation, detach change adapter from positioned element */ public void deactivate() { if (isActive()) { super.deactivate(); getPositionedElement().eAdapters().remove(positionChangeAdapter); } } private Shape getCastedModel() { return (Shape) getModel(); } private PositionedElement getPositionedElement() { return ((CursorShape) getModel()).getPositionedElement(); } protected ConnectionAnchor getConnectionAnchor() { if (anchor == null) { anchor = new EllipseAnchor(getFigure()); } return anchor; } /* * (non-Javadoc) * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections * () */ protected List getModelSourceConnections() { return getCastedModel().getSourceConnections(); } /* * (non-Javadoc) * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections * () */ protected List getModelTargetConnections() { return getCastedModel().getTargetConnections(); } /* * (non-Javadoc) * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) { return getConnectionAnchor(); } /* * (non-Javadoc) * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .Request) */ public ConnectionAnchor getSourceConnectionAnchor(Request request) { return getConnectionAnchor(); } /* * (non-Javadoc) * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) { return getConnectionAnchor(); } /* * (non-Javadoc) * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .Request) */ public ConnectionAnchor getTargetConnectionAnchor(Request request) { return getConnectionAnchor(); } protected void refreshVisuals() { IFigure figure = getFigure(); PositionedElement model = getPositionedElement(); DiagramEditPart parent = (DiagramEditPart) this.getParent(); CursorShape cursor = (CursorShape) getModel(); if (getViewer() == null || getViewer().getControl() == null) { return; } if (cursor.isEditing()) { figure.setBackgroundColor(ColorConstants.orange); } else { figure.setBackgroundColor(ColorConstants.red); } org.eclipse.swt.graphics.Point size = getViewer().getControl().getSize(); // scaling factors, so user can stay at fixed position float xScaling = (size.x) * 0.75f; float yScaling = (size.y) * 0.75f; float xOffset = (size.x) / 2; float yOffset = (size.y) / 2; // set new location of cursor getCastedModel().setLocation( new org.eclipse.draw2d.geometry.Point(Math.round(xOffset + model.getX() * xScaling), Math.round(yOffset - model.getY() * yScaling))); // inform parent of location change Rectangle layout = new Rectangle(getCastedModel().getLocation(), getCastedModel().getSize()); parent.setLayoutConstraint(this, figure, layout); } }