package processing.app.tools;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;
import javax.swing.JFileChooser;
/** File chooser additions, cannibalized from PApplet. */
class Chooser {
static final boolean useNativeSelect = true;
static abstract class Callback {
//abstract void select(File file);
void handle(final File file) {
EventQueue.invokeLater(new Runnable() {
// new Thread(new Runnable() {
public void run() {
select(file);
}
});
// }).start();
}
abstract void select(File file);
}
// Frame parent;
//
// public Chooser(Frame parent) {
// this.parent = parent;
// }
/**
* Open a platform-specific file chooser dialog to select a file for input.
* After the selection is made, the selected File will be passed to the
* 'callback' function. If the dialog is closed or canceled, null will be
* sent to the function, so that the program is not waiting for additional
* input. The callback is necessary because of how threading works.
*
* <pre>
* void setup() {
* selectInput("Select a file to process:", "fileSelected");
* }
*
* void fileSelected(File selection) {
* if (selection == null) {
* println("Window was closed or the user hit cancel.");
* } else {
* println("User selected " + fileSeleted.getAbsolutePath());
* }
* }
* </pre>
*
* For advanced users, the method must be 'public', which is true for all
* methods inside a sketch when run from the PDE, but must explicitly be
* set when using Eclipse or other development environments.
*
* @webref input:files
* @param prompt message to the user
* @param callback name of the method to be called when the selection is made
*/
// public void selectInput(String prompt, String callback) {
// selectInput(prompt, callback, null);
// }
// public void selectInput(String prompt, String callback, File file) {
// selectInput(prompt, callback, file, this);
// }
// public void selectInput(String prompt, String callback,
// File file, Object callbackObject) {
// selectInput(prompt, callback, file, callbackObject, selectFrame());
// }
static public void selectInput(Frame parent, String prompt, File file,
Callback callback) {
selectImpl(parent, prompt, file, callback, FileDialog.LOAD);
}
/**
* See selectInput() for details.
*
* @webref output:files
* @param prompt message to the user
* @param callback name of the method to be called when the selection is made
*/
// public void selectOutput(String prompt, String callback) {
// selectOutput(prompt, callback, null);
// }
//
// public void selectOutput(String prompt, String callback, File file) {
// selectOutput(prompt, callback, file, this);
// }
//
//
// public void selectOutput(String prompt, String callback,
// File file, Object callbackObject) {
// selectOutput(prompt, callback, file, callbackObject, selectFrame());
// }
static public void selectOutput(Frame parent, String prompt, File file,
Callback callback) {
selectImpl(parent, prompt, file, callback, FileDialog.SAVE);
}
static protected void selectImpl(final Frame parentFrame,
final String prompt,
final File defaultSelection,
final Callback callback,
final int mode) {
// EventQueue.invokeLater(new Runnable() {
// public void run() {
File selectedFile = null;
if (useNativeSelect) {
FileDialog dialog = new FileDialog(parentFrame, prompt, mode);
if (defaultSelection != null) {
dialog.setDirectory(defaultSelection.getParent());
dialog.setFile(defaultSelection.getName());
}
dialog.setVisible(true);
String directory = dialog.getDirectory();
String filename = dialog.getFile();
if (filename != null) {
selectedFile = new File(directory, filename);
}
} else {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(prompt);
if (defaultSelection != null) {
chooser.setSelectedFile(defaultSelection);
}
int result = -1;
if (mode == FileDialog.SAVE) {
result = chooser.showSaveDialog(parentFrame);
} else if (mode == FileDialog.LOAD) {
result = chooser.showOpenDialog(parentFrame);
}
if (result == JFileChooser.APPROVE_OPTION) {
selectedFile = chooser.getSelectedFile();
}
}
//selectCallback(selectedFile, callbackMethod, callbackObject);
callback.handle(selectedFile);
// }
// });
}
/**
* See selectInput() for details.
*
* @webref input:files
* @param prompt message to the user
* @param callback name of the method to be called when the selection is made
*/
// public void selectFolder(String prompt, String callback) {
// selectFolder(prompt, callback, null);
// }
//
//
// public void selectFolder(String prompt, String callback, File file) {
// selectFolder(prompt, callback, file, this);
// }
//
//
// public void selectFolder(String prompt, String callback,
// File file, Object callbackObject) {
// selectFolder(prompt, callback, file, callbackObject, selectFrame());
// }
static public void selectFolder(final Frame parentFrame,
final String prompt,
final File defaultSelection,
final Callback callback) {
// EventQueue.invokeLater(new Runnable() {
// public void run() {
File selectedFile = null;
if (System.getProperty("os.name").contains("Mac") && useNativeSelect) {
FileDialog fileDialog =
new FileDialog(parentFrame, prompt, FileDialog.LOAD);
System.setProperty("apple.awt.fileDialogForDirectories", "true");
fileDialog.setVisible(true);
System.setProperty("apple.awt.fileDialogForDirectories", "false");
String filename = fileDialog.getFile();
if (filename != null) {
selectedFile = new File(fileDialog.getDirectory(), fileDialog.getFile());
}
} else {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle(prompt);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if (defaultSelection != null) {
fileChooser.setSelectedFile(defaultSelection);
}
int result = fileChooser.showOpenDialog(parentFrame);
if (result == JFileChooser.APPROVE_OPTION) {
selectedFile = fileChooser.getSelectedFile();
}
}
//selectCallback(selectedFile, callbackMethod, callbackObject);
callback.handle(selectedFile);
// }
// });
}
// static private void selectCallback(File selectedFile,
// String callbackMethod,
// Object callbackObject) {
// try {
// Class<?> callbackClass = callbackObject.getClass();
// Method selectMethod =
// callbackClass.getMethod(callbackMethod, new Class[] { File.class });
// selectMethod.invoke(callbackObject, new Object[] { selectedFile });
//
// } catch (IllegalAccessException iae) {
// System.err.println(callbackMethod + "() must be public");
//
// } catch (InvocationTargetException ite) {
// ite.printStackTrace();
//
// } catch (NoSuchMethodException nsme) {
// System.err.println(callbackMethod + "() could not be found");
// }
// }
}