尝试从 setInput() 中切换编辑器输入

Trying to switch editor input from within setInput()

我有一个 Eclipse 编辑器可以修改多个文件。当这些文件中的任何一个出现错误时,我希望它打开 MyEditor 而不是它可能打开的标准文本编辑器。

我通过设置marker属性强制marker打开MyEditor:

marker.setAttribute(IDE.EDITOR_ID_ATTR, "com.example.xyz.MyEditorID");

现在,在 MyEditor.setInput() 内,我有以下代码将输入从传入文件切换到主文件:

    protected void setInput(final IEditorInput input) {
        FileEditorInput fileEditorInput = (FileEditorInput) input; 
        final IFile file = (IFile) input.getAdapter(IFile.class);
        if( file.getName().endsWith(mySuffix) ) {
        // this is a coded values type file. It needs to be opened with the default profile
            fileEditorInput = new FileEditorInput(theCorrectFileName);
        }
        ... 
        super.setInput(fileEditorInput);
        ...
    }

我将编辑器的 equals 方法更改为 return 如果输入相等则为 true

public boolean equals(final Object obj) {
    if(obj == null) {
        return false;
    }

    if(this == obj) {
        return true;
    }

    if( !getClass().isInstance(obj) ) {
        return false;
    }
    final MyEdior otherEditor = (MyEditor) obj;
    return getEditorInput().equals( otherEditor.getEditorInput() );
}

但是当我点击我的错误标记时,它仍然每次都会打开一个新的编辑器。我做错了什么?

不使用equals方法将编辑器匹配到编辑器输入。相反,您需要使用 IEditorMatchingStrategy class 将您的编辑器与输入相匹配。

您使用 matchingStrategy 属性在 org.eclipse.ui.editors 扩展点上指定此 class。

例如,这是 Manifest.mf / plugin.xml / build.properties 编辑器:

<extension
     point="org.eclipse.ui.editors">
  <editor
        default="true"
        name="%editors.pluginManifest.name"
        icon="$nl$/icons/obj16/plugin_mf_obj.gif"
        class="org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor"
        contributorClass="org.eclipse.pde.internal.ui.editor.plugin.ManifestEditorContributor"
        matchingStrategy="org.eclipse.pde.internal.ui.editor.plugin.ManifestEditorMatchingStrategy"
        id="org.eclipse.pde.ui.manifestEditor">
        <contentTypeBinding contentTypeId="org.eclipse.pde.pluginManifest"/>
        <contentTypeBinding contentTypeId="org.eclipse.pde.fragmentManifest"/>
        <contentTypeBinding contentTypeId="org.eclipse.pde.bundleManifest"/>            
  </editor>

匹配策略只有一个方法来匹配对输入的编辑器引用:

public boolean matches(IEditorReference editorRef, IEditorInput input)

所有这些都是为同时编辑多个文件的编辑器(例如 Manifest.mf 编辑器)设计的,但我认为您可以使用它。