package org.netbeans.gradle.project.properties.ui; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Objects; import javax.swing.DefaultComboBoxModel; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.api.java.platform.JavaPlatformManager; import org.netbeans.gradle.project.api.config.ActiveSettingsQuery; import org.netbeans.gradle.project.api.config.PropertyReference; import org.netbeans.gradle.project.api.config.ui.ProfileEditor; import org.netbeans.gradle.project.api.config.ui.ProfileEditorFactory; import org.netbeans.gradle.project.api.config.ui.ProfileInfo; import org.netbeans.gradle.project.api.config.ui.StoredSettings; import org.netbeans.gradle.project.properties.PlatformSelectionMode; import org.netbeans.gradle.project.properties.ScriptPlatform; import org.netbeans.gradle.project.properties.global.CommonGlobalSettings; import org.netbeans.gradle.project.properties.global.GlobalSettingsPage; import org.netbeans.gradle.project.util.NbFileUtils; @SuppressWarnings("serial") public class ScriptAndTasksPanel extends javax.swing.JPanel implements ProfileEditorFactory { private static final URL HELP_URL = NbFileUtils.getSafeURL("https://github.com/kelemen/netbeans-gradle-project/wiki/Script-and-Tasks"); public ScriptAndTasksPanel() { initComponents(); } public static GlobalSettingsPage createSettingsPage() { GlobalSettingsPage.Builder result = new GlobalSettingsPage.Builder(new ScriptAndTasksPanel()); result.setHelpUrl(HELP_URL); return result.create(); } private void fillPlatformCombo() { JavaPlatform[] platforms = JavaPlatformManager.getDefault().getInstalledPlatforms(); JavaPlatformItem[] comboItems = new JavaPlatformItem[platforms.length]; for (int i = 0; i < platforms.length; i++) { comboItems[i] = new JavaPlatformItem(platforms[i]); } jJdkCombo.setModel(new DefaultComboBoxModel<>(comboItems)); } private static String argListToText(List<String> args) { if (args == null || args.isEmpty()) { return ""; } StringBuilder result = new StringBuilder(256); for (String arg: args) { result.append(arg); result.append('\n'); } return result.toString(); } private static List<String> textToArgsList(String str) { try { return textToArgsListUnsafe(str); } catch (IOException ex) { throw new RuntimeException(ex); } } private static List<String> textToArgsListUnsafe(String str) throws IOException { List<String> result = new ArrayList<>(); BufferedReader reader = new BufferedReader(new StringReader(str)); for (String line = reader.readLine(); line != null; line = reader.readLine()) { if (!line.trim().isEmpty()) { result.add(line); } } return result; } @Override public ProfileEditor startEditingProfile(ProfileInfo profileInfo, ActiveSettingsQuery profileQuery) { return new PropertyRefs(profileQuery); } private void displayGradleArgs(List<String> args) { jGradleArgs.setText(argListToText(args)); } private void displayGradleJvmArgs(List<String> jvmArgs) { jGradleJVMArgs.setText(argListToText(jvmArgs)); } private void displayScriptPlatform(ScriptPlatform jdk) { fillPlatformCombo(); if (jdk != null) { jJdkCombo.setSelectedItem(new JavaPlatformItem(jdk.getJavaPlatform())); } } private ScriptPlatform getScriptJdk() { JavaPlatform result = getJdk(); return result != null ? new ScriptPlatform(result, PlatformSelectionMode.BY_LOCATION) : null; } private JavaPlatform getJdk() { @SuppressWarnings("unchecked") JavaPlatformItem selected = (JavaPlatformItem)jJdkCombo.getSelectedItem(); return selected != null ? selected.getPlatform() : JavaPlatform.getDefault(); } private String getGradleArgs() { String result = jGradleArgs.getText(); return result != null ? result.trim() : ""; } private String getGradleJvmArgs() { String result = jGradleJVMArgs.getText(); return result != null ? result.trim() : ""; } private static class JavaPlatformItem { private final JavaPlatform platform; public JavaPlatformItem(JavaPlatform platform) { ExceptionHelper.checkNotNullArgument(platform, "platform"); this.platform = platform; } public JavaPlatform getPlatform() { return platform; } @Override public String toString() { return platform.getDisplayName(); } @Override public int hashCode() { int hash = 7; hash = 23 * hash + this.platform.hashCode(); return hash; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final JavaPlatformItem other = (JavaPlatformItem)obj; return Objects.equals(this.platform, other.platform); } } private final class PropertyRefs implements ProfileEditor { private final PropertyReference<ScriptPlatform> defaultJdkRef; private final PropertyReference<List<String>> gradleArgsRef; private final PropertyReference<List<String>> gradleJvmArgsRef; public PropertyRefs(ActiveSettingsQuery settingsQuery) { defaultJdkRef = CommonGlobalSettings.defaultJdk(settingsQuery); gradleArgsRef = CommonGlobalSettings.gradleArgs(settingsQuery); gradleJvmArgsRef = CommonGlobalSettings.gradleJvmArgs(settingsQuery); } @Override public StoredSettings readFromSettings() { return new StoredSettingsImpl(this); } @Override public StoredSettings readFromGui() { return new StoredSettingsImpl(this, ScriptAndTasksPanel.this); } } private class StoredSettingsImpl implements StoredSettings { private final PropertyRefs properties; private final ScriptPlatform defaultJdk; private final List<String> gradleArgs; private final List<String> gradleJvmArgs; public StoredSettingsImpl(PropertyRefs properties) { this.properties = properties; this.defaultJdk = properties.defaultJdkRef.tryGetValueWithoutFallback(); this.gradleArgs = properties.gradleArgsRef.tryGetValueWithoutFallback(); this.gradleJvmArgs = properties.gradleJvmArgsRef.tryGetValueWithoutFallback(); } public StoredSettingsImpl(PropertyRefs properties, ScriptAndTasksPanel panel) { this.properties = properties; this.defaultJdk = panel.getScriptJdk(); this.gradleArgs = textToArgsList(panel.getGradleArgs()); this.gradleJvmArgs = textToArgsList(panel.getGradleJvmArgs()); } @Override public void displaySettings() { displayGradleArgs(gradleArgs); displayGradleJvmArgs(gradleJvmArgs); displayScriptPlatform(defaultJdk != null ? defaultJdk : properties.defaultJdkRef.getActiveValue()); } @Override public void saveSettings() { properties.defaultJdkRef.setValue(defaultJdk); properties.gradleArgsRef.setValue(gradleArgs); properties.gradleJvmArgsRef.setValue(gradleJvmArgs); } } /** * 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() { jScrollPane1 = new javax.swing.JScrollPane(); jGradleJVMArgs = new javax.swing.JTextArea(); jGradleVMArgsCaption = new javax.swing.JLabel(); jJdkCombo = new javax.swing.JComboBox<>(); jGradleJdkCaption = new javax.swing.JLabel(); jGradleArgsCaption = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); jGradleArgs = new javax.swing.JTextArea(); jGradleJVMArgs.setColumns(20); jGradleJVMArgs.setRows(3); jScrollPane1.setViewportView(jGradleJVMArgs); org.openide.awt.Mnemonics.setLocalizedText(jGradleVMArgsCaption, org.openide.util.NbBundle.getMessage(ScriptAndTasksPanel.class, "ScriptAndTasksPanel.jGradleVMArgsCaption.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jGradleJdkCaption, org.openide.util.NbBundle.getMessage(ScriptAndTasksPanel.class, "ScriptAndTasksPanel.jGradleJdkCaption.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jGradleArgsCaption, org.openide.util.NbBundle.getMessage(ScriptAndTasksPanel.class, "ScriptAndTasksPanel.jGradleArgsCaption.text")); // NOI18N jGradleArgs.setColumns(20); jGradleArgs.setRows(3); jScrollPane2.setViewportView(jGradleArgs); 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(jJdkCombo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jGradleJdkCaption) .addComponent(jGradleVMArgsCaption) .addComponent(jGradleArgsCaption)) .addGap(0, 65, Short.MAX_VALUE)) .addComponent(jScrollPane2)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jGradleJdkCaption) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jJdkCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jGradleArgsCaption) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jGradleVMArgsCaption, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, 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.JTextArea jGradleArgs; private javax.swing.JLabel jGradleArgsCaption; private javax.swing.JTextArea jGradleJVMArgs; private javax.swing.JLabel jGradleJdkCaption; private javax.swing.JLabel jGradleVMArgsCaption; private javax.swing.JComboBox<JavaPlatformItem> jJdkCombo; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; // End of variables declaration//GEN-END:variables }