package org.netbeans.gradle.project.properties.ui; import java.net.URL; import java.util.concurrent.TimeUnit; import javax.swing.SpinnerNumberModel; 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.global.CommonGlobalSettings; import org.netbeans.gradle.project.properties.global.GlobalSettingsPage; import org.netbeans.gradle.project.util.NbFileUtils; import static org.jtrim.property.BoolProperties.*; import static org.jtrim.property.swing.AutoDisplayState.*; import static org.jtrim.property.swing.SwingProperties.*; @SuppressWarnings("serial") public class GradleDaemonPanel extends javax.swing.JPanel implements ProfileEditorFactory { private static final URL HELP_URL = NbFileUtils.getSafeURL("https://github.com/kelemen/netbeans-gradle-project/wiki/Gradle-Daemon"); private static final int DEFAULT_TIMEOUT_SEC = longToInt(TimeUnit.HOURS.toSeconds(3)); private static final TimeUnit DISPLAY_UNIT = TimeUnit.MINUTES; public GradleDaemonPanel() { initComponents(); jDaemonTimeoutSpinner.setModel(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 30)); setupEnableDisable(); } public static GlobalSettingsPage createSettingsPage() { GlobalSettingsPage.Builder result = new GlobalSettingsPage.Builder(new GradleDaemonPanel()); result.setHelpUrl(HELP_URL); return result.create(); } private void setupEnableDisable() { addSwingStateListener(not(buttonSelected(jUseDefaultDaemonTimeoutCheck)), componentDisabler(jDaemonTimeoutSpinner)); } private int getDisplayedTimeout(PropertyRefs properties, Integer seconds) { if (seconds != null) { return seconds; } Integer active = properties.gradleDaemonTimeoutSecRef.getActiveValue(); return active != null ? active : DEFAULT_TIMEOUT_SEC; } private void displayDaemonTimeout(PropertyRefs properties, Integer seconds) { jUseDefaultDaemonTimeoutCheck.setSelected(seconds == null); int displayTimeoutSec = getDisplayedTimeout(properties, seconds); jDaemonTimeoutSpinner.setValue(longToInt(DISPLAY_UNIT.convert(displayTimeoutSec, TimeUnit.SECONDS))); } @Override public ProfileEditor startEditingProfile(ProfileInfo profileInfo, ActiveSettingsQuery profileQuery) { return new PropertyRefs(profileQuery); } private static int longToInt(long value) { if (value >= (long)Integer.MAX_VALUE) return Integer.MAX_VALUE; if (value <= (long)Integer.MIN_VALUE) return Integer.MIN_VALUE; return (int)value; } private Integer getDaemonTimeoutInSec(PropertyRefs properties) { if (jUseDefaultDaemonTimeoutCheck.isSelected()) { return null; } Object value = jDaemonTimeoutSpinner.getValue(); int displayTimeout = -1; if (value instanceof Number) { displayTimeout = ((Number)value).intValue(); } return displayTimeout >= 0 ? longToInt(DISPLAY_UNIT.toSeconds(displayTimeout)) : properties.gradleDaemonTimeoutSecRef.tryGetValueWithoutFallback(); } private final class PropertyRefs implements ProfileEditor { private final PropertyReference<Integer> gradleDaemonTimeoutSecRef; public PropertyRefs(ActiveSettingsQuery settingsQuery) { gradleDaemonTimeoutSecRef = CommonGlobalSettings.gradleDaemonTimeoutSec(settingsQuery); } @Override public StoredSettings readFromSettings() { return new StoredSettingsImpl(this); } @Override public StoredSettings readFromGui() { return new StoredSettingsImpl(this, GradleDaemonPanel.this); } } private class StoredSettingsImpl implements StoredSettings { private final PropertyRefs properties; private final Integer gradleDaemonTimeoutSec; public StoredSettingsImpl(PropertyRefs properties) { this.properties = properties; this.gradleDaemonTimeoutSec = properties.gradleDaemonTimeoutSecRef.tryGetValueWithoutFallback(); } public StoredSettingsImpl(PropertyRefs properties, GradleDaemonPanel panel) { this.properties = properties; this.gradleDaemonTimeoutSec = panel.getDaemonTimeoutInSec(properties); } @Override public void displaySettings() { displayDaemonTimeout(properties, gradleDaemonTimeoutSec); } @Override public void saveSettings() { properties.gradleDaemonTimeoutSecRef.setValue(gradleDaemonTimeoutSec); } } /** * 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() { jDaemonTimeoutCaption = new javax.swing.JLabel(); jDaemonTimeoutSpinner = new javax.swing.JSpinner(); jUseDefaultDaemonTimeoutCheck = new javax.swing.JCheckBox(); org.openide.awt.Mnemonics.setLocalizedText(jDaemonTimeoutCaption, org.openide.util.NbBundle.getMessage(GradleDaemonPanel.class, "GradleDaemonPanel.jDaemonTimeoutCaption.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jUseDefaultDaemonTimeoutCheck, org.openide.util.NbBundle.getMessage(GradleDaemonPanel.class, "GradleDaemonPanel.jUseDefaultDaemonTimeoutCheck.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() .addComponent(jDaemonTimeoutCaption) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jDaemonTimeoutSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jUseDefaultDaemonTimeoutCheck) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jDaemonTimeoutCaption) .addComponent(jDaemonTimeoutSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jUseDefaultDaemonTimeoutCheck)) .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.JLabel jDaemonTimeoutCaption; private javax.swing.JSpinner jDaemonTimeoutSpinner; private javax.swing.JCheckBox jUseDefaultDaemonTimeoutCheck; // End of variables declaration//GEN-END:variables }