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 在评论中指出的那样,确保不要制造混乱,这是很有可能的。
在我的插件中有一个打开编辑器的操作(扩展了 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 在评论中指出的那样,确保不要制造混乱,这是很有可能的。