gef:将子约束更改为新父级

时间:2013-04-25 16:06:13

标签: eclipse-gef draw2d

我有somme流程元素,可以包含其他没有限制的流程元素。

我直接从调色板中将新进程添加到其他进程中,它正常工作但是当我拖动已经绘制的进程将其集成为已绘制的另一个进程的新子进程时,编辑器不允许我这样做我有一个白色的十字光标。

在我的模型中,Process类正在扩展ContainerElement类,它处理子项的添加和删除以及通知内容。

我在想,因为这个过程会有一个新的父母,我必须在更改ConstraintCommand中添加它

这是我的代码片段

    public class ProcessFigure extends Figure {
    public ProcessFigure() {
    setLayoutManager(new XYLayout());

    ellipse = new Ellipse();
    ellipse.setFill(false);
    add(ellipse);
    label = new Label();
    add(label);
    ellipse.setLayoutManager(new XYLayout());
   }

    public IFigure getContentPane() {
    return ellipse;
   }
    ...
}

 ------------------------------
 public class ProcessEditPart extends ContainerElementEditPart {
 ...
    public IFigure getContentPane() {
    return ((ProcessFigure)getFigure()).getContentPane();
    }

    @Override
    protected void createEditPolicies() {
    installEditPolicy(EditPolicy.LAYOUT_ROLE, new ContainerElementXYLayoutEditPolicy(
            (XYLayout) getContentPane().getLayoutManager()));
    }
...
}
------------------------

public class ContainerElementXYLayoutEditPolicy extends XYLayoutEditPolicy {
    ...
    public ContainerElementXYLayoutEditPolicy(XYLayout layoutManager) {
    super();
    setXyLayout(layoutManager);
    }

    private Command getProcessCreateCommand(CreateRequest request) {
    ProcessCreateCommand result = new ProcessCreateCommand();
    Rectangle constraint = (Rectangle) getConstraintFor(request);
    result.setLocation(constraint.getLocation());
    result.setProcess((Process)request.getNewObject());
    result.setParent((ContainerElement)getHost().getModel());
    return result;
    }


    protected Command createChangeConstraintCommand (ChangeBoundsRequest request,EditPart child , Object constraint) {
    ProcessChangeConstraintCommand changeConstraintCommand = new ProcessChangeConstraintCommand (); 
    changeConstraintCommand.setProcess((Process)child.getModel());
    changeConstraintCommand.setNewConstraint((Rectangle)constraint);
    return changeConstraintCommand;

    }    
...

}

我认为问题是gef无法找到合适的布局管理器,我尝试了几次更改但是每次获得cast或stackoverflow异常,请帮忙!

1 个答案:

答案 0 :(得分:2)

当您在编辑部分GEF的图形外拖动元素时,会触发一个REQ_ORPHAN请求,该请求必须由从中取出该元素的编辑部分处理。如果没有这样做,我认为你不能把这个元素带到编辑部分的数字之外。您可以通过覆盖getOrphanChildrenCommand类中的LayoutEditPolicy来处理此要求。

我从未使用过此功能,但这是GEF Programmer's Guide

移动和调整大小中所写的内容