mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-04 16:50:57 +00:00
1627 lines
43 KiB
Java
1627 lines
43 KiB
Java
|
/* JFileChooser.java --
|
||
|
Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
|
||
|
|
||
|
This file is part of GNU Classpath.
|
||
|
|
||
|
GNU Classpath 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, or (at your option)
|
||
|
any later version.
|
||
|
|
||
|
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
|
||
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
02110-1301 USA.
|
||
|
|
||
|
Linking this library statically or dynamically with other modules is
|
||
|
making a combined work based on this library. Thus, the terms and
|
||
|
conditions of the GNU General Public License cover the whole
|
||
|
combination.
|
||
|
|
||
|
As a special exception, the copyright holders of this library give you
|
||
|
permission to link this library with independent modules to produce an
|
||
|
executable, regardless of the license terms of these independent
|
||
|
modules, and to copy and distribute the resulting executable under
|
||
|
terms of your choice, provided that you also meet, for each linked
|
||
|
independent module, the terms and conditions of the license of that
|
||
|
module. An independent module is a module which is not derived from
|
||
|
or based on this library. If you modify this library, you may extend
|
||
|
this exception to your version of the library, but you are not
|
||
|
obligated to do so. If you do not wish to do so, delete this
|
||
|
exception statement from your version. */
|
||
|
|
||
|
package javax.swing;
|
||
|
|
||
|
import gnu.java.lang.CPStringBuilder;
|
||
|
|
||
|
import java.awt.Component;
|
||
|
import java.awt.Frame;
|
||
|
import java.awt.GraphicsEnvironment;
|
||
|
import java.awt.HeadlessException;
|
||
|
import java.awt.event.ActionEvent;
|
||
|
import java.awt.event.ActionListener;
|
||
|
import java.awt.event.WindowEvent;
|
||
|
import java.awt.event.WindowAdapter;
|
||
|
import java.beans.PropertyChangeEvent;
|
||
|
import java.io.File;
|
||
|
import java.util.ArrayList;
|
||
|
|
||
|
import javax.accessibility.Accessible;
|
||
|
import javax.accessibility.AccessibleContext;
|
||
|
import javax.accessibility.AccessibleRole;
|
||
|
import javax.swing.filechooser.FileFilter;
|
||
|
import javax.swing.filechooser.FileSystemView;
|
||
|
import javax.swing.filechooser.FileView;
|
||
|
import javax.swing.plaf.FileChooserUI;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* A component that provides the user a dialog box to browse through a
|
||
|
* filesystem and choose one or more files or directories.
|
||
|
*
|
||
|
* A JFileChooser can be configured to filter the displayed file list
|
||
|
* by adding a {@link FileFilter} instance using
|
||
|
* {@link #addChoosableFileFilter(FileFilter)}. Additional components can
|
||
|
* be embedded in the file chooser using {@link #setAccessory(JComponent)}.
|
||
|
* The JFileChooser properties also provide mechanisms to customize the
|
||
|
* behaviour of the file chooser.
|
||
|
*
|
||
|
* @author Kim Ho (kho@luxsci.net)
|
||
|
*/
|
||
|
public class JFileChooser extends JComponent implements Accessible
|
||
|
{
|
||
|
private static final long serialVersionUID = 3162921138695327837L;
|
||
|
|
||
|
/**
|
||
|
* A dialog type for selecting a file to open.
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
public static final int OPEN_DIALOG = 0;
|
||
|
|
||
|
/**
|
||
|
* A dialog type for selecting a file to save.
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
public static final int SAVE_DIALOG = 1;
|
||
|
|
||
|
/**
|
||
|
* A dialog type for some custom purpose.
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
public static final int CUSTOM_DIALOG = 2;
|
||
|
|
||
|
/**
|
||
|
* A return value indicating the file chooser has been closed by cancelling.
|
||
|
*
|
||
|
* @see #showOpenDialog(Component)
|
||
|
* @see #showSaveDialog(Component)
|
||
|
*/
|
||
|
public static final int CANCEL_OPTION = 1;
|
||
|
|
||
|
/**
|
||
|
* A return value indicating the file chooser has been closed by approving
|
||
|
* the selection.
|
||
|
* @see #showOpenDialog(Component)
|
||
|
* @see #showSaveDialog(Component)
|
||
|
*/
|
||
|
public static final int APPROVE_OPTION = 0;
|
||
|
|
||
|
/**
|
||
|
* A return value indicating the file chooser has been closed by some error.
|
||
|
* @see #showOpenDialog(Component)
|
||
|
* @see #showSaveDialog(Component)
|
||
|
*/
|
||
|
public static final int ERROR_OPTION = -1;
|
||
|
|
||
|
/**
|
||
|
* A selection mode constant indicating acceptance of files only.
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
public static final int FILES_ONLY = 0;
|
||
|
|
||
|
/**
|
||
|
* A selection mode constant indicating acceptance of directories only.
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
public static final int DIRECTORIES_ONLY = 1;
|
||
|
|
||
|
/**
|
||
|
* A selection mode constant indicating acceptance of files and directories.
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
public static final int FILES_AND_DIRECTORIES = 2;
|
||
|
|
||
|
/**
|
||
|
* Action command string for cancelling the current selection.
|
||
|
* @see #cancelSelection()
|
||
|
*/
|
||
|
public static final String CANCEL_SELECTION = "CancelSelection";
|
||
|
|
||
|
/**
|
||
|
* Action command string for approving the current selection.
|
||
|
* @see #cancelSelection()
|
||
|
*/
|
||
|
public static final String APPROVE_SELECTION = "ApproveSelection";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the approve button text.
|
||
|
* @see #setApproveButtonText(String)
|
||
|
*/
|
||
|
public static final String APPROVE_BUTTON_TEXT_CHANGED_PROPERTY =
|
||
|
"ApproveButtonTextChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the approve button tool tip text.
|
||
|
* @see #setApproveButtonToolTipText(String)
|
||
|
*/
|
||
|
public static final String APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY =
|
||
|
"ApproveButtonToolTipTextChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the approve button mnemonic.
|
||
|
* @see #setApproveButtonMnemonic(int)
|
||
|
*/
|
||
|
public static final String APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY =
|
||
|
"ApproveButtonMnemonicChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for control button visibility.
|
||
|
* @see #setControlButtonsAreShown(boolean)
|
||
|
*/
|
||
|
public static final String CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY =
|
||
|
"ControlButtonsAreShownChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the current directory.
|
||
|
* @see #setCurrentDirectory(File)
|
||
|
*/
|
||
|
public static final String DIRECTORY_CHANGED_PROPERTY = "directoryChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the selected file.
|
||
|
* @see #setSelectedFile(File)
|
||
|
*/
|
||
|
public static final String SELECTED_FILE_CHANGED_PROPERTY =
|
||
|
"SelectedFileChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for the selected files.
|
||
|
* @see #setSelectedFiles(File[])
|
||
|
*/
|
||
|
public static final String SELECTED_FILES_CHANGED_PROPERTY =
|
||
|
"SelectedFilesChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the property for multi-selection.
|
||
|
* @see #setMultiSelectionEnabled(boolean)
|
||
|
*/
|
||
|
public static final String MULTI_SELECTION_ENABLED_CHANGED_PROPERTY =
|
||
|
"MultiSelectionEnabledChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'file system view' property.
|
||
|
* @see #setFileSystemView(FileSystemView)
|
||
|
*/
|
||
|
public static final String FILE_SYSTEM_VIEW_CHANGED_PROPERTY =
|
||
|
"FileSystemViewChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'file view' property.
|
||
|
* @see #setFileView(FileView)
|
||
|
*/
|
||
|
public static final String FILE_VIEW_CHANGED_PROPERTY = "fileViewChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'file hiding enabled' property.
|
||
|
* @see #setFileHidingEnabled(boolean)
|
||
|
*/
|
||
|
public static final String FILE_HIDING_CHANGED_PROPERTY =
|
||
|
"FileHidingChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'file filter' property.
|
||
|
* @see #setFileFilter(FileFilter)
|
||
|
*/
|
||
|
public static final String FILE_FILTER_CHANGED_PROPERTY =
|
||
|
"fileFilterChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'file selection mode' property.
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
public static final String FILE_SELECTION_MODE_CHANGED_PROPERTY =
|
||
|
"fileSelectionChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'accessory' property.
|
||
|
* @see #setAccessory(JComponent)
|
||
|
*/
|
||
|
public static final String ACCESSORY_CHANGED_PROPERTY =
|
||
|
"AccessoryChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'accept all file filter used' property.
|
||
|
* @see #setAcceptAllFileFilterUsed(boolean)
|
||
|
*/
|
||
|
public static final String ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY =
|
||
|
"acceptAllFileFilterUsedChanged";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'dialog title' property.
|
||
|
* @see #setDialogTitle(String)
|
||
|
*/
|
||
|
public static final String DIALOG_TITLE_CHANGED_PROPERTY =
|
||
|
"DialogTitleChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'dialog type' property.
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
public static final String DIALOG_TYPE_CHANGED_PROPERTY =
|
||
|
"DialogTypeChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The name of the 'choosable file filters' property.
|
||
|
* @see #addChoosableFileFilter(FileFilter)
|
||
|
*/
|
||
|
public static final String CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY =
|
||
|
"ChoosableFileFilterChangedProperty";
|
||
|
|
||
|
/**
|
||
|
* The accessible context.
|
||
|
* @see #getAccessibleContext()
|
||
|
*/
|
||
|
protected AccessibleContext accessibleContext;
|
||
|
|
||
|
/**
|
||
|
* The file system view.
|
||
|
* @see #setFileSystemView(FileSystemView)
|
||
|
*/
|
||
|
private FileSystemView fsv;
|
||
|
|
||
|
/**
|
||
|
* The accessory component.
|
||
|
* @see #setAccessory(JComponent)
|
||
|
*/
|
||
|
private JComponent accessory;
|
||
|
|
||
|
/**
|
||
|
* The approve button mnemonic.
|
||
|
* @see #setApproveButtonMnemonic(int)
|
||
|
*/
|
||
|
private int approveButtonMnemonic = 0;
|
||
|
|
||
|
/**
|
||
|
* The approve button text.
|
||
|
* @see #setApproveButtonText(String)
|
||
|
*/
|
||
|
private String approveButtonText;
|
||
|
|
||
|
/**
|
||
|
* The approve button tool tip text.
|
||
|
* @see #setApproveButtonToolTipText(String)
|
||
|
*/
|
||
|
private String approveButtonToolTipText;
|
||
|
|
||
|
/**
|
||
|
* The choosable file filters.
|
||
|
* @see #addChoosableFileFilter(FileFilter)
|
||
|
*/
|
||
|
private ArrayList choosableFilters = new ArrayList();
|
||
|
|
||
|
/**
|
||
|
* A flag controlling whether the accept all file filter is used.
|
||
|
* @see #setAcceptAllFileFilterUsed(boolean)
|
||
|
*/
|
||
|
private boolean isAcceptAll = true;
|
||
|
|
||
|
/**
|
||
|
* The dialog title.
|
||
|
* @see #setDialogTitle(String)
|
||
|
*/
|
||
|
private String dialogTitle;
|
||
|
|
||
|
/**
|
||
|
* The dialog type.
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
private int dialogType = OPEN_DIALOG;
|
||
|
|
||
|
/**
|
||
|
* The return value for the dialog.
|
||
|
* @see #showOpenDialog(Component)
|
||
|
* @see #showSaveDialog(Component)
|
||
|
*/
|
||
|
private int retval = ERROR_OPTION;
|
||
|
|
||
|
/**
|
||
|
* A flag indicating whether the file chooser allows multiple selection.
|
||
|
* @see #isMultiSelectionEnabled()
|
||
|
*/
|
||
|
private boolean multiSelection = false;
|
||
|
|
||
|
/**
|
||
|
* A flag indicating whether file hiding is enabled.
|
||
|
* @see #isFileHidingEnabled()
|
||
|
*/
|
||
|
private boolean fileHiding = true;
|
||
|
|
||
|
/**
|
||
|
* The file selection mode.
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
private int fileSelectionMode = FILES_ONLY;
|
||
|
|
||
|
/**
|
||
|
* The file view.
|
||
|
* @see #setFileView(FileView)
|
||
|
*/
|
||
|
private FileView fv = null;
|
||
|
|
||
|
/**
|
||
|
* A flag controlling whether or not the control buttons are visible.
|
||
|
* @see #setControlButtonsAreShown(boolean)
|
||
|
*/
|
||
|
private boolean controlButtonsShown = true;
|
||
|
|
||
|
/**
|
||
|
* The current directory.
|
||
|
* @see #setCurrentDirectory(File)
|
||
|
*/
|
||
|
private File currentDir = null;
|
||
|
|
||
|
/**
|
||
|
* The current file filter.
|
||
|
* @see #setFileFilter(FileFilter)
|
||
|
*/
|
||
|
private FileFilter currentFilter = null;
|
||
|
|
||
|
/**
|
||
|
* An array of selected files.
|
||
|
* @see #setSelectedFiles(File[])
|
||
|
*/
|
||
|
private File[] selectedFiles;
|
||
|
|
||
|
/**
|
||
|
* The selected file.
|
||
|
* @see #setSelectedFile(File)
|
||
|
*/
|
||
|
private File selectedFile;
|
||
|
|
||
|
/**
|
||
|
* The drag enabled property.
|
||
|
* @see #setDragEnabled(boolean)
|
||
|
* @see #getDragEnabled()
|
||
|
*/
|
||
|
private boolean dragEnabled;
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object.
|
||
|
*/
|
||
|
public JFileChooser()
|
||
|
{
|
||
|
setup(null);
|
||
|
setCurrentDirectory(null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object.
|
||
|
*
|
||
|
* @param currentDirectoryPath the directory that should initially be
|
||
|
* shown in the filechooser (if <code>null</code>, the user's home
|
||
|
* directory is used).
|
||
|
*/
|
||
|
public JFileChooser(String currentDirectoryPath)
|
||
|
{
|
||
|
this(currentDirectoryPath, null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object with the specified
|
||
|
* directory and {@link FileSystemView}.
|
||
|
*
|
||
|
* @param currentDirectoryPath the directory that should initially be
|
||
|
* shown in the filechooser (if <code>null</code>, the user's home
|
||
|
* directory is used).
|
||
|
* @param fsv the file system view (if <code>null</code>, the default file
|
||
|
* system view is used).
|
||
|
*/
|
||
|
public JFileChooser(String currentDirectoryPath, FileSystemView fsv)
|
||
|
{
|
||
|
setup(fsv);
|
||
|
File dir = null;
|
||
|
if (currentDirectoryPath != null)
|
||
|
dir = getFileSystemView().createFileObject(currentDirectoryPath);
|
||
|
setCurrentDirectory(dir);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object.
|
||
|
*
|
||
|
* @param currentDirectory the directory that should initially be
|
||
|
* shown in the filechooser (if <code>null</code>, the user's home
|
||
|
* directory is used).
|
||
|
*/
|
||
|
public JFileChooser(File currentDirectory)
|
||
|
{
|
||
|
setup(null);
|
||
|
setCurrentDirectory(currentDirectory);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object.
|
||
|
*
|
||
|
* @param fsv the file system view (if <code>null</code>, the default file
|
||
|
* system view is used).
|
||
|
*/
|
||
|
public JFileChooser(FileSystemView fsv)
|
||
|
{
|
||
|
setup(fsv);
|
||
|
setCurrentDirectory(null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new <code>JFileChooser</code> object.
|
||
|
*
|
||
|
* @param currentDirectory the directory that should initially be
|
||
|
* shown in the filechooser (if <code>null</code>, the user's home
|
||
|
* directory is used).
|
||
|
* @param fsv the file system view (if <code>null</code>, the default file
|
||
|
* system view is used).
|
||
|
*/
|
||
|
public JFileChooser(File currentDirectory, FileSystemView fsv)
|
||
|
{
|
||
|
setup(fsv);
|
||
|
setCurrentDirectory(currentDirectory);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets up the file chooser. This method is called by all the constructors.
|
||
|
*
|
||
|
* @param view the file system view (if <code>null</code>, the default file
|
||
|
* system view is used).
|
||
|
*
|
||
|
* @see FileSystemView#getFileSystemView()
|
||
|
*/
|
||
|
protected void setup(FileSystemView view)
|
||
|
{
|
||
|
if (view == null)
|
||
|
view = FileSystemView.getFileSystemView();
|
||
|
setFileSystemView(view);
|
||
|
updateUI();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the dragEnabled property, this disables/enables automatic drag
|
||
|
* handling (drag and drop) on this component. The default value of the
|
||
|
* dragEnabled property is false.
|
||
|
*
|
||
|
* Some look and feels might not support automatic drag and drop; they
|
||
|
* will ignore this property.
|
||
|
*
|
||
|
* @param b - the new dragEnabled value
|
||
|
*/
|
||
|
public void setDragEnabled(boolean b)
|
||
|
{
|
||
|
if (b && GraphicsEnvironment.isHeadless())
|
||
|
throw new HeadlessException();
|
||
|
|
||
|
dragEnabled = b;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if dragging is enabled.
|
||
|
*
|
||
|
* @return true if dragging is enabled.
|
||
|
*/
|
||
|
public boolean getDragEnabled()
|
||
|
{
|
||
|
return dragEnabled;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the selected file, if there is one.
|
||
|
*
|
||
|
* @return The selected file (possibly <code>null</code>).
|
||
|
*
|
||
|
* @see #setSelectedFile(File)
|
||
|
*/
|
||
|
public File getSelectedFile()
|
||
|
{
|
||
|
return selectedFile;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the selected file and sends a {@link PropertyChangeEvent} to all
|
||
|
* registered listeners. The property name is
|
||
|
* {@link #SELECTED_FILE_CHANGED_PROPERTY}.
|
||
|
*
|
||
|
* @param file the file (<code>null</code> permitted).
|
||
|
*/
|
||
|
public void setSelectedFile(File file)
|
||
|
{
|
||
|
if (selectedFile == null || !selectedFile.equals(file))
|
||
|
{
|
||
|
File old = selectedFile;
|
||
|
selectedFile = file;
|
||
|
firePropertyChange(SELECTED_FILE_CHANGED_PROPERTY, old, selectedFile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the selected file or files in an array. If no files are selected,
|
||
|
* an empty array is returned.
|
||
|
*
|
||
|
* @return An array of the selected files (possibly empty).
|
||
|
*/
|
||
|
public File[] getSelectedFiles()
|
||
|
{
|
||
|
if (selectedFiles != null)
|
||
|
return selectedFiles;
|
||
|
if (selectedFile != null)
|
||
|
return new File[] { selectedFile };
|
||
|
return new File[0];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the selected files and sends a {@link PropertyChangeEvent} (with the
|
||
|
* name {@link #SELECTED_FILES_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param selectedFiles the selected files (<code>null</code> permitted).
|
||
|
*/
|
||
|
public void setSelectedFiles(File[] selectedFiles)
|
||
|
{
|
||
|
if (selectedFiles == null)
|
||
|
selectedFiles = new File[0];
|
||
|
if (selectedFiles.length > 0)
|
||
|
setSelectedFile(selectedFiles[0]);
|
||
|
else
|
||
|
setSelectedFile(null);
|
||
|
if (this.selectedFiles != selectedFiles)
|
||
|
{
|
||
|
File[] old = this.selectedFiles;
|
||
|
this.selectedFiles = selectedFiles;
|
||
|
firePropertyChange(SELECTED_FILES_CHANGED_PROPERTY, old, selectedFiles);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current directory.
|
||
|
*
|
||
|
* @return The current directory.
|
||
|
*/
|
||
|
public File getCurrentDirectory()
|
||
|
{
|
||
|
return currentDir;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the current directory and fires a {@link PropertyChangeEvent} (with
|
||
|
* the property name {@link #DIRECTORY_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners. If <code>dir</code> is <code>null</code>, the current
|
||
|
* directory is set to the default directory returned by the file system
|
||
|
* view.
|
||
|
*
|
||
|
* @param dir the new directory (<code>null</code> permitted).
|
||
|
*
|
||
|
* @see FileSystemView#getDefaultDirectory()
|
||
|
*/
|
||
|
public void setCurrentDirectory(File dir)
|
||
|
{
|
||
|
if (currentDir != dir || dir == null)
|
||
|
{
|
||
|
if (dir == null)
|
||
|
dir = fsv.getDefaultDirectory();
|
||
|
|
||
|
File old = currentDir;
|
||
|
currentDir = dir;
|
||
|
firePropertyChange(DIRECTORY_CHANGED_PROPERTY, old, currentDir);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called by the UI delegate when the parent directory is changed.
|
||
|
*/
|
||
|
public void changeToParentDirectory()
|
||
|
{
|
||
|
setCurrentDirectory(fsv.getParentDirectory(currentDir));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Rescans the current directory (this is handled by the UI delegate).
|
||
|
*/
|
||
|
public void rescanCurrentDirectory()
|
||
|
{
|
||
|
getUI().rescanCurrentDirectory(this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Ensures the the specified file is visible (this is handled by the
|
||
|
* UI delegate).
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*/
|
||
|
public void ensureFileIsVisible(File f)
|
||
|
{
|
||
|
getUI().ensureFileIsVisible(this, f);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Displays the file chooser in a modal dialog using the
|
||
|
* {@link #OPEN_DIALOG} type.
|
||
|
*
|
||
|
* @param parent the parent component.
|
||
|
*
|
||
|
* @return A return value indicating how the dialog was closed (one of
|
||
|
* {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
|
||
|
* {@link #ERROR_OPTION}).
|
||
|
*
|
||
|
* @throws HeadlessException DOCUMENT ME!
|
||
|
*/
|
||
|
public int showOpenDialog(Component parent) throws HeadlessException
|
||
|
{
|
||
|
JDialog d = createDialog(parent);
|
||
|
|
||
|
// FIXME: Remove when we get ancestor property
|
||
|
d.setTitle("Open");
|
||
|
setDialogType(OPEN_DIALOG);
|
||
|
|
||
|
retval = ERROR_OPTION;
|
||
|
|
||
|
d.pack();
|
||
|
d.show();
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Displays the file chooser in a modal dialog using the
|
||
|
* {@link #SAVE_DIALOG} type.
|
||
|
*
|
||
|
* @param parent the parent component.
|
||
|
*
|
||
|
* @return A return value indicating how the dialog was closed (one of
|
||
|
* {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
|
||
|
* {@link #ERROR_OPTION}).
|
||
|
*
|
||
|
* @throws HeadlessException DOCUMENT ME!
|
||
|
*/
|
||
|
public int showSaveDialog(Component parent) throws HeadlessException
|
||
|
{
|
||
|
JDialog d = createDialog(parent);
|
||
|
setDialogType(SAVE_DIALOG);
|
||
|
|
||
|
retval = ERROR_OPTION;
|
||
|
|
||
|
d.pack();
|
||
|
d.show();
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Displays the file chooser in a modal dialog using the
|
||
|
* {@link #CUSTOM_DIALOG} type.
|
||
|
*
|
||
|
* @param parent the parent component.
|
||
|
*
|
||
|
* @return A return value indicating how the dialog was closed (one of
|
||
|
* {@link #APPROVE_OPTION}, {@link #CANCEL_OPTION} and
|
||
|
* {@link #ERROR_OPTION}).
|
||
|
*
|
||
|
* @throws HeadlessException DOCUMENT ME!
|
||
|
*/
|
||
|
public int showDialog(Component parent, String approveButtonText)
|
||
|
throws HeadlessException
|
||
|
{
|
||
|
JDialog d = createDialog(parent);
|
||
|
setApproveButtonText(approveButtonText);
|
||
|
setDialogType(CUSTOM_DIALOG);
|
||
|
|
||
|
retval = ERROR_OPTION;
|
||
|
|
||
|
d.pack();
|
||
|
d.show();
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a modal dialog in which to display the file chooser.
|
||
|
*
|
||
|
* @param parent the parent component.
|
||
|
*
|
||
|
* @return The dialog.
|
||
|
*
|
||
|
* @throws HeadlessException DOCUMENT ME!
|
||
|
*/
|
||
|
protected JDialog createDialog(Component parent) throws HeadlessException
|
||
|
{
|
||
|
Frame toUse = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
|
||
|
if (toUse == null)
|
||
|
toUse = (Frame) SwingUtilities.getOwnerFrame(null);
|
||
|
|
||
|
JDialog dialog = new JDialog(toUse);
|
||
|
setSelectedFile(null);
|
||
|
dialog.getContentPane().add(this);
|
||
|
dialog.addWindowListener( new WindowAdapter()
|
||
|
{
|
||
|
public void windowClosing(WindowEvent e)
|
||
|
{
|
||
|
cancelSelection();
|
||
|
}
|
||
|
});
|
||
|
dialog.setModal(true);
|
||
|
dialog.invalidate();
|
||
|
dialog.repaint();
|
||
|
return dialog;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the flag that controls whether or not the control buttons are
|
||
|
* shown on the file chooser.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*
|
||
|
* @see #setControlButtonsAreShown(boolean)
|
||
|
*/
|
||
|
public boolean getControlButtonsAreShown()
|
||
|
{
|
||
|
return controlButtonsShown;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the flag that controls whether or not the control buttons are
|
||
|
* shown and, if it changes, sends a {@link PropertyChangeEvent} (with the
|
||
|
* property name {@link #CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY}) to
|
||
|
* all registered listeners.
|
||
|
*
|
||
|
* @param b the new value for the flag.
|
||
|
*/
|
||
|
public void setControlButtonsAreShown(boolean b)
|
||
|
{
|
||
|
if (controlButtonsShown != b)
|
||
|
{
|
||
|
controlButtonsShown = b;
|
||
|
firePropertyChange(CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY,
|
||
|
! controlButtonsShown, controlButtonsShown);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the type of file chooser.
|
||
|
*
|
||
|
* @return {@link #OPEN_DIALOG}, {@link #SAVE_DIALOG} or
|
||
|
* {@link #CUSTOM_DIALOG}.
|
||
|
*
|
||
|
* @see #setDialogType(int)
|
||
|
*/
|
||
|
public int getDialogType()
|
||
|
{
|
||
|
return dialogType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the dialog type and fires a {@link PropertyChangeEvent} (with the
|
||
|
* property name {@link #DIALOG_TYPE_CHANGED_PROPERTY}) to all
|
||
|
* registered listeners.
|
||
|
*
|
||
|
* @param dialogType the dialog type (one of: {@link #OPEN_DIALOG},
|
||
|
* {@link #SAVE_DIALOG}, {@link #CUSTOM_DIALOG}).
|
||
|
*
|
||
|
* @throws IllegalArgumentException if <code>dialogType</code> is not valid.
|
||
|
*/
|
||
|
public void setDialogType(int dialogType)
|
||
|
{
|
||
|
if (dialogType != OPEN_DIALOG && dialogType != SAVE_DIALOG
|
||
|
&& dialogType != CUSTOM_DIALOG)
|
||
|
throw new IllegalArgumentException("Choose allowable dialogType.");
|
||
|
|
||
|
if (this.dialogType != dialogType)
|
||
|
{
|
||
|
int old = this.dialogType;
|
||
|
this.dialogType = dialogType;
|
||
|
firePropertyChange(DIALOG_TYPE_CHANGED_PROPERTY, old, this.dialogType);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the dialog title and sends a {@link PropertyChangeEvent} (with the
|
||
|
* property name {@link #DIALOG_TITLE_CHANGED_PROPERTY}) to all
|
||
|
* registered listeners.
|
||
|
*
|
||
|
* @param dialogTitle the dialog title (<code>null</code> permitted).
|
||
|
*
|
||
|
* @see #getDialogTitle()
|
||
|
*/
|
||
|
public void setDialogTitle(String dialogTitle)
|
||
|
{
|
||
|
if (this.dialogTitle != dialogTitle)
|
||
|
{
|
||
|
String old = this.dialogTitle;
|
||
|
this.dialogTitle = dialogTitle;
|
||
|
firePropertyChange(DIALOG_TITLE_CHANGED_PROPERTY, old, this.dialogTitle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the dialog title.
|
||
|
*
|
||
|
* @return The dialog title (possibly <code>null</code>).
|
||
|
*
|
||
|
* @see #setDialogTitle(String)
|
||
|
*/
|
||
|
public String getDialogTitle()
|
||
|
{
|
||
|
return dialogTitle;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the tool tip text for the approve button and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY}) to all
|
||
|
* registered listeners.
|
||
|
*
|
||
|
* @param toolTipText the text.
|
||
|
*/
|
||
|
public void setApproveButtonToolTipText(String toolTipText)
|
||
|
{
|
||
|
if (approveButtonToolTipText != toolTipText)
|
||
|
{
|
||
|
String oldText = approveButtonToolTipText;
|
||
|
approveButtonToolTipText = toolTipText;
|
||
|
firePropertyChange(APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY,
|
||
|
oldText, approveButtonToolTipText);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the tool tip text for the approve button.
|
||
|
*
|
||
|
* @return The tool tip text for the approve button.
|
||
|
*
|
||
|
* @see #setApproveButtonToolTipText(String)
|
||
|
*/
|
||
|
public String getApproveButtonToolTipText()
|
||
|
{
|
||
|
return approveButtonToolTipText;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the approve button mnemonic, or zero if no mnemonic has been set.
|
||
|
*
|
||
|
* @return The approve button mnemonic.
|
||
|
*
|
||
|
* @see #setApproveButtonMnemonic(int)
|
||
|
*/
|
||
|
public int getApproveButtonMnemonic()
|
||
|
{
|
||
|
return approveButtonMnemonic;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the mnemonic for the approve button and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param mnemonic the mnemonic.
|
||
|
*
|
||
|
* @see #setApproveButtonMnemonic(char)
|
||
|
*/
|
||
|
public void setApproveButtonMnemonic(int mnemonic)
|
||
|
{
|
||
|
if (approveButtonMnemonic != mnemonic)
|
||
|
{
|
||
|
int oldMnemonic = approveButtonMnemonic;
|
||
|
approveButtonMnemonic = mnemonic;
|
||
|
firePropertyChange(APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY,
|
||
|
oldMnemonic, approveButtonMnemonic);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the mnemonic for the approve button and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param mnemonic the mnemonic.
|
||
|
*
|
||
|
* @see #setApproveButtonMnemonic(int)
|
||
|
*/
|
||
|
public void setApproveButtonMnemonic(char mnemonic)
|
||
|
{
|
||
|
setApproveButtonMnemonic((int) Character.toUpperCase(mnemonic));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the approve button text and fires a {@link PropertyChangeEvent}
|
||
|
* (with the property name {@link #APPROVE_BUTTON_TEXT_CHANGED_PROPERTY}) to
|
||
|
* all registered listeners.
|
||
|
*
|
||
|
* @param approveButtonText the text (<code>null</code> permitted).
|
||
|
*
|
||
|
* @see #getApproveButtonText()
|
||
|
*/
|
||
|
public void setApproveButtonText(String approveButtonText)
|
||
|
{
|
||
|
if (this.approveButtonText != approveButtonText)
|
||
|
{
|
||
|
String oldText = this.approveButtonText;
|
||
|
this.approveButtonText = approveButtonText;
|
||
|
firePropertyChange(APPROVE_BUTTON_TEXT_CHANGED_PROPERTY, oldText,
|
||
|
this.approveButtonText);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the approve button text.
|
||
|
*
|
||
|
* @return The approve button text (possibly <code>null</code>).
|
||
|
*
|
||
|
* @see #setApproveButtonText(String)
|
||
|
*/
|
||
|
public String getApproveButtonText()
|
||
|
{
|
||
|
return approveButtonText;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the available file filters for this file chooser.
|
||
|
*
|
||
|
* @return The available file filters.
|
||
|
*/
|
||
|
public FileFilter[] getChoosableFileFilters()
|
||
|
{
|
||
|
return (FileFilter[]) choosableFilters.toArray(new FileFilter[choosableFilters.size()]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a file filter to the list of available filters and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param filter the filter (<code>null</code> permitted).
|
||
|
*/
|
||
|
public void addChoosableFileFilter(FileFilter filter)
|
||
|
{
|
||
|
if (filter != null)
|
||
|
{
|
||
|
FileFilter[] old = getChoosableFileFilters();
|
||
|
choosableFilters.add(filter);
|
||
|
FileFilter[] newFilters = getChoosableFileFilters();
|
||
|
firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old,
|
||
|
newFilters);
|
||
|
}
|
||
|
setFileFilter(filter);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes a file filter from the list of available filters and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param f the file filter.
|
||
|
*
|
||
|
* @return <code>true</code> if the filter was removed and
|
||
|
* <code>false</code> otherwise.
|
||
|
*/
|
||
|
public boolean removeChoosableFileFilter(FileFilter f)
|
||
|
{
|
||
|
if (f == currentFilter)
|
||
|
setFileFilter(null);
|
||
|
FileFilter[] old = getChoosableFileFilters();
|
||
|
if (! choosableFilters.remove(f))
|
||
|
return false;
|
||
|
FileFilter[] newFilters = getChoosableFileFilters();
|
||
|
firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clears the list of choosable file filters and installs the 'accept all'
|
||
|
* filter from the UI delegate.
|
||
|
*/
|
||
|
public void resetChoosableFileFilters()
|
||
|
{
|
||
|
choosableFilters.clear();
|
||
|
choosableFilters.add(getUI().getAcceptAllFileFilter(this));
|
||
|
setFileFilter((FileFilter) choosableFilters.get(0));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the 'accept all' file filter from the UI delegate.
|
||
|
*
|
||
|
* @return The 'accept all' file filter.
|
||
|
*/
|
||
|
public FileFilter getAcceptAllFileFilter()
|
||
|
{
|
||
|
return getUI().getAcceptAllFileFilter(this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the flag that controls whether or not the 'accept all' file
|
||
|
* filter is included in the list of filters.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*
|
||
|
* @see #setAcceptAllFileFilterUsed(boolean)
|
||
|
*/
|
||
|
public boolean isAcceptAllFileFilterUsed()
|
||
|
{
|
||
|
return isAcceptAll;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the flag that controls whether or not the 'accept all' file filter
|
||
|
* is included in the list of filters, and sends a
|
||
|
* {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param b the new value of the flag.
|
||
|
*/
|
||
|
public void setAcceptAllFileFilterUsed(boolean b)
|
||
|
{
|
||
|
if (isAcceptAll != b)
|
||
|
{
|
||
|
isAcceptAll = b;
|
||
|
if (b)
|
||
|
addChoosableFileFilter(getAcceptAllFileFilter());
|
||
|
else
|
||
|
removeChoosableFileFilter(getAcceptAllFileFilter());
|
||
|
firePropertyChange(ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY,
|
||
|
! isAcceptAll, isAcceptAll);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the accessory component for the file chooser. The default
|
||
|
* value is <code>null</code>.
|
||
|
*
|
||
|
* @return The accessory component (possibly <code>null</code>).
|
||
|
*
|
||
|
* @see #setAccessory(JComponent)
|
||
|
*/
|
||
|
public JComponent getAccessory()
|
||
|
{
|
||
|
return accessory;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the accessory component for the file chooser and sends a
|
||
|
* {@link PropertyChangeEvent} to all registered listeners. The property
|
||
|
* name is {@link #ACCESSORY_CHANGED_PROPERTY}.
|
||
|
*
|
||
|
* @param newAccessory the accessory component.
|
||
|
*/
|
||
|
public void setAccessory(JComponent newAccessory)
|
||
|
{
|
||
|
if (accessory != newAccessory)
|
||
|
{
|
||
|
JComponent old = accessory;
|
||
|
accessory = newAccessory;
|
||
|
firePropertyChange(ACCESSORY_CHANGED_PROPERTY, old, accessory);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the file selection mode and sends a {@link PropertyChangeEvent}
|
||
|
* to all registered listeners. The property name is
|
||
|
* {@link #FILE_SELECTION_MODE_CHANGED_PROPERTY}.
|
||
|
*
|
||
|
* @param mode the mode ({@link #FILES_ONLY}, {@link #DIRECTORIES_ONLY} or
|
||
|
* {@link #FILES_AND_DIRECTORIES}).
|
||
|
*
|
||
|
* @throws IllegalArgumentException if the mode is invalid.
|
||
|
*/
|
||
|
public void setFileSelectionMode(int mode)
|
||
|
{
|
||
|
if (mode != FILES_ONLY && mode != DIRECTORIES_ONLY
|
||
|
&& mode != FILES_AND_DIRECTORIES)
|
||
|
throw new IllegalArgumentException("Choose a correct file selection mode.");
|
||
|
if (fileSelectionMode != mode)
|
||
|
{
|
||
|
int old = fileSelectionMode;
|
||
|
fileSelectionMode = mode;
|
||
|
firePropertyChange(FILE_SELECTION_MODE_CHANGED_PROPERTY, old,
|
||
|
fileSelectionMode);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the file selection mode, one of: {@link #FILES_ONLY},
|
||
|
* {@link #DIRECTORIES_ONLY} or {@link #FILES_AND_DIRECTORIES}. The
|
||
|
* default is {@link #FILES_ONLY}.
|
||
|
*
|
||
|
* @return The file selection mode.
|
||
|
*
|
||
|
* @see #setFileSelectionMode(int)
|
||
|
*/
|
||
|
public int getFileSelectionMode()
|
||
|
{
|
||
|
return fileSelectionMode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if file selection is enabled, and
|
||
|
* <code>false</code> otherwise. File selection is enabled when the
|
||
|
* file selection mode is {@link #FILES_ONLY} or
|
||
|
* {@link #FILES_AND_DIRECTORIES}.
|
||
|
*
|
||
|
* @return <code>true</code> if file selection is enabled.
|
||
|
*
|
||
|
* @see #getFileSelectionMode()
|
||
|
*/
|
||
|
public boolean isFileSelectionEnabled()
|
||
|
{
|
||
|
return (fileSelectionMode == FILES_ONLY
|
||
|
|| fileSelectionMode == FILES_AND_DIRECTORIES);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if directory selection is enabled, and
|
||
|
* <code>false</code> otherwise. Directory selection is enabled when the
|
||
|
* file selection mode is {@link #DIRECTORIES_ONLY} or
|
||
|
* {@link #FILES_AND_DIRECTORIES}.
|
||
|
*
|
||
|
* @return <code>true</code> if file selection is enabled.
|
||
|
*
|
||
|
* @see #getFileSelectionMode()
|
||
|
*/
|
||
|
public boolean isDirectorySelectionEnabled()
|
||
|
{
|
||
|
return (fileSelectionMode == DIRECTORIES_ONLY
|
||
|
|| fileSelectionMode == FILES_AND_DIRECTORIES);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the flag that controls whether multiple selections are allowed in
|
||
|
* this filechooser and sends a {@link PropertyChangeEvent} (with the
|
||
|
* property name {@link #MULTI_SELECTION_ENABLED_CHANGED_PROPERTY}) to all
|
||
|
* registered listeners.
|
||
|
*
|
||
|
* @param b the new value of the flag.
|
||
|
*/
|
||
|
public void setMultiSelectionEnabled(boolean b)
|
||
|
{
|
||
|
if (multiSelection != b)
|
||
|
{
|
||
|
multiSelection = b;
|
||
|
firePropertyChange(MULTI_SELECTION_ENABLED_CHANGED_PROPERTY,
|
||
|
! multiSelection, multiSelection);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if multiple selections are allowed within this
|
||
|
* file chooser, and <code>false</code> otherwise.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*
|
||
|
* @see #setMultiSelectionEnabled(boolean)
|
||
|
*/
|
||
|
public boolean isMultiSelectionEnabled()
|
||
|
{
|
||
|
return multiSelection;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if hidden files are to be hidden, and
|
||
|
* <code>false</code> otherwise.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*
|
||
|
* @see #setFileHidingEnabled(boolean)
|
||
|
*/
|
||
|
public boolean isFileHidingEnabled()
|
||
|
{
|
||
|
return fileHiding;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the flag that controls whether or not hidden files are displayed,
|
||
|
* and sends a {@link PropertyChangeEvent} (with the property name
|
||
|
* {@link #FILE_HIDING_CHANGED_PROPERTY}) to all registered listeners.
|
||
|
*
|
||
|
* @param b the new value of the flag.
|
||
|
*/
|
||
|
public void setFileHidingEnabled(boolean b)
|
||
|
{
|
||
|
if (fileHiding != b)
|
||
|
{
|
||
|
fileHiding = b;
|
||
|
firePropertyChange(FILE_HIDING_CHANGED_PROPERTY, ! fileHiding,
|
||
|
fileHiding);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the file filter and sends a {@link PropertyChangeEvent} (with the
|
||
|
* property name {@link #FILE_FILTER_CHANGED_PROPERTY}) to all registered
|
||
|
* listeners.
|
||
|
*
|
||
|
* @param filter the filter (<code>null</code> permitted).
|
||
|
*/
|
||
|
public void setFileFilter(FileFilter filter)
|
||
|
{
|
||
|
if (currentFilter != filter)
|
||
|
{
|
||
|
if (filter != null && !choosableFilters.contains(filter))
|
||
|
addChoosableFileFilter(filter);
|
||
|
FileFilter old = currentFilter;
|
||
|
currentFilter = filter;
|
||
|
firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, old, currentFilter);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the file filter.
|
||
|
*
|
||
|
* @return The file filter.
|
||
|
*
|
||
|
* @see #setFileFilter(FileFilter)
|
||
|
*/
|
||
|
public FileFilter getFileFilter()
|
||
|
{
|
||
|
return currentFilter;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a custom {@link FileView} for the file chooser and sends a
|
||
|
* {@link PropertyChangeEvent} to all registered listeners. The property
|
||
|
* name is {@link #FILE_VIEW_CHANGED_PROPERTY}.
|
||
|
*
|
||
|
* @param fileView the file view (<code>null</code> permitted).
|
||
|
*
|
||
|
* @see #getFileView()
|
||
|
*/
|
||
|
public void setFileView(FileView fileView)
|
||
|
{
|
||
|
if (fv != fileView)
|
||
|
{
|
||
|
FileView old = fv;
|
||
|
fv = fileView;
|
||
|
firePropertyChange(FILE_VIEW_CHANGED_PROPERTY, old, fv);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the custom {@link FileView} for the file chooser.
|
||
|
*
|
||
|
* @return The file view (possibly <code>null</code>).
|
||
|
*/
|
||
|
public FileView getFileView()
|
||
|
{
|
||
|
return fv;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the name of the file, generated by the current (or default)
|
||
|
* {@link FileView}.
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*
|
||
|
* @return The file name.
|
||
|
*/
|
||
|
public String getName(File f)
|
||
|
{
|
||
|
String name = null;
|
||
|
if (fv != null)
|
||
|
name = fv.getName(f);
|
||
|
if (name == null)
|
||
|
name = getUI().getFileView(this).getName(f);
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the description of the file, generated by the current (or default)
|
||
|
* {@link FileView}.
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*
|
||
|
* @return The file description.
|
||
|
*/
|
||
|
public String getDescription(File f)
|
||
|
{
|
||
|
String result = null;
|
||
|
if (fv != null)
|
||
|
result = fv.getDescription(f);
|
||
|
if (result == null)
|
||
|
result = getUI().getFileView(this).getDescription(f);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the type description for the file, generated by the current (or
|
||
|
* default) {@link FileView}.
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*
|
||
|
* @return The file type description.
|
||
|
*/
|
||
|
public String getTypeDescription(File f)
|
||
|
{
|
||
|
String result = null;
|
||
|
if (fv != null)
|
||
|
result = getFileView().getTypeDescription(f);
|
||
|
if (result == null)
|
||
|
result = getUI().getFileView(this).getTypeDescription(f);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the icon provided by the current (or default) {@link FileView}.
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*
|
||
|
* @return An icon representing the file.
|
||
|
*/
|
||
|
public Icon getIcon(File f)
|
||
|
{
|
||
|
Icon result = null;
|
||
|
if (fv != null)
|
||
|
result = fv.getIcon(f);
|
||
|
if (result == null)
|
||
|
result = getUI().getFileView(this).getIcon(f);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if the file is traversable, and
|
||
|
* <code>false</code> otherwise.
|
||
|
*
|
||
|
* @param f the file or directory.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*/
|
||
|
public boolean isTraversable(File f)
|
||
|
{
|
||
|
return getFileSystemView().isTraversable(f).booleanValue();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if the file is accepted by the current
|
||
|
* file filter.
|
||
|
*
|
||
|
* @param f the file.
|
||
|
*
|
||
|
* @return A boolean.
|
||
|
*/
|
||
|
public boolean accept(File f)
|
||
|
{
|
||
|
if (f == null)
|
||
|
return true;
|
||
|
FileFilter ff = getFileFilter();
|
||
|
if (ff != null)
|
||
|
return ff.accept(f);
|
||
|
else
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the file system view for the file chooser and sends a
|
||
|
* {@link PropertyChangeEvent} to all registered listeners.
|
||
|
*
|
||
|
* @param fsv the file system view.
|
||
|
*/
|
||
|
public void setFileSystemView(FileSystemView fsv)
|
||
|
{
|
||
|
if (this.fsv != fsv)
|
||
|
{
|
||
|
FileSystemView old = this.fsv;
|
||
|
this.fsv = fsv;
|
||
|
firePropertyChange(FILE_SYSTEM_VIEW_CHANGED_PROPERTY, old, this.fsv);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the file system view being used by this file chooser.
|
||
|
*
|
||
|
* @return The file system view.
|
||
|
*
|
||
|
* @see #setFileSystemView(FileSystemView)
|
||
|
*/
|
||
|
public FileSystemView getFileSystemView()
|
||
|
{
|
||
|
return fsv;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Approves the selection. An {@link ActionEvent} is sent to all registered
|
||
|
* listeners.
|
||
|
*/
|
||
|
public void approveSelection()
|
||
|
{
|
||
|
retval = APPROVE_OPTION;
|
||
|
fireActionPerformed(APPROVE_SELECTION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Cancels the selection. An {@link ActionEvent} is sent to all registered
|
||
|
* listeners.
|
||
|
*/
|
||
|
public void cancelSelection()
|
||
|
{
|
||
|
retval = CANCEL_OPTION;
|
||
|
fireActionPerformed(CANCEL_SELECTION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an {@link ActionListener} to the file chooser.
|
||
|
*
|
||
|
* @param l the listener.
|
||
|
*/
|
||
|
public void addActionListener(ActionListener l)
|
||
|
{
|
||
|
listenerList.add(ActionListener.class, l);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes an {@link ActionListener} from this file chooser.
|
||
|
*
|
||
|
* @param l the listener.
|
||
|
*/
|
||
|
public void removeActionListener(ActionListener l)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
listenerList.remove(ActionListener.class, l);
|
||
|
}
|
||
|
catch (IllegalArgumentException e)
|
||
|
{
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the action listeners registered with this file chooser.
|
||
|
*
|
||
|
* @return An array of listeners.
|
||
|
*/
|
||
|
public ActionListener[] getActionListeners()
|
||
|
{
|
||
|
return (ActionListener[]) getListeners(ActionListener.class);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sends an @link {ActionEvent} to all registered listeners.
|
||
|
*
|
||
|
* @param command the action command.
|
||
|
*/
|
||
|
protected void fireActionPerformed(String command)
|
||
|
{
|
||
|
ActionListener[] list = getActionListeners();
|
||
|
ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
|
||
|
command);
|
||
|
|
||
|
for (int i = 0; i < list.length; i++)
|
||
|
list[i].actionPerformed(event);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Installs the UI delegate for the current look and feel.
|
||
|
*/
|
||
|
public void updateUI()
|
||
|
{
|
||
|
setUI((FileChooserUI) UIManager.getUI(this));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the UI delegate class identifier.
|
||
|
*
|
||
|
* @return <code>FileChooserUI</code>.
|
||
|
*/
|
||
|
public String getUIClassID()
|
||
|
{
|
||
|
return "FileChooserUI";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the UI delegate for the component.
|
||
|
*
|
||
|
* @return The UI delegate.
|
||
|
*/
|
||
|
public FileChooserUI getUI()
|
||
|
{
|
||
|
return (FileChooserUI) ui;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a string describing the attributes for the
|
||
|
* <code>JFileChooser</code> component, for use in debugging. The return
|
||
|
* value is guaranteed to be non-<code>null</code>, but the format of the
|
||
|
* string may vary between implementations.
|
||
|
*
|
||
|
* @return A string describing the attributes of the
|
||
|
* <code>JFileChooser</code>.
|
||
|
*/
|
||
|
protected String paramString()
|
||
|
{
|
||
|
CPStringBuilder sb = new CPStringBuilder(super.paramString());
|
||
|
sb.append(",approveButtonText=");
|
||
|
if (approveButtonText != null)
|
||
|
sb.append(approveButtonText);
|
||
|
sb.append(",currentDirectory=");
|
||
|
if (currentDir != null)
|
||
|
sb.append(currentDir);
|
||
|
sb.append(",dialogTitle=");
|
||
|
if (dialogTitle != null)
|
||
|
sb.append(dialogTitle);
|
||
|
sb.append(",dialogType=");
|
||
|
if (dialogType == OPEN_DIALOG)
|
||
|
sb.append("OPEN_DIALOG");
|
||
|
if (dialogType == SAVE_DIALOG)
|
||
|
sb.append("SAVE_DIALOG");
|
||
|
if (dialogType == CUSTOM_DIALOG)
|
||
|
sb.append("CUSTOM_DIALOG");
|
||
|
sb.append(",fileSelectionMode=");
|
||
|
if (fileSelectionMode == FILES_ONLY)
|
||
|
sb.append("FILES_ONLY");
|
||
|
if (fileSelectionMode == DIRECTORIES_ONLY)
|
||
|
sb.append("DIRECTORIES_ONLY");
|
||
|
if (fileSelectionMode == FILES_AND_DIRECTORIES)
|
||
|
sb.append("FILES_AND_DIRECTORIES");
|
||
|
sb.append(",returnValue=");
|
||
|
if (retval == APPROVE_OPTION)
|
||
|
sb.append("APPROVE_OPTION");
|
||
|
if (retval == CANCEL_OPTION)
|
||
|
sb.append("CANCEL_OPTION");
|
||
|
if (retval == ERROR_OPTION)
|
||
|
sb.append("ERROR_OPTION");
|
||
|
sb.append(",selectedFile=");
|
||
|
if (selectedFile != null)
|
||
|
sb.append(selectedFile);
|
||
|
sb.append(",useFileHiding=").append(fileHiding);
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the object that provides accessibility features for this
|
||
|
* <code>JFileChooser</code> component.
|
||
|
*
|
||
|
* @return The accessible context (an instance of
|
||
|
* {@link AccessibleJFileChooser}).
|
||
|
*/
|
||
|
public AccessibleContext getAccessibleContext()
|
||
|
{
|
||
|
if (accessibleContext == null)
|
||
|
accessibleContext = new AccessibleJFileChooser();
|
||
|
return accessibleContext;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Provides the accessibility features for the <code>JFileChooser</code>
|
||
|
* component.
|
||
|
*/
|
||
|
protected class AccessibleJFileChooser
|
||
|
extends JComponent.AccessibleJComponent
|
||
|
{
|
||
|
/**
|
||
|
* Creates a new instance of <code>AccessibleJFileChooser</code>.
|
||
|
*/
|
||
|
protected AccessibleJFileChooser()
|
||
|
{
|
||
|
// Nothing to do here.
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the accessible role for the <code>JFileChooser</code>
|
||
|
* component.
|
||
|
*
|
||
|
* @return {@link AccessibleRole#FILE_CHOOSER}.
|
||
|
*/
|
||
|
public AccessibleRole getAccessibleRole()
|
||
|
{
|
||
|
return AccessibleRole.FILE_CHOOSER;
|
||
|
}
|
||
|
}
|
||
|
}
|