0

我正在尝试添加一个 dropListener,以便我可以在 GEf 编辑器中将文本拖放到 draw2d 标签中,任何人都可以帮助我如何做到这一点。一个很好的例子。

4

1 回答 1

0

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

您必须了解Request和都EditPolicy允许您在基础上自定义放置行为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));

最后确保在目标上安装了一个EditPolicy理解请求类型REQ_ADD(也许你已经添加了一个扩展LayoutEditPolicyContainerEditPolicy)的EditPart,这通常在AbstractEditPart.createEditPolicies().

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

于 2013-07-24T11:28:28.007 回答