如何添加DropListener以删除draw2d Label中的文本

时间:2013-07-19 08:21:59

标签: eclipse-gef draw2d

我正在尝试添加一个dropListener,这样我就可以删除并将文本转换成一个draw2d标签,在GEf编辑器中,任何人都可以帮助我如何做到这一点。一个例子很棒。

1 个答案:

答案 0 :(得分:0)

要响应GEF编辑部件查看器上的放置事件,您必须在查看器本身上安装org.eclipse.jface.util.TransferDropTargetListener的实现,该实现了解类型org.eclipse.swt.dnd.TextTransfer的转移并创建某种org.eclipse.gef.Request可以由目标org.eclipse.gef.EditPolicy上安装的org.eclipse.gef.EditPart处理。

您必须了解RequestEditPolicy都允许您在EditPart基础上自定义放弃行为。因此,我可以向您展示一个实际上功能齐全的示例,但可以根据您的实际需求进行自定义。

首先创建TransferDropTargetListener

public class TextTransferDropTargetListener extends AbstractTransferDropTargetListener {

    public TextTransferDropTargetListener(EditPartViewer viewer) {
        super(viewer, TextTransfer.getInstance());
    }

    @Override
    protected void handleDragOver() {
        getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
        super.handleDragOver();
    }

    @Override
    protected Request createTargetRequest() {
        return new ChangeBoundsRequest(REQ_ADD);
    }

    @Override
    protected void updateTargetRequest() {
        ChangeBoundsRequest request = (ChangeBoundsRequest) getTargetRequest();
        request.setEditParts(Collections.EMPTY_LIST);
        request.setLocation(getDropLocation());
    }

    @Override
    protected void handleDrop() {
        super.handleDrop();
        if (getCurrentEvent().detail != DND.DROP_NONE) {
            getViewer().setSelection(StructuredSelection.EMPTY);
            getViewer().getControl().setFocus();
        }
    }

    @Override
    protected Command getCommand() {
        String text = (String) getCurrentEvent().data; 
        List<IEntityPart> editParts = new ArrayList<IEntityPart>();

        //
        // using the 'text' variable you have to create
        // a new EditPart that would eventually replace the old one.
        //
        editParts.add(createNewLabelPart());

        ChangeBoundsRequest request = (ChangeBoundsRequest) getTargetRequest();
        request.setEditParts(editParts);

        return super.getCommand();
    }
}

然后使用以下语句在图形查看器构造函数中安装侦听器:

addDropTargetListener(new TextTransferDropTargetListener(this));

最后确保在目标{{1}上安装了EditPolicy,该REQ_ADD了解LayoutEditPolicy类型的请求(可能您已经添加了一个扩展ContainerEditPolicyEditPart的请求)通常在AbstractEditPart.createEditPolicies()

中完成

为了更好地理解责任链,我建议你看一下TransferDropTargetListener.getCommand()方法的超级实现。