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いますが、これは EMF (ドメイン) モデルでは表されません。これらは、プライマリ (ノード) レイヤーと接続レイヤー ( を使用ShortestPathConnectionRouter) をエディターに追加するために使用されます。

問題: 私は EMF アダプターの仕組みを理解しようとしています。利用可能なチュートリアル、主にEMF-GEF Eclipse チュートリアルvainolo のブログ、およびvogella のチュートリアルを利用しようとしています。簡単なことから始めようと思ったので、グラフからノードを削除して、それが機能するかどうかを確認してみました。私はそうではありませんでしたし、問題がどこにあるのかわかりません。

ノードを選択してAction、ツールバーに一般的な削除を表示できますが、クリックしても何も起こりません。これは、さまざまな責任部分のそれぞれのソース コードです。あなたが見つけることができるエラー(思考、コーディングエラー、何を持っているか)を私に指摘してください。

NodeEditPart

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());
}

}

NodeComponentEditPolicy

public class NodeComponentEditPolicy extends ComponentEditPolicy {

    public NodeComponentEditPolicy() {
        super();
    }

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

DeleteNodeCommand

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 を持つことの問題です。sの構造を編集したら、うまくいきましたEditPart

于 2012-07-09T08:51:41.747 に答える