这个问题主要是我关于 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;
}
}
所以也许整个事件毕竟是图层的非模型编辑部分的问题?