// Copyright © 2010, Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
package net.orfjackal.sbt.plugin.settings;
import com.intellij.execution.ui.AlternativeJREPanel;
import com.intellij.openapi.util.io.FileUtil;
import net.miginfocom.swing.MigLayout;
import net.orfjackal.sbt.plugin.IO;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.event.*;
import java.io.File;
public class SbtSettingsForm {
// org.jetbrains.idea.maven.project.MavenImportingSettingsForm
private final JPanel root;
private final JTextField applicationSbtLauncherJarPath = new JTextField();
private final JTextField applicationVmParameters = new JTextField();
private final JCheckBox useApplicationSettings = new JCheckBox();
private final JTextField projectSbtLauncherJarPath = new JTextField();
private final JTextField projectVmParameters = new JTextField();
private JLabel projectSbtLauncherLabel = new JLabel("SBT launcher JAR file (sbt-launch.jar)");
private JLabel projectVmParametersLabel = new JLabel("VM parameters");
private AlternativeJREPanel jreChooser = new AlternativeJREPanel();
public SbtSettingsForm() {
JPanel projectSettings = new JPanel(new MigLayout("", "[grow]", "[nogrid]"));
projectSettings.setBorder(BorderFactory.createTitledBorder("Project Settings"));
{
useApplicationSettings.setText("Use IDE Settings");
useApplicationSettings.setMnemonic('U');
useApplicationSettings.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
enableOrDisableProjectSettings();
}
});
projectSettings.add(useApplicationSettings, "wrap");
}
{
projectSbtLauncherLabel.setDisplayedMnemonic('C');
projectSbtLauncherLabel.setLabelFor(projectSbtLauncherJarPath);
JButton browse = new JButton("...");
browse.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
browseForSbtLauncherJar(SbtSettingsForm.this.projectSbtLauncherJarPath);
}
});
projectSettings.add(projectSbtLauncherLabel, "wrap");
projectSettings.add(projectSbtLauncherJarPath, "growx");
projectSettings.add(browse, "wrap");
}
{
projectVmParametersLabel.setDisplayedMnemonic('M');
projectVmParametersLabel.setLabelFor(projectVmParameters);
projectSettings.add(projectVmParametersLabel, "wrap");
projectSettings.add(projectVmParameters, "growx");
}
JPanel ideSettings = new JPanel(new MigLayout("", "[grow]", "[nogrid]"));
ideSettings.setBorder(BorderFactory.createTitledBorder("IDE Settings"));
{
JLabel label = new JLabel("SBT launcher JAR file (sbt-launch.jar). Leave blank to use the bundled launcher.");
label.setDisplayedMnemonic('L');
label.setLabelFor(applicationSbtLauncherJarPath);
label.setToolTipText("When using the bundled launcher, ./project/build.properties should contain the desired SBT version, e.g. sbt.version=0.12.0");
JButton browse = new JButton("...");
browse.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
browseForSbtLauncherJar(SbtSettingsForm.this.applicationSbtLauncherJarPath);
}
});
ideSettings.add(label, "wrap");
ideSettings.add(applicationSbtLauncherJarPath, "growx");
ideSettings.add(browse, "wrap");
}
{
JLabel label = new JLabel("VM parameters");
label.setDisplayedMnemonic('V');
label.setLabelFor(applicationVmParameters);
ideSettings.add(label, "wrap");
ideSettings.add(applicationVmParameters, "wrap, growx");
ideSettings.add(jreChooser, "growx");
}
root = new JPanel(new MigLayout("wrap 1", "[grow]"));
root.add(projectSettings, "grow");
root.add(ideSettings, "grow");
enableOrDisableProjectSettings();
}
private void enableOrDisableProjectSettings() {
boolean enable = !useApplicationSettings.isSelected();
projectSbtLauncherLabel.setEnabled(enable);
projectSbtLauncherJarPath.setEnabled(enable);
projectVmParameters.setEnabled(enable);
projectVmParametersLabel.setEnabled(enable);
}
private void browseForSbtLauncherJar(JTextField launcherJarTextField) {
JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(new FileFilter() {
public boolean accept(File file) {
return file.isDirectory() ||
file.getName().toLowerCase().endsWith(".jar");
}
public String getDescription() {
return "JAR files (*.jar)";
}
});
File oldValue = new File(launcherJarTextField.getText());
chooser.setCurrentDirectory(oldValue);
chooser.setSelectedFile(oldValue);
int result = chooser.showOpenDialog(root);
if (result == JFileChooser.APPROVE_OPTION) {
launcherJarTextField.setText(chooser.getSelectedFile().getAbsolutePath());
}
}
public JComponent createComponent() {
return root;
}
public boolean isModified(SbtProjectSettings projectSettings, SbtApplicationSettings applicationSettings) {
SbtProjectSettings currentProj = new SbtProjectSettings();
SbtApplicationSettings currentApp = new SbtApplicationSettings();
copyTo(currentProj, currentApp);
return !currentProj.equals(projectSettings) ||
!currentApp.equals(applicationSettings);
}
public void copyTo(SbtProjectSettings projectSettings, SbtApplicationSettings applicationSettings) {
projectSettings.setUseApplicationSettings(useApplicationSettings.isSelected());
if (projectSbtLauncherJarPath.getText().length() == 0) {
projectSettings.setSbtLauncherJarPath("");
} else {
projectSettings.setSbtLauncherJarPath(FileUtil.toSystemIndependentName(projectSbtLauncherJarPath.getText()));
}
projectSettings.setSbtLauncherVmParameters(projectVmParameters.getText());
if (applicationSbtLauncherJarPath.getText().length() == 0) {
applicationSettings.setSbtLauncherJarPath("");
} else {
applicationSettings.setSbtLauncherJarPath(FileUtil.toSystemIndependentName(applicationSbtLauncherJarPath.getText()));
}
applicationSettings.setSbtLauncherVmParameters(applicationVmParameters.getText());
applicationSettings.setUseCustomJdk(jreChooser.isPathEnabled());
applicationSettings.setJdkHome(jreChooser.getPath());
enableOrDisableProjectSettings();
}
public void copyFrom(SbtProjectSettings projectSettings, SbtApplicationSettings applicationSettings) {
if (projectSettings.getSbtLauncherJarPath().length() == 0) {
projectSbtLauncherJarPath.setText("");
} else {
projectSbtLauncherJarPath.setText(FileUtil.toSystemDependentName(IO.absolutePath(projectSettings.getSbtLauncherJarPath())));
}
projectVmParameters.setText(projectSettings.getSbtLauncherVmParameters());
useApplicationSettings.setSelected(projectSettings.isUseApplicationSettings());
if (applicationSettings.getSbtLauncherJarPath().length() == 0) {
applicationSbtLauncherJarPath.setText("");
} else {
applicationSbtLauncherJarPath.setText(FileUtil.toSystemDependentName(IO.absolutePath(applicationSettings.getSbtLauncherJarPath())));
}
applicationVmParameters.setText(applicationSettings.getSbtLauncherVmParameters());
jreChooser.init(applicationSettings.getJdkHome(), applicationSettings.isUseCustomJdk());
}
public static void main(String[] args) {
SbtSettingsForm form = new SbtSettingsForm();
form.copyFrom(new SbtProjectSettings(), new SbtApplicationSettings());
JFrame frame = new JFrame("Test: SbtSettingsForm");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(form.createComponent());
frame.setSize(600, 600);
frame.setLocation(500, 300);
frame.setVisible(true);
}
}