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.PriorityQueue;
10 import java.util.Random;
11 import java.util.TreeSet;
13 import javax.swing.event.TreeExpansionEvent;
14 import javax.swing.event.TreeWillExpandListener;
15 import javax.swing.tree.DefaultTreeModel;
16 import javax.swing.tree.ExpandVetoException;
17 import javax.swing.tree.TreeNode;
18 import javax.swing.tree.TreePath;
20 public class FragSeqTreeModel extends DefaultTreeModel implements TreeWillExpandListener{
22 private FragSeqNode _rootIDs = new FragSeqNode("IDs");
23 private FragSeqNode _rootFolders = new FragSeqNode("Folders");
25 private TreeSet<String> _folders = new TreeSet<String>();
26 private Hashtable<String,FragSeqNode> _folderPathToFolderNode = new Hashtable<String,FragSeqNode>();
28 private Hashtable<String,FragSeqNode> _idsToNode = new Hashtable<String,FragSeqNode>();
29 private Hashtable<String,ArrayList<FragSeqNode>> _pathToIDFileNodes = new Hashtable<String,ArrayList<FragSeqNode>>();
31 public enum SORT_MODE{
36 private SORT_MODE _mode = SORT_MODE.PATH;
38 public FragSeqTreeModel()
40 this(new FragSeqNode("Folders"));
43 public FragSeqTreeModel(TreeNode t)
46 this.setRoot(_rootFolders);
50 public FragSeqNode getPathViewRoot()
55 public FragSeqNode getIDViewRoot()
60 public void switchToIDView()
62 if (_mode!=SORT_MODE.ID)
64 this.setRoot(this._rootIDs);
71 private void removeAllNodes(ArrayList<FragSeqNode> toBeRemoved)
73 for(FragSeqNode leafNode : toBeRemoved)
75 FragSeqNode parent = (FragSeqNode) leafNode.getParent();
76 parent.remove(leafNode);
77 if (parent.getChildCount()==0)
79 parent.removeFromParent();
80 _folderPathToFolderNode.remove(parent);
81 if (parent.getUserObject() instanceof String)
83 String path = parent.getUserObject().toString();
94 public FragSeqNode getNodeForId(String id)
96 if(!_idsToNode.containsKey(id))
98 FragSeqNode idNode = new FragSeqNode(id);
99 _idsToNode.put(id, idNode);
100 _rootIDs.add(idNode);
102 FragSeqNode idNode = _idsToNode.get(id);
106 public void removeFolder(String path)
108 ArrayList<FragSeqNode> toBeRemoved = new ArrayList<FragSeqNode>();
109 Enumeration en = _folderPathToFolderNode.get(path).children();
110 while(en.hasMoreElements())
112 FragSeqNode n = (FragSeqNode) en.nextElement();
115 removeAllNodes(toBeRemoved);
116 _folders.remove(path);
120 public FragSeqNode insertGroupNode(String crit, TreeSet<String> t)
122 FragSeqNode groupNode = new FragSeqNode(crit);
123 FragSeqNode parent = getRoot();
124 int pos = t.headSet(crit).size();
125 parent.insert(groupNode, pos);
132 public void insertFileNode(FragSeqNode parent, FragSeqFileModel m)
134 FragSeqNode leafNode = new FragSeqNode(m);
135 parent.add(leafNode);
138 public FragSeqNode addFolder(String path)
140 FragSeqNode groupNode = null;
142 if (!_folders.contains(path))
144 File dir = new File(path);
145 if (dir.isDirectory())
147 path = dir.getCanonicalPath();
149 groupNode = insertGroupNode(path, _folders);
150 _folderPathToFolderNode.put(path,groupNode);
151 for(File f:dir.listFiles(_f))
153 addFile(path,f.getCanonicalPath());
157 } catch (IOException e) {
163 private void addFile(String folder, String path)
165 System.out.println(" => "+path);
166 FragSeqFileModel m = new FragSeqFileModel(folder,path);
168 insertFileNode(_folderPathToFolderNode.get(folder), m);
171 public FragSeqNode getRoot()
173 return (FragSeqNode) super.getRoot();
176 public ArrayList<String> getFolders()
178 ArrayList<String> result = new ArrayList<String>(_folders);
183 FilenameFilter _f = new FilenameFilter(){
184 public boolean accept(File dir, String name) {
185 return name.toLowerCase().endsWith(".dbn")
186 || name.toLowerCase().endsWith(".ct")
187 || name.toLowerCase().endsWith(".bpseq")
188 || name.toLowerCase().endsWith(".rnaml");
191 public FilenameFilter getFileNameFilter()
196 public void setFileNameFilter(FilenameFilter f)
202 private Hashtable<FragSeqNode,Boolean> _isExpanded = new Hashtable<FragSeqNode,Boolean>();
204 public boolean isExpanded(FragSeqNode n)
206 if(_isExpanded.containsKey(n))
208 return _isExpanded.get(n);
214 public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
215 if (event.getSource() instanceof FragSeqTree)
217 FragSeqTree tree = (FragSeqTree) event.getSource();
218 TreePath t = event.getPath();
219 FragSeqNode n = (FragSeqNode) t.getLastPathComponent();
220 _isExpanded.put(n, true);
221 Object o = n.getUserObject();
222 if (o instanceof FragSeqFileModel)
224 FragSeqFileModel f = (FragSeqFileModel) o;
227 String path = f.getPath();
228 if (!_pathToIDFileNodes.containsKey(path))
230 _pathToIDFileNodes.put(path, new ArrayList<FragSeqNode>());
232 ArrayList<FragSeqNode> nodesForID = _pathToIDFileNodes.get(path);
233 for(FragSeqModel m: f.getModels())
235 n.add(new FragSeqNode(m));
236 FragSeqNode nid = getNodeForId(m.getID());
237 nid.add(new FragSeqNode(m));
245 public void treeWillCollapse(TreeExpansionEvent event)
246 throws ExpandVetoException {
247 // TODO Auto-generated method stub
248 TreePath t = event.getPath();
249 FragSeqNode n = (FragSeqNode) t.getLastPathComponent();
250 _isExpanded.put(n, false);