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 进一步修改它,如果您想要更改其中的任何内容。
我有一个模板 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 进一步修改它,如果您想要更改其中的任何内容。