/*
* Copyright (C) 2004 The Concord Consortium, Inc.,
* 10 Concord Crossing, Concord, MA 01742
*
* Web Site: http://www.concord.org
* Email: info@concord.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* END LICENSE */
package org.concord.swing;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.prefs.Preferences;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class CCFileDialog extends FileDialog {
public final static String PREFERENCE_DOMAIN ="org/concord/swing/CCFileDialog";
public final static String DEFAULT_NAME ="org.concord.swing.CCFileDialog";
public final static int FILES_ONLY = 1;
public final static int FILES_AND_DIRECTORIES = 2;
public final static int DIRECTORIES_ONLY = 3;
private String preferencesKey;
private boolean preferencesKeyWasSet = false;
private int fileSelectionMode = 1;
public CCFileDialog() {
this(DEFAULT_NAME);
}
public CCFileDialog(String preferencesKey) {
super(new Frame());
//Frame frame = (Frame)SwingUtilities.getRoot(this);
setPreferencesKey(preferencesKey);
checkingPreferences();
}
public CCFileDialog(Frame parent) {
this(parent, null, DEFAULT_NAME);
}
public CCFileDialog(Frame parent, String title) {
this(parent, title, DEFAULT_NAME);
}
public CCFileDialog(Frame parent, String title, String preferencesKey) {
super(parent, title);
setPreferencesKey(preferencesKey);
settingPreferences();
}
public CCFileDialog(Frame parent, String title, int mode) {
this(parent, title, mode, DEFAULT_NAME);
}
public CCFileDialog(Frame parent, String title, int mode, String preferencesKey) {
super(parent, title, mode);
setPreferencesKey(preferencesKey);
settingPreferences();
}
public void setDirectory(String dir) {
super.setDirectory(dir);
if(preferencesKeyWasSet){
settingPreferences();
}
}
protected void setPreferencesKey(String preferencesKey){
this.preferencesKey = (preferencesKey == null)?DEFAULT_NAME:preferencesKey;
preferencesKeyWasSet = true;
}
protected void checkingPreferences(){
Preferences userPreferences = Preferences.userRoot();
Preferences dialogPreferences = null;
try{
dialogPreferences = userPreferences.node(PREFERENCE_DOMAIN);
}catch(Throwable t){
dialogPreferences = null;
}
if(dialogPreferences == null) return;
String suggestedPath = dialogPreferences.get(preferencesKey,null);
if(suggestedPath == null){
try{
suggestedPath = (new File(getDirectory())).getCanonicalPath();
}catch(Throwable t){}
if(suggestedPath == null) suggestedPath = System.getProperty("user.dir");
}
File suggestedFile = new File(suggestedPath);
if(suggestedFile != null && suggestedFile.exists() && suggestedFile.isDirectory()){
try {
super.setDirectory(suggestedFile.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
protected void settingPreferences(){
if(preferencesKey == null) preferencesKey = DEFAULT_NAME;
String dir = getDirectory();
File currDirectory = null;
if(dir == null) {
checkingPreferences();
dir = getDirectory();
}
if(dir != null) currDirectory = new File(dir);
String canonicalPath = null;
try{
if(currDirectory != null)
canonicalPath = currDirectory.getCanonicalPath();
}catch(Throwable t){}
if(canonicalPath == null) canonicalPath = System.getProperty("user.dir");
Preferences userPreferences = Preferences.userRoot();
Preferences dialogPreferences = null;
try{
dialogPreferences = userPreferences.node(PREFERENCE_DOMAIN);
}catch(Throwable t){
dialogPreferences = null;
}
if(dialogPreferences == null) return;
dialogPreferences.put(preferencesKey,canonicalPath);
}
public void setFileSelectionMode(int fileSelectionMode) {
if(fileSelectionMode != FILES_ONLY &&
fileSelectionMode != FILES_AND_DIRECTORIES &&
fileSelectionMode != DIRECTORIES_ONLY)
throw new IllegalArgumentException(
"Must be either CCFileDialog.FILES_ONLY, " +
"CCFileDialog.FILES_AND_DIRECTORIES, or " +
"CCFileDialog.DIRECTORIES_ONLY");
this.fileSelectionMode = fileSelectionMode;
}
public int getFileSelectionMode() {
return fileSelectionMode;
}
public void show() {
if(fileSelectionMode == DIRECTORIES_ONLY) {
String message = "Since you are supposed to open a folder,\n " +
"all the acceptable files in the same folder\n " +
"will be selected.";
JOptionPane.showMessageDialog(null, message, "FYI", JOptionPane.INFORMATION_MESSAGE);
}
super.show();
}
public String getFile() {
if(fileSelectionMode == DIRECTORIES_ONLY) {
return super.getDirectory();
}
return super.getFile();
}
public static void main(String[] args) {
JFrame frame = new JFrame("CCFileDialog Test");
JButton openButton = new JButton("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CCFileDialog fileDialog = new CCFileDialog();
CCFilenameFilter filenameFilter = new CCFilenameFilter();
filenameFilter.setAcceptableExtension("jnlp");
//filenameFilter.setFileSelectionMode(CCFilenameFilter.DIRECTORY_ONLY);
fileDialog.setFilenameFilter(filenameFilter);
fileDialog.setFileSelectionMode(DIRECTORIES_ONLY);
fileDialog.show();
System.out.println("dir: " + fileDialog.getFile());
String dir = fileDialog.getFile();
File fd = new File(dir);
File[] fs = fd.listFiles();
for(int i = 0; i < fs.length; i++) {
String filename = fs[i].getName();
if(filename.lastIndexOf(".") == -1) return;
String ext = filename.substring(filename.lastIndexOf(".")+1, filename.length());
if(ext.equalsIgnoreCase(filenameFilter.getAcceptableExtension()))
System.out.println(fs[i].getName());
}
//fileDialog.show();
//System.out.println("file: " + fileDialog.getFile());
}
});
frame.getContentPane().add(openButton);
frame.pack();
frame.show();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}