package org.netbeans.gradle.project.filesupport; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import java.util.Set; import javax.swing.JComponent; import javax.swing.event.ChangeListener; import org.jtrim.property.MutableProperty; import org.jtrim.property.PropertyFactory; import org.jtrim.swing.concurrent.SwingTaskExecutor; import org.netbeans.api.templates.TemplateRegistration; import org.openide.WizardDescriptor; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.TemplateWizard; @TemplateRegistration( folder=GradleTemplateConsts.FOLDER_NAME, id=GradleTemplateConsts.TEMPLATE_SCRIPT_NAME, displayName="#GradleFiles.template", iconBase="org/netbeans/gradle/project/resources/gradle.png", description="Gradle-Files.html", category=GradleTemplateConsts.CATEGORY_NAME ) public final class GradleTemplateRegistration implements WizardDescriptor.BackgroundInstantiatingIterator<WizardDescriptor> { private final List<WizardDescriptor.Panel<WizardDescriptor>> descriptors; private final MutableProperty<GradleTemplateWizardConfig> config; private int descriptorIndex; public GradleTemplateRegistration() { this.config = PropertyFactory.memPropertyConcurrent(null, true, SwingTaskExecutor.getSimpleExecutor(false)); this.descriptors = new ArrayList<>(1); this.descriptorIndex = 0; } public static FileObject getTemplateFileObj() { return GradleTemplateConsts.getTemplateFolder().getFileObject(GradleTemplateConsts.TEMPLATE_SCRIPT_NAME); } @Override public Set<FileObject> instantiate() throws IOException { GradleTemplateWizardConfig currentConfig = config.getValue(); if (currentConfig == null) { throw new IOException("Missing config."); } Path gradleFile = currentConfig.getGradleFile(); Path dir = gradleFile.getParent(); if (dir != null) { Files.createDirectories(dir); } Files.createFile(gradleFile); FileObject gradleFileObj = FileUtil.toFileObject(gradleFile.toFile()); return gradleFileObj != null ? Collections.singleton(gradleFileObj) : Collections.<FileObject>emptySet(); } @Override public void initialize(WizardDescriptor wizard) { if (!(wizard instanceof TemplateWizard)) { return; } descriptorIndex = 0; descriptors.add(new GradleTemplateWizardPanelWrapper(config, (TemplateWizard)wizard)); JComponent c = (JComponent)descriptors.get(0).getComponent(); c.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, 0); c.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, new String[] {"File name"}); c.setName("File name"); } @Override public void uninitialize(WizardDescriptor wizard) { descriptors.clear(); config.setValue(null); } @Override public WizardDescriptor.Panel<WizardDescriptor> current() { return descriptors.get(descriptorIndex); } @Override public String name() { return "GradleFileTemplate"; } @Override public boolean hasNext() { return descriptorIndex < descriptors.size() - 1; } @Override public boolean hasPrevious() { return descriptorIndex > 0; } @Override public void nextPanel() { if (!hasNext()) { throw new NoSuchElementException(); } descriptorIndex++; } @Override public void previousPanel() { if (!hasPrevious()) { throw new NoSuchElementException(); } descriptorIndex--; } @Override public void addChangeListener(ChangeListener l) { } @Override public void removeChangeListener(ChangeListener l) { } }