package xapi.dev.gwt.gui;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;
@SuppressWarnings("all")
public class SourcesSelector extends JPanel{
private static final long serialVersionUID = 1153019705058563667L;
private JSplitPane splitter;
private Label label;
private DefaultListModel dir;
private final Set<File> testSources = new LinkedHashSet<File>();
private JFileChooser chooser;
private JList list;
private ProcessLog logger;
@SuppressWarnings({"unchecked", "serial"})
public SourcesSelector(final ProcessLog logger) {
super(new BorderLayout(0, 5));
this.logger = logger;
JPanel buttons = new JPanel(new GridLayout(5, 1,0,10));
buttons.add(new JButton(new AbstractAction("Add Source") {
@Override
public void actionPerformed(ActionEvent e) {
chooser.showOpenDialog(null);
}
}));
buttons.add(new JButton(new AbstractAction("Load Sources") {
@Override
public void actionPerformed(ActionEvent e) {
//TODO: use an xml config file to load sources from a saved file
refreshModules();
}
}));
buttons.add(new JButton(new AbstractAction("Remove Source") {
@Override
public void actionPerformed(ActionEvent e) {
int[] selected = list.getSelectedIndices();
int pos = selected.length;
while(pos>0)
dir.remove(selected[--pos]);
refreshModules();
}
}));
buttons.add(new JButton(new AbstractAction("Remove All Sources") {
@Override
public void actionPerformed(ActionEvent e) {
dir.removeAllElements();
refreshModules();
}
}));
buttons.add(new JButton(new AbstractAction("Clear Log") {
@Override
public void actionPerformed(ActionEvent e) {
logger.clear();
}
}));
splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitter.setLeftComponent(buttons);
dir = new DefaultListModel();
chooser = new JFileChooser();
chooser.setFileFilter(new FileFilter() {
@Override
public String getDescription() {
return "Directories Or Jars";
}
@Override
public boolean accept(File f) {
return f.isDirectory()||f.toString().endsWith(".jar");
}
});
chooser.setMultiSelectionEnabled(true);
chooser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (File f :chooser.getSelectedFiles()){
int ind = dir.indexOf(f);
if (ind>-1)
dir.remove(ind);
dir.add(0, f);
}
refreshModules();
}
});
list = new JList(dir);
list.setCellRenderer(new DefaultListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
try{
File f = (File) value;
if (f.isDirectory()){
return super.getListCellRendererComponent(list, f.toString(), index, isSelected, cellHasFocus);
}else{
return super.getListCellRendererComponent(list, f.getName(), index, isSelected, cellHasFocus);
}
}catch (Exception e) {
e.printStackTrace();
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
});
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
int[] selected = list.getSelectedIndices();
if (selected.length>0){
File f = (File) dir.get(selected[0]);
if (f.isDirectory()){
chooser.setCurrentDirectory(f);
}else{
chooser.setCurrentDirectory(f.getParentFile());
}
}
}
});
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
JScrollPane scroller = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
splitter.setRightComponent(scroller);
add(splitter);
splitter.setDividerLocation(0.5);
}
protected void refreshModules() {
//Scan the selected sources for .gwt.xml files with <entry-point> elements
}
public SourcesSelector(String title, ProcessLog logger) {
this(logger);
setTitle(title);
}
public void setTitle(String title) {
if (null==label){
label = new Label(title);
label.setAlignment(Label.CENTER);
add(label,BorderLayout.NORTH);
}else{
label.setText(title);
}
}
public void addSource(File file) {
addSource(file,true);
}
public void addTestSource(File file) {
addSource(file,true);
testSources.add(file);
}
@SuppressWarnings("unchecked")
public void addSource(File file,boolean resolve) {
//TODO: put in some whitelist / blacklist parameters
if (resolve && file.isDirectory()){
//resolve the /src/main/java portion of source directories.
File next = new File(file,"src");
if (next.exists()){
file = next;
next = new File(file,"main");
if (next.exists()){
file = next;
next = new File(file,"java");
if (next.exists()){
file = next;
}
}
}
}
if (file.isDirectory()||file.toString().endsWith(".jar")){
int was = dir.indexOf(file);
if (was>-1){
dir.remove(was);
}
dir.add(dir.getSize(),file);
}
}
/**
* @return A java exec compatible string of all jars on the classpath
*/
public String getClasspath(boolean includeTestSource, String cpSep) {
int size = dir.getSize();
StringBuilder b = new StringBuilder();
String prefix = "";
for(int i = 0;i < size; i++){
File item = (File)dir.get(i);
if (!includeTestSource){
if (testSources.contains(item))
continue;
}
if (item.isFile()){
b.append(prefix+item);
prefix=cpSep;
}
}
return b.toString();
}
public LinkedList<String> getSourcePaths(boolean includeTestSource) {
LinkedList<String> paths = new LinkedList<String>();
int size = dir.getSize();
for(int i = -1;++i < size;){
File item = (File)dir.get(i);
if (!includeTestSource){
if (testSources.contains(item))
continue;
}
if (item.isDirectory()){
paths.add(item.toString());
}
}
return paths;
}
}