package com.vitco.util.misc; import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.awt.*; import java.io.File; import java.util.ArrayList; /** * Custom file dialog */ public class CFileDialog extends JFileChooser { // list of files private final ArrayList<ExtensionFileFilter> accepted = new ArrayList<ExtensionFileFilter>(); // constructor public CFileDialog() { super(); } // ========================= // add a file type public void addFileType(String ext) { accepted.add(new GeneralFilter(ext.toLowerCase(), ext.toUpperCase())); } // add a file type public void addFileType(String ext, String name) { accepted.add(new GeneralFilter(ext.toLowerCase(), name)); } // add a file type public void addFileType(String[] exts, String name) { ArrayList<ExtensionFileFilter> filterList = new ArrayList<ExtensionFileFilter>(); for (String ext : exts) { filterList.add(new GeneralFilter(ext, ext.toUpperCase())); } accepted.add(new CumulativeGeneralFilter(filterList, name)); } // select an existing file public File openFile(Frame mainFrame) { prepare(true); if (showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) { File selectedfile = getSelectedFile(); if (selectedfile.exists()) { return selectedfile; } } return null; } // select a file (doesn't need to exist) public File saveFile(Frame mainFrame) { prepare(false); if (showSaveDialog(mainFrame) == JFileChooser.APPROVE_OPTION) { // selected file File selectedFile = getSelectedFile(); // currently selected ext String ext = getCurrentExt(); if (ext != null) { // make sure filename ends correctly String dir = selectedFile.getPath(); if(!dir.toLowerCase().endsWith("." + ext)) { selectedFile = new File(dir + "." + ext); } } // dae file return selectedFile; } return null; } // get the current path (that is shown when this dialog is opened) public String getDialogPath() { return getCurrentDirectory().getAbsolutePath(); } // set the current path (that is shown when this dialog is opened) public void setDialogPath(File path) { if (path.exists() && path.isDirectory()) { setCurrentDirectory(path); } } // ========================= // helper - prepare this file chooser private void prepare(boolean allowAllFiles) { resetChoosableFileFilters(); // create general file chooser that holds all file types if (!accepted.isEmpty()) { for (ExtensionFileFilter filter : accepted) { addChoosableFileFilter(filter); } if (allowAllFiles) { // create "all files" file chooser CumulativeGeneralFilter cumulativeGeneralFilter = new CumulativeGeneralFilter(accepted); setFileFilter(cumulativeGeneralFilter); } else { setFileFilter(accepted.get(0)); } setAcceptAllFileFilterUsed(false); } } // set the title of this dialog public void setTitle(String title) { setDialogTitle(title); } // get the extension that is currently selected // returns null if the extension is not known public final String getCurrentExt() { FileFilter filter = this.getFileFilter(); if (filter instanceof ExtensionFileFilter) { return ((ExtensionFileFilter)filter).getExt(); } return null; } // helper - filter class for multiple endings private final class CumulativeGeneralFilter extends ExtensionFileFilter { private final ArrayList<ExtensionFileFilter> filters; private String desc = "All Files (*.*)"; // constructor private CumulativeGeneralFilter(ArrayList<ExtensionFileFilter> filters) { this.filters = filters; } // constructor public CumulativeGeneralFilter(ArrayList<ExtensionFileFilter> filters, String name) { this(filters); // generate new name boolean first = true; StringBuilder builder = new StringBuilder(); builder.append(name).append(" ("); for (ExtensionFileFilter filter : filters) { builder.append(first ? "" : ", ").append("*.").append(filter.getExt()); first = false; } builder.append(")"); this.desc = builder.toString(); } @Override public final String getExt() { File selectedFile = getSelectedFile(); if (selectedFile != null) { String extension = ""; String fileName = selectedFile.getName(); int i = fileName.lastIndexOf('.'); if (i > 0) { extension = fileName.substring(i+1); } return extension; } return null; } @Override public boolean accept(File f) { // we want to display folders if (f.isDirectory()) { return true; } else { for (ExtensionFileFilter filter : filters) { if (filter.accept(f)) { return true; } } } return false; } @Override public String getDescription() { return desc; } } // helper - filter class private final class GeneralFilter extends ExtensionFileFilter { private final String desc; private final String ext; private GeneralFilter(String ext, String name) { this.ext = ext; desc = name + " (*." + ext + ")"; } @Override public final String getExt() { return ext; } @Override public boolean accept(File f) { // we want to display folders return f.isDirectory() || f.getName().endsWith("." + ext); } @Override public String getDescription() { return desc; } } // helper - abstract class to define the getExt() method private abstract class ExtensionFileFilter extends FileFilter { abstract String getExt(); } }