5

我正在编写一个 Eclipse 插件,它允许更轻松地为 Android 编辑资源。当用户单击项目内的任何 XML 资源文件时,将打开一个编辑器,允许一次编辑项目中的所有资源。

我想添加在单独的默认 Android 资源编辑器中打开同一文件的功能。我知道那个编辑器的 id,但我无权访问它的类。

调用 IDE.openEditor 什么都不做,因为已经为该文件打开了一个编辑器,即使我指定了另一个 Android 编辑器的 id。

如何强制 Eclipse 为相同的输入打开另一个编辑器?

另一方面,如果我只能访问它的 id 而不是它的类,是否可以在 MultiPageEditorPart 中嵌入另一个编辑器?

4

2 回答 2

4

这些IDE.openEditor方法最后会调用相应的IWorkbenchPage方法来打开编辑器。

在您的情况下可能有用的方法是 org.eclipse.ui.IWorkbenchPage.openEditor(IEditorInput, String, boolean, int)

    /**
     * Opens an editor on the given input.
     * <p>
     * If this page already has an editor open that matches the given input
     * and/or editor id (as specified by the matchFlags argument), that editor
     * is brought to the front; otherwise, a new editor is opened. Two editor
     * inputs are considered the same if they equal. See
     * <code>Object.equals(Object)<code>
     * and <code>IEditorInput</code>. If <code>activate == true</code> the editor
     * will be activated.  
     * </p><p>
     * The editor type is determined by mapping <code>editorId</code> to an editor
     * extension registered with the workbench.  An editor id is passed rather than
     * an editor object to prevent the accidental creation of more than one editor
     * for the same input. It also guarantees a consistent lifecycle for editors,
     * regardless of whether they are created by the user or restored from saved 
     * data.
     * </p>
     * 
     * @param input the editor input
     * @param editorId the id of the editor extension to use
     * @param activate if <code>true</code> the editor will be activated
     * @param matchFlags a bit mask consisting of zero or more of the MATCH_* constants OR-ed together
     * @return an open editor, or <code>null</code> if an external editor was opened
     * @exception PartInitException if the editor could not be created or initialized
     * 
     * @see #MATCH_NONE
     * @see #MATCH_INPUT
     * @see #MATCH_ID
     * @since 3.2
     */
    public IEditorPart openEditor(final IEditorInput input,
        final String editorId, final boolean activate, final int matchFlags)
        throws PartInitException;

您需要调用它并传递它,MATCH_ID | MATCH_INPUT以便在尝试确定是否应重用现有编辑器或创建新编辑器时将编辑器 ID 考虑在内。

于 2012-09-26T09:00:51.410 回答
2

编辑器扩展点org.eclipse.ui.editors允许向扩展添加一个matchingStrategy。当 Eclipse 尝试确定给定 ID 和给定编辑器输入的编辑器是否已打开时,这使您能够影响行为。

实施相当容易。您只需提供 interface 的实现org.eclipse.ui.IEditorMatchingStrategy。它只有一种方法

boolean matches(IEditorReference editorRef, IEditorInput input);

如果返回false这里,Eclipse 每次都会打开一个新的编辑器,即使编辑器 ID 和编辑器输入相等。

于 2012-09-26T09:31:22.230 回答