mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |