/* * Copyright (C) 2007 Clam <clamisgood@gmail.com> * Copyright (C) 2014 Robert B. Colton * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.components; import java.io.File; import java.util.ArrayList; import java.util.prefs.Preferences; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileFilter; import org.lateralgm.components.impl.CustomFileFilter; import org.lateralgm.messages.Messages; public class CustomFileChooser extends JFileChooser { private static final long serialVersionUID = 1L; private Preferences prefs; private String propertyName; // whether to warn the user that the file they entered does not exist and keep the dialog open private boolean fileMustExist = true; // whether to warn the user the file already exists when saving and ask whether to overwrite private boolean confirmOverwrite = true; public CustomFileChooser(String node, String propertyName) { this.propertyName = propertyName; prefs = Preferences.userRoot().node(node); setCurrentDirectory(new File(prefs.get(propertyName,getCurrentDirectory().getAbsolutePath()))); } public void setConfirmOverwrite(boolean enable) { confirmOverwrite = enable; } public boolean getConfirmOverwrite() { return confirmOverwrite; } public boolean getFileExists() { boolean fileExists = false; if (this.isMultiSelectionEnabled()) { for (File f : this.getSelectedFiles()) { if (f.exists()) { fileExists = true; break; } } } else { fileExists = this.getSelectedFile().exists(); } return fileExists; } @Override public void approveSelection() { if (fileMustExist && this.getDialogType() == JFileChooser.OPEN_DIALOG) { boolean fileExists = getFileExists(); if (!fileExists) { JOptionPane.showMessageDialog(this, Messages.getString("FileChooser.NOT_FOUND_MESSAGE"), Messages.getString("FileChooser.NOT_FOUND_TITLE"), JOptionPane.WARNING_MESSAGE); return; } } else if (confirmOverwrite && this.getDialogType() == JFileChooser.SAVE_DIALOG) { boolean fileExists = getFileExists(); if (fileExists) { if (JOptionPane.showConfirmDialog(this, Messages.getString("FileChooser.CONFIRM_OVERWRITE_MESSAGE"), Messages.getString("FileChooser.CONFIRM_OVERWRITE_TITLE"), JOptionPane.WARNING_MESSAGE) == JOptionPane.CANCEL_OPTION) { return; } } } super.approveSelection(); saveDir(); } @Override public void cancelSelection() { super.cancelSelection(); saveDir(); } private void saveDir() { prefs.put(propertyName,getCurrentDirectory().getAbsolutePath()); } public void setFileMustExist(boolean enable) { fileMustExist = enable; } public boolean getFileMustExist() { return fileMustExist; } /** * Sets the given <code>FilterSet</code> to be the current set * of chooseable file filters. The first item in the list will be set as * the currently selected filter. * @param filters The list of filters to use */ public void setFilterSet(FilterSet fs) { if (fs == null) throw new IllegalArgumentException("null FilterSet"); resetChoosableFileFilters(); for (FileFilter filt : fs) addChoosableFileFilter(filt); if (fs.size() > 0) setFileFilter(fs.get(0)); } public static class FilterSet extends ArrayList<FileFilter> { private static final long serialVersionUID = 1L; public void addFilter(String descKey, String...exts) { add(new CustomFileFilter(Messages.getString(descKey),exts)); } } }