/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.utils.ui; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.commons.io.FilenameUtils; import com.opendoorlogistics.api.ui.UIFactory.FilenameChangeListener; import com.opendoorlogistics.core.utils.io.RelativeFiles; import com.opendoorlogistics.core.utils.strings.Strings; public class FileBrowserPanel extends JPanel { final private JTextField textField; final private JButton browseButton; final private JLabel label; public FileBrowserPanel(String initialFilename, final FilenameChangeListener filenameChangeListener, final boolean directoriesOnly, final String browserApproveButtonText, final FileFilter... fileFilters) { this(null, initialFilename, filenameChangeListener, directoriesOnly, browserApproveButtonText, fileFilters); } public FileBrowserPanel(String label, String initialFilename, final FilenameChangeListener filenameChangeListener, final boolean directoriesOnly, final String browserApproveButtonText, final FileFilter... fileFilters) { this(0, label, initialFilename, filenameChangeListener, directoriesOnly, browserApproveButtonText, fileFilters); } @Override public void setToolTipText(String text) { super.setToolTipText(text); textField.setToolTipText(text); browseButton.setToolTipText(text); if (label != null) { label.setToolTipText(text); } } private FileBrowserPanel(int indentWidth, String label, String initialFilename, final FilenameChangeListener filenameChangeListener, final boolean directoriesOnly, final String browserApproveButtonText, final FileFilter... fileFilters) { textField = createTextField(initialFilename, filenameChangeListener); // add browser button browseButton = createBrowseButton(directoriesOnly, browserApproveButtonText, textField, fileFilters); setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); if (indentWidth > 0) { add(Box.createRigidArea(new Dimension(indentWidth, 1))); } if (label != null) { this.label = new JLabel(label); add(this.label); } else { this.label = null; } add(textField); add(browseButton); } public static JComponent [] createComponents( String label, String initialFilename, final FilenameChangeListener filenameChangeListener, final boolean directoriesOnly, final String browserApproveButtonText, final FileFilter... fileFilters) { ArrayList<JComponent> ret = new ArrayList<JComponent>(); if(label!=null){ ret.add(new JLabel(label)); } JTextField textField = createTextField(initialFilename, filenameChangeListener); ret.add(textField); textField.setPreferredSize(new Dimension(200, 28)); ret.add( createBrowseButton(directoriesOnly, browserApproveButtonText, textField, fileFilters)); return ret.toArray(new JComponent[ret.size()]); } private static JTextField createTextField(String initialFilename, final FilenameChangeListener filenameChangeListener) { JTextField textField = new JTextField(); if (initialFilename != null) { textField.setText(initialFilename); } if (filenameChangeListener != null) { textField.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { fire(); } @Override public void insertUpdate(DocumentEvent e) { fire(); } @Override public void changedUpdate(DocumentEvent e) { fire(); } private void fire() { filenameChangeListener.filenameChanged(textField.getText()); } }); } return textField; } // protected static File processSelectedFile(File selected) { // String workingDir = System.getProperty("user.dir"); // String relative = RelativeFiles.getFilenameToSaveInLink(selected, // workingDir); // return new File(relative); // } private static boolean matchesFilter(FileNameExtensionFilter filter, String path) { String[] exts = filter.getExtensions(); for (String ext : exts) { // check if it already has a valid extension if (Strings.equalsStd(FilenameUtils.getExtension(path), ext)) { return true; } } return false; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); browseButton.setEnabled(enabled); textField.setEnabled(enabled); if (label != null) { label.setEnabled(enabled); } } @Override public void setVisible(boolean visible) { super.setVisible(visible); browseButton.setVisible(visible); textField.setVisible(visible); if (label != null) { label.setVisible(visible); } } public void setFilename(String filename) { textField.setText(filename); // textField.invalidate(); } public String getFilename() { return textField.getText(); } public static JButton createBrowseButton(final boolean directoriesOnly, final String browserApproveButtonText, final JTextField textField, final FileFilter... fileFilters) { JButton browseButton = new JButton("..."); browseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); if (textField.getText() != null) { File file = new File(textField.getText()); // if the file doesn't exist but the directory does, get that if (!file.exists() && file.getParentFile() != null && file.getParentFile().exists()) { file = file.getParentFile(); } if (!directoriesOnly && file.isFile()) { chooser.setSelectedFile(file); } if (file.isDirectory() && file.exists()) { chooser.setCurrentDirectory(file); } } if (directoriesOnly) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } // add filters and automatically select correct one if (fileFilters.length == 1) { chooser.setFileFilter(fileFilters[0]); } else { for (FileFilter filter : fileFilters) { chooser.addChoosableFileFilter(filter); if (filter instanceof FileNameExtensionFilter) { if (matchesFilter((FileNameExtensionFilter) filter, textField.getText())) { chooser.setFileFilter(filter); } } } } if (chooser.showDialog(textField, browserApproveButtonText) == JFileChooser.APPROVE_OPTION) { //File selected = processSelectedFile(chooser.getSelectedFile()); File selected = chooser.getSelectedFile(); String path = selected.getPath(); FileFilter filter = chooser.getFileFilter(); if (filter != null && filter instanceof FileNameExtensionFilter) { boolean found = matchesFilter( ((FileNameExtensionFilter) chooser .getFileFilter()), path); if (!found) { String[] exts = ((FileNameExtensionFilter) chooser .getFileFilter()).getExtensions(); if (exts.length > 0) { path = FilenameUtils.removeExtension(path); path += "." + exts[0]; } } } textField.setText(path); } } }); return browseButton; } }