この質問は主に、 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;
}
}
レイヤーの非モデル編集部分の問題ではないでしょうか?