/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.bio.gui; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JTree; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import org.biojava.bio.Annotation; import org.biojava.bio.BioException; import org.biojava.bio.seq.Feature; import org.biojava.bio.seq.FeatureFilter; import org.biojava.bio.seq.FeatureHolder; import org.biojava.bio.seq.Sequence; import org.biojava.bio.seq.SequenceIterator; import org.biojava.bio.seq.db.SequenceDB; /** * FeatureTree is GUI tree to display the features and annotations * of the sequences in a SequenceDB Nested Features are * displayed as expandable leaves. * *

Copyright: Copyright (c) 2002

*

Company: AgResearch

* * @author Mark Schreiber * @version 1.0 */ public class FeatureTree extends JTree{ private String root = "DB"; private ArrayList seqs = new ArrayList(); /** * Create a new FeatureTree */ public FeatureTree() { super(); this.setModel(new FeatureModel(root)); } /** * Use this method to provide the sequences for the tree to work with. * @param db A database of Sequences to display * @throws org.biojava.bio.BioException if information cannot be retrieved from db */ public void setSequenceDB(SequenceDB db) throws BioException{ for(SequenceIterator i = db.sequenceIterator(); i.hasNext();){ seqs.add(i.nextSequence()); } this.expandRow(0); this.repaint(); } /** * Labels Sequence objects with their name, Annotations with * the tag Annotations, Features with the tag Features and other objects * with the toString value. */ public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if(value instanceof Sequence) return ((Sequence)value).getName(); if(value instanceof Annotation) return "Annotations"; if(value instanceof Feature) return value.toString(); if(value instanceof FeatureHolder) return "Features"; else if(value != null) return value.toString(); return ""; } /** * The model used by the FeatureTree */ class FeatureModel implements TreeModel { protected String root; public FeatureModel(String root){ this.root = root; } public Object getRoot(){ return root;} public boolean isLeaf(Object node){ if(node.equals(getRoot())){ if(seqs.size()==0) return true; else return false; } if(node instanceof FeatureHolder){ return false; } if(node.equals(Annotation.EMPTY_ANNOTATION)){ return true; } if(node instanceof String) return true; return false; } public int getChildCount(Object parent){ if(parent.equals(this.getRoot())) return seqs.size(); else if(parent instanceof Sequence){ return 3; //annotation + feature holder + SymbolList } if(parent instanceof Annotation){ return ((Annotation)parent).keys().size(); } if(parent instanceof Feature){ return 3;//for annotation + Sequence + Nested Features } if(parent instanceof FeatureHolder){ return ((FeatureHolder)parent).countFeatures(); } return 0; } public Object getChild(Object parent, int index){ if(parent.equals(getRoot())){ return ((Sequence)seqs.get(index)); }else if(parent instanceof Sequence){ if(index == 0) return ((Sequence)parent).getAnnotation(); if(index == 1) return ((Sequence)parent).filter(FeatureFilter.all,false); else return ((Sequence)parent).seqString(); }else if(parent instanceof Feature){ if(index == 0)return ((Feature)parent).getAnnotation(); if(index == 1)return ((Feature)parent).filter(FeatureFilter.all,false); else return ((Feature)parent).getSymbols().seqString(); }else if(parent instanceof FeatureHolder){ ArrayList al = new ArrayList(); for(Iterator i = ((FeatureHolder)parent).features(); i.hasNext();){ al.add(i.next()); } Feature f = (Feature)al.get(index); return f; }else{//parent must be Annotation ArrayList al = new ArrayList(); for(Iterator i = ((Annotation)parent).keys().iterator(); i.hasNext();){ Object key = i.next(); Object value = ((Annotation)parent).getProperty(key); al.add(key.toString()+" : "+value.toString()); } return al.get(index); } } public int getIndexOfChild(Object parent, Object child){ if(parent.equals(getRoot())){ for(int i = 0; i < seqs.size(); i++){ if(seqs.get(i).equals(child)) return i; } }else if(parent instanceof Sequence || parent instanceof Feature){ if(child instanceof Annotation)return 0; if(child instanceof FeatureHolder)return 1; else return 2; }else if(parent instanceof FeatureHolder){ ArrayList al = new ArrayList(); for(Iterator i = ((FeatureHolder)parent).features(); i.hasNext();){ al.add(i.next()); } for(int i = 0; i < al.size(); i++){ if(al.get(i).equals(child)) return i; } }else if(parent instanceof Annotation){ ArrayList al = new ArrayList(); for(Iterator i = ((Annotation)parent).keys().iterator(); i.hasNext();){ Object key = i.next(); Object value = ((Annotation)parent).getProperty(key); al.add(key.toString()+" : "+value.toString()); } for (int i = 0; i < al.size(); i++) { if(child.equals(al.get(i))) return i; } } return -1; } public void valueForPathChanged(TreePath path, Object newValue){} public void removeTreeModelListener(TreeModelListener l){} public void addTreeModelListener(TreeModelListener l){} } }