package org.dylanfoundry.deft.actions;
import com.intellij.ide.fileTemplates.*;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.util.IncorrectOperationException;
import org.dylanfoundry.deft.DeftBundle;
import org.dylanfoundry.deft.DeftIcons;
import javax.swing.*;
import java.util.Properties;
public class DeftTemplatesFactory implements FileTemplateGroupDescriptorFactory {
public static final String NEW_LID_FILE_NAME = "LID File.lid";
public static final String NEW_DYLAN_FILE_NAME = "Dylan File.dylan";
public static final String NEW_INTR_FILE_NAME = "Melange Interface File.intr";
public static final Pair[] DEFT_TEMPLATES = {
new Pair<String, Icon>(NEW_LID_FILE_NAME, DeftIcons.LID_FILE),
new Pair<String, Icon>(NEW_DYLAN_FILE_NAME, DeftIcons.DYLAN_FILE),
new Pair<String, Icon>(NEW_INTR_FILE_NAME, DeftIcons.MELANGE_INTERFACE_FILE)
};
public static final String NAME_TEMPLATE_PROPERTY = "NAME";
@Override
public FileTemplateGroupDescriptor getFileTemplatesDescriptor() {
FileTemplateGroupDescriptor group =
new FileTemplateGroupDescriptor(DeftBundle.message("file.template.group.title"),
DeftIcons.DYLAN_FILE);
for (Pair<String, Icon> p : DEFT_TEMPLATES) {
group.addTemplate(new FileTemplateDescriptor(p.getFirst(), p.getSecond()));
}
return group;
}
public static PsiFile createFromTemplate(final PsiDirectory directory,
final String name,
String fileName,
FileType fileType,
String templateName,
String... parameters) throws IncorrectOperationException {
final FileTemplate template = FileTemplateManager.getInstance().getTemplate(templateName);
Properties properties = new Properties(FileTemplateManager.getInstance().getDefaultProperties());
properties.setProperty(NAME_TEMPLATE_PROPERTY, name);
JavaTemplateUtil.setPackageNameAttribute(properties, directory);
for (int i = 0; i < parameters.length; i += 2) {
properties.setProperty(parameters[i], parameters[i+1]);
}
String text;
try {
text = template.getText(properties);
} catch (Exception e) {
throw new RuntimeException("Unable to load template " +
FileTemplateManager.getInstance().internalTemplateToSubject(templateName),
e);
}
final PsiFileFactory factory = PsiFileFactory.getInstance(directory.getProject());
final PsiFile file = factory.createFileFromText(fileName, fileType, text);
return (PsiFile) directory.add(file);
}
}