我正在为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>
我现在如何控制大纲视图?
答案 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 - 在新标签页中打开以查看