Eclipse 插件:如何让插件每次都打开一个新的编辑器,而不是将焦点切换到现有的编辑器?

Eclipse Plugin: How can I tell the plugin to open a new Editor every time instead of switching the focus to an existing Editor?

在我的插件中有一个打开编辑器的操作(扩展了 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,并且在其 matches() 方法中始终 returns false。即使那样也不会改变行为。

这似乎是 eclipse 中的 desired/default 行为。我该如何更改它以便用户每次都可以初始化一个新的编辑器?

Eclipse 查找 IEditorInput 实例的 equals 方法。编辑器在其代码中的某处(在我的例子中是 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 的 class。 eclipse 重用 Editor 或创建新编辑器的逻辑在其 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 在评论中指出的那样,确保不要制造混乱,这是很有可能的。