package org.basex.gui.layout; import static org.basex.core.Text.*; import java.awt.FileDialog; import java.io.File; import java.util.Locale; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import org.basex.gui.GUI; import org.basex.gui.GUIProp; import org.basex.gui.dialog.Dialog; import org.basex.io.IOFile; import org.basex.util.Util; /** * Project specific File Chooser implementation. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class BaseXFileChooser { /** File dialog mode. */ public enum Mode { /** Open file. */ FOPEN, /** Open file or directory. */ FDOPEN, /** Open directory. */ DOPEN, /** Save file. */ FSAVE, /** Save file or directory. */ DSAVE, } /** Reference to main window. */ private GUI gui; /** Swing file chooser. */ private JFileChooser fc; /** Simple file dialog. */ private FileDialog fd; /** File suffix. */ private String suffix; /** * Default constructor. * @param title dialog title * @param path initial path * @param main reference to main window */ public BaseXFileChooser(final String title, final String path, final GUI main) { if(main.gprop.is(GUIProp.SIMPLEFD)) { fd = new FileDialog(main, title); fd.setDirectory(new File(path).getPath()); } else { fc = new JFileChooser(path); final File file = new File(path); if(!file.isDirectory()) fc.setSelectedFile(file); fc.setDialogTitle(title); gui = main; } } /** * Sets a file filter. * @param dsc description * @param suf suffix */ public void addFilter(final String dsc, final String... suf) { if(fc != null) { final FileFilter ff = fc.getFileFilter(); fc.addChoosableFileFilter(new Filter(suf, dsc)); fc.setFileFilter(ff); } else { fd.setFile('*' + suf[0]); } // treat first filter as default if(suffix == null) suffix = suf[0]; } /** * Selects a file or directory. * @param mode type defined by {@link Mode} * @return resulting input reference */ public IOFile select(final Mode mode) { IOFile io; if(fd != null) { if(mode == Mode.FDOPEN) fd.setFile(" "); fd.setMode(mode == Mode.FSAVE || mode == Mode.DSAVE ? FileDialog.SAVE : FileDialog.LOAD); fd.setVisible(true); final String f = fd.getFile(); if(f == null) return null; final String dir = fd.getDirectory(); return new IOFile(mode == Mode.DOPEN || mode == Mode.DSAVE ? dir : dir + '/' + fd.getFile()); } int state = 0; switch(mode) { case FOPEN: state = fc.showOpenDialog(gui); break; case FDOPEN: fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); state = fc.showOpenDialog(gui); break; case FSAVE: state = fc.showSaveDialog(gui); break; case DOPEN: case DSAVE: fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); state = fc.showDialog(gui, null); break; } if(state != JFileChooser.APPROVE_OPTION) return null; io = new IOFile(fc.getSelectedFile().getPath()); if(mode != Mode.FSAVE) return io; // add file suffix to file to be saved if(suffix != null && !io.path().contains(".")) io = new IOFile(io.path() + suffix); // show replace dialog return !io.exists() || Dialog.confirm(gui, Util.info(FILE_EXISTS_X, io)) ? io : null; } /** * Defines a file filter for a list of extensions. */ private static class Filter extends FileFilter { /** Suffixes. */ private final String[] sufs; /** Description. */ private final String desc; /** * Constructor. * @param s suffixes * @param d description */ Filter(final String[] s, final String d) { sufs = s; desc = d; } @Override public boolean accept(final File file) { if(file.isDirectory()) return true; final String name = file.getName().toLowerCase(Locale.ENGLISH); for(final String s : sufs) if(name.endsWith(s)) return true; return false; } @Override public String getDescription() { final StringBuilder sb = new StringBuilder(); for(final String s : sufs) { if(sb.length() != 0) sb.append(", "); sb.append('*').append(s); } return desc + " (" + sb + ')'; } } }