Eclipse 插件 - 以编程方式从模板创建文件

Eclipse plugin - Programatically create file from template

我有一个模板 org.eclipse.jface.text.templates.Template:

Template template = new Template(name, description, contextTypeId, pattern, true);

或更好的 org.eclipse.cdt.core.model.Template:

Template template = new Template(templateString);

或者假设模板已经在首选项 -> C/C++ -> 代码样式 -> 代码模板中,我可以直接从那里获取它。

现在我想像您在向导中那样以编程方式从中创建一个文件:

    IFile mainTestFile = testFolder.getFile(resource.getName() + ".myfile");
    if (!mainTestFile.exists()) {
        mainTestFile.create(template, true, null);
    }

遗憾的是,它仅适用于 InputStream,不适用于模板。

那么我如何从我拥有的模板中以编程方式在 eclipse 项目中创建文件?

好吧,我这样做的方式可能看起来有点违反直觉,但它奏效了:

首先您需要一个 class 来扩展 CDT NewSourceFileCreationWizardPage。然后重载 createFile 方法以使用您自己定义的 org.eclipse.jface.text.templates.Template。模板代码将存储在一个字符串中,可以从资源文件中获取。

        Template myTemplate = new Template("My Template", "My Template for file", "com.my.template.contenttype.contenttype_context", templateString, true);

        MyNewFileWizardPage myTemplateWizard = new MyNewFileWizardPage ();

        mainTestFile = myTemplateWizard.createMyFile(myTemplate, mainTestFile.getLocation(), null);

以及自定义新建文件向导页面:

class MyNewFileWizardPage extends NewSourceFileCreationWizardPage{

   private ITranslationUnit fNewFileTU = null;

   @SuppressWarnings("restriction")
   public IFile createMyFile(Template template, IPath filePath, IProgressMonitor monitor) throws CoreException {
    if (filePath != null) {
        if (monitor == null)
            monitor = new NullProgressMonitor();
        try {
            fNewFileTU = null;
            IFile newFile = NewSourceFileGenerator.createSourceFile(filePath, true, monitor);
            if (newFile != null) {
                fNewFileTU = (ITranslationUnit) CoreModel.getDefault().create(newFile);
                if (fNewFileTU != null) {
                    String lineDelimiter = StubUtility.getLineDelimiterUsed(fNewFileTU);
                    String content = CodeGeneration.getBodyFileContent(template, fNewFileTU, null, null, lineDelimiter);
                    if (content != null) {
                        fNewFileTU.getBuffer().setContents(content.toCharArray());
                        fNewFileTU.save(monitor, true);
                        return newFile;
                    }
                }
            }
        } finally {
            monitor.done();
        }
    }
    return null;
  }
}

然后您可以使用创建的 IFile 进一步修改它,如果您想要更改其中的任何内容。