尝试从 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 编辑器)设计的,但我认为您可以使用它。
我有一个 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 编辑器)设计的,但我认为您可以使用它。