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 }