To make use of this policy I made my plugin depend on import org.eclipse.gmf.runtime.diagram.ui.editpolicies and extended DragDropEditPolicy with my own
public class DesignerDragDropEditPolicty extends DragDropEditPolicy { private Label connectionLabel; private PolylineConnection relationFigure; private DesignerEditor editor; private Image image; public DesignerDragDropEditPolicty() { connectionLabel = new Label(); connectionLabel.setOpaque(false); image = DesignerUIPlugin.getDefault().getImageRegistry().get(ImageConstants.DROP_ICON); connectionLabel.setIcon(image); } @Override // remove icon when edit policy is done public void eraseTargetFeedback(Request request) { if(relationFigure != null){ if(relationFigure.getChildren().contains(connectionLabel)){ relationFigure.remove(connectionLabel); } } } // add icon on filtered edit part. Remove it when another edit part is hovered over. public void showTargetFeedback(Request request) { if(request instanceof CreateRequest){ editor = (DesignerEditor) DesignerUtil.getActiveDesignerTab(); Point location = ((CreateRequest)request).getLocation(); EditPart part = editor.getViewer().findObjectAt(location); if(part instanceof RelationEditPart){ relationFigure = ((RelationEditPart)part).getConnection(); relationFigure.add(connectionLabel, new MidpointLocator(relationFigure, 0)); relationFigure.repaint(); } else{ if(relationFigure != null){ if(relationFigure.getChildren().contains(connectionLabel)){ relationFigure.remove(connectionLabel); } } } } } }
Instead of changing background of the figure as DragDropEditPolicy does I did something different. Whenever user passes inside an EditPart, in my case it's a relation, I put an icon signifying that in this case an object can be dropped onto existing connection an be created in the middle of the relation. I could have put a label saying "Drop here", but I think icons work better than words and after you get used to seeing a particular label with words it gets annoying.
Notice that in showTargetFeedback I filter out EditPart that I am interested in, so here code can be added to add different behavior for other parts.
No comments:
Post a Comment