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

时间:2019-04-01 15:01:26

标签: eclipse-plugin

在我的插件中,有一个打开编辑器的动作(扩展了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。即使那样也不会改变行为。

这似乎是日食中的一种期望/默认行为。我该如何更改,以便用户每次都可以初始化一个新的编辑器?

1 个答案:

答案 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在评论中指出的那样。这很可能。