001    /* ========================================================================
002     * JCommon : a free general purpose class library for the Java(tm) platform
003     * ========================================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     * 
007     * Project Info:  http://www.jfree.org/jcommon/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * ----------------------------
028     * AbstractFileSelectionAction.java
029     * ----------------------------
030     * (C)opyright 2002-2004, by Thomas Morgner and Contributors.
031     *
032     * Original Author:  Thomas Morgner;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *
035     * $Id: AbstractFileSelectionAction.java,v 1.4 2005/10/18 13:22:13 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 21-Nov-2004 : Initial version
040     *
041     */
042    package org.jfree.ui.action;
043    
044    import java.awt.Component;
045    import java.io.File;
046    import javax.swing.JFileChooser;
047    
048    import org.jfree.ui.ExtensionFileFilter;
049    import org.jfree.util.StringUtils;
050    
051    /**
052     * A base class for all file operations. This implementation provides all methods
053     * to let the user select a file.
054     *
055     * @author Thomas Morgner
056     */
057    public abstract class AbstractFileSelectionAction extends AbstractActionDowngrade {
058        /**
059         * The FileChooser that is used to perform the selection.
060         */
061        private JFileChooser fileChooser;
062        /**
063         * The (optional) parent component.
064         */
065        private Component parent;
066    
067        /**
068         * Creates a new FileSelectionAction with the given optional parent component
069         * as parent for the file chooser dialog.
070         *
071         * @param parent the parent
072         */
073        public AbstractFileSelectionAction(final Component parent) {
074            this.parent = parent;
075        }
076    
077        /**
078         * Returns the file extension that should be used for the operation.
079         *
080         * @return the file extension.
081         */
082        protected abstract String getFileExtension();
083    
084        /**
085         * Returns a descriptive text describing the file extension.
086         *
087         * @return the file description.
088         */
089        protected abstract String getFileDescription();
090    
091        /**
092         * Returns the working directory that should be used when initializing
093         * the FileChooser.
094         *
095         * @return the working directory.
096         */
097        protected File getCurrentDirectory() {
098            return new File(".");
099        }
100    
101        /**
102         * Selects a file to use as target for the operation.
103         *
104         * @param selectedFile    the selected file.
105         * @param dialogType  the dialog type.
106         * @param appendExtension true, if the file extension should be added if
107         *                        necessary, false if the unmodified filename should be used.
108         * 
109         * @return the selected and approved file or null, if the user canceled
110         *         the operation
111         */
112        protected File performSelectFile(final File selectedFile,
113                                         final int dialogType,
114                                         final boolean appendExtension) {
115            if (this.fileChooser == null) {
116                this.fileChooser = createFileChooser();
117            }
118    
119            this.fileChooser.setSelectedFile(selectedFile);
120            this.fileChooser.setDialogType(dialogType);
121            final int option = this.fileChooser.showDialog(this.parent, null);
122            if (option == JFileChooser.APPROVE_OPTION) {
123                final File selFile = this.fileChooser.getSelectedFile();
124                String selFileName = selFile.getAbsolutePath();
125                if (StringUtils.endsWithIgnoreCase(selFileName, getFileExtension()) == false) {
126                    selFileName = selFileName + getFileExtension();
127                }
128                return new File(selFileName);
129            }
130            return null;
131        }
132    
133        /**
134         * Creates the file chooser.
135         *
136         * @return the initialized file chooser.
137         */
138        protected JFileChooser createFileChooser() {
139            final JFileChooser fc = new JFileChooser();
140            fc.addChoosableFileFilter(
141                new ExtensionFileFilter(getFileDescription(), getFileExtension())
142            );
143            fc.setMultiSelectionEnabled(false);
144            fc.setCurrentDirectory(getCurrentDirectory());
145            return fc;
146        }
147        
148    }