使用IEditorreference关闭编辑器? (eclipse RCP)

时间:2011-08-10 12:38:42

标签: eclipse-plugin eclipse-rcp

我有一个UI,当我选择一个项目(在树中),然后按下“添加”按钮时,我得到一个新的编辑器。每个项目我都可以得到一个编辑器。 (但都有相同的ID) 我的目的是仅关闭item1的编辑器,例如,当我按“save”时。 我可以通过以下方式关闭所有编辑器:                  getSite().getWorkbenchWindow().getActivePage().closeAllEditors(true);

但不仅仅是我需要关闭的那个。

我认为,这个问题可能会使用IEditorreferences解决,但不知道该怎么做! :( 请帮助:)

List<IEditorReference> editors = new ArrayList<IEditorReference>();               
for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) {
    for (IWorkbenchPage page : window.getPages()) {
        for (IEditorReference editor : page.getEditorReferences()) {
           editors.add(editor);
         }
    }
}

getSite().getWorkbenchWindow().getActivePage().closeEditor(editors.get(index)????,true);

3 个答案:

答案 0 :(得分:3)

可以使用编辑器输入跟踪编辑器。表示item1的对象必须是编辑器输入的一部分......

类似的东西:

// Creating and opening
MyObject item1 = ... //create item1
// open editor
myInput = new MyEditorInput(item1)
IDE.openEditor(workbenchPage, myInput, MY_EDITOR_ID);

// Closing
tmpInput = new MyEditorInput(item1)
IEditorReference[] editorReferences = PlatformUI.getWorkbench()
                .getActiveWorkbenchWindow().getActivePage()
                .getEditorReferences();
        List<IEditorReference> relevantEditors = new ArrayList<IEditorReference>();
        for (IEditorReference iEditorReference : editorReferences) {
            if (iEditorReference.getEditorInput().equals(tmpInput)) {
                relevantEditors.add(iEditorReference);
            }
        }
        PlatformUI
                .getWorkbench()
                .getActiveWorkbenchWindow()
                .getActivePage()
                .closeEditors(
                        (IEditorReference[]) relevantEditors.toArray(new IEditorReference[relevantEditors
                                .size()]), true);

确保已覆盖EditorInput的equals和hashCode以检查包装MyObject的实例是否相等 - 实例

答案 1 :(得分:0)

打开编辑器时,您必须跟踪项目与关联的已打开IEditorReference之间的映射。例如,可以使用简单的HashMap对象来完成此操作。

答案 2 :(得分:0)

谢谢Tom,你的回答很有帮助。

由于每个IEditorInput都可以设置其名称,我们也可以使用以下内容:

// String str =.....
// str, could be an editor's property

if (iEditorReference.getEditorInput().getName().equals(str))

此外,它将抛出PartInitException,如下所示:

//....................

    try {
        for (IEditorReference iEditorReference : editorReferences) {
            if (iEditorReference.getEditorInput().getName().equals(str)) {
                relevantEditors.add(iEditorReference);
            }
        }
    } catch (PartInitException e) {
        e.printStackTrace();
    }
//...................