用于XML文件的Eclipse Project Explorer过滤器 [英] Eclipse Project Explorer filter for XML files

查看:144
本文介绍了用于XML文件的Eclipse Project Explorer过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在工作台Project Explorer中有很多XML文件,每个都是十个不同的eco​​re模型之一的实例。对于每个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆