Mercurial > repos > timpalpant > java_genomics_toolkit
comparison gui/edu/unc/genomics/ToolRunnerFrame.java @ 2:e16016635b2a
Uploaded
| author | timpalpant |
|---|---|
| date | Mon, 13 Feb 2012 22:12:06 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:a54db233ee3d | 2:e16016635b2a |
|---|---|
| 1 package edu.unc.genomics; | |
| 2 | |
| 3 import java.awt.BorderLayout; | |
| 4 import java.awt.Color; | |
| 5 import java.awt.Component; | |
| 6 import java.awt.Container; | |
| 7 import java.awt.Dimension; | |
| 8 import java.awt.Font; | |
| 9 | |
| 10 import javax.swing.JFrame; | |
| 11 import javax.swing.JPanel; | |
| 12 | |
| 13 import javax.swing.BorderFactory; | |
| 14 import javax.swing.JComponent; | |
| 15 import javax.swing.JLabel; | |
| 16 import javax.swing.JList; | |
| 17 import javax.swing.JMenuBar; | |
| 18 import javax.swing.JMenu; | |
| 19 import javax.swing.JMenuItem; | |
| 20 import javax.swing.JButton; | |
| 21 import javax.swing.JOptionPane; | |
| 22 import javax.swing.JPopupMenu; | |
| 23 import javax.swing.JScrollPane; | |
| 24 import javax.swing.SwingConstants; | |
| 25 | |
| 26 import javax.swing.JProgressBar; | |
| 27 import javax.swing.JSplitPane; | |
| 28 import javax.swing.BoxLayout; | |
| 29 import javax.swing.JTabbedPane; | |
| 30 import javax.swing.JTextPane; | |
| 31 | |
| 32 import javax.swing.event.TreeSelectionListener; | |
| 33 import javax.swing.event.TreeSelectionEvent; | |
| 34 import javax.xml.parsers.ParserConfigurationException; | |
| 35 | |
| 36 import org.apache.log4j.Logger; | |
| 37 import org.simplericity.macify.eawt.Application; | |
| 38 import org.simplericity.macify.eawt.ApplicationEvent; | |
| 39 import org.simplericity.macify.eawt.ApplicationListener; | |
| 40 import org.simplericity.macify.eawt.DefaultApplication; | |
| 41 import org.xml.sax.SAXException; | |
| 42 | |
| 43 import com.beust.jcommander.JCommander; | |
| 44 | |
| 45 import java.awt.event.ActionListener; | |
| 46 import java.awt.event.ActionEvent; | |
| 47 import java.io.IOException; | |
| 48 | |
| 49 /** | |
| 50 * The main ToolRunner window | |
| 51 * and controller for creating, running, and managing Jobs | |
| 52 * | |
| 53 * @author timpalpant | |
| 54 * | |
| 55 */ | |
| 56 public class ToolRunnerFrame extends JFrame implements ApplicationListener { | |
| 57 | |
| 58 private static final long serialVersionUID = 6454774196137357898L; | |
| 59 private static final Logger log = Logger.getLogger(ToolRunnerFrame.class); | |
| 60 | |
| 61 private final Application application = new DefaultApplication(); | |
| 62 | |
| 63 private final JPanel contentPane = new JPanel(); | |
| 64 private final JSplitPane splitPane = new JSplitPane(); | |
| 65 private final JPanel mainPane = new JPanel(); | |
| 66 private final JProgressBar progressBar = new JProgressBar(); | |
| 67 private final JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP); | |
| 68 private final JobConfigPanel configurationPanel = new JobConfigPanel(); | |
| 69 private final JTextPane helpTextPanel = new JTextPane(); | |
| 70 private final ToolsTree toolsTree = new ToolsTree(); | |
| 71 | |
| 72 private final JobQueue queue = new JobQueue(); | |
| 73 private final JobQueueManager queueManager = new JobQueueManager(queue); | |
| 74 private final JList<SubmittedJob> queueList = new JList<>(queue); | |
| 75 | |
| 76 /** | |
| 77 * Create the frame. | |
| 78 */ | |
| 79 public ToolRunnerFrame() { | |
| 80 //application.addPreferencesMenuItem(); | |
| 81 //application.setEnabledPreferencesMenu(true); | |
| 82 application.addApplicationListener(this); | |
| 83 | |
| 84 // set OS X-specific properties | |
| 85 if (application.isMac()) { | |
| 86 setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); | |
| 87 //toolsTree.putClientProperty("Quaqua.Tree.style", "sourceList"); | |
| 88 } else { | |
| 89 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
| 90 } | |
| 91 setTitle("Genomics Toolkit Tool Runner"); | |
| 92 setBounds(100, 100, 1000, 600); | |
| 93 | |
| 94 contentPane.setBorder(BorderFactory.createEmptyBorder()); | |
| 95 contentPane.setLayout(new BorderLayout(0, 0)); | |
| 96 setContentPane(contentPane); | |
| 97 | |
| 98 initializeChildren(); | |
| 99 initializeMenuBar(); | |
| 100 } | |
| 101 | |
| 102 private void initializeChildren() { | |
| 103 splitPane.setBorder(BorderFactory.createEmptyBorder()); | |
| 104 contentPane.add(splitPane, BorderLayout.CENTER); | |
| 105 | |
| 106 initializeQueuePanel(); | |
| 107 initializeToolsTree(); | |
| 108 | |
| 109 mainPane.setLayout(new BorderLayout(0, 0)); | |
| 110 mainPane.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); | |
| 111 mainPane.add(tabbedPane, BorderLayout.CENTER); | |
| 112 | |
| 113 JPanel runPanel = new JPanel(); | |
| 114 runPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); | |
| 115 runPanel.setLayout(new BoxLayout(runPanel, BoxLayout.X_AXIS)); | |
| 116 runPanel.add(progressBar); | |
| 117 JButton btnRun = new JButton("Run"); | |
| 118 btnRun.addActionListener(new ActionListener() { | |
| 119 public void actionPerformed(ActionEvent e) { | |
| 120 addJobToQueue(); | |
| 121 } | |
| 122 }); | |
| 123 runPanel.add(btnRun); | |
| 124 mainPane.add(runPanel, BorderLayout.SOUTH); | |
| 125 splitPane.setRightComponent(mainPane); | |
| 126 | |
| 127 initializeConfigurationPanel(); | |
| 128 initializeHelpPanel(); | |
| 129 } | |
| 130 | |
| 131 private void initializeMenuBar() { | |
| 132 JMenuBar menuBar = new JMenuBar(); | |
| 133 setJMenuBar(menuBar); | |
| 134 | |
| 135 JMenu mnFileMenu = new JMenu("File"); | |
| 136 menuBar.add(mnFileMenu); | |
| 137 | |
| 138 JMenuItem mntmAssemblyManager = new JMenuItem("Assembly manager"); | |
| 139 mntmAssemblyManager.addActionListener(new ActionListener() { | |
| 140 public void actionPerformed(ActionEvent e) { | |
| 141 JMenuItem menuItem = (JMenuItem) e.getSource(); | |
| 142 JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent(); | |
| 143 Component invoker = popupMenu.getInvoker(); //this is the JMenu (in my code) | |
| 144 JComponent invokerAsJComponent = (JComponent) invoker; | |
| 145 Container topLevel = invokerAsJComponent.getTopLevelAncestor(); | |
| 146 AssemblyManagerDialog dialog = new AssemblyManagerDialog((JFrame) topLevel); | |
| 147 //dialog.getRootPane().putClientProperty("Window.style", "small"); | |
| 148 dialog.setVisible(true); | |
| 149 } | |
| 150 }); | |
| 151 mnFileMenu.add(mntmAssemblyManager); | |
| 152 | |
| 153 JMenu mnHelpMenu = new JMenu("Help"); | |
| 154 menuBar.add(mnHelpMenu); | |
| 155 | |
| 156 JMenuItem mntmHelpContents = new JMenuItem("Help Contents"); | |
| 157 mnHelpMenu.add(mntmHelpContents); | |
| 158 | |
| 159 if (!application.isMac()) { | |
| 160 JMenuItem mntmAbout = new JMenuItem("About"); | |
| 161 mnHelpMenu.add(mntmAbout); | |
| 162 mnHelpMenu.addActionListener(new ActionListener() { | |
| 163 public void actionPerformed(ActionEvent e) { | |
| 164 handleAbout(null); | |
| 165 } | |
| 166 }); | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 private void initializeQueuePanel() { | |
| 171 JPanel queuePanel = new JPanel(); | |
| 172 queuePanel.setLayout(new BoxLayout(queuePanel, BoxLayout.PAGE_AXIS)); | |
| 173 queuePanel.setBorder(BorderFactory.createEmptyBorder()); | |
| 174 contentPane.add(queuePanel, BorderLayout.EAST); | |
| 175 | |
| 176 JLabel queueLabel = new JLabel("Job Queue"); | |
| 177 queueLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); | |
| 178 queueLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT); | |
| 179 queuePanel.add(queueLabel); | |
| 180 | |
| 181 queueList.setBackground(contentPane.getBackground()); | |
| 182 queueList.setCellRenderer(new JobQueueCellRenderer()); | |
| 183 JScrollPane queueListScrollPane = new JScrollPane(queueList); | |
| 184 queueListScrollPane.setBorder(BorderFactory.createEmptyBorder()); | |
| 185 queueListScrollPane.setBackground(contentPane.getBackground()); | |
| 186 queueListScrollPane.setPreferredSize(new Dimension(200, Integer.MAX_VALUE)); | |
| 187 queuePanel.add(queueListScrollPane); | |
| 188 } | |
| 189 | |
| 190 private void initializeConfigurationPanel() { | |
| 191 JScrollPane configScrollPane = new JScrollPane(configurationPanel); | |
| 192 configScrollPane.setBorder(BorderFactory.createEmptyBorder()); | |
| 193 tabbedPane.addTab("Tool Configuration", null, configScrollPane, "Configure tool"); | |
| 194 } | |
| 195 | |
| 196 private void initializeHelpPanel() { | |
| 197 JPanel helpPanel = new JPanel(); | |
| 198 tabbedPane.addTab("Help", null, helpPanel, null); | |
| 199 helpPanel.setLayout(new BorderLayout(0, 0)); | |
| 200 | |
| 201 helpTextPanel.setEditable(false); | |
| 202 helpTextPanel.setBackground(tabbedPane.getBackground()); | |
| 203 Font mono = new Font("Monospaced", helpTextPanel.getFont().getStyle(), helpTextPanel.getFont().getSize()); | |
| 204 helpTextPanel.setFont(mono); | |
| 205 JScrollPane helpScrollPane = new JScrollPane(helpTextPanel); | |
| 206 helpScrollPane.setBorder(BorderFactory.createEmptyBorder()); | |
| 207 helpPanel.add(helpScrollPane); | |
| 208 } | |
| 209 | |
| 210 private void initializeToolsTree() { | |
| 211 try { | |
| 212 ToolsTreeModel model = ToolsTreeModel.loadDefaultConfig(); | |
| 213 toolsTree.setModel(model); | |
| 214 } catch (ParserConfigurationException | SAXException | IOException e1) { | |
| 215 log.error("Error loading tool configuration file"); | |
| 216 e1.printStackTrace(); | |
| 217 System.exit(-1); | |
| 218 } catch (ClassNotFoundException e) { | |
| 219 log.error("Error loading tool: " + e.getMessage()); | |
| 220 e.printStackTrace(); | |
| 221 System.exit(-1); | |
| 222 } | |
| 223 | |
| 224 toolsTree.addTreeSelectionListener(new TreeSelectionListener() { | |
| 225 public void valueChanged(TreeSelectionEvent e) { | |
| 226 changeTool(); | |
| 227 } | |
| 228 }); | |
| 229 | |
| 230 JScrollPane toolsTreeScrollPane = new JScrollPane(toolsTree); | |
| 231 toolsTreeScrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.LIGHT_GRAY)); | |
| 232 splitPane.setLeftComponent(toolsTreeScrollPane); | |
| 233 } | |
| 234 | |
| 235 /** | |
| 236 * Change the configuration panel to the currently selected tool | |
| 237 * to configure a new Job | |
| 238 */ | |
| 239 private void changeTool() { | |
| 240 // Returns the last path element of the selection. | |
| 241 Object node = toolsTree.getLastSelectedPathComponent(); | |
| 242 // Nothing is selected | |
| 243 if (node == null) { | |
| 244 return; | |
| 245 } | |
| 246 | |
| 247 if (node instanceof ToolsTreeNode) { | |
| 248 ToolsTreeNode toolNode = (ToolsTreeNode) node; | |
| 249 try { | |
| 250 Class<? extends CommandLineTool> tool = toolNode.getClazz(); | |
| 251 | |
| 252 // Set up the configuration panel to configure this tool | |
| 253 Job job = new Job(tool); | |
| 254 configurationPanel.setJob(job); | |
| 255 // Set the help text to the usage | |
| 256 helpTextPanel.setText(job.getUsageText()); | |
| 257 } catch (InstantiationException | IllegalAccessException e) { | |
| 258 log.error("Error initializing Job"); | |
| 259 e.printStackTrace(); | |
| 260 JOptionPane.showMessageDialog(this, "Error initializing job", "Job Initialization Error", JOptionPane.ERROR_MESSAGE); | |
| 261 } | |
| 262 | |
| 263 } | |
| 264 } | |
| 265 | |
| 266 private void addJobToQueue() { | |
| 267 Job currentJob = configurationPanel.getJob(); | |
| 268 if (currentJob == null) return; | |
| 269 | |
| 270 // Validate the required parameters | |
| 271 log.info("Validating parameters for tool"); | |
| 272 if (!currentJob.validateArguments()) { | |
| 273 configurationPanel.highlightInvalidArguments(); | |
| 274 return; | |
| 275 } | |
| 276 | |
| 277 // Add the job to the queue | |
| 278 try { | |
| 279 queueManager.submitJob(currentJob); | |
| 280 configurationPanel.setJob(null); | |
| 281 } catch (JobException e) { | |
| 282 log.error("Error adding Job to queue"); | |
| 283 e.printStackTrace(); | |
| 284 JOptionPane.showMessageDialog(this, "Error adding job to queue", "Job Queue Error", JOptionPane.ERROR_MESSAGE); | |
| 285 } | |
| 286 } | |
| 287 | |
| 288 public void handleAbout(ApplicationEvent event) { | |
| 289 JOptionPane.showMessageDialog(this, "Java Genomics Toolkit v1.0"); | |
| 290 if (event != null) { | |
| 291 event.setHandled(true); | |
| 292 } | |
| 293 } | |
| 294 | |
| 295 public void handleOpenApplication(ApplicationEvent event) { | |
| 296 // Application was opened | |
| 297 } | |
| 298 | |
| 299 public void handleOpenFile(ApplicationEvent event) { | |
| 300 //JOptionPane.showMessageDialog(frmToolRunner, "OS X told us to open " + event.getFilename()); | |
| 301 } | |
| 302 | |
| 303 public void handlePreferences(ApplicationEvent event) { | |
| 304 //JOptionPane.showMessageDialog(frmToolRunner, "No preferences available"); | |
| 305 } | |
| 306 | |
| 307 public void handlePrintFile(ApplicationEvent event) { | |
| 308 //JOptionPane.showMessageDialog(frmToolRunner, "OS X told us to print " + event.getFilename()); | |
| 309 } | |
| 310 | |
| 311 public void handleQuit(ApplicationEvent event) { | |
| 312 boolean confirm = true; | |
| 313 if (queueManager.isRunning()) { | |
| 314 int result = JOptionPane.showConfirmDialog(this, "Jobs are currently running. Are you sure you want to quit?", "Confirm Quit", JOptionPane.OK_CANCEL_OPTION); | |
| 315 confirm = (result == JOptionPane.OK_OPTION); | |
| 316 } | |
| 317 | |
| 318 if (confirm) { | |
| 319 dispose(); | |
| 320 System.exit(0); | |
| 321 } | |
| 322 } | |
| 323 | |
| 324 public void handleReOpenApplication(ApplicationEvent event) { | |
| 325 //JOptionPane.showMessageDialog(frmToolRunner, "OS X told the application was reopened"); | |
| 326 setVisible(true); | |
| 327 } | |
| 328 } |
