/* * Created by JFormDesigner on Wed Mar 17 09:42:52 CET 2010 */ package de.mpicbg.knime.knutils.ui; import de.mpicbg.knime.knutils.FileUtils; import org.knime.core.node.defaultnodesettings.SettingsModelString; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Holger Brandl */ public class FileSelectPanel extends JPanel { private SettingsModelString fileChooserProperty; public FileNameExtensionFilter extensionFilter; public FileSelectPanel(SettingsModelString fileChooserProperty, FileNameExtensionFilter fileFilter) { this.fileChooserProperty = fileChooserProperty; setExtensionFilter(fileFilter); initComponents(); } public void setExtensionFilter(FileNameExtensionFilter extensionFilter) { this.extensionFilter = extensionFilter; } private void selectFilesButtonActionPerformed() { // go back to the old directory // File oldFile = new File(fileChooserProperty.getStringValue()); JFileChooser fileChooser; // if (oldFile.exists()) { // fileChooser = new JFileChooser(oldFile.getParentFile()); // } else { fileChooser = new JFileChooser(); // } // take the first and use it as start-directoruy List<File> inputFiles = FileSelectPanel.getInputFilesInternal(fileChooserProperty.getStringValue(), extensionFilter.getExtensions()); if (inputFiles.size() > 0) { File firstFile = inputFiles.get(0); if (firstFile.exists()) { fileChooser.setCurrentDirectory(firstFile.getParentFile()); } } fileChooser.setFileFilter(extensionFilter); fileChooser.setMultiSelectionEnabled(true); fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); int status = fileChooser.showOpenDialog(this); if (status == JFileChooser.CANCEL_OPTION) return; List<File> selectedFiles = Arrays.asList(fileChooser.getSelectedFiles()); String selectionString = selectedFiles.toString(); selectionString = selectionString.replace("[", "").replace("]", "").replace(",", ";"); fileChooserProperty.setStringValue(selectionString); updateListView(); } public void updateListView() { String fileChooserValue = fileChooserProperty.getStringValue(); if (!fileChooserValue.contains(";") && new File(fileChooserValue).isDirectory()) { selectionMode.setText("Directory ('" + fileChooserValue + "')"); } else { selectionMode.setText("Multiple files"); } List<File> inputFiles = FileSelectPanel.getInputFiles(fileChooserProperty.getStringValue(), extensionFilter.getExtensions()); StringBuffer sb = new StringBuffer(); for (File inputFile : inputFiles) { sb.append(inputFile.getAbsolutePath() + "\n"); } fileListArea.setText(sb.toString()); invalidate(); } public static List<File> parseFileSelection(String serializedFileCollection) { List<File> files = new ArrayList<File>(); if (serializedFileCollection == null || serializedFileCollection.trim().isEmpty()) return files; for (String fileName : serializedFileCollection.split(";")) { files.add(new File(fileName.trim())); } return files; } private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // Generated using JFormDesigner Open Source Project license - Sphinx-4 (cmusphinx.sourceforge.net/sphinx4/) selectFilesButton = new JButton(); scrollPane1 = new JScrollPane(); fileListArea = new JTextArea(); panel1 = new JPanel(); label1 = new JLabel(); selectionMode = new JLabel(); //======== this ======== setLayout(new BorderLayout()); //---- selectFilesButton ---- selectFilesButton.setText("Select Files or Directory"); selectFilesButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectFilesButtonActionPerformed(); } }); add(selectFilesButton, BorderLayout.NORTH); //======== scrollPane1 ======== { //---- fileListArea ---- fileListArea.setEditable(false); fileListArea.setEnabled(false); fileListArea.setPreferredSize(new Dimension(200, 200)); scrollPane1.setViewportView(fileListArea); } add(scrollPane1, BorderLayout.CENTER); //======== panel1 ======== { panel1.setLayout(new BorderLayout()); //---- label1 ---- label1.setText("Mode: "); panel1.add(label1, BorderLayout.WEST); //---- selectionMode ---- selectionMode.setText("text"); panel1.add(selectionMode, BorderLayout.CENTER); } add(panel1, BorderLayout.SOUTH); // JFormDesigner - End of component initialization //GEN-END:initComponents } // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // Generated using JFormDesigner Open Source Project license - Sphinx-4 (cmusphinx.sourceforge.net/sphinx4/) private JButton selectFilesButton; private JScrollPane scrollPane1; private JTextArea fileListArea; private JPanel panel1; private JLabel label1; private JLabel selectionMode; // JFormDesigner - End of variables declaration //GEN-END:variables public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.add(new FileSelectPanel(new SettingsModelString("test", ""), new FileNameExtensionFilter("text files", "xls"))); jFrame.setBounds(200, 200, 500, 500); jFrame.setVisible(true); } public static List<File> getInputFiles(String serializedFileSelection, String... extensions) { List<File> filteredFiles = getInputFilesInternal(serializedFileSelection, extensions); if (filteredFiles.isEmpty()) { throw new RuntimeException("no " + Arrays.toString(extensions) + "-files found in input selection"); } return filteredFiles; } private static List<File> getInputFilesInternal(String serializedFileSelection, String[] extensions) { List<File> inputSelection = parseFileSelection(serializedFileSelection); List<File> foundFiles = new ArrayList<File>(); for (File inputArg : inputSelection) { if (inputArg.isDirectory()) { foundFiles.addAll(FileUtils.findFiles(inputArg)); } else { foundFiles.add(inputArg); } } //filter the list List<File> filteredFiles = new ArrayList<File>(); for (File foundFile : foundFiles) { for (String extension : extensions) { if (foundFile.getName().endsWith(extension)) { filteredFiles.add(foundFile); break; } } } return filteredFiles; } }