我正在尝试添加一个 dropListener,以便我可以在 GEf 编辑器中将文本拖放到 draw2d 标签中,任何人都可以帮助我如何做到这一点。一个很好的例子。
1 回答
要响应 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
(也许你已经添加了一个扩展LayoutEditPolicy
或ContainerEditPolicy
)的EditPart
,这通常在AbstractEditPart.createEditPolicies()
.
为了更好地理解责任链,我建议你看一下TransferDropTargetListener.getCommand()
方法的超级实现。