X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2Ffragseq%2FFragSeqTreeModel.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2Ffragseq%2FFragSeqTreeModel.java;h=70b858b0c9feab1c9bd942cfdc1db54671a67878;hb=4898f0ae429e0c61ddba72ca46be89b34bb4df8b;hp=0000000000000000000000000000000000000000;hpb=5a6ac5b535856903629234ad43a71319a91ebee5;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java b/srcjar/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java new file mode 100644 index 0000000..70b858b --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/applications/fragseq/FragSeqTreeModel.java @@ -0,0 +1,263 @@ +package fr.orsay.lri.varna.applications.fragseq; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.TreeSet; + +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeWillExpandListener; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.ExpandVetoException; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +public class FragSeqTreeModel extends DefaultTreeModel implements TreeWillExpandListener{ + + private FragSeqNode _rootIDs = new FragSeqNode("IDs"); + private FragSeqNode _rootFolders = new FragSeqNode("Folders"); + + private TreeSet _folders = new TreeSet<>(); + private Hashtable _folderPathToFolderNode = new Hashtable<>(); + + private Hashtable _idsToNode = new Hashtable<>(); + private Hashtable> _pathToIDFileNodes = new Hashtable<>(); + + public enum SORT_MODE{ + PATH, + ID + } + + private SORT_MODE _mode = SORT_MODE.PATH; + + public FragSeqTreeModel() + { + this(new FragSeqNode("Folders")); + + } + public FragSeqTreeModel(TreeNode t) + { + super(t); + this.setRoot(_rootFolders); + } + + + public FragSeqNode getPathViewRoot() + { + return _rootFolders; + } + + public FragSeqNode getIDViewRoot() + { + return _rootIDs; + } + + public void switchToIDView() + { + if (_mode!=SORT_MODE.ID) + { + this.setRoot(this._rootIDs); + + } + _mode=SORT_MODE.ID; + + } + + private void removeAllNodes(ArrayList toBeRemoved) + { + for(FragSeqNode leafNode : toBeRemoved) + { + FragSeqNode parent = (FragSeqNode) leafNode.getParent(); + parent.remove(leafNode); + if (parent.getChildCount()==0) + { + parent.removeFromParent(); + // BH was just parent -- + System.out.println("Varna FragSeqTreeModel removing " + parent + " " + + parent.toString()); + _folderPathToFolderNode.remove(parent.toString()); + if (parent.getUserObject() instanceof String) + { + String path = parent.getUserObject().toString(); + } + } + else + { + reload(parent); + } + } + } + + + public FragSeqNode getNodeForId(String id) + { + if(!_idsToNode.containsKey(id)) + { + FragSeqNode idNode = new FragSeqNode(id); + _idsToNode.put(id, idNode); + _rootIDs.add(idNode); + } + FragSeqNode idNode = _idsToNode.get(id); + return idNode; + } + + public void removeFolder(String path) + { + ArrayList toBeRemoved = new ArrayList<>(); + Enumeration en = _folderPathToFolderNode.get(path).children(); + while(en.hasMoreElements()) + { + FragSeqNode n = (FragSeqNode) en.nextElement(); + toBeRemoved.add(n); + } + removeAllNodes(toBeRemoved); + _folders.remove(path); + } + + + public FragSeqNode insertGroupNode(String crit, TreeSet t) + { + FragSeqNode groupNode = new FragSeqNode(crit); + FragSeqNode parent = getRoot(); + int pos = t.headSet(crit).size(); + parent.insert(groupNode, pos); + reload(groupNode); + return groupNode; + } + + + + public void insertFileNode(FragSeqNode parent, FragSeqFileModel m) + { + FragSeqNode leafNode = new FragSeqNode(m); + parent.add(leafNode); + } + + public FragSeqNode addFolder(String path) + { + FragSeqNode groupNode = null; + try { + if (!_folders.contains(path)) + { + File dir = new File(path); + if (dir.isDirectory()) + { + path = dir.getCanonicalPath(); + _folders.add(path); + groupNode = insertGroupNode(path, _folders); + _folderPathToFolderNode.put(path,groupNode); + 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); + FragSeqFileModel m = new FragSeqFileModel(folder,path); + addFolder(folder); + insertFileNode(_folderPathToFolderNode.get(folder), m); + } + + @Override + public FragSeqNode getRoot() + { + return (FragSeqNode) super.getRoot(); + } + + public ArrayList getFolders() + { + ArrayList result = new ArrayList<>(_folders); + return result; + } + + + FilenameFilter _f = new FilenameFilter(){ + @Override + 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; + } + + +private Hashtable _isExpanded = new Hashtable<>(); + +public boolean isExpanded(FragSeqNode n) +{ + if(_isExpanded.containsKey(n)) + { + return _isExpanded.get(n); + } + else + { + return false; + } +} + +@Override +public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { + if (event.getSource() instanceof FragSeqTree) + { + FragSeqTree tree = (FragSeqTree) event.getSource(); + TreePath t = event.getPath(); + FragSeqNode n = (FragSeqNode) t.getLastPathComponent(); + _isExpanded.put(n, true); + Object o = n.getUserObject(); + if (o instanceof FragSeqFileModel) + { + FragSeqFileModel f = (FragSeqFileModel) o; + if (!f._cached) + { + String path = f.getPath(); + if (!_pathToIDFileNodes.containsKey(path)) + { + _pathToIDFileNodes.put(path, new ArrayList()); + } + ArrayList nodesForID = _pathToIDFileNodes.get(path); + for(FragSeqModel m: f.getModels()) + { + n.add(new FragSeqNode(m)); + FragSeqNode nid = getNodeForId(m.getID()); + nid.add(new FragSeqNode(m)); + nodesForID.add(nid); + } + } + } + } +} + +@Override +public void treeWillCollapse(TreeExpansionEvent event) + throws ExpandVetoException { + // TODO Auto-generated method stub + TreePath t = event.getPath(); + FragSeqNode n = (FragSeqNode) t.getLastPathComponent(); + _isExpanded.put(n, false); + + +} + + +}