我正在尝试添加一个dropListener,这样我就可以删除并将文本转换成一个draw2d标签,在GEf编辑器中,任何人都可以帮助我如何做到这一点。一个例子很棒。
答案 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
处理。
您必须了解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));
最后确保在目标{{1}上安装了EditPolicy
,该REQ_ADD
了解LayoutEditPolicy
类型的请求(可能您已经添加了一个扩展ContainerEditPolicy
或EditPart
的请求)通常在AbstractEditPart.createEditPolicies()
。
为了更好地理解责任链,我建议你看一下TransferDropTargetListener.getCommand()
方法的超级实现。