/* * File : FileChooserForFiles.java * Created : 18-apr-2002 16:43 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.File; import java.lang.reflect.Method; import javax.swing.JFileChooser; import javax.swing.filechooser.FileSystemView; import javax.swing.plaf.FileChooserUI; import javax.swing.plaf.metal.MetalFileChooserUI; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class FileChooserForFiles extends JFileChooser{ /** Creates new FileChooserForFiles */ public FileChooserForFiles(){ setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(File file) { super(file); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(File currentDirectory, FileSystemView fsv) { super(currentDirectory, fsv); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(FileSystemView fsw) { super(fsw); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(String file) { super(file); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(String currentDirectory, FileSystemView fsv) { super(currentDirectory, fsv); setFileSelectionMode(JFileChooser.FILES_ONLY); } @Override public void setCurrentDirectory(final File dir) { final String oldFileName = getCurrentFileName(); super.setCurrentDirectory(dir); // TODO: interpret oldFilename for multiselection if (oldFileName != null && oldFileName.indexOf('"')== -1) { if (getCurrentFileName() == null) { setSelectedFile(new File(dir, oldFileName)); } } } static Class<?> WindowsFileChooserUIClass; static Method getFileNameMethod; static{ try{ // 03-Apr-2008: Perform a previous check of the class as resource in order to avoid // uncatchable exceptions in applets if(FileChooserForFiles.class.getResource("/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.class")!=null){ WindowsFileChooserUIClass=Class.forName("com.sun.java.swing.plaf.windows.WindowsFileChooserUI"); if(WindowsFileChooserUIClass!=null){ getFileNameMethod=WindowsFileChooserUIClass.getMethod("getFileName", (Class[])null); } } } catch(Exception ex){ // Class not found: ignore } } /** JDKBUG: get current selected filename. */ private String getCurrentFileName() { final FileChooserUI fchui = getUI(); String fileName; if (fchui instanceof MetalFileChooserUI) { fileName = ((MetalFileChooserUI)fchui).getFileName(); } else if(WindowsFileChooserUIClass!=null && WindowsFileChooserUIClass.isInstance(fchui) && getFileNameMethod!=null) { try{ fileName = (String)getFileNameMethod.invoke(fchui, (Object[])null); } catch(Exception ex){ fileName=null; } } else { fileName = null; } return fileName == null || fileName.trim().length()== 0 ? null : fileName; } public void directSetSelectedFile(final File selectedFile){ super.setSelectedFile(selectedFile); } /** JDKBUG: avoid unsetting filename when a directory is selected. */ @Override public void setSelectedFile(final File selectedFile) { if (selectedFile != null) { if ((selectedFile.isDirectory() && isDirectorySelectionEnabled()) || (!selectedFile.isDirectory() && isFileSelectionEnabled())) { super.setSelectedFile(selectedFile); } } } }