package com.compomics.software.dialogs;
import com.compomics.util.gui.error_handlers.HelpDialog;
import com.compomics.util.preferences.UtilitiesUserPreferences;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
* A dialog for changing the Java Home.
*
* @author Harald Barsnes
*/
public class JavaHomeDialog extends javax.swing.JDialog {
/**
* Reference to the JavaHomeOrMemoryDialogParent.
*/
private JavaHomeOrMemoryDialogParent javaHomeOrMemoryDialogParent;
/**
* A reference to the Welcome Dialog.
*/
private JDialog welcomeDialog;
/**
* The name of the tool, e.g., PeptideShaker.
*/
private String toolName;
/**
* Creates a new JavaHomeDialog.
*
* @param parent the parent of the dialog
* @param javaHomeOrMemoryDialogParent reference to the
* JavaHomeOrMemoryDialogParent
* @param welcomeDialog reference to the Welcome Dialog, can be null
* @param toolName the name of the tool, e.g., PeptideShaker
*/
public JavaHomeDialog(JFrame parent, JavaHomeOrMemoryDialogParent javaHomeOrMemoryDialogParent, JDialog welcomeDialog, String toolName) {
super(parent, true);
this.javaHomeOrMemoryDialogParent = javaHomeOrMemoryDialogParent;
this.welcomeDialog = welcomeDialog;
this.toolName = toolName;
initComponents();
String javaHome = System.getProperty("java.home") + File.separator + "bin" + File.separator;
javaHomeTxt.setText(javaHome);
if (parent.isVisible()) {
setLocationRelativeTo(parent);
} else {
setLocationRelativeTo(null);
}
setVisible(true);
}
/**
* Validates the input of the user.
*
* @return a boolean indicating whether the input of the user is correct
*/
private boolean validateInput() {
boolean error = false;
try {
ArrayList process_name_array = new ArrayList();
String tempJavaHome = javaHomeTxt.getText();
if (!tempJavaHome.endsWith(File.separator)) {
tempJavaHome += File.separator;
}
process_name_array.add(tempJavaHome + "java");
process_name_array.add("-version");
ProcessBuilder pb = new ProcessBuilder(process_name_array);
pb.directory(new File(tempJavaHome));
Process p = pb.start();
InputStream stderr = p.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String errorMessage = "";
if (br.ready()) {
String line = br.readLine();
while (line != null) {
errorMessage += line + "\n";
line = br.readLine();
error = true;
}
}
br.close();
isr.close();
stderr.close();
if (error) {
System.out.println("Java startup error: " + errorMessage);
JOptionPane.showMessageDialog(null, "Error starting Java. Please check the Java Home folder.",
"Java Error", JOptionPane.WARNING_MESSAGE);
} else {
p.destroy();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error starting Java. Please check the Java Home folder.",
"Java Error", JOptionPane.WARNING_MESSAGE);
e.printStackTrace();
return false;
}
return true;
}
/**
* 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() {
backgroundPanel = new javax.swing.JPanel();
cancelButton = new javax.swing.JButton();
okButton = new javax.swing.JButton();
javaHomeHelpJButton = new javax.swing.JButton();
javaHomeLabel = new javax.swing.JLabel();
javaHomeTxt = new javax.swing.JTextField();
jSeparator1 = new javax.swing.JSeparator();
browseButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Java Memory Settings");
setResizable(false);
backgroundPanel.setBackground(new java.awt.Color(230, 230, 230));
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
okButton.setText("OK");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
javaHomeHelpJButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/help.GIF"))); // NOI18N
javaHomeHelpJButton.setToolTipText("Help");
javaHomeHelpJButton.setBorder(null);
javaHomeHelpJButton.setBorderPainted(false);
javaHomeHelpJButton.setContentAreaFilled(false);
javaHomeHelpJButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
javaHomeHelpJButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
javaHomeHelpJButtonMouseExited(evt);
}
});
javaHomeHelpJButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
javaHomeHelpJButtonActionPerformed(evt);
}
});
javaHomeLabel.setText("Java Home");
javaHomeTxt.setEditable(false);
javaHomeTxt.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
javaHomeTxtKeyReleased(evt);
}
});
browseButton.setText("Browse");
browseButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout backgroundPanelLayout = new javax.swing.GroupLayout(backgroundPanel);
backgroundPanel.setLayout(backgroundPanelLayout);
backgroundPanelLayout.setHorizontalGroup(
backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSeparator1)
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(javaHomeHelpJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cancelButton))
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addComponent(javaHomeLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(javaHomeTxt, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(browseButton)))
.addContainerGap())
);
backgroundPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelButton, okButton});
backgroundPanelLayout.setVerticalGroup(
backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(javaHomeLabel)
.addComponent(javaHomeTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(browseButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cancelButton)
.addComponent(okButton))
.addComponent(javaHomeHelpJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(backgroundPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(backgroundPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* Closes the dialog without saving the changes.
*
* @param evt
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
/**
* Closes the dialog and tries to restart the tool with the new settings.
*
* @param evt
*/
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
if (validateInput()) {
String newJavaHome = javaHomeTxt.getText().trim();
String currentJavaHome = System.getProperty("java.home") + File.separator + "bin" + File.separator;
if (!newJavaHome.equalsIgnoreCase(currentJavaHome)) {
int outcome = JOptionPane.showConfirmDialog(this, toolName + " needs to restart in order to take the new settings into account. Restart now?",
"Restart Requested", JOptionPane.OK_CANCEL_OPTION);
if (outcome == JOptionPane.OK_OPTION) {
javaHomeOrMemoryDialogParent.getUtilitiesUserPreferences().setJavaHome(newJavaHome);
try {
UtilitiesUserPreferences.saveUserPreferences(javaHomeOrMemoryDialogParent.getUtilitiesUserPreferences());
} catch (Exception e) {
e.printStackTrace();
}
if (welcomeDialog != null) {
welcomeDialog.setVisible(false);
}
javaHomeOrMemoryDialogParent.restart();
}
}
dispose();
}
}//GEN-LAST:event_okButtonActionPerformed
/**
* Change the cursor to a hand cursor.
*
* @param evt
*/
private void javaHomeHelpJButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_javaHomeHelpJButtonMouseEntered
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_javaHomeHelpJButtonMouseEntered
/**
* Change the cursor back to the default cursor.
*
* @param evt
*/
private void javaHomeHelpJButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_javaHomeHelpJButtonMouseExited
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_javaHomeHelpJButtonMouseExited
/**
* Open the help dialog.
*
* @param evt
*/
private void javaHomeHelpJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javaHomeHelpJButtonActionPerformed
setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
new HelpDialog(this, getClass().getResource("/helpFiles/JavaHomeDialog.html"),
Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/help.GIF")),
Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/help.GIF")),
"Java Home - Help");
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_javaHomeHelpJButtonActionPerformed
/**
* Execute the OK button if the user clicks the Enter key.
*
* @param evt
*/
private void javaHomeTxtKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_javaHomeTxtKeyReleased
if (evt.getKeyCode() == KeyEvent.VK_ENTER
&& javaHomeTxt.getText().length() > 0) {
okButtonActionPerformed(null);
}
}//GEN-LAST:event_javaHomeTxtKeyReleased
/**
* Open a file browser for selecting the Java Home.
*
* @param evt
*/
private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
JFileChooser fileChooser = new JFileChooser(javaHomeTxt.getText());
fileChooser.setDialogTitle("Select Java Home");
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setMultiSelectionEnabled(true);
int returnVal = fileChooser.showDialog(this, "Select");
if (returnVal == JFileChooser.APPROVE_OPTION) {
String selectedDir = fileChooser.getSelectedFile().getAbsolutePath();
if (!selectedDir.endsWith(File.separator)) {
selectedDir += File.separator;
}
javaHomeTxt.setText(selectedDir);
validateInput();
}
}//GEN-LAST:event_browseButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel backgroundPanel;
private javax.swing.JButton browseButton;
private javax.swing.JButton cancelButton;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JButton javaHomeHelpJButton;
private javax.swing.JLabel javaHomeLabel;
private javax.swing.JTextField javaHomeTxt;
private javax.swing.JButton okButton;
// End of variables declaration//GEN-END:variables
}