package fr.orsay.lri.varna.applications.newGUI; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; import java.util.PriorityQueue; import java.util.TreeSet; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; public class VARNAGUITreeModel extends DefaultTreeModel{ private TreeSet _folders = new TreeSet(); private TreeSet _ids = new TreeSet(); private Hashtable> _criterionToFiles = new Hashtable>(); private Hashtable _criterionToNodes = new Hashtable(); private ArrayList _fileNodes = new ArrayList(); public enum SORT_MODE{ PATH, ID } private SORT_MODE _mode = SORT_MODE.PATH; public VARNAGUITreeModel() { super(new DefaultMutableTreeNode("Folders")); } public void removeFolder(String path) { if (_mode==SORT_MODE.PATH) { int pos = _folders.headSet(path).size(); DefaultMutableTreeNode parent = (DefaultMutableTreeNode) getRoot().getChildAt(pos); parent.removeAllChildren(); reload(parent); getRoot().remove(parent); _criterionToNodes.remove(path); _criterionToFiles.remove(path); } else if (_mode==SORT_MODE.ID) { ArrayList toBeRemoved = new ArrayList(); for(DefaultMutableTreeNode leafNode : _fileNodes) { VARNAGUIModel m = (VARNAGUIModel)leafNode.getUserObject(); if (m.getFolder().equals(path)) { toBeRemoved.add(leafNode); } } for(DefaultMutableTreeNode leafNode : toBeRemoved) { _fileNodes.remove(leafNode); DefaultMutableTreeNode parent = (DefaultMutableTreeNode) leafNode.getParent(); parent.remove(leafNode); } } _folders.remove(path); } public DefaultMutableTreeNode insertGroupNode(String crit, TreeSet t) { DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(crit); DefaultMutableTreeNode parent = getRoot(); int pos = t.headSet(crit).size(); parent.insert(groupNode, pos); reload(groupNode); return groupNode; } public void insertLeafNode(DefaultMutableTreeNode parent, VARNAGUIModel m, TreeSet t) { DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode(m); int pos = t.headSet(m).size(); parent.insert(leafNode, pos); _fileNodes.add(leafNode); } public DefaultMutableTreeNode addFolder(String path) { DefaultMutableTreeNode groupNode = null; try { if (!_folders.contains(path)) { System.out.println("Folder: "+path); File dir = new File(path); if (dir.isDirectory()) { path = dir.getCanonicalPath(); _folders.add(path); if (_mode==SORT_MODE.PATH) { System.out.println(" Adding: "+path); groupNode = insertGroupNode(path, _folders); _criterionToNodes.put(path,groupNode); _criterionToFiles.put(path, new TreeSet()); } for(File f:dir.listFiles(_f)) { addFile(path,f.getCanonicalPath()); } } } } catch (IOException e) { e.printStackTrace(); } return groupNode; } private void addFile(String folder, String path) { System.out.println(" => "+path); VARNAGUIModel m = new VARNAGUIModel(folder,path); if (_mode==SORT_MODE.PATH) { addFolder(folder); insertLeafNode(_criterionToNodes.get(folder), m, _criterionToFiles.get(folder)); } else if (_mode==SORT_MODE.ID) { String id = m.getID(); if (!_criterionToNodes.containsKey(id)) { _criterionToNodes.put(id, insertGroupNode(id, _ids)); } insertLeafNode(_criterionToNodes.get(id), m, _criterionToFiles.get(id)); } } public DefaultMutableTreeNode getRoot() { return (DefaultMutableTreeNode) super.getRoot(); } public ArrayList getFolders() { ArrayList result = new ArrayList(_folders); return result; } FilenameFilter _f = new FilenameFilter(){ public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".dbn") || name.toLowerCase().endsWith(".ct") || name.toLowerCase().endsWith(".bpseq") || name.toLowerCase().endsWith(".rnaml"); }}; public FilenameFilter getFileNameFilter() { return _f; } public void setFileNameFilter(FilenameFilter f) { _f = f; } }