如何使用StructuredTextEditor来关闭MultiPageEditor以显示所有页面的Outline View?

时间:2014-07-11 09:19:57

标签: java eclipse-plugin

我正在为eclipse开发一个多页XML编辑器,并在第一页上使用StructuredTextEditor。我想知道是否可以让大纲视图仅在选择文本编辑器时显示内容。虽然选择是其他页面之一,但大纲视图不应显示任何内容。

我将文本编辑器添加到多页面编辑器中,如下所示:

private StructuredTextEditor textEditor;

@Override
protected void addPages()
{
    textEditor = new StructuredTextEditor();
    addPage(textEditor, getEditorInput());

    // add other pages
}

我还在plugin.xml中声明了一种内容类型:

<extension point="org.eclipse.core.contenttype.contentTypes">
     <content-type
         id="artFile"
         name="%content-type.name"
         base-type="org.eclipse.core.runtime.xml"
         file-names="app_registration_template.vm"
         file-extensions="vm">
         <describer class="org.eclipse.core.runtime.content.XMLContentDescriber"/>
     </content-type>
</extension>

我现在如何控制大纲视图?

1 个答案:

答案 0 :(得分:4)

我遇到了类似的问题。

正如@ greg-449在问题的评论中提到的那样#34;内容大纲视图代码对多页编辑器一无所知,每个编辑器只支持一个内容大纲。&#34;

这是真的,实际上让我知道如何解决这个问题。我提出的解决方案与刷新大纲视图(关闭并以编程方式再次打开)相关,同时在标签之间导航。

首先,我在多页面编辑器中应用了该解决方案,该编辑器结合了EMF / GMF标签以及用于显示XML的StructuredTextEditor。

你应该拥有什么

您的多页面编辑器应覆盖/添加以下方法。请注意,这不是插头和插件。播放情境,搜索如何创建自定义大纲页面或如何基于editorInput调用默认大纲页面。我添加这个的原因是为了理解。


(注意showOutlineView方法)它返回false,因为我们要禁用其他视图。但是,如果您愿意,您可以为每个编辑器提供不同的轮廓。为此,您需要始终在showOutlineView中返回true,并在getContentOutlinePage()方法中以不同方式初始化大纲页面。可能是根据所请求的编辑器对页面进行不同的实现。


/**
 * This is how the framework determines which interfaces we implement.
*/
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class key) {
    if (key.equals(IContentOutlinePage.class)) {
        return showOutlineView() ? getContentOutlinePage() : null;
    } else {
        return super.getAdapter(key);
    }
}

/**
 * This accesses a cached version of the content outliner.
 */
public IContentOutlinePage getContentOutlinePage() {
    if (contentOutlinePage == null) {
        //your outlinepage from your editor
        //or create a custom page(s)
    }
    return contentOutlinePage;
}

/**
 * Returns whether the outline view should be presented to the user.
 */
protected boolean showOutlineView() {
    //e.g if StructuredTextEditor xmlEditor;
    //like this we force the editor getAdapter contentOutline part
    //to return false, and therefore the contentoutline will get a value of
    //null that results in "an outline in not available" in the outline view
    if(getActiveEditor() != xmlEditor)) {
        return false;
    }
    return true;
}

如何应用解决方案

为了应用解决方案,您需要修改 pageChange 方法,并引入一种以编程方式刷新大纲视图并适当调用它的方法。

public void refreshOutlineView() {
    //get the activePage
    IWorkbenchPage wp =  PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    //Find desired view by its visual ID
    IViewPart myView=wp.findView("org.eclipse.ui.views.ContentOutline");

    //Hide the view :
    wp.hideView(myView);
    try {
      //show the view again     
      PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("org.eclipse.ui.views.ContentOutline");
    } catch (PartInitException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}

@Override
protected void pageChange(int pageIndex) {
    refreshOutlineView();
    ....
    ....
    ....
}

解决方案的作用/它是如何做的

编辑器初始化时初始化编辑器的大纲视图(例如,当您使用编辑器打开文件时)。在此之后,它被检索并且由于缓存而不会改变。现在,这个解决方法的作用是以编程方式关闭大纲视图(以便强制进行初始化调用)。当进行此调用时,我们可以初始化并显示我们偏好的大纲视图。


右键单击gif - 在新标签页中打开以查看


Gif demonstrating the solution