package org.netbeans.gradle.project.filesupport; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.ChangeListener; import org.jtrim.property.PropertyFactory; import org.jtrim.property.PropertySource; import org.jtrim.utils.ExceptionHelper; import org.netbeans.gradle.project.newproject.NewProjectStrings; import org.netbeans.gradle.project.script.GroovyScripts; import org.netbeans.gradle.project.util.NbFileUtils; import org.netbeans.gradle.project.validate.BackgroundValidator; import org.netbeans.gradle.project.validate.Problem; import org.netbeans.gradle.project.validate.Validator; import org.openide.filesystems.FileObject; import org.openide.loaders.TemplateWizard; import static org.netbeans.gradle.project.validate.Validators.*; @SuppressWarnings("serial") class GradleTemplateWizardPanel extends javax.swing.JPanel { private static final Logger LOGGER = Logger.getLogger(GradleTemplateWizardPanel.class.getName()); private final TemplateWizard wizard; private final AtomicBoolean started; private final BackgroundValidator bckgValidator; private final Path targetDir; private final PropertySource<String> fileNameStr; public GradleTemplateWizardPanel(TemplateWizard wizard) { ExceptionHelper.checkNotNullArgument(wizard, "wizard"); this.started = new AtomicBoolean(false); this.wizard = wizard; this.bckgValidator = new BackgroundValidator(); this.targetDir = NbFileUtils.asPath(getTargetDirObj(wizard)); initComponents(); this.jDestDirEdit.setText(getDisplayNameOfTargetDir(targetDir)); this.fileNameStr = trimmedText(jFileNameEdit); this.fileNameStr.addChangeListener(new Runnable() { @Override public void run() { updateDestFileEdit(); } }); updateDestFileEdit(); } private void updateDestFileEdit() { jDestFileEdit.setText(getResultFilePath().toString()); } private static String getDisplayNameOfTargetDir(Path targetDir) { return targetDir != null ? targetDir.toString() : ""; } private static FileObject getTargetDirObj(TemplateWizard wizard) { try { return wizard.getTargetFolder().getPrimaryFile(); } catch (IOException ex) { LOGGER.log(Level.INFO, "Failed to get target folder.", ex); return null; } } public void startValidation() { if (!started.compareAndSet(false, true)) { return; } Validator<String> emptyNameValidator = createNonEmptyValidator( Problem.Level.SEVERE, NewProjectStrings.getFileNameRequired()); bckgValidator.addValidator(emptyNameValidator, fileNameStr); Validator<String> fileNameValidator = createFileNameWithExtensionValidator( Problem.Level.SEVERE, NewProjectStrings.getInvalidFileName()); bckgValidator.addValidator(fileNameValidator, fileNameStr); Validator<Object> hasTargetDirValidator = new Validator<Object>() { @Override public Problem validateInput(Object inputType) { if (inputType != null) { return null; } return Problem.severe(NewProjectStrings.getTargetFolderNotAvailable()); } }; bckgValidator.addValidator(hasTargetDirValidator, PropertyFactory.constSource(targetDir)); connectWizardDescriptorToProblems(bckgValidator, wizard); } private static String toGradleFileName(String rawFileName) { String ext = GroovyScripts.EXTENSION; if (rawFileName.toLowerCase(Locale.ROOT).endsWith(ext)) { return rawFileName.substring(0, rawFileName.length() - ext.length()) + ext; } else if (rawFileName.endsWith(".")) { return rawFileName + GroovyScripts.EXTENSION_WITHOUT_DOT; } else { return rawFileName + ext; } } private Path getResultFilePath() { String fileName = toGradleFileName(fileNameStr.getValue()); return targetDir != null ? targetDir.resolve(fileName) : Paths.get(fileName); } public GradleTemplateWizardConfig getConfig() { return new GradleTemplateWizardConfig(getResultFilePath()); } public boolean containsValidData() { return bckgValidator.isValid(); } public void addChangeListener(ChangeListener listener) { bckgValidator.currentProblemForSwing().addChangeListener(listener); } public void removeChangeListener(ChangeListener listener) { bckgValidator.currentProblemForSwing().removeChangeListener(listener); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jFileNameLabel = new javax.swing.JLabel(); jFileNameEdit = new javax.swing.JTextField(); jDestDirLabel = new javax.swing.JLabel(); jDestDirEdit = new javax.swing.JTextField(); jSeparator1 = new javax.swing.JSeparator(); jDestFileLabel = new javax.swing.JLabel(); jDestFileEdit = new javax.swing.JTextField(); org.openide.awt.Mnemonics.setLocalizedText(jFileNameLabel, org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jFileNameLabel.text")); // NOI18N jFileNameEdit.setText(org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jFileNameEdit.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jDestDirLabel, org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jDestDirLabel.text")); // NOI18N jDestDirEdit.setEditable(false); jDestDirEdit.setText(org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jDestDirEdit.text")); // NOI18N jDestDirEdit.setEnabled(false); org.openide.awt.Mnemonics.setLocalizedText(jDestFileLabel, org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jDestFileLabel.text")); // NOI18N jDestFileEdit.setEditable(false); jDestFileEdit.setText(org.openide.util.NbBundle.getMessage(GradleTemplateWizardPanel.class, "GradleTemplateWizardPanel.jDestFileEdit.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jFileNameEdit) .addComponent(jDestDirEdit) .addComponent(jSeparator1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jDestDirLabel) .addComponent(jFileNameLabel) .addComponent(jDestFileLabel)) .addGap(0, 273, Short.MAX_VALUE)) .addComponent(jDestFileEdit)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jDestDirLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jDestDirEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jFileNameLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jFileNameEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jDestFileLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jDestFileEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField jDestDirEdit; private javax.swing.JLabel jDestDirLabel; private javax.swing.JTextField jDestFileEdit; private javax.swing.JLabel jDestFileLabel; private javax.swing.JTextField jFileNameEdit; private javax.swing.JLabel jFileNameLabel; private javax.swing.JSeparator jSeparator1; // End of variables declaration//GEN-END:variables }