package org.openpnp.vision.pipeline.ui; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; import java.io.File; import java.util.prefs.Preferences; import javax.swing.AbstractAction; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openpnp.vision.pipeline.CvPipeline; import org.openpnp.vision.pipeline.CvStage; import org.openpnp.vision.pipeline.stages.ImageRead; @SuppressWarnings("serial") public class StandaloneEditor extends JFrame { private JTextField textField; private File directory; private CvPipelineEditor editor; private DefaultListModel<String> listModel; public StandaloneEditor() { CvPipeline pipeline = new CvPipeline(); pipeline.add(new ImageRead()); setTitle("CvPipelineEditor"); setSize(1328, 1022); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); JSplitPane splitPane = new JSplitPane(); splitPane.setContinuousLayout(true); getContentPane().add(splitPane, BorderLayout.CENTER); editor = new CvPipelineEditor(pipeline); splitPane.setRightComponent(editor); JPanel panel = new JPanel(); splitPane.setLeftComponent(panel); panel.setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane(); panel.add(scrollPane, BorderLayout.CENTER); listModel = new DefaultListModel<>(); JList<String> list = new JList<>(listModel); scrollPane.setViewportView(list); JPanel panel_1 = new JPanel(); panel.add(panel_1, BorderLayout.NORTH); panel_1.setLayout(new BorderLayout(0, 0)); textField = new JTextField(); panel_1.add(textField); textField.setColumns(10); textField.setAction(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { setInputDirectory(new File(textField.getText())); } }); JButton browseDirectoryButton = new JButton(new AbstractAction("...") { public void actionPerformed(ActionEvent e) { JFileChooser j = new JFileChooser(); j.setSelectedFile(directory); j.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); j.setMultiSelectionEnabled(false); if (j.showOpenDialog(StandaloneEditor.this) == JFileChooser.APPROVE_OPTION) { File directory = j.getSelectedFile(); setInputDirectory(directory); } } }); panel_1.add(browseDirectoryButton, BorderLayout.EAST); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; } String filename = list.getSelectedValue(); if (filename == null) { return; } File file = new File(directory, filename); if (pipeline.getStages().isEmpty()) { return; } CvStage stage = pipeline.getStages().get(0); if (stage instanceof ImageRead) { ImageRead imageRead = (ImageRead) stage; imageRead.setFile(file); editor.process(); } } }); addHierarchyListener(new HierarchyListener() { @Override public void hierarchyChanged(HierarchyEvent e) { splitPane.setDividerLocation(0.20); } }); String defaultInputDirectoryPath = Preferences.userNodeForPackage(getClass()).get("inputDirectory", null); if (defaultInputDirectoryPath != null) { File defaultInputDirectory = new File(defaultInputDirectoryPath); if (defaultInputDirectory.exists()) { setInputDirectory(defaultInputDirectory); } } setVisible(true); } private void setInputDirectory(File inputDirectory) { textField.setText(inputDirectory.getAbsolutePath()); directory = new File(textField.getText()); listModel.clear(); for (File file : directory.listFiles()) { if (!file.isFile()) { continue; } listModel.addElement(file.getName()); } Preferences.userNodeForPackage(getClass()).put("inputDirectory", inputDirectory.getAbsolutePath()); } public static void main(String[] args) throws Exception { // http://developer.apple.com/library/mac/#documentation/Java/Conceptual/Java14Development/07-NativePlatformIntegration/NativePlatformIntegration.html#//apple_ref/doc/uid/TP40001909-212952-TPXREF134 System.setProperty("apple.laf.useScreenMenuBar", "true"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { throw new Error(e); } new StandaloneEditor(); } }