/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2012 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others. * *See COPYING for Details * *This program is free software; you can redistribute it and/or *modify it under the terms of the GNU General Public License *as published by the Free Software Foundation; either version 2 *of the License, or (at your option) any later version. * *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program; if not, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package freemind.modes; import java.awt.Component; import java.awt.FileDialog; import java.awt.Frame; import java.awt.HeadlessException; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import javax.xml.transform.stream.StreamResult; /** * File Chooser for Mac * @author foltin * @date 23.02.2012 */ public class FreeMindAwtFileDialog extends FileDialog implements FreeMindFileDialog { private static final String APPLE_AWT_FILE_DIALOG_FOR_DIRECTORIES = "apple.awt.fileDialogForDirectories"; protected static java.util.logging.Logger logger = null; private final static class NullFilter extends FileFilter { /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#accept(java.io.File) */ public boolean accept(File pF) { return true; } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return "NullFilter"; } } private final class DirFilter extends FileFilter { public boolean accept(File pF) { return pF.isDirectory(); } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return "DirFilter"; } } private final class FileOnlyFilter extends FileFilter { public boolean accept(File pF) { return pF.isFile(); } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return "FileFilter"; } } private final class FileAndDirFilter extends FileFilter { public boolean accept(File pF) { return pF.isFile() || pF.isDirectory(); } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return "FileAndDirFilter"; } } private FreeMindFilenameFilter mFilter; private DirectoryResultListener mDirectoryResultListener = null; /** * @author foltin * @date 27.02.2012 */ private final class FreeMindFilenameFilter implements FilenameFilter { /** * */ private FileFilter mCustomFilter = new NullFilter(); /** * Filter for dirs, files or both. */ private FileFilter mPrincipalFilter = new NullFilter(); /** * @param pFilter */ private FreeMindFilenameFilter() { } public boolean accept(File pDir, String pName) { File file = new File(pDir, pName); return mPrincipalFilter.accept(file) && mCustomFilter.accept(file); } public FileFilter getCustomFilter() { return mCustomFilter; } public void setCustomFilter(FileFilter pFilter) { mCustomFilter = pFilter; } public FileFilter getPrincipalFilter() { return mPrincipalFilter; } public void setPrincipalFilter(FileFilter pPrincipalFilter) { mPrincipalFilter = pPrincipalFilter; } } /** * */ public FreeMindAwtFileDialog() { super((Frame) null); if (logger == null) { logger = freemind.main.Resources.getInstance().getLogger( this.getClass().getName()); } mFilter = new FreeMindFilenameFilter(); super.setFilenameFilter(mFilter); System.setProperty(APPLE_AWT_FILE_DIALOG_FOR_DIRECTORIES, "false"); } protected void callDirectoryListener() { if(getFile() != null) { if(mDirectoryResultListener != null) { try { mDirectoryResultListener .setChosenDirectory(getSelectedFile() .getParentFile()); } catch (Exception e) { freemind.main.Resources.getInstance().logException(e); } } } } protected int getReturnValue() { return (getFile() == null)?JFileChooser.CANCEL_OPTION:JFileChooser.APPROVE_OPTION; } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#showOpenDialog(java.awt.Component) */ public int showOpenDialog(Component pParent) throws HeadlessException { setMode(LOAD); setVisible(true); callDirectoryListener(); return getReturnValue(); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#showSaveDialog(java.awt.Component) */ public int showSaveDialog(Component pParent) throws HeadlessException { setMode(SAVE); setVisible(true); callDirectoryListener(); return getReturnValue(); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#setDialogTitle(java.lang.String) */ public void setDialogTitle(String pDialogTitle) { setTitle(pDialogTitle); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#addChoosableFileFilter(javax.swing.filechooser.FileFilter) */ public void addChoosableFileFilter(FileFilter pFilter) { mFilter.setCustomFilter(pFilter); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#setFileSelectionMode(int) */ public void setFileSelectionMode(int pMode) { System.setProperty(APPLE_AWT_FILE_DIALOG_FOR_DIRECTORIES, "false"); switch(pMode) { case JFileChooser.DIRECTORIES_ONLY: mFilter.setPrincipalFilter(new DirFilter()); System.setProperty(APPLE_AWT_FILE_DIALOG_FOR_DIRECTORIES, "true"); break; case JFileChooser.FILES_ONLY: mFilter.setPrincipalFilter(new FileOnlyFilter()); break; case JFileChooser.FILES_AND_DIRECTORIES: mFilter.setPrincipalFilter(new FileAndDirFilter()); break; default: mFilter.setPrincipalFilter(new NullFilter()); break; } } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#setMultiSelectionEnabled(boolean) */ public void setMultiSelectionEnabled(boolean pB) { if(pB) { throw new IllegalArgumentException("Not implemented yet."); } } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#isMultiSelectionEnabled() */ public boolean isMultiSelectionEnabled() { return false; } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#getSelectedFiles() */ public File[] getSelectedFiles() { throw new IllegalArgumentException("Not implemented yet."); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#getSelectedFile() */ public File getSelectedFile() { return new File(getDirectory(), getFile()); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#setCurrentDirectory(java.io.File) */ public void setCurrentDirectory(File pDir) { if(pDir == null) { return; } logger.info("Setting dir to " + pDir); super.setDirectory(pDir.getAbsolutePath()); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#setSelectedFile(java.io.File) */ public void setSelectedFile(File pFile) { super.setFile(pFile.getName()); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#registerDirectoryResultListener(freemind.modes.FreeMindFileDialog.DirectoryResultListener) */ public void registerDirectoryResultListener( DirectoryResultListener pDirectoryResultListener) { mDirectoryResultListener = pDirectoryResultListener; } public static void main(String[] args) throws IOException { FreeMindAwtFileDialog dialog = new FreeMindAwtFileDialog(); dialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); dialog.showOpenDialog(null); File selectedFile = dialog.getSelectedFile(); System.out.println("Dir '" + dialog.getDirectory() + "', File: '" + dialog.getFile() + "', selected File: '" + selectedFile + "'" ); System.exit(0); dialog.showSaveDialog(null); selectedFile = dialog.getSelectedFile(); System.out.println("Dir '" + dialog.getDirectory() + "', File: '" + dialog.getFile() + "', selected File: '" + selectedFile + "'" ); StreamResult streamResult = new StreamResult(new FileOutputStream(selectedFile)); streamResult.getOutputStream().write("bla".getBytes()); streamResult.getOutputStream().close(); System.out.println("File exists: " + selectedFile.exists()); } /* (non-Javadoc) * @see freemind.modes.FreeMindFileDialog#addChoosableFileFilterAsDefault(javax.swing.filechooser.FileFilter) */ public void addChoosableFileFilterAsDefault(FileFilter pFilter) { addChoosableFileFilter(pFilter); } }