在我的插件中,有一个打开编辑器的动作(扩展了EditorPart)。当我尝试第二次打开它时,未调用其init方法。而是将焦点转移到已经打开的编辑器上。
编辑器与文件类型关联。这是来自plugin.xml的摘录:
<extension point="org.eclipse.ui.editors">
<editor
class="de.blub.tool.ide.editors.GRASPEditor"
default="true"
extensions="grasp"
filenames="*.grasp"
icon="icons/newGraspFile.png"
id="de.blub.tool.ide.editors.GRASPEditor"
name="GRASP File Editor">
</editor>
</extension>
我有一个操作来打开一个新的编辑器。当我尝试单击该操作两次时,它将重用第一个编辑器。我还尝试使用实现IEditorMatchingStrategy
的EditorMatcher,并始终在其matchs()方法中返回false。即使那样也不会改变行为。
这似乎是日食中的一种期望/默认行为。我该如何更改,以便用户每次都可以初始化一个新的编辑器?
答案 0 :(得分:0)
Eclipse在equals
实例中寻找IEditorInput
方法。编辑器在其代码中的某处(在我的情况下,在doSave
方法中)使用的是setInput
方法,如下所示:
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
// Initialize the editor input
this.input = new MyInputClass(resource);
...
}
@Override
public void doSave(IProgressMonitor monitor) {
...
setInput(input);
}
MyInputClass
是扩展IEditorInput
的类。 eclipse重用编辑器或创建新编辑器的逻辑是在其equals
方法中。下面的示例检查IResource字段的路径:
public class MyInputClass implements IEditorInput {
private IResource resource;
public MyInputClass(IResource resource) {
this.resource = resource;
}
public IResource getResource() {
return resource;
}
public void setResource(IResource resource) {
this.resource = resource;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof MyEditorClass) {
MyEditorClass other = (MyEditorClass) obj;
if (getResource().getFullPath().equals(other.getResource().getFullPath())) {
return true;
}
}
return false;
}
}
当然,可以在equals方法内定义另一种逻辑。请确保不要造成混乱,正如greg-449在评论中指出的那样。这很可能。