用于XML文件的Eclipse Project Explorer过滤器 [英] Eclipse Project Explorer filter for XML files
问题描述
我在工作台Project Explorer中有很多XML文件,每个都是十个不同的ecore模型之一的实例。对于每个ecore模型,我想为导航者的 navigatorContent
扩展点贡献一个 commonFilter
,以使用户能够显示或隐藏相应的XML文件。这些是外部工具文件,因此没有办法通过观察文件名或 xml
扩展名来标识内容,重命名是不可行的。使用可能从 org.eclipse.jface.viewers.ViewerFilter
派生的类,识别XML文件包含哪个ecore模型的最佳方式是什么?我认为有一个简单的方式来做到这一点EMF资源,或使用 EcoreUtil
或与适配器,但我还没有找到一个成功的技术。或者,直接从扩展点的 filterExpression
或查看者的 viewerContentBinding
直接执行此操作的方式将会很好。所有的 genmodel
引用的插件可用于各种ecore模型。
I have many XML files in the workbench Project Explorer, each one an instance of one of ten different ecore models. For each ecore model I would like to contribute a commonFilter
to the navigator's navigatorContent
extension point to enable the user to show or hide the corresponding XML files. These are external tool files so there is not a way to identify the content merely by observing the file name or the xml
extension, and renaming is not feasible. Using perhaps a class deriving from org.eclipse.jface.viewers.ViewerFilter
, what is the best way to identify which of the ecore models the XML file contains? I presume there is a simple way to do this with EMF resources, or with EcoreUtil
, or with adapters, but I haven't found a successful technique. Alternatively, a way to do this directly from the extension point's filterExpression
or the viewer's viewerContentBinding
would be fine. All of the genmodel
-derived plugins are available for the various ecore models.
package com.my.navigator;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
public class MyViewerFilter extends ViewerFilter {
public MyViewerFilter() {
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if ( element instanceof IFile ) {
IFile file = (IFile)element;
// check whether file is one of our ecore models...
// ...
}
return true;
}
}
推荐答案
您可以使用 org.eclipse.core.contenttype.contentTypes
为您的文件定义新的内容类型。
You could use the org.eclipse.core.contenttype.contentTypes
to define new content types for your file.
使用内容类型定义的 describeer
参数指定内容描述者类,可以检查XML文件符合您的要求。已经有一个 XMLContentDescriber
类,您可以将其用作描述器的基础。
Use the describer
argument of the content type definition to specify a 'content describer' class which can check that the XML file meets your requirements. There is already an XMLContentDescriber
class that you can use as a basis for the describer.
例如, Ant build.xml文件的内容类型定义:
For example this is the content type definition for Ant build.xml files:
<extension
point="org.eclipse.core.contenttype.contentTypes">
<content-type
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml,ant"
priority="normal">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>
</extension>
这是Ant内容描述器,可以大致了解您可以做什么:
and this is the Ant content describer to give you a rough idea of what you can:
public final class AntBuildfileContentDescriber extends XMLContentDescriber implements IExecutableExtension {
private int checkCriteria(InputSource contents) throws IOException {
AntHandler antHandler = new AntHandler();
try {
if (!antHandler.parseContents(contents)) {
return INDETERMINATE;
}
}
catch (SAXException e) {
// we may be handed any kind of contents... it is normal we fail to parse
return INDETERMINATE;
}
catch (ParserConfigurationException e) {
// some bad thing happened - force this describer to be disabled
String message = "Internal Error: XML parser configuration error during content description for Ant buildfiles"; //$NON-NLS-1$
throw new RuntimeException(message);
}
// Check to see if we matched our criteria.
if (antHandler.hasRootProjectElement()) {
if (antHandler.hasProjectDefaultAttribute() || antHandler.hasTargetElement() || antHandler.hasAntElement()) {
// project and default attribute or project and target element(s)
// or project and top level ant element(s) (classpath, import, macrodef, path, property, taskdef, typedef)
return VALID;
}
// only a top level project element...maybe an Ant buildfile
return INDETERMINATE;
}
return INDETERMINATE;
}
@Override
public int describe(InputStream contents, IContentDescription description) throws IOException {
// call the basic XML describer to do basic recognition
if (super.describe(contents, description) == INVALID) {
return INVALID;
}
// super.describe will have consumed some chars, need to rewind
contents.reset();
// Check to see if we matched our criteria.
return checkCriteria(new InputSource(contents));
}
@Override
public int describe(Reader contents, IContentDescription description) throws IOException {
// call the basic XML describer to do basic recognition
if (super.describe(contents, description) == INVALID) {
return INVALID;
}
// super.describe will have consumed some chars, need to rewind
contents.reset();
// Check to see if we matched our criteria.
return checkCriteria(new InputSource(contents));
}
@Override
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
// do nothing
}
}
这篇关于用于XML文件的Eclipse Project Explorer过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!