package com.baselet.diagram.io;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import com.baselet.control.config.Config;
import com.baselet.gui.CurrentGui;
public class ClassChooser {
private static JFileChooser instance;
private static final String ALLOWED_EXTENSIONS = ".*.(java|class)";
private static final int TOO_MANY_FILES = 10;
private static JFileChooser getInstance() {
if (instance == null) {
instance = new JFileChooser(Config.getInstance().getOpenFileHome());
instance.setMultiSelectionEnabled(true);
instance.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
instance.setFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
return Pattern.matches(ALLOWED_EXTENSIONS, f.getName()) || f.isDirectory();
}
@Override
public String getDescription() {
return ".java/.class file or directory";
}
});
instance.setAcceptAllFileFilterUsed(false);
}
return instance;
}
public static List<String> getFilesToOpen() {
List<String> fileNames = new ArrayList<String>();
int returnVal = getInstance().showOpenDialog(CurrentGui.getInstance().getGui().getMainFrame());
if (returnVal == JFileChooser.APPROVE_OPTION) {
File[] selectedFiles = getInstance().getSelectedFiles();
for (File file : selectedFiles) {
searchRecursively(file, fileNames);
}
Config.getInstance().setOpenFileHome(selectedFiles[0].getAbsoluteFile().getParent());
if (fileNames.size() > TOO_MANY_FILES) {
returnVal = JOptionPane.showConfirmDialog(CurrentGui.getInstance().getGui().getMainFrame(),
"Your selection contains " + fileNames.size() + " files which may " +
"clutter up your diagram. Continue?",
"Confirm selection", JOptionPane.OK_CANCEL_OPTION);
if (returnVal == JOptionPane.CANCEL_OPTION) {
fileNames.clear();
}
}
}
return fileNames;
}
private static void searchRecursively(File file, List<String> fileNames) {
if (Pattern.matches(ALLOWED_EXTENSIONS, file.getName())) {
fileNames.add(file.getAbsolutePath());
}
else if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
searchRecursively(f, fileNames);
}
}
}
}