2

这个问题主要是我关于 EMF 监听机制的问题的后续。

所以,我有一个基于通用图模型的第三方 EMF 模型(不可编辑)。结构如下:

   Project
      |
  ItemGraph
      |
    Item
      |
   Document
      |
  DocumentGraph
 /       |     \
Tokens Nodes   Relations(Edges)

我有一个 GEF 编辑器,它适用于DocumentGraph(即,不是根对象,也许这是一个问题?)getGraphicalViewer().setContents(documentGraph):。编辑器具有以下编辑部分结构:

   DocumentGraphEP
     /        \
Primary      Connection
 LayerEP     LayerEP
  /     \        |
TokenEP NodeEP RelationEP

PrimaryLayerEP并且ConnectionLayerEP两者都有简单String的 s 作为模型,在 EMF(域)模型中没有表示。它们仅用于向ShortestPathConnectionRouter编辑器添加一个主要(即节点)层和一个连接层(带有 )。

问题:我试图让自己进入 EMF 适配器的工作,并尝试利用可用的教程,主要是EMF-GEF Eclipse 教程vainolo 的博客vogella 的教程。我以为我会从一件简单的事情开始,所以尝试从图中删除一个节点,看看我是否让它工作。我没有,我看不出问题出在哪里。

我可以选择一个节点,并Action在我的工具栏中进行通用删除,但是当我单击它时,什么也没有发生。这是不同负责部分的相应源代码。请您指出我能找到的任何错误(思考、编码错误、你有什么)。

节点编辑部分

public class NodeEditPart extends AbstractGraphicalEditPart implements Adapter {

    protected IFigure createFigure() {
        return new NodeFigure();
    }

    protected void createEditPolicies() {
            ....
        installEditPolicy(EditPolicy.COMPONENT_ROLE, new NodeComponentEditPolicy());
    }

    protected void refreshVisuals() {
        NodeFigure figure = (NodeFigure) getFigure();
        SNode model = (SNode) getModel();
        PrimaryLayerEditPart parent = (PrimaryLayerEditPart) getParent();

        // Set text
        figure.getLabel().setText(model.getSName());

             ....
    }

    public void activate() {
        if (isActive()) return;

        // start listening for changes in the model
        ((Notifier)getModel()).eAdapters().add(this);

        super.activate();
}

public void deactivate() {
    if (!isActive()) return;

    // stop listening for changes in the model
    ((Notifier)getModel()).eAdapters().remove(this);

    super.deactivate();
}

private Notifier getSDocumentGraph() {
      return ((SNode)getModel()).getSDocumentGraph();
}

@Override
public void notifyChanged(Notification notification) {
    int type = notification.getEventType();
    switch( type ) {
        case Notification.ADD:
        case Notification.ADD_MANY:
        case Notification.REMOVE:
        case Notification.REMOVE_MANY:
            refreshChildren();
            break;
        case Notification.SET:
            refreshVisuals();
            break;
    }
}

@Override
public Notifier getTarget() {
    return target;
}

@Override
public void setTarget(Notifier newTarget) {
    this.target = newTarget;
}

@Override
public boolean isAdapterForType(Object type) {
    return type.equals(getModel().getClass());
}

}

节点组件编辑策略

public class NodeComponentEditPolicy extends ComponentEditPolicy {

    public NodeComponentEditPolicy() {
        super();
    }

    protected Command createDeleteCommand(GroupRequest deleteRequest) {
        DeleteNodeCommand cmd = new DeleteNodeCommand();
        cmd.setSNode((SNode) getHost().getModel());
        return cmd;
    }
}

删除节点命令

public class DeleteNodeCommand extends Command {

  private SNode node;
  private SDocumentGraph graph;

  @Override
  public void execute() {
    node.setSDocumentGraph(null);
  }

  @Override
  public void undo() {
    node.setSDocumentGraph(graph);
  }

  public void setSNode(SNode node) {
    this.node = node;
    this.graph = node.getSDocumentGraph();
  }
}

一切似乎都正常:当在编辑器中选择一个节点时,工具栏中的删除符号被激活,但是当它被单击时,编辑器中没有任何反应。

我会非常感谢任何指针:)。

编辑

好的,我猜模型对象的删除应该由DocumentGraphEditPart(父)而不是对象本身来处理。所以我也修改了前者以实现Adapter,但直到没有任何反应。

DocumentGraphEP 的 notifyChanged 方法

public void notifyChanged(Notification notification) {
        System.out.println("I'm in the graph EP");// DELETE_SYSO
        int type = notification.getEventType();
        switch( type ) {
            case Notification.ADD:
            case Notification.ADD_MANY:
            case Notification.REMOVE:
                System.out.println("I'm in graph remove");// DELETE_SYSO
                refreshChildren();
                ((PrimaryLayerEditPart)getChildren().get(0)).refresh();
                ((PrimaryLayerEditPart)getChildren().get(0)).refreshVisuals();
                refreshVisuals();
                break;
            case Notification.REMOVE_MANY:
                refreshChildren();
                break;
            case Notification.SET:
                refreshVisuals();
                break;
        }
    }

所以也许整个事件毕竟是图层的非模型编辑部分的问题?

4

1 回答 1

2

这确实是一个EditPart不代表任何现有模型元素的 s 的问题。一旦我编辑了EditParts 的结构,它就可以正常工作了。

于 2012-07-09T08:51:41.747 回答