package gui.processing; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionListener; import java.text.Format; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import util.ProcessFeedbackData; @SuppressWarnings("serial") public class ProcessInfoPanel extends JPanel { private JScrollPane scrollProcessList = new JScrollPane(); private JTree tree = null; private final JButton processFeedbackButton = new JButton( "Get process feedback"); private final JButton abortProcessButton = new JButton("Abort process"); /** * Initiates the east panel in the process tabs borderlayout. */ public ProcessInfoPanel() { super(); this.setBorder(BorderFactory .createTitledBorder("Processing Information")); this.setLayout(new BorderLayout()); JPanel procInfoSouthPanel = new JPanel(new FlowLayout()); JPanel procInfoCenterPanel = new JPanel(new BorderLayout()); this.add(procInfoSouthPanel, BorderLayout.SOUTH); this.add(procInfoCenterPanel, BorderLayout.CENTER); scrollProcessList.setPreferredSize(new Dimension(300, 700)); procInfoCenterPanel.add(scrollProcessList, BorderLayout.CENTER); procInfoSouthPanel.add(Box.createHorizontalStrut(35)); procInfoSouthPanel.add(processFeedbackButton); procInfoSouthPanel.add(abortProcessButton); procInfoSouthPanel.add(Box.createHorizontalStrut(35)); } private JTree createFeedbackTree(ArrayList<String> experiments, ProcessFeedbackData[] processFeedbackData) { // create the root node DefaultMutableTreeNode root = new DefaultMutableTreeNode( "<html><b>Current processes</b></html>"); // create the child nodes for (String s : experiments) { DefaultMutableTreeNode experimentNode = new DefaultMutableTreeNode( "<html><b>ExpID</b>: " + s + "</html>"); root.add(experimentNode); for (ProcessFeedbackData p : processFeedbackData) { if (p.experimentName.equals(s)) { DefaultMutableTreeNode processNode = new ProcessNode(p); experimentNode.add(processNode); processNode.add(new DefaultMutableTreeNode( "<html><b>Author</b>: " + p.author + "</html>")); DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode( "<html><b>Files</b>: " + "Files" + "</html>"); for (String files : p.outputFiles) { fileNode.add(new DefaultMutableTreeNode( "<html><b>File</b>: " + files + "</html>")); } processNode.add(fileNode); processNode.add(new DefaultMutableTreeNode( "<html><b>Status</b>: " + p.status + "</html>")); Format format = new SimpleDateFormat("yyyy-MM-dd, HH:mm"); String timeAdded = "Not added"; String timeStarted = "Not started"; String timeFinished = "Not finished"; if (p.timeAdded != 0) { timeAdded = format.format(new Date(p.timeAdded)) .toString(); } if (p.timeStarted != 0) { timeStarted = format.format(new Date(p.timeStarted)) .toString(); } if (p.timeFinished != 0) { timeFinished = format.format(new Date(p.timeFinished)) .toString(); } processNode .add(new DefaultMutableTreeNode( "<html><b>TimeAdded</b>: " + timeAdded + "</html>")); processNode.add(new DefaultMutableTreeNode( "<html><b>TimeStarted</b>: " + timeStarted + "</html>")); processNode.add(new DefaultMutableTreeNode( "<html><b>TimeFinished</b>: " + timeFinished + "</html>")); } } } // create the tree by passing in the root node JTree tree = new JTree(root); tree.setRootVisible(false); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree .getCellRenderer(); renderer.setLeafIcon(null); renderer.setClosedIcon(null); renderer.setOpenIcon(null); return tree; } /** * Adds button listener to processFeedbackButton. * * @see controller.ProcessTabController#processFeedbackListener() * @param listener */ public void addProcessFeedbackListener(ActionListener listener) { processFeedbackButton.addActionListener(listener); } /** * Adds button listener to abortProcessButton. * * @see controller.ProcessTabController#abortProcessListener() * @param listener */ public void addAbortProcessListener(ActionListener listener) { abortProcessButton.addActionListener(listener); } public void showProcessFeedback(ProcessFeedbackData[] processFeedbackData) { ArrayList<String> experiments = new ArrayList<String>(); for (ProcessFeedbackData p : processFeedbackData) { if (!experiments.contains(p.experimentName)) { experiments.add(p.experimentName); } } this.tree = createFeedbackTree(experiments, processFeedbackData); scrollProcessList.setViewportView(tree); } public ProcessFeedbackData getSelectedProcess() { if ( this.tree == null ){ return null; } TreePath[] tps = this.tree.getSelectionPaths(); if (tps.length != 1) { return null; } TreePath tp = tps[0]; Object nod = tp.getLastPathComponent(); while ( nod != null ){ if ( nod instanceof ProcessNode ) { return ((ProcessNode)nod).getProcessFeedbackData(); } nod = ((DefaultMutableTreeNode)nod).getParent(); } return null; } private class ProcessNode extends DefaultMutableTreeNode{ /** * */ private static final long serialVersionUID = -8248950057225139957L; private ProcessFeedbackData p; private ProcessNode(ProcessFeedbackData p){ super("<html><b>ProcessID</b>: " + p.PID + "</html>"); this.p = p; } public ProcessFeedbackData getProcessFeedbackData(){ return p; } } }