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