mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-12 11:29:30 +00:00
1438 lines
36 KiB
Java
1438 lines
36 KiB
Java
/* BasicFileChooserUI.java --
|
|
Copyright (C) 2005 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.plaf.basic;
|
|
|
|
import java.awt.Window;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.event.MouseListener;
|
|
import java.beans.PropertyChangeListener;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Hashtable;
|
|
|
|
import javax.swing.AbstractAction;
|
|
import javax.swing.Action;
|
|
import javax.swing.Icon;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JComponent;
|
|
import javax.swing.JDialog;
|
|
import javax.swing.JFileChooser;
|
|
import javax.swing.JList;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JTextField;
|
|
import javax.swing.SwingUtilities;
|
|
import javax.swing.UIDefaults;
|
|
import javax.swing.UIManager;
|
|
import javax.swing.event.ListSelectionEvent;
|
|
import javax.swing.event.ListSelectionListener;
|
|
import javax.swing.filechooser.FileFilter;
|
|
import javax.swing.filechooser.FileSystemView;
|
|
import javax.swing.filechooser.FileView;
|
|
import javax.swing.plaf.ComponentUI;
|
|
import javax.swing.plaf.FileChooserUI;
|
|
import javax.swing.plaf.metal.MetalIconFactory;
|
|
|
|
|
|
/**
|
|
* A UI delegate for the {@link JFileChooser} component under the
|
|
* {@link BasicLookAndFeel}.
|
|
*/
|
|
public class BasicFileChooserUI extends FileChooserUI
|
|
{
|
|
/**
|
|
* A file filter that accepts all files.
|
|
*/
|
|
protected class AcceptAllFileFilter extends FileFilter
|
|
{
|
|
/**
|
|
* Creates a new instance.
|
|
*/
|
|
public AcceptAllFileFilter()
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
|
|
/**
|
|
* Returns <code>true</code> always, as all files are accepted by this
|
|
* filter.
|
|
*
|
|
* @param f the file.
|
|
*
|
|
* @return Always <code>true</code>.
|
|
*/
|
|
public boolean accept(File f)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns a description for this filter.
|
|
*
|
|
* @return A description for the file filter.
|
|
*/
|
|
public String getDescription()
|
|
{
|
|
return acceptAllFileFilterText;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles a user action to approve the dialog selection.
|
|
*
|
|
* @see BasicFileChooserUI#getApproveSelectionAction()
|
|
*/
|
|
protected class ApproveSelectionAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new ApproveSelectionAction object.
|
|
*/
|
|
protected ApproveSelectionAction()
|
|
{
|
|
super("approveSelection");
|
|
}
|
|
|
|
/**
|
|
* Sets the current selection and closes the dialog.
|
|
*
|
|
* @param e the action event.
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
Object obj = null;
|
|
if (parentPath != null)
|
|
obj = new String(parentPath + getFileName());
|
|
else
|
|
obj = filechooser.getSelectedFile();
|
|
if (obj != null)
|
|
{
|
|
File f = filechooser.getFileSystemView().createFileObject(obj.toString());
|
|
File currSelected = filechooser.getSelectedFile();
|
|
if (filechooser.isTraversable(f))
|
|
{
|
|
filechooser.setCurrentDirectory(currSelected);
|
|
filechooser.rescanCurrentDirectory();
|
|
}
|
|
else
|
|
{
|
|
filechooser.approveSelection();
|
|
closeDialog();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
File f = new File(filechooser.getCurrentDirectory(), getFileName());
|
|
if ( selectedDir != null )
|
|
f = selectedDir;
|
|
if (filechooser.isTraversable(f))
|
|
{
|
|
filechooser.setCurrentDirectory(f);
|
|
filechooser.rescanCurrentDirectory();
|
|
}
|
|
else
|
|
{
|
|
filechooser.setSelectedFile(f);
|
|
filechooser.approveSelection();
|
|
closeDialog();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Provides presentation information about files and directories.
|
|
*/
|
|
protected class BasicFileView extends FileView
|
|
{
|
|
/** Storage for cached icons. */
|
|
protected Hashtable<File, Icon> iconCache = new Hashtable<File, Icon>();
|
|
|
|
/**
|
|
* Creates a new instance.
|
|
*/
|
|
public BasicFileView()
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
|
|
/**
|
|
* Adds an icon to the cache, associating it with the given file/directory.
|
|
*
|
|
* @param f the file/directory.
|
|
* @param i the icon.
|
|
*/
|
|
public void cacheIcon(File f, Icon i)
|
|
{
|
|
iconCache.put(f, i);
|
|
}
|
|
|
|
/**
|
|
* Clears the icon cache.
|
|
*/
|
|
public void clearIconCache()
|
|
{
|
|
iconCache.clear();
|
|
}
|
|
|
|
/**
|
|
* Retrieves the icon associated with the specified file/directory, if
|
|
* there is one.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return The cached icon (or <code>null</code>).
|
|
*/
|
|
public Icon getCachedIcon(File f)
|
|
{
|
|
return (Icon) iconCache.get(f);
|
|
}
|
|
|
|
/**
|
|
* Returns a description of the given file/directory. In this
|
|
* implementation, the description is the same as the name returned by
|
|
* {@link #getName(File)}.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return A description of the given file/directory.
|
|
*/
|
|
public String getDescription(File f)
|
|
{
|
|
return getName(f);
|
|
}
|
|
|
|
/**
|
|
* Returns an icon appropriate for the given file or directory.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return An icon.
|
|
*/
|
|
public Icon getIcon(File f)
|
|
{
|
|
Icon val = getCachedIcon(f);
|
|
if (val != null)
|
|
return val;
|
|
if (filechooser.isTraversable(f))
|
|
val = directoryIcon;
|
|
else
|
|
val = fileIcon;
|
|
cacheIcon(f, val);
|
|
return val;
|
|
}
|
|
|
|
/**
|
|
* Returns the name for the given file/directory.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return The name of the file/directory.
|
|
*/
|
|
public String getName(File f)
|
|
{
|
|
String name = null;
|
|
if (f != null)
|
|
{
|
|
JFileChooser c = getFileChooser();
|
|
FileSystemView v = c.getFileSystemView();
|
|
name = v.getSystemDisplayName(f);
|
|
}
|
|
return name;
|
|
}
|
|
|
|
/**
|
|
* Returns a localised description for the type of file/directory.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return A type description for the given file/directory.
|
|
*/
|
|
public String getTypeDescription(File f)
|
|
{
|
|
if (filechooser.isTraversable(f))
|
|
return dirDescText;
|
|
else
|
|
return fileDescText;
|
|
}
|
|
|
|
/**
|
|
* Returns {@link Boolean#TRUE} if the given file/directory is hidden,
|
|
* and {@link Boolean#FALSE} otherwise.
|
|
*
|
|
* @param f the file/directory.
|
|
*
|
|
* @return {@link Boolean#TRUE} or {@link Boolean#FALSE}.
|
|
*/
|
|
public Boolean isHidden(File f)
|
|
{
|
|
return Boolean.valueOf(filechooser.getFileSystemView().isHiddenFile(f));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles an action to cancel the file chooser.
|
|
*
|
|
* @see BasicFileChooserUI#getCancelSelectionAction()
|
|
*/
|
|
protected class CancelSelectionAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new <code>CancelSelectionAction</code> object.
|
|
*/
|
|
protected CancelSelectionAction()
|
|
{
|
|
super(null);
|
|
}
|
|
|
|
/**
|
|
* Cancels the selection and closes the dialog.
|
|
*
|
|
* @param e the action event (ignored).
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
filechooser.setSelectedFile(null);
|
|
filechooser.setSelectedFiles(null);
|
|
filechooser.cancelSelection();
|
|
closeDialog();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An action to handle changes to the parent directory (for example, via
|
|
* a click on the "up folder" button).
|
|
*
|
|
* @see BasicFileChooserUI#getChangeToParentDirectoryAction()
|
|
*/
|
|
protected class ChangeToParentDirectoryAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new <code>ChangeToParentDirectoryAction</code> object.
|
|
*/
|
|
protected ChangeToParentDirectoryAction()
|
|
{
|
|
super("Go Up");
|
|
}
|
|
|
|
/**
|
|
* Handles the action event.
|
|
*
|
|
* @param e the action event.
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
filechooser.changeToParentDirectory();
|
|
filechooser.revalidate();
|
|
filechooser.repaint();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A mouse listener that handles double-click events.
|
|
*
|
|
* @see BasicFileChooserUI#createDoubleClickListener(JFileChooser, JList)
|
|
*/
|
|
protected class DoubleClickListener extends MouseAdapter
|
|
{
|
|
|
|
/** DOCUMENT ME! */
|
|
private Object lastSelected;
|
|
|
|
/** DOCUMENT ME! */
|
|
private JList list;
|
|
|
|
/**
|
|
* Creates a new DoubleClickListener object.
|
|
*
|
|
* @param list DOCUMENT ME!
|
|
*/
|
|
public DoubleClickListener(JList list)
|
|
{
|
|
this.list = list;
|
|
lastSelected = list.getSelectedValue();
|
|
setDirectorySelected(false);
|
|
}
|
|
|
|
/**
|
|
* Handles a mouse click event.
|
|
*
|
|
* @param e the event.
|
|
*/
|
|
public void mouseClicked(MouseEvent e)
|
|
{
|
|
Object p = list.getSelectedValue();
|
|
if (p == null)
|
|
return;
|
|
FileSystemView fsv = filechooser.getFileSystemView();
|
|
if (e.getClickCount() >= 2 && lastSelected != null &&
|
|
p.toString().equals(lastSelected.toString()))
|
|
{
|
|
File f = fsv.createFileObject(lastSelected.toString());
|
|
if (filechooser.isTraversable(f))
|
|
{
|
|
filechooser.setCurrentDirectory(f);
|
|
filechooser.rescanCurrentDirectory();
|
|
}
|
|
else
|
|
{
|
|
filechooser.setSelectedFile(f);
|
|
filechooser.approveSelection();
|
|
closeDialog();
|
|
}
|
|
}
|
|
else // single click
|
|
{
|
|
String path = p.toString();
|
|
File f = fsv.createFileObject(path);
|
|
filechooser.setSelectedFile(f);
|
|
|
|
if (filechooser.isMultiSelectionEnabled())
|
|
{
|
|
int[] inds = list.getSelectedIndices();
|
|
File[] allFiles = new File[inds.length];
|
|
for (int i = 0; i < inds.length; i++)
|
|
allFiles[i] = (File) list.getModel().getElementAt(inds[i]);
|
|
filechooser.setSelectedFiles(allFiles);
|
|
}
|
|
|
|
if (filechooser.isTraversable(f))
|
|
{
|
|
setDirectorySelected(true);
|
|
setDirectory(f);
|
|
}
|
|
else
|
|
{
|
|
setDirectorySelected(false);
|
|
setDirectory(null);
|
|
}
|
|
lastSelected = path;
|
|
parentPath = f.getParent();
|
|
|
|
if (f.isFile())
|
|
setFileName(f.getName());
|
|
else if (filechooser.getFileSelectionMode() !=
|
|
JFileChooser.FILES_ONLY)
|
|
setFileName(path);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles a mouse entered event (NOT IMPLEMENTED).
|
|
*
|
|
* @param e the mouse event.
|
|
*/
|
|
public void mouseEntered(MouseEvent e)
|
|
{
|
|
// FIXME: Implement
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An action that changes the file chooser to display the user's home
|
|
* directory.
|
|
*
|
|
* @see BasicFileChooserUI#getGoHomeAction()
|
|
*/
|
|
protected class GoHomeAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new <code>GoHomeAction</code> object.
|
|
*/
|
|
protected GoHomeAction()
|
|
{
|
|
super("Go Home");
|
|
}
|
|
|
|
/**
|
|
* Sets the directory to the user's home directory, and repaints the
|
|
* file chooser component.
|
|
*
|
|
* @param e the action event (ignored).
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
filechooser.setCurrentDirectory(filechooser.getFileSystemView()
|
|
.getHomeDirectory());
|
|
filechooser.revalidate();
|
|
filechooser.repaint();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An action that handles the creation of a new folder/directory.
|
|
*
|
|
* @see BasicFileChooserUI#getNewFolderAction()
|
|
*/
|
|
protected class NewFolderAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new <code>NewFolderAction</code> object.
|
|
*/
|
|
protected NewFolderAction()
|
|
{
|
|
super("New Folder");
|
|
}
|
|
|
|
/**
|
|
* Handles the event by creating a new folder.
|
|
*
|
|
* @param e the action event (ignored).
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
try
|
|
{
|
|
filechooser.getFileSystemView().createNewFolder(filechooser
|
|
.getCurrentDirectory());
|
|
}
|
|
catch (IOException ioe)
|
|
{
|
|
return;
|
|
}
|
|
filechooser.rescanCurrentDirectory();
|
|
filechooser.repaint();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A listener for selection events in the file list.
|
|
*
|
|
* @see BasicFileChooserUI#createListSelectionListener(JFileChooser)
|
|
*/
|
|
protected class SelectionListener implements ListSelectionListener
|
|
{
|
|
/**
|
|
* Creates a new <code>SelectionListener</code> object.
|
|
*/
|
|
protected SelectionListener()
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
|
|
/**
|
|
* Sets the JFileChooser to the selected file on an update
|
|
*
|
|
* @param e DOCUMENT ME!
|
|
*/
|
|
public void valueChanged(ListSelectionEvent e)
|
|
{
|
|
JList list = (JList) e.getSource();
|
|
Object f = list.getSelectedValue();
|
|
if (f == null)
|
|
return;
|
|
File file = filechooser.getFileSystemView().createFileObject(f.toString());
|
|
if (! filechooser.isTraversable(file))
|
|
{
|
|
selectedDir = null;
|
|
filechooser.setSelectedFile(file);
|
|
}
|
|
else
|
|
{
|
|
selectedDir = file;
|
|
filechooser.setSelectedFile(null);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @see BasicFileChooserUI#getUpdateAction()
|
|
*/
|
|
protected class UpdateAction extends AbstractAction
|
|
{
|
|
/**
|
|
* Creates a new UpdateAction object.
|
|
*/
|
|
protected UpdateAction()
|
|
{
|
|
super(null);
|
|
}
|
|
|
|
/**
|
|
* NOT YET IMPLEMENTED.
|
|
*
|
|
* @param e the action event.
|
|
*/
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
// FIXME: implement this
|
|
}
|
|
}
|
|
|
|
/** The localised mnemonic for the cancel button. */
|
|
protected int cancelButtonMnemonic;
|
|
|
|
/** The localised text for the cancel button. */
|
|
protected String cancelButtonText;
|
|
|
|
/** The localised tool tip text for the cancel button. */
|
|
protected String cancelButtonToolTipText;
|
|
|
|
/** An icon representing a computer. */
|
|
protected Icon computerIcon;
|
|
|
|
/** An icon for the "details view" button. */
|
|
protected Icon detailsViewIcon;
|
|
|
|
/** An icon representing a directory. */
|
|
protected Icon directoryIcon;
|
|
|
|
/** The localised Mnemonic for the open button. */
|
|
protected int directoryOpenButtonMnemonic;
|
|
|
|
/** The localised text for the open button. */
|
|
protected String directoryOpenButtonText;
|
|
|
|
/** The localised tool tip text for the open button. */
|
|
protected String directoryOpenButtonToolTipText;
|
|
|
|
/** An icon representing a file. */
|
|
protected Icon fileIcon;
|
|
|
|
/** An icon representing a floppy drive. */
|
|
protected Icon floppyDriveIcon;
|
|
|
|
/** An icon representing a hard drive. */
|
|
protected Icon hardDriveIcon;
|
|
|
|
/** The localised mnemonic for the "help" button. */
|
|
protected int helpButtonMnemonic;
|
|
|
|
/** The localised text for the "help" button. */
|
|
protected String helpButtonText;
|
|
|
|
/** The localised tool tip text for the help button. */
|
|
protected String helpButtonToolTipText;
|
|
|
|
/** An icon representing the user's home folder. */
|
|
protected Icon homeFolderIcon;
|
|
|
|
/** An icon for the "list view" button. */
|
|
protected Icon listViewIcon;
|
|
|
|
/** An icon for the "new folder" button. */
|
|
protected Icon newFolderIcon = directoryIcon;
|
|
|
|
/** The localised mnemonic for the "open" button. */
|
|
protected int openButtonMnemonic;
|
|
|
|
/** The localised text for the "open" button. */
|
|
protected String openButtonText;
|
|
|
|
/** The localised tool tip text for the "open" button. */
|
|
protected String openButtonToolTipText;
|
|
|
|
/** The localised mnemonic for the "save" button. */
|
|
protected int saveButtonMnemonic;
|
|
|
|
/** The localised text for the "save" button. */
|
|
protected String saveButtonText;
|
|
|
|
/** The localised tool tip text for the save button. */
|
|
protected String saveButtonToolTipText;
|
|
|
|
/** The localised mnemonic for the "update" button. */
|
|
protected int updateButtonMnemonic;
|
|
|
|
/** The localised text for the "update" button. */
|
|
protected String updateButtonText;
|
|
|
|
/** The localised tool tip text for the "update" button. */
|
|
protected String updateButtonToolTipText;
|
|
|
|
/** An icon for the "up folder" button. */
|
|
protected Icon upFolderIcon;
|
|
|
|
// -- begin private, but package local since used in inner classes --
|
|
|
|
/** The file chooser component represented by this UI delegate. */
|
|
JFileChooser filechooser;
|
|
|
|
/** The model for the directory list. */
|
|
BasicDirectoryModel model;
|
|
|
|
/** The file filter for all files. */
|
|
FileFilter acceptAll = new AcceptAllFileFilter();
|
|
|
|
/** The default file view. */
|
|
FileView fv = new BasicFileView();
|
|
|
|
/** The accept (open/save) button. */
|
|
JButton accept;
|
|
|
|
/** An optional accessory panel. */
|
|
JPanel accessoryPanel = new JPanel();
|
|
|
|
/** A property change listener. */
|
|
PropertyChangeListener propertyChangeListener;
|
|
|
|
/** The text describing the filter for "all files". */
|
|
String acceptAllFileFilterText;
|
|
|
|
/** The text describing a directory type. */
|
|
String dirDescText;
|
|
|
|
/** The text describing a file type. */
|
|
String fileDescText;
|
|
|
|
/** Is a directory selected? */
|
|
boolean dirSelected;
|
|
|
|
/** The current directory. */
|
|
File currDir;
|
|
|
|
// FIXME: describe what is contained in the bottom panel
|
|
/** The bottom panel. */
|
|
JPanel bottomPanel;
|
|
|
|
/** The close panel. */
|
|
JPanel closePanel;
|
|
|
|
/** Text box that displays file name */
|
|
JTextField entry;
|
|
|
|
/** Current parent path */
|
|
String parentPath;
|
|
|
|
/**
|
|
* The action for the 'approve' button.
|
|
* @see #getApproveSelectionAction()
|
|
*/
|
|
private ApproveSelectionAction approveSelectionAction;
|
|
|
|
/**
|
|
* The action for the 'cancel' button.
|
|
* @see #getCancelSelectionAction()
|
|
*/
|
|
private CancelSelectionAction cancelSelectionAction;
|
|
|
|
/**
|
|
* The action for the 'go home' control button.
|
|
* @see #getGoHomeAction()
|
|
*/
|
|
private GoHomeAction goHomeAction;
|
|
|
|
/**
|
|
* The action for the 'up folder' control button.
|
|
* @see #getChangeToParentDirectoryAction()
|
|
*/
|
|
private ChangeToParentDirectoryAction changeToParentDirectoryAction;
|
|
|
|
/**
|
|
* The action for the 'new folder' control button.
|
|
* @see #getNewFolderAction()
|
|
*/
|
|
private NewFolderAction newFolderAction;
|
|
|
|
/**
|
|
* The action for ???. // FIXME: what is this?
|
|
* @see #getUpdateAction()
|
|
*/
|
|
private UpdateAction updateAction;
|
|
|
|
/**
|
|
* When in FILES_ONLY, mode a directory cannot be selected, so
|
|
* we save a reference to any it here. This is used to enter
|
|
* the directory on "Open" when in that mode.
|
|
*/
|
|
private File selectedDir;
|
|
|
|
// -- end private --
|
|
|
|
/**
|
|
* Closes the dialog.
|
|
*/
|
|
void closeDialog()
|
|
{
|
|
Window owner = SwingUtilities.windowForComponent(filechooser);
|
|
if (owner instanceof JDialog)
|
|
((JDialog) owner).dispose();
|
|
}
|
|
|
|
/**
|
|
* Creates a new <code>BasicFileChooserUI</code> object.
|
|
*
|
|
* @param b the file chooser component.
|
|
*/
|
|
public BasicFileChooserUI(JFileChooser b)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Returns a UI delegate for the given component.
|
|
*
|
|
* @param c the component (should be a {@link JFileChooser}).
|
|
*
|
|
* @return A new UI delegate.
|
|
*/
|
|
public static ComponentUI createUI(JComponent c)
|
|
{
|
|
return new BasicFileChooserUI((JFileChooser) c);
|
|
}
|
|
|
|
/**
|
|
* Installs the UI for the specified component.
|
|
*
|
|
* @param c the component (should be a {@link JFileChooser}).
|
|
*/
|
|
public void installUI(JComponent c)
|
|
{
|
|
if (c instanceof JFileChooser)
|
|
{
|
|
JFileChooser fc = (JFileChooser) c;
|
|
this.filechooser = fc;
|
|
fc.resetChoosableFileFilters();
|
|
createModel();
|
|
clearIconCache();
|
|
installDefaults(fc);
|
|
installComponents(fc);
|
|
installListeners(fc);
|
|
|
|
File path = filechooser.getCurrentDirectory();
|
|
if (path != null)
|
|
parentPath = path.getParent();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Uninstalls this UI from the given component.
|
|
*
|
|
* @param c the component (should be a {@link JFileChooser}).
|
|
*/
|
|
public void uninstallUI(JComponent c)
|
|
{
|
|
model = null;
|
|
uninstallListeners(filechooser);
|
|
uninstallComponents(filechooser);
|
|
uninstallDefaults(filechooser);
|
|
filechooser = null;
|
|
}
|
|
|
|
// FIXME: Indent the entries in the combobox
|
|
// Made this method package private to access it from within inner classes
|
|
// with better performance
|
|
void boxEntries()
|
|
{
|
|
ArrayList parentFiles = new ArrayList();
|
|
File parent = filechooser.getCurrentDirectory();
|
|
if (parent == null)
|
|
parent = filechooser.getFileSystemView().getDefaultDirectory();
|
|
while (parent != null)
|
|
{
|
|
String name = parent.getName();
|
|
if (name.equals(""))
|
|
name = parent.getAbsolutePath();
|
|
|
|
parentFiles.add(parentFiles.size(), name);
|
|
parent = parent.getParentFile();
|
|
}
|
|
|
|
if (parentFiles.size() == 0)
|
|
return;
|
|
|
|
}
|
|
|
|
/**
|
|
* Creates and install the subcomponents for the file chooser.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
public void installComponents(JFileChooser fc)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Uninstalls the components from the file chooser.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
public void uninstallComponents(JFileChooser fc)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Installs the listeners required by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void installListeners(JFileChooser fc)
|
|
{
|
|
propertyChangeListener = createPropertyChangeListener(filechooser);
|
|
if (propertyChangeListener != null)
|
|
filechooser.addPropertyChangeListener(propertyChangeListener);
|
|
fc.addPropertyChangeListener(getModel());
|
|
}
|
|
|
|
/**
|
|
* Uninstalls the listeners previously installed by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void uninstallListeners(JFileChooser fc)
|
|
{
|
|
if (propertyChangeListener != null)
|
|
{
|
|
filechooser.removePropertyChangeListener(propertyChangeListener);
|
|
propertyChangeListener = null;
|
|
}
|
|
fc.removePropertyChangeListener(getModel());
|
|
}
|
|
|
|
/**
|
|
* Installs the defaults for this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void installDefaults(JFileChooser fc)
|
|
{
|
|
installIcons(fc);
|
|
installStrings(fc);
|
|
}
|
|
|
|
/**
|
|
* Uninstalls the defaults previously added by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void uninstallDefaults(JFileChooser fc)
|
|
{
|
|
uninstallStrings(fc);
|
|
uninstallIcons(fc);
|
|
}
|
|
|
|
/**
|
|
* Installs the icons for this UI delegate.
|
|
*
|
|
* @param fc the file chooser (ignored).
|
|
*/
|
|
protected void installIcons(JFileChooser fc)
|
|
{
|
|
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
|
|
computerIcon = MetalIconFactory.getTreeComputerIcon();
|
|
detailsViewIcon = defaults.getIcon("FileChooser.detailsViewIcon");
|
|
directoryIcon = new MetalIconFactory.TreeFolderIcon();
|
|
fileIcon = new MetalIconFactory.TreeLeafIcon();
|
|
floppyDriveIcon = MetalIconFactory.getTreeFloppyDriveIcon();
|
|
hardDriveIcon = MetalIconFactory.getTreeHardDriveIcon();
|
|
homeFolderIcon = defaults.getIcon("FileChooser.homeFolderIcon");
|
|
listViewIcon = defaults.getIcon("FileChooser.listViewIcon");
|
|
newFolderIcon = defaults.getIcon("FileChooser.newFolderIcon");
|
|
upFolderIcon = defaults.getIcon("FileChooser.upFolderIcon");
|
|
}
|
|
|
|
/**
|
|
* Uninstalls the icons previously added by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void uninstallIcons(JFileChooser fc)
|
|
{
|
|
computerIcon = null;
|
|
detailsViewIcon = null;
|
|
directoryIcon = null;
|
|
fileIcon = null;
|
|
floppyDriveIcon = null;
|
|
hardDriveIcon = null;
|
|
homeFolderIcon = null;
|
|
listViewIcon = null;
|
|
newFolderIcon = null;
|
|
upFolderIcon = null;
|
|
}
|
|
|
|
/**
|
|
* Installs the strings used by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void installStrings(JFileChooser fc)
|
|
{
|
|
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
|
|
|
|
dirDescText = defaults.getString("FileChooser.directoryDescriptionText");
|
|
fileDescText = defaults.getString("FileChooser.fileDescriptionText");
|
|
|
|
acceptAllFileFilterText = defaults.getString("FileChooser.acceptAllFileFilterText");
|
|
cancelButtonText = "Cancel";
|
|
cancelButtonToolTipText = "Abort file chooser dialog";
|
|
cancelButtonMnemonic = new Integer((String) UIManager.get("FileChooser.cancelButtonMnemonic")).intValue();
|
|
|
|
directoryOpenButtonText = "Open";
|
|
directoryOpenButtonToolTipText = "Open selected directory";
|
|
directoryOpenButtonMnemonic
|
|
= new Integer((String) UIManager.get("FileChooser.directoryOpenButtonMnemonic")).intValue();
|
|
|
|
helpButtonText = "Help";
|
|
helpButtonToolTipText = "FileChooser help";
|
|
helpButtonMnemonic = new Integer((String) UIManager.get("FileChooser.helpButtonMnemonic")).intValue();
|
|
|
|
openButtonText = "Open";
|
|
openButtonToolTipText = "Open selected file";
|
|
openButtonMnemonic = new Integer((String) UIManager.get("FileChooser.openButtonMnemonic")).intValue();
|
|
|
|
saveButtonText = "Save";
|
|
saveButtonToolTipText = "Save selected file";
|
|
saveButtonMnemonic = new Integer((String) UIManager.get("FileChooser.saveButtonMnemonic")).intValue();
|
|
|
|
updateButtonText = "Update";
|
|
updateButtonToolTipText = "Update directory listing";
|
|
updateButtonMnemonic = new Integer((String) UIManager.get("FileChooser.updateButtonMnemonic")).intValue();
|
|
}
|
|
|
|
/**
|
|
* Uninstalls the strings previously added by this UI delegate.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
protected void uninstallStrings(JFileChooser fc)
|
|
{
|
|
acceptAllFileFilterText = null;
|
|
dirDescText = null;
|
|
fileDescText = null;
|
|
|
|
cancelButtonText = null;
|
|
cancelButtonToolTipText = null;
|
|
|
|
directoryOpenButtonText = null;
|
|
directoryOpenButtonToolTipText = null;
|
|
|
|
helpButtonText = null;
|
|
helpButtonToolTipText = null;
|
|
|
|
openButtonText = null;
|
|
openButtonToolTipText = null;
|
|
|
|
saveButtonText = null;
|
|
saveButtonToolTipText = null;
|
|
|
|
updateButtonText = null;
|
|
updateButtonToolTipText = null;
|
|
}
|
|
|
|
/**
|
|
* Creates a new directory model.
|
|
*/
|
|
protected void createModel()
|
|
{
|
|
model = new BasicDirectoryModel(filechooser);
|
|
}
|
|
|
|
/**
|
|
* Returns the directory model.
|
|
*
|
|
* @return The directory model.
|
|
*/
|
|
public BasicDirectoryModel getModel()
|
|
{
|
|
return model;
|
|
}
|
|
|
|
/**
|
|
* Creates a listener to handle changes to the properties of the given
|
|
* file chooser component.
|
|
*
|
|
* @param fc the file chooser component.
|
|
*
|
|
* @return A new listener.
|
|
*/
|
|
public PropertyChangeListener createPropertyChangeListener(JFileChooser fc)
|
|
{
|
|
// The RI returns null here, so do we.
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Returns the current file name.
|
|
*
|
|
* @return The current file name.
|
|
*/
|
|
public String getFileName()
|
|
{
|
|
return entry.getText();
|
|
}
|
|
|
|
/**
|
|
* Returns the current directory name.
|
|
*
|
|
* @return The directory name.
|
|
*
|
|
* @see #setDirectoryName(String)
|
|
*/
|
|
public String getDirectoryName()
|
|
{
|
|
// XXX: I don't see a case where the thing returns something non-null..
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Sets the file name.
|
|
*
|
|
* @param filename the file name.
|
|
*
|
|
* @see #getFileName()
|
|
*/
|
|
public void setFileName(String filename)
|
|
{
|
|
// FIXME: it might be the case that this method provides an access
|
|
// point for the JTextField (or whatever) a subclass is using...
|
|
//this.filename = filename;
|
|
}
|
|
|
|
/**
|
|
* Sets the directory name (NOT IMPLEMENTED).
|
|
*
|
|
* @param dirname the directory name.
|
|
*
|
|
* @see #getDirectoryName()
|
|
*/
|
|
public void setDirectoryName(String dirname)
|
|
{
|
|
// FIXME: Implement
|
|
}
|
|
|
|
/**
|
|
* Rescans the current directory.
|
|
*
|
|
* @param fc the file chooser.
|
|
*/
|
|
public void rescanCurrentDirectory(JFileChooser fc)
|
|
{
|
|
getModel().validateFileCache();
|
|
}
|
|
|
|
/**
|
|
* NOT YET IMPLEMENTED.
|
|
*
|
|
* @param fc the file chooser.
|
|
* @param f the file.
|
|
*/
|
|
public void ensureFileIsVisible(JFileChooser fc, File f)
|
|
{
|
|
// XXX: Not sure what this does.
|
|
}
|
|
|
|
/**
|
|
* Returns the {@link JFileChooser} component that this UI delegate
|
|
* represents.
|
|
*
|
|
* @return The component represented by this UI delegate.
|
|
*/
|
|
public JFileChooser getFileChooser()
|
|
{
|
|
return filechooser;
|
|
}
|
|
|
|
/**
|
|
* Returns the optional accessory panel.
|
|
*
|
|
* @return The optional accessory panel.
|
|
*/
|
|
public JPanel getAccessoryPanel()
|
|
{
|
|
return accessoryPanel;
|
|
}
|
|
|
|
/**
|
|
* Returns the approve (open or save) button for the dialog.
|
|
*
|
|
* @param fc the file chooser.
|
|
*
|
|
* @return The button.
|
|
*/
|
|
protected JButton getApproveButton(JFileChooser fc)
|
|
{
|
|
return accept;
|
|
}
|
|
|
|
/**
|
|
* Returns the tool tip text for the approve (open/save) button. This first
|
|
* checks the file chooser to see if a value has been explicitly set - if
|
|
* not, a default value appropriate for the type of file chooser is
|
|
* returned.
|
|
*
|
|
* @param fc the file chooser.
|
|
*
|
|
* @return The tool tip text.
|
|
*/
|
|
public String getApproveButtonToolTipText(JFileChooser fc)
|
|
{
|
|
if (fc.getApproveButtonToolTipText() != null)
|
|
return fc.getApproveButtonToolTipText();
|
|
else if (fc.getDialogType() == JFileChooser.SAVE_DIALOG)
|
|
return saveButtonToolTipText;
|
|
else
|
|
return openButtonToolTipText;
|
|
}
|
|
|
|
/**
|
|
* Clears the icon cache.
|
|
*/
|
|
public void clearIconCache()
|
|
{
|
|
if (fv instanceof BasicFileView)
|
|
((BasicFileView) fv).clearIconCache();
|
|
}
|
|
|
|
/**
|
|
* Creates a new listener to handle selections in the file list.
|
|
*
|
|
* @param fc the file chooser component.
|
|
*
|
|
* @return A new instance of {@link SelectionListener}.
|
|
*/
|
|
public ListSelectionListener createListSelectionListener(JFileChooser fc)
|
|
{
|
|
return new SelectionListener();
|
|
}
|
|
|
|
/**
|
|
* Creates a new listener to handle double-click events.
|
|
*
|
|
* @param fc the file chooser component.
|
|
* @param list the list.
|
|
*
|
|
* @return A new instance of {@link DoubleClickListener}.
|
|
*/
|
|
protected MouseListener createDoubleClickListener(JFileChooser fc, JList list)
|
|
{
|
|
return new DoubleClickListener(list);
|
|
}
|
|
|
|
/**
|
|
* Returns <code>true</code> if a directory is selected, and
|
|
* <code>false</code> otherwise.
|
|
*
|
|
* @return A boolean.
|
|
*/
|
|
protected boolean isDirectorySelected()
|
|
{
|
|
return dirSelected;
|
|
}
|
|
|
|
/**
|
|
* Sets the flag that indicates whether the current directory is selected.
|
|
*
|
|
* @param selected the new flag value.
|
|
*/
|
|
protected void setDirectorySelected(boolean selected)
|
|
{
|
|
dirSelected = selected;
|
|
}
|
|
|
|
/**
|
|
* Returns the current directory.
|
|
*
|
|
* @return The current directory.
|
|
*/
|
|
protected File getDirectory()
|
|
{
|
|
return currDir;
|
|
}
|
|
|
|
/**
|
|
* Sets the current directory.
|
|
*
|
|
* @param f the directory.
|
|
*/
|
|
protected void setDirectory(File f)
|
|
{
|
|
currDir = f;
|
|
}
|
|
|
|
/**
|
|
* Returns the "accept all" file filter.
|
|
*
|
|
* @param fc the file chooser component.
|
|
*
|
|
* @return The "accept all" file filter.
|
|
*/
|
|
public FileFilter getAcceptAllFileFilter(JFileChooser fc)
|
|
{
|
|
return acceptAll;
|
|
}
|
|
|
|
/**
|
|
* Returns the default file view (NOT the file view from the file chooser,
|
|
* if there is one).
|
|
*
|
|
* @param fc the file chooser component.
|
|
*
|
|
* @return The file view.
|
|
*
|
|
* @see JFileChooser#getFileView()
|
|
*/
|
|
public FileView getFileView(JFileChooser fc)
|
|
{
|
|
return fv;
|
|
}
|
|
|
|
/**
|
|
* Returns the dialog title.
|
|
*
|
|
* @param fc the file chooser (<code>null</code> not permitted).
|
|
*
|
|
* @return The dialog title.
|
|
*
|
|
* @see JFileChooser#getDialogTitle()
|
|
*/
|
|
public String getDialogTitle(JFileChooser fc)
|
|
{
|
|
String result = fc.getDialogTitle();
|
|
if (result == null)
|
|
result = getApproveButtonText(fc);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Returns the approve button mnemonic.
|
|
*
|
|
* @param fc the file chooser (<code>null</code> not permitted).
|
|
*
|
|
* @return The approve button mnemonic.
|
|
*
|
|
* @see JFileChooser#getApproveButtonMnemonic()
|
|
*/
|
|
public int getApproveButtonMnemonic(JFileChooser fc)
|
|
{
|
|
if (fc.getApproveButtonMnemonic() != 0)
|
|
return fc.getApproveButtonMnemonic();
|
|
else if (fc.getDialogType() == JFileChooser.SAVE_DIALOG)
|
|
return saveButtonMnemonic;
|
|
else
|
|
return openButtonMnemonic;
|
|
}
|
|
|
|
/**
|
|
* Returns the approve button text.
|
|
*
|
|
* @param fc the file chooser (<code>null</code> not permitted).
|
|
*
|
|
* @return The approve button text.
|
|
*
|
|
* @see JFileChooser#getApproveButtonText()
|
|
*/
|
|
public String getApproveButtonText(JFileChooser fc)
|
|
{
|
|
String result = fc.getApproveButtonText();
|
|
if (result == null)
|
|
{
|
|
if (fc.getDialogType() == JFileChooser.SAVE_DIALOG)
|
|
result = saveButtonText;
|
|
else
|
|
result = openButtonText;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates and returns a new action that will be used with the "new folder"
|
|
* button.
|
|
*
|
|
* @return A new instance of {@link NewFolderAction}.
|
|
*/
|
|
public Action getNewFolderAction()
|
|
{
|
|
if (newFolderAction == null)
|
|
newFolderAction = new NewFolderAction();
|
|
return newFolderAction;
|
|
}
|
|
|
|
/**
|
|
* Creates and returns a new action that will be used with the "home folder"
|
|
* button.
|
|
*
|
|
* @return A new instance of {@link GoHomeAction}.
|
|
*/
|
|
public Action getGoHomeAction()
|
|
{
|
|
if (goHomeAction == null)
|
|
goHomeAction = new GoHomeAction();
|
|
return goHomeAction;
|
|
}
|
|
|
|
/**
|
|
* Returns the action that handles events for the "up folder" control button.
|
|
*
|
|
* @return An instance of {@link ChangeToParentDirectoryAction}.
|
|
*/
|
|
public Action getChangeToParentDirectoryAction()
|
|
{
|
|
if (changeToParentDirectoryAction == null)
|
|
changeToParentDirectoryAction = new ChangeToParentDirectoryAction();
|
|
return changeToParentDirectoryAction;
|
|
}
|
|
|
|
/**
|
|
* Returns the action that handles events for the "approve" button.
|
|
*
|
|
* @return An instance of {@link ApproveSelectionAction}.
|
|
*/
|
|
public Action getApproveSelectionAction()
|
|
{
|
|
if (approveSelectionAction == null)
|
|
approveSelectionAction = new ApproveSelectionAction();
|
|
return approveSelectionAction;
|
|
}
|
|
|
|
/**
|
|
* Returns the action that handles events for the "cancel" button.
|
|
*
|
|
* @return An instance of {@link CancelSelectionAction}.
|
|
*/
|
|
public Action getCancelSelectionAction()
|
|
{
|
|
if (cancelSelectionAction == null)
|
|
cancelSelectionAction = new CancelSelectionAction();
|
|
return cancelSelectionAction;
|
|
}
|
|
|
|
/**
|
|
* Returns the update action (an instance of {@link UpdateAction}).
|
|
*
|
|
* @return An action.
|
|
*/
|
|
public Action getUpdateAction()
|
|
{
|
|
if (updateAction == null)
|
|
updateAction = new UpdateAction();
|
|
return updateAction;
|
|
}
|
|
}
|