ascii type
[jalview.git] / src / jalview / datamodel / HiddenSequences.java
index 9a7afd2..0514fb8 100755 (executable)
@@ -1,6 +1,6 @@
 /*\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
@@ -23,7 +23,7 @@ import java.util.*;
 \r
 public class HiddenSequences\r
 {\r
-  Hashtable hiddenSequences;\r
+  public SequenceI[] hiddenSequences;\r
   AlignmentI alignment;\r
 \r
   public HiddenSequences(AlignmentI al)\r
@@ -33,146 +33,231 @@ public class HiddenSequences
 \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 Vector showAll()\r
+  public Vector showAll(Hashtable hiddenReps)\r
   {\r
-   Vector revealedSeqs = new Vector();\r
-   for(int i=0; i<alignment.getHeight()+hiddenSequences.size(); i++)\r
+    Vector revealedSeqs = new Vector();\r
+    for (int i = 0; i < hiddenSequences.length; i++)\r
     {\r
-      Vector tmp = showSequence(i);\r
-      for(int t=0; t<tmp.size(); t++)\r
-        revealedSeqs.addElement(tmp.elementAt(t));\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 Vector 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
-\r
-    for(int index = end; index > start; index--)\r
+    if (end >= hiddenSequences.length)\r
     {\r
-      SequenceI seq =  (SequenceI)hiddenSequences.remove(new Integer(\r
-          index));\r
+      end = hiddenSequences.length - 1;\r
+    }\r
 \r
+    for (int index = end; index > start; index--)\r
+    {\r
+      SequenceI seq = hiddenSequences[index];\r
+      hiddenSequences[index] = null;\r
 \r
-      if(seq!=null)\r
+      if (seq != null)\r
       {\r
-        revealedSeqs.addElement(seq);\r
-        alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
-        if(repSequence!=null)\r
+        if (seq.getLength() > 0)\r
         {\r
-          repSequence.showHiddenSequence(seq);\r
+          revealedSeqs.addElement(seq);\r
+          alignment.getSequences().insertElementAt(seq, alignmentIndex);\r
+        }\r
+        else\r
+        {\r
+          System.out.println(seq.getName() + " has been deleted whilst hidden");\r
         }\r
       }\r
+\r
     }\r
 \r
     return revealedSeqs;\r
   }\r
 \r
-  public Hashtable getHiddenSequences()\r
-  {\r
-    return hiddenSequences;\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
@@ -180,6 +265,14 @@ public class HiddenSequences
 \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