/*\r
* Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
*\r
* This program is free software; you can redistribute it and/or\r
* modify it under the terms of the GNU General Public License\r
\r
public class HiddenSequences\r
{\r
- Hashtable hiddenSequences;\r
+ public SequenceI[] hiddenSequences;\r
AlignmentI alignment;\r
\r
public HiddenSequences(AlignmentI al)\r
\r
public int getSize()\r
{\r
- return hiddenSequences == null ? 0 : hiddenSequences.size();\r
+ if (hiddenSequences == null)\r
+ {\r
+ return 0;\r
+ }\r
+ int count = 0;\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
+ {\r
+ if (hiddenSequences[i] != null)\r
+ {\r
+ count++;\r
+ }\r
+ }\r
+\r
+ return count;\r
}\r
\r
public int getWidth()\r
{\r
- Enumeration en = hiddenSequences.elements();\r
int width = 0;\r
- while(en.hasMoreElements())\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
{\r
- SequenceI seq = (SequenceI)en.nextElement();\r
- if(seq.getLength()>width)\r
- width = seq.getLength();\r
+ if (hiddenSequences[i] != null && hiddenSequences[i].getLength() > width)\r
+ {\r
+ width = hiddenSequences[i].getLength();\r
+ }\r
}\r
+\r
return width;\r
}\r
\r
+ /**\r
+ * Call this method if sequences are removed from the\r
+ * main alignment\r
+ */\r
+ public void adjustHeightSequenceDeleted(int seqIndex)\r
+ {\r
+ if (hiddenSequences == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ int alHeight = alignment.getHeight();\r
+\r
+ SequenceI[] tmp = new SequenceI[alHeight + getSize()];\r
+ int deletionIndex = adjustForHiddenSeqs(seqIndex);\r
+\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
+ {\r
+ if (hiddenSequences[i] == null)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if (i > deletionIndex)\r
+ {\r
+ tmp[i - 1] = hiddenSequences[i];\r
+ }\r
+ else\r
+ {\r
+ tmp[i] = hiddenSequences[i];\r
+ }\r
+ }\r
+\r
+ hiddenSequences = tmp;\r
+\r
+ }\r
+\r
+ /**\r
+ * Call this method if sequences are added to or removed from the\r
+ * main alignment\r
+ */\r
+ public void adjustHeightSequenceAdded()\r
+ {\r
+ if (hiddenSequences == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ int alHeight = alignment.getHeight();\r
+\r
+ SequenceI[] tmp = new SequenceI[alHeight + getSize()];\r
+ System.arraycopy(hiddenSequences, 0, tmp, 0, hiddenSequences.length);\r
+ hiddenSequences = tmp;\r
+ }\r
+\r
public void hideSequence(SequenceI sequence)\r
{\r
- if(hiddenSequences==null)\r
- hiddenSequences = new Hashtable();\r
+ if (hiddenSequences == null)\r
+ {\r
+ hiddenSequences = new SequenceI[alignment.getHeight()];\r
+ }\r
\r
int alignmentIndex = alignment.findIndex(sequence);\r
alignmentIndex = adjustForHiddenSeqs(alignmentIndex);\r
\r
- hiddenSequences.put(new Integer(alignmentIndex), sequence);\r
+ if (hiddenSequences[alignmentIndex] != null)\r
+ {\r
+ System.out.println("ERROR!!!!!!!!!!!");\r
+ }\r
+\r
+ hiddenSequences[alignmentIndex] = sequence;\r
\r
alignment.deleteSequence(sequence);\r
}\r
\r
- public void showAll()\r
+ public Vector showAll(Hashtable hiddenReps)\r
{\r
- for(int i=0; i<alignment.getHeight()+hiddenSequences.size(); i++)\r
- showSequence(i);\r
+ Vector revealedSeqs = new Vector();\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
+ {\r
+ if (hiddenSequences[i] != null)\r
+ {\r
+ Vector tmp = showSequence(i, hiddenReps);\r
+ for (int t = 0; t < tmp.size(); t++)\r
+ {\r
+ revealedSeqs.addElement(tmp.elementAt(t));\r
+ }\r
+ }\r
+ }\r
+ return revealedSeqs;\r
}\r
\r
- public void showSequence(int alignmentIndex)\r
+ public Vector showSequence(int alignmentIndex, Hashtable hiddenReps)\r
{\r
+ Vector revealedSeqs = new Vector();\r
SequenceI repSequence = alignment.getSequenceAt(alignmentIndex);\r
- if(repSequence!=null\r
- && repSequence.getHiddenSequences()==null\r
- && alignmentIndex>0)\r
- repSequence = alignment.getSequenceAt(alignmentIndex-1);\r
-\r
- if(repSequence!=null\r
- && repSequence.getHiddenSequences()==null)\r
- repSequence = null;\r
+ if (repSequence != null &&\r
+ hiddenReps != null\r
+ && hiddenReps.containsKey(repSequence))\r
+ {\r
+ hiddenReps.remove(repSequence);\r
+ revealedSeqs.addElement(repSequence);\r
+ }\r
\r
- int start = adjustForHiddenSeqs(alignmentIndex-1);\r
+ int start = adjustForHiddenSeqs(alignmentIndex - 1);\r
int end = adjustForHiddenSeqs(alignmentIndex);\r
+ if (end >= hiddenSequences.length)\r
+ {\r
+ end = hiddenSequences.length - 1;\r
+ }\r
\r
- for(int index = end; index > start; index--)\r
+ for (int index = end; index > start; index--)\r
{\r
- SequenceI seq = (SequenceI)hiddenSequences.remove(new Integer(\r
- index));\r
+ SequenceI seq = hiddenSequences[index];\r
+ hiddenSequences[index] = null;\r
\r
- if(seq!=null)\r
+ if (seq != null)\r
{\r
- alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
- if(repSequence!=null)\r
+ if (seq.getLength() > 0)\r
+ {\r
+ revealedSeqs.addElement(seq);\r
+ alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
+ }\r
+ else\r
{\r
- repSequence.showHiddenSequence(seq);\r
+ System.out.println(seq.getName() + " has been deleted whilst hidden");\r
}\r
}\r
+\r
}\r
- }\r
\r
- public Hashtable getHiddenSequences()\r
- {\r
- return hiddenSequences;\r
+ return revealedSeqs;\r
}\r
\r
public SequenceI getHiddenSequence(int alignmentIndex)\r
{\r
- return (SequenceI)hiddenSequences.get(new Integer(alignmentIndex));\r
+ return hiddenSequences[alignmentIndex];\r
}\r
\r
public int findIndexWithoutHiddenSeqs(int alignmentIndex)\r
{\r
int index = 0;\r
int hiddenSeqs = 0;\r
- while(index <= alignmentIndex)\r
+ if (hiddenSequences.length <= alignmentIndex)\r
{\r
- if(hiddenSequences.containsKey(new Integer(index)))\r
- {\r
- hiddenSeqs ++;\r
- }\r
- index ++;\r
- };\r
+ alignmentIndex = hiddenSequences.length - 1;\r
+ }\r
\r
- return (alignmentIndex - hiddenSeqs) ;\r
+ while (index <= alignmentIndex)\r
+ {\r
+ if (hiddenSequences[index] != null)\r
+ {\r
+ hiddenSeqs++;\r
+ }\r
+ index++;\r
+ }\r
+ ;\r
+\r
+ return (alignmentIndex - hiddenSeqs);\r
}\r
\r
public int adjustForHiddenSeqs(int alignmentIndex)\r
{\r
int index = 0;\r
- while(index <= alignmentIndex)\r
+ int hSize = hiddenSequences.length;\r
+ while (index <= alignmentIndex && index < hSize)\r
{\r
- if(hiddenSequences.containsKey(new Integer(index)))\r
- {\r
- alignmentIndex ++;\r
- }\r
- index ++;\r
- };\r
+ if (hiddenSequences[index] != null)\r
+ {\r
+ alignmentIndex++;\r
+ }\r
+ index++;\r
+ }\r
+ ;\r
\r
- return alignmentIndex ;\r
+ return alignmentIndex;\r
}\r
\r
public AlignmentI getFullAlignment()\r
{\r
- int isize = alignment.getHeight()+hiddenSequences.size();\r
- SequenceI [] seq = new Sequence[isize];\r
-\r
- Enumeration en = hiddenSequences.keys();\r
- while(en.hasMoreElements())\r
- {\r
- Integer key = (Integer)en.nextElement();\r
- seq[key.intValue()] = (SequenceI)hiddenSequences.get(key);\r
- }\r
+ int isize = hiddenSequences.length;\r
+ SequenceI[] seq = new Sequence[isize];\r
\r
int index = 0;\r
- for(int i=0; i<isize; i++)\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
{\r
- if(seq[i]!=null)\r
+ if (hiddenSequences[i] != null)\r
{\r
- continue;\r
+ seq[i] = hiddenSequences[i];\r
+ }\r
+ else\r
+ {\r
+ seq[i] = alignment.getSequenceAt(index);\r
+ index++;\r
}\r
-\r
- seq[i] = alignment.getSequenceAt(index);\r
- index++;\r
}\r
\r
return new Alignment(seq);\r
\r
public boolean isHidden(SequenceI seq)\r
{\r
- return hiddenSequences.contains(seq);\r
+ for (int i = 0; i < hiddenSequences.length; i++)\r
+ {\r
+ if (hiddenSequences[i] != null && hiddenSequences[i] == seq)\r
+ {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
}\r
}\r