1 package fr.orsay.lri.varna.applications.fragseq;
4 import java.io.FilenameFilter;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.Enumeration;
8 import java.util.Hashtable;
9 import java.util.TreeSet;
11 import javax.swing.event.TreeExpansionEvent;
12 import javax.swing.event.TreeWillExpandListener;
13 import javax.swing.tree.DefaultTreeModel;
14 import javax.swing.tree.ExpandVetoException;
15 import javax.swing.tree.TreeNode;
16 import javax.swing.tree.TreePath;
18 public class FragSeqTreeModel extends DefaultTreeModel implements TreeWillExpandListener{
20 private FragSeqNode _rootIDs = new FragSeqNode("IDs");
21 private FragSeqNode _rootFolders = new FragSeqNode("Folders");
23 private TreeSet<String> _folders = new TreeSet<>();
24 private Hashtable<String,FragSeqNode> _folderPathToFolderNode = new Hashtable<>();
26 private Hashtable<String,FragSeqNode> _idsToNode = new Hashtable<>();
27 private Hashtable<String,ArrayList<FragSeqNode>> _pathToIDFileNodes = new Hashtable<>();
29 public enum SORT_MODE{
34 private SORT_MODE _mode = SORT_MODE.PATH;
36 public FragSeqTreeModel()
38 this(new FragSeqNode("Folders"));
41 public FragSeqTreeModel(TreeNode t)
44 this.setRoot(_rootFolders);
48 public FragSeqNode getPathViewRoot()
53 public FragSeqNode getIDViewRoot()
58 public void switchToIDView()
60 if (_mode!=SORT_MODE.ID)
62 this.setRoot(this._rootIDs);
69 private void removeAllNodes(ArrayList<FragSeqNode> toBeRemoved)
71 for(FragSeqNode leafNode : toBeRemoved)
73 FragSeqNode parent = (FragSeqNode) leafNode.getParent();
74 parent.remove(leafNode);
75 if (parent.getChildCount()==0)
77 parent.removeFromParent();
78 // BH was just parent --
79 System.out.println("Varna FragSeqTreeModel removing " + parent + " "
81 _folderPathToFolderNode.remove(parent.toString());
82 if (parent.getUserObject() instanceof String)
84 String path = parent.getUserObject().toString();
95 public FragSeqNode getNodeForId(String id)
97 if(!_idsToNode.containsKey(id))
99 FragSeqNode idNode = new FragSeqNode(id);
100 _idsToNode.put(id, idNode);
101 _rootIDs.add(idNode);
103 FragSeqNode idNode = _idsToNode.get(id);
107 public void removeFolder(String path)
109 ArrayList<FragSeqNode> toBeRemoved = new ArrayList<>();
110 Enumeration en = _folderPathToFolderNode.get(path).children();
111 while(en.hasMoreElements())
113 FragSeqNode n = (FragSeqNode) en.nextElement();
116 removeAllNodes(toBeRemoved);
117 _folders.remove(path);
121 public FragSeqNode insertGroupNode(String crit, TreeSet<String> t)
123 FragSeqNode groupNode = new FragSeqNode(crit);
124 FragSeqNode parent = getRoot();
125 int pos = t.headSet(crit).size();
126 parent.insert(groupNode, pos);
133 public void insertFileNode(FragSeqNode parent, FragSeqFileModel m)
135 FragSeqNode leafNode = new FragSeqNode(m);
136 parent.add(leafNode);
139 public FragSeqNode addFolder(String path)
141 FragSeqNode groupNode = null;
143 if (!_folders.contains(path))
145 File dir = new File(path);
146 if (dir.isDirectory())
148 path = dir.getCanonicalPath();
150 groupNode = insertGroupNode(path, _folders);
151 _folderPathToFolderNode.put(path,groupNode);
152 for(File f:dir.listFiles(_f))
154 addFile(path,f.getCanonicalPath());
158 } catch (IOException e) {
164 private void addFile(String folder, String path)
166 System.out.println(" => "+path);
167 FragSeqFileModel m = new FragSeqFileModel(folder,path);
169 insertFileNode(_folderPathToFolderNode.get(folder), m);
173 public FragSeqNode getRoot()
175 return (FragSeqNode) super.getRoot();
178 public ArrayList<String> getFolders()
180 ArrayList<String> result = new ArrayList<>(_folders);
185 FilenameFilter _f = new FilenameFilter(){
187 public boolean accept(File dir, String name) {
188 return name.toLowerCase().endsWith(".dbn")
189 || name.toLowerCase().endsWith(".ct")
190 || name.toLowerCase().endsWith(".bpseq")
191 || name.toLowerCase().endsWith(".rnaml");
194 public FilenameFilter getFileNameFilter()
199 public void setFileNameFilter(FilenameFilter f)
205 private Hashtable<FragSeqNode,Boolean> _isExpanded = new Hashtable<>();
207 public boolean isExpanded(FragSeqNode n)
209 if(_isExpanded.containsKey(n))
211 return _isExpanded.get(n);
220 public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
221 if (event.getSource() instanceof FragSeqTree)
223 FragSeqTree tree = (FragSeqTree) event.getSource();
224 TreePath t = event.getPath();
225 FragSeqNode n = (FragSeqNode) t.getLastPathComponent();
226 _isExpanded.put(n, true);
227 Object o = n.getUserObject();
228 if (o instanceof FragSeqFileModel)
230 FragSeqFileModel f = (FragSeqFileModel) o;
233 String path = f.getPath();
234 if (!_pathToIDFileNodes.containsKey(path))
236 _pathToIDFileNodes.put(path, new ArrayList<FragSeqNode>());
238 ArrayList<FragSeqNode> nodesForID = _pathToIDFileNodes.get(path);
239 for(FragSeqModel m: f.getModels())
241 n.add(new FragSeqNode(m));
242 FragSeqNode nid = getNodeForId(m.getID());
243 nid.add(new FragSeqNode(m));
252 public void treeWillCollapse(TreeExpansionEvent event)
253 throws ExpandVetoException {
254 // TODO Auto-generated method stub
255 TreePath t = event.getPath();
256 FragSeqNode n = (FragSeqNode) t.getLastPathComponent();
257 _isExpanded.put(n, false);