/*
* Copyright 2010-2013, Sikuli.org
* Released under the MIT License.
*
* modified RaiMan 2013
*/
package org.sikuli.ide;
import java.awt.*;
import java.io.File;
import java.io.FilenameFilter;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import org.sikuli.script.Settings;
public class SikuliIDEFileChooser {
static final int FILES = JFileChooser.FILES_ONLY;
static final int DIRS = JFileChooser.DIRECTORIES_ONLY;
static final int SAVE = FileDialog.SAVE;
static final int LOAD = FileDialog.LOAD;
Frame _parent;
public SikuliIDEFileChooser(Frame parent) {
_parent = parent;
}
private File showFileChooser(String msg, int mode, GeneralFileFilter[] filters, int selectionMode) {
if (Settings.isMac()) {
if (Settings.isJava7() && selectionMode == DIRS) {
return showJFileChooser(msg, mode, filters, FILES);
} else {
//TODO Mac Java7: FileDialog not taking bundles as files
FileDialog fd = new FileDialog(_parent, msg, mode);
for (GeneralFileFilter filter : filters) {
fd.setFilenameFilter(filter);
}
fd.setVisible(true);
if (fd.getFile() == null) {
return null;
}
return new File(fd.getDirectory(), fd.getFile());
}
}
return showJFileChooser(msg, mode, filters, selectionMode);
}
private File showJFileChooser(String msg, int mode, GeneralFileFilter[] filters, int selectionMode) {
JFileChooser fchooser = new JFileChooser();
if (mode == FileDialog.SAVE) {
fchooser.setDialogType(JFileChooser.SAVE_DIALOG);
}
PreferencesUser pref = PreferencesUser.getInstance();
String last_dir = pref.get("LAST_OPEN_DIR", "");
if (!last_dir.equals("")) {
fchooser.setCurrentDirectory(new File(last_dir));
}
fchooser.setAcceptAllFileFilterUsed(false);
for (GeneralFileFilter filter : filters) {
fchooser.setFileFilter(filter);
}
fchooser.setFileSelectionMode(selectionMode);
fchooser.setSelectedFile(null);
if (fchooser.showDialog(_parent, null) != JFileChooser.APPROVE_OPTION) {
return null;
}
File ret = fchooser.getSelectedFile();
String dir = ret.getParent();
PreferencesUser.getInstance().put("LAST_OPEN_DIR", dir);
return ret;
}
public File loadImage() {
return showFileChooser("Open a Image File", LOAD,
new GeneralFileFilter[]{
new GeneralFileFilter("png", "PNG Image Files (*.png)"),
new GeneralFileFilter("jpg", "JPEG Image Files (*.jpg)")
}, FILES);
}
public File load() {
return showFileChooser("Open a Sikuli Source File", LOAD,
new GeneralFileFilter[]{
new GeneralFileFilter("sikuli", "Sikuli source files (*.sikuli)")
}, DIRS);
}
public File save() {
return showFileChooser("Save a Sikuli Source File", SAVE,
new GeneralFileFilter[]{
new GeneralFileFilter("sikuli", "Sikuli source files (*.sikuli)")
}, DIRS);
}
public File export() {
return showFileChooser("Export a Sikuli Executable File", SAVE,
new GeneralFileFilter[]{
new GeneralFileFilter("skl", "Sikuli executable files (*.skl)")
}, FILES);
}
}
class GeneralFileFilter extends FileFilter implements FilenameFilter {
private String _ext, _desc;
public GeneralFileFilter(String ext, String desc) {
_ext = ext;
_desc = desc;
}
@Override
public boolean accept(File dir, String fname) {
int i = fname.lastIndexOf('.');
if (i > 0 && i < fname.length() - 1) {
String ext = fname.substring(i + 1).toLowerCase();
if (ext.equals(_ext)) {
return true;
}
}
return false;
}
@Override
public boolean accept(File f) {
if (f.isDirectory()) {
return true;
}
String s = f.getName();
int i = s.lastIndexOf('.');
if (i > 0 && i < s.length() - 1) {
String ext = s.substring(i + 1).toLowerCase();
if (ext.equals(_ext)) {
return true;
}
}
return false;
}
@Override
public String getDescription() {
return _desc;
}
}