JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / applications / newGUI / VARNAGUITreeModel.java
1 package fr.orsay.lri.varna.applications.newGUI;
2
3 import java.io.File;
4 import java.io.FilenameFilter;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.Hashtable;
8 import java.util.PriorityQueue;
9 import java.util.TreeSet;
10
11 import javax.swing.tree.DefaultMutableTreeNode;
12 import javax.swing.tree.DefaultTreeModel;
13 import javax.swing.tree.TreePath;
14
15 public class VARNAGUITreeModel extends DefaultTreeModel{
16         
17   private TreeSet<String> _folders = new TreeSet<String>();
18   private TreeSet<String> _ids = new TreeSet<String>();
19   private Hashtable<String,TreeSet<VARNAGUIModel>> _criterionToFiles = new Hashtable<String,TreeSet<VARNAGUIModel>>();
20   private Hashtable<String,DefaultMutableTreeNode> _criterionToNodes = new Hashtable<String,DefaultMutableTreeNode>();
21   private ArrayList<DefaultMutableTreeNode> _fileNodes = new ArrayList<DefaultMutableTreeNode>();
22   
23   public enum SORT_MODE{
24           PATH,
25           ID
26   }
27   
28   private SORT_MODE _mode = SORT_MODE.PATH; 
29         
30   public VARNAGUITreeModel()
31   {
32           super(new DefaultMutableTreeNode("Folders"));
33   }
34
35
36   public void removeFolder(String path)
37   {
38           if (_mode==SORT_MODE.PATH)
39           {
40                   int pos = _folders.headSet(path).size();
41                   DefaultMutableTreeNode parent = (DefaultMutableTreeNode) getRoot().getChildAt(pos);
42                   parent.removeAllChildren();
43                   reload(parent);
44                   getRoot().remove(parent);
45                   _criterionToNodes.remove(path);
46                   _criterionToFiles.remove(path);
47           }
48           else if (_mode==SORT_MODE.ID)
49           {
50                   ArrayList<DefaultMutableTreeNode> toBeRemoved = new ArrayList<DefaultMutableTreeNode>(); 
51                   for(DefaultMutableTreeNode leafNode : _fileNodes)
52                   {
53                           VARNAGUIModel m = (VARNAGUIModel)leafNode.getUserObject();
54                           if (m.getFolder().equals(path))
55                           {
56                                   toBeRemoved.add(leafNode);
57                           }
58                   }
59                   for(DefaultMutableTreeNode leafNode : toBeRemoved)
60                   {
61                           _fileNodes.remove(leafNode);
62                           DefaultMutableTreeNode parent = (DefaultMutableTreeNode) leafNode.getParent();
63                           parent.remove(leafNode);
64                   }
65           }
66           _folders.remove(path);
67   }
68   
69   
70   public DefaultMutableTreeNode insertGroupNode(String crit, TreeSet<String> t)
71   {
72           DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(crit);
73           DefaultMutableTreeNode parent = getRoot();
74           int pos = t.headSet(crit).size();
75           parent.insert(groupNode, pos);         
76           reload(groupNode);
77           return groupNode;
78   }
79
80   public void insertLeafNode(DefaultMutableTreeNode parent, VARNAGUIModel m, TreeSet<VARNAGUIModel> t)
81   {
82           DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode(m);
83           int pos = t.headSet(m).size();
84           parent.insert(leafNode, pos);
85           _fileNodes.add(leafNode);
86   }
87
88   public DefaultMutableTreeNode addFolder(String path)
89   {
90           DefaultMutableTreeNode groupNode = null;
91           try {
92                   if (!_folders.contains(path))
93                   {
94                           System.out.println("Folder: "+path);
95                           File dir = new File(path);
96                           if (dir.isDirectory())
97                           {
98                                   path = dir.getCanonicalPath();
99                                   _folders.add(path);
100                                   if (_mode==SORT_MODE.PATH)
101                                   {
102                                           System.out.println("  Adding: "+path);
103                                           groupNode = insertGroupNode(path, _folders);
104                                           _criterionToNodes.put(path,groupNode);
105                                           _criterionToFiles.put(path, new TreeSet<VARNAGUIModel>());
106                                   }
107                                   for(File f:dir.listFiles(_f))
108                                   {
109                                           addFile(path,f.getCanonicalPath());
110                                   }
111                           }
112                   }
113           } catch (IOException e) {
114                   e.printStackTrace();
115           }
116           return groupNode;
117   }
118     
119   private void addFile(String folder, String path)
120   {
121           System.out.println("  => "+path);
122           VARNAGUIModel m = new VARNAGUIModel(folder,path);
123           if (_mode==SORT_MODE.PATH)
124           {
125                   addFolder(folder);
126                   insertLeafNode(_criterionToNodes.get(folder), m, _criterionToFiles.get(folder));
127           }
128           else if (_mode==SORT_MODE.ID)
129           {
130                   String id = m.getID();
131                   if (!_criterionToNodes.containsKey(id))
132                   {
133                           _criterionToNodes.put(id, insertGroupNode(id, _ids));
134                   }
135                   insertLeafNode(_criterionToNodes.get(id), m, _criterionToFiles.get(id));
136           }
137   }
138   
139   public DefaultMutableTreeNode getRoot()
140   {
141           return (DefaultMutableTreeNode) super.getRoot();
142   }
143   
144   public ArrayList<String> getFolders()
145   {
146           ArrayList<String> result = new ArrayList<String>(_folders);
147           return result;
148   }
149   
150   
151    FilenameFilter _f = new FilenameFilter(){
152                 public boolean accept(File dir, String name) {
153                         return name.toLowerCase().endsWith(".dbn") 
154                         || name.toLowerCase().endsWith(".ct")
155                         || name.toLowerCase().endsWith(".bpseq")
156                         || name.toLowerCase().endsWith(".rnaml");       
157                 }};
158           
159   public FilenameFilter getFileNameFilter()
160   {
161         return _f;
162   }
163
164   public void setFileNameFilter(FilenameFilter f)
165   {
166         _f = f;
167   }
168
169 }