为扩展的子集创建Eclipse Editor插件

时间:2016-02-16 05:53:43

标签: java eclipse-plugin eclipse-rcp

我有特殊的.xml文件,我需要通过自己的eclipse编辑器打开。所以我添加了一个自定义内容类型并与我的编辑器绑定。

这是我的Describer类。

public class TEPFileContentDescriber implements IContentDescriber {

@Override
public int describe(InputStream contents, IContentDescription description)
        throws IOException {
    try{
        XmlUtil.parseSuite(contents);
        System.out.println("VALID");
        return  IContentDescriber.VALID;
    }
    catch(Exception e){
        System.out.println("INVALID");
        return  IContentDescriber.INVALID;
    }
}

@Override
public QualifiedName[] getSupportedOptions() {
    // TODO Auto-generated method stub
    return null;
}

}

在控制台中我可以看到触发了正确的状态,但Project Explorer仍然将所有xml文件视为我的类型,因此编辑器在尝试打开时会抱怨其他文件。

1)我需要覆盖其他任何方法吗?

2)我是否也可以使用单独的文件图标,仅适用于我的内容类型?

2 个答案:

答案 0 :(得分:3)

如果XML对您的应用程序实际上是正确的,则describe方法只能返回VALID

因此,如果您的应用的XML不正确,则代码XmlUtil.parseSuite必须抛出异常。因此,例如,如果您的描述符被赋予Ant构建脚本XML,则必须拒绝它。

如果输入看起来像XML但不适合您的应用,则还应返回INDETERMINATE

您可以延长XMLContentDescriber为您完成一些工作。

例如,这是Ant插件内容描述符:

public final class AntBuildfileContentDescriber extends XMLContentDescriber {
    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));
    }

    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));
    }
}

您可以将此作为基础并更改checkCriteria来进行检查。

答案 1 :(得分:0)

日食编辑器基于文件而非基于内容 ...您可以按照答案中的说明检查文件,但文件类型由文件结尾。

该概念用于 eclipse 以及默认文件系统,例如 windows 或类似...

也许您应该引入自定义文件类型,例如myfile.tepxml

可以定义某些内容类型,它们是文件名和文件扩展名的组合,但是它们是自定义的,作为日食设置的部分和< strong>不是编辑器的一部分(锁定是从eclipse预先定义的)

enter image description here