package com.ppfold.main; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.PrintStream; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.Border; import javax.swing.text.DefaultCaret; public class PPfoldGUIMainWindow extends JFrame { MainButtonPanel exitStartButtons; PPfoldButtonGroup alignmentGroup; PPfoldButtonGroup treeGroup; PPfoldButtonGroup outputGroup; DataButtonGroup databuttons; ExportsGroup exportbuttons; SequenceExportsGroup seqexportbuttons; JTextArea textArea; CompIntensityGroup intensityArea; JProgressBar progressbar; JButton suspendbutton; JButton stopbutton; //public static ArrayList<String> dataIDs = new ArrayList<String>(); public static PrintStream ps_orig; //output stream public static PrintStream ps_orig_err; //Error stream public static String directory = null; private static final long serialVersionUID = 1L; public PPfoldGUIMainWindow(){ createAndShowGUI(); } private void createAndShowGUI(){ setTitle("PPfold version " + PPfoldMain.versionnumber); setSize(400,400); setLocation(200,10); setResizable( false ); Container contentPane = this.getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); JPanel mainpanel = new JPanel(); Border border = BorderFactory.createEmptyBorder(10,10,10,10); mainpanel.setBorder(border); outputGroup = new PPfoldButtonGroup("Output folder: ", PPfoldButtonGroup.FOLDERCHOOSER){ private static final long serialVersionUID = 1L; public void updateModel(){ if(outputGroup.getFileName().startsWith("<No file selected>")){ PPfoldMain.outputdir = null;} else{ PPfoldMain.outputdir = outputGroup.getFileName(); } } }; alignmentGroup = new PPfoldButtonGroup("Alignment file: ", PPfoldButtonGroup.FILECHOOSER){ private static final long serialVersionUID = 1L; public void updateModel(){ if(alignmentGroup.getFileName().startsWith("<No file selected>")){ PPfoldMain.alignmentfilename = null;} else{ PPfoldMain.alignmentfilename = alignmentGroup.getFileName(); if(PPfoldMain.outputdir==null){ PPfoldMain.outputdir = directory; outputGroup.setText(directory); } File alignfile = new File (PPfoldMain.alignmentfilename); String exportfilehandle = alignfile.getName(); int lastdotpos = exportfilehandle.lastIndexOf('.'); exportfilehandle = exportfilehandle.substring(0,lastdotpos); exportbuttons.setExportPrefix(exportfilehandle); } } }; alignmentGroup.setAlignmentX(Component.CENTER_ALIGNMENT); treeGroup = new PPfoldButtonGroup("Tree file: ", PPfoldButtonGroup.FILECHOOSER){ private static final long serialVersionUID = 1L; public void updateModel(){ if(treeGroup.getFileName().startsWith("<No file selected>")){ PPfoldMain.treefilename = null; PPfoldMain.createtree=true; PPfoldMain.optimizetree=true; } else{ PPfoldMain.treefilename = treeGroup.getFileName(); PPfoldMain.createtree=false; PPfoldMain.optimizetree=false; } } }; treeGroup.setAlignmentX(Component.CENTER_ALIGNMENT); mainpanel.setLayout(new BoxLayout(mainpanel, BoxLayout.PAGE_AXIS)); mainpanel.add(alignmentGroup); mainpanel.add(Box.createRigidArea(new Dimension(0, 5))); mainpanel.add(treeGroup); mainpanel.add(Box.createRigidArea(new Dimension(0, 5))); mainpanel.add(outputGroup); mainpanel.add(Box.createRigidArea(new Dimension(0, 5))); contentPane.add( mainpanel); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ PPfoldMain.userfinished = true; System.exit(0); } // Terminate the program }); databuttons = new DataButtonGroup(); databuttons.setAlignmentX(Component.CENTER_ALIGNMENT); mainpanel.add(databuttons); exportbuttons = new ExportsGroup(); mainpanel.add(exportbuttons); mainpanel.add(Box.createRigidArea(new Dimension(0,5))); seqexportbuttons = new SequenceExportsGroup(); mainpanel.add(seqexportbuttons); intensityArea = new CompIntensityGroup(); mainpanel.add(intensityArea); exitStartButtons = new MainButtonPanel(this); exitStartButtons.setBorder(border); contentPane.add( exitStartButtons); JPanel outputpanel = new JPanel(); outputpanel.setBorder(border); textArea = new AutoScrollingTextArea(); float[] somecolor = new float[3]; somecolor = Color.RGBtoHSB(175,238,238, null); textArea.setBackground(Color.getHSBColor(somecolor[0], somecolor[1], somecolor[2])); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setToolTipText("Stdout and stderr are redirected here."); System.out.println("Redirecting output and errors to GUI window."); ps_orig = System.out;//This is for backup ps_orig_err = System.err;//This is for backup try{ System.setOut(new PrintStream(new TextAreaOutputStream(textArea))); //System.setErr(new PrintStream(new TextAreaOutputStream(textArea))); } catch(SecurityException e){ System.err.println("Permission denied, output and errors remain on command-line.");; } outputpanel.setLayout(new BoxLayout(outputpanel, BoxLayout.PAGE_AXIS)); JLabel outputlabel = new JLabel("PPfold messages:"); outputlabel.setAlignmentX(Component.CENTER_ALIGNMENT); outputpanel.add(outputlabel); outputpanel.add(textArea); JScrollPane scrollpane = new JScrollPane(textArea); scrollpane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollpane.setPreferredSize(new Dimension(400, 200)); outputpanel.add(scrollpane); JButton copyButton = new JButton("Copy to clipboard"); copyButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String selection = textArea.getText(); StringSelection data = new StringSelection(selection); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(data, data); } }); copyButton.setAlignmentX(Component.CENTER_ALIGNMENT); outputpanel.add(copyButton); contentPane.add(outputpanel); JPanel progresspanel = new JPanel(); progresspanel.setLayout(new BoxLayout(progresspanel, BoxLayout.LINE_AXIS)); progresspanel.setBorder(border); progressbar = new JProgressBar(0, 100); //JLabel progresslabel = new JLabel("Folding progress: "); //progresslabel.setAlignmentX(Component.CENTER_ALIGNMENT); progressbar.setAlignmentX(Component.CENTER_ALIGNMENT); progressbar.setStringPainted(true); progressbar.setString("(Folding not started)"); progressbar.setToolTipText("Folding progress is shown here"); //progresspanel.add(progresslabel); progresspanel.add(progressbar); stopbutton = new JButton("Stop"); stopbutton.setEnabled(false); stopbutton.setAlignmentX(Component.CENTER_ALIGNMENT); stopbutton.setToolTipText("Stops the current folding."); progresspanel.add(Box.createRigidArea(new Dimension(5, 0))); progresspanel.add(stopbutton); stopbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { PPfoldMain.shouldstop = true; stopbutton.setEnabled(false); //Isn't allowed to press twice! } }); contentPane.add(progresspanel); mainpanel.setVisible(true); outputpanel.setVisible(true); contentPane.setVisible(true); pack(); setVisible(true); } public void checkAllData(boolean messageDialog){ try{ String testresults = CheckAllData.checkData(); String message = "The results of the test are given below. If any of the tests failed,\n" + "PPfold is unlikely to run correctly."; if(messageDialog){ @SuppressWarnings("unused") JDialog testResults = new CustomTextDialog("Test results",message,testresults); } } catch(Exception e){ String message = "An error occured while checking the data! This definitely should not have happened.\n" + "Please email the following debug text to zs@mb.au.dk and describe what you did."; String text = new String(""); for(StackTraceElement s:e.getStackTrace()){ text = text.concat(s.toString()+"\n"); } String errormessage = "PPfold version " + PPfoldMain.versionnumber + "\n"; try{ errormessage += "Platform: " + System.getProperty("os.name") + ", version " + System.getProperty("os.version") + "\n"; errormessage += "JVM: " + System.getProperty("java.vm.vendor") + ", JRE version "+ System.getProperty("java.version") + "\n"; } catch(SecurityException e1){ errormessage += "System check permission denied \n"; } errormessage += "\n"; errormessage += e.toString()+":\n"+text; @SuppressWarnings("unused") JDialog failure = new CustomTextDialog("Error",message,errormessage); e.printStackTrace(); } } public void resetOutput(){ textArea.setText(""); } public void enableAll(){ alignmentGroup.setEnabled(true); treeGroup.setEnabled(true); outputGroup.setEnabled(true); databuttons.setEnabled(true); exitStartButtons.setEnabled(true); //exit will always be enabled exportbuttons.setEnabled(true); seqexportbuttons.setEnabled(true); intensityArea.setEnabled(true); stopbutton.setEnabled(false); } public void disableAll(){ alignmentGroup.setEnabled(false); treeGroup.setEnabled(false); outputGroup.setEnabled(false); databuttons.setEnabled(false); exitStartButtons.setEnabled(false); //exit will always be enabled exportbuttons.setEnabled(false); seqexportbuttons.setEnabled(false); intensityArea.setEnabled(false); stopbutton.setEnabled(true); } }