bugfix for occasional nullpointer exceptions when selecting menu items that operate...
[jalview.git] / src / jalview / datamodel / SequenceGroup.java
index dd842ea..49f270d 100755 (executable)
@@ -46,12 +46,23 @@ public class SequenceGroup
   boolean displayText = true;
 
   boolean colourText = false;
-
+  /**
+   * after Olivier's non-conserved only character display
+   */
+  boolean showUnconserved = false;
+  
+  /**
+   * group members
+   */
   private Vector sequences = new Vector();
-
+  /**
+   * representative sequence for this group (if any)
+   */
+  private SequenceI seqrep = null;
   int width = -1;
 
-  /** DOCUMENT ME!! */
+  /**
+   * Colourscheme applied to group if any */
   public ColourSchemeI cs;
 
   int startRes = 0;
@@ -104,6 +115,47 @@ public class SequenceGroup
     endRes = end;
     recalcConservation();
   }
+  /**
+   * copy constructor
+   * @param seqsel
+   */
+  public SequenceGroup(SequenceGroup seqsel)
+  {
+    if (seqsel!=null)
+    {
+      sequences=new Vector();
+      Enumeration sq = seqsel.sequences.elements();
+      while (sq.hasMoreElements()) { 
+        sequences.addElement(sq.nextElement()); 
+      };
+      if (seqsel.groupName!=null)
+      {
+        groupName = new String(seqsel.groupName);
+      }
+      displayBoxes = seqsel.displayBoxes;
+      displayText = seqsel.displayText;
+      colourText = seqsel.colourText;
+      startRes = seqsel.startRes;
+      endRes = seqsel.endRes;
+      cs =seqsel.cs;
+      if (seqsel.description!=null)
+        description = new String(seqsel.description);
+      hidecols = seqsel.hidecols;
+      hidereps = seqsel.hidereps;
+      idColour = seqsel.idColour;
+      outlineColour = seqsel.outlineColour;
+      seqrep = seqsel.seqrep;
+      textColour = seqsel.textColour;
+      textColour2 = seqsel.textColour2;
+      thresholdTextColour = seqsel.thresholdTextColour;
+      width = seqsel.width;
+      if (seqsel.conserve!=null)
+      {
+        recalcConservation(); // safer than 
+        // aaFrequency = (Vector) seqsel.aaFrequency.clone(); // ??
+      }
+    }
+  }
 
   public SequenceI[] getSelectionAsNewSequences(AlignmentI align)
   {
@@ -639,11 +691,12 @@ public class SequenceGroup
 
   /**
    * 
-   * returns the sequences in the group ordered by the ordering given by al
-   * 
+   * returns the sequences in the group ordered by the ordering given by al.
+   * this used to return an array with null entries regardless, new behaviour is below.
+   * TODO: verify that this does not affect use in applet or application
    * @param al
    *                Alignment
-   * @return SequenceI[]
+   * @return SequenceI[] intersection of sequences in group with al, ordered by al, or null if group does not intersect with al
    */
   public SequenceI[] getSequencesInOrder(AlignmentI al)
   {
@@ -660,7 +713,20 @@ public class SequenceGroup
         seqs[index++] = al.getSequenceAt(i);
       }
     }
-
+    if (index==0)
+    {
+      return null;
+    }
+    if (index<seqs.length)
+    {
+      SequenceI[] dummy = seqs;
+      seqs = new SequenceI[index];
+      while (--index>=0)
+      {
+        seqs[index] = dummy[index];
+        dummy[index] = null;
+      }
+    }
     return seqs;
   }
 
@@ -680,4 +746,116 @@ public class SequenceGroup
   {
     this.idColour = idColour;
   }
+
+  /**
+   * @return the representative sequence for this group
+   */
+  public SequenceI getSeqrep()
+  {
+    return seqrep;
+  }
+
+  /**
+   * set the representative sequence for this group.
+   * Note - this affects the interpretation of the Hidereps attribute.
+   * @param seqrep the seqrep to set (null means no sequence representative)
+   */
+  public void setSeqrep(SequenceI seqrep)
+  {
+    this.seqrep = seqrep;
+  }
+  /**
+   * 
+   * @return true if group has a sequence representative
+   */
+  public boolean hasSeqrep()
+  {
+    return seqrep != null;
+  }
+  /**
+   * visibility of rows or represented rows covered by group
+   */
+  private boolean hidereps=false;
+  /**
+   * set visibility of sequences covered by (if no sequence representative is defined) 
+   * or represented by this group.
+   * @param visibility
+   */
+  public void setHidereps(boolean visibility)
+  {
+    hidereps = visibility;
+  }
+  /**
+   * 
+   * @return true if sequences represented (or covered) by this group should be hidden
+   */
+  public boolean isHidereps()
+  {
+    return hidereps;
+  }
+  /**
+   * visibility of columns intersecting this group
+   */
+  private boolean hidecols=false;
+  /**
+   * set intended visibility of columns covered by this group
+   * @param visibility
+   */
+  public void setHideCols(boolean visibility)
+  {
+    hidecols = visibility;
+  }
+  /**
+   * 
+   * @return true if columns covered by group should be hidden
+   */
+  public boolean isHideCols()
+  {
+    return hidecols;
+  }
+  /**
+   * create a new sequence group from the intersection of this group
+   * with an alignment Hashtable of hidden representatives
+   * 
+   * @param alignment (may not be null)
+   * @param hashtable (may be null)
+   * @return new group containing sequences common to this group and alignment
+   */
+  public SequenceGroup intersect(AlignmentI alignment, Hashtable hashtable)
+  {
+    SequenceGroup sgroup = new SequenceGroup(this);
+    Enumeration en = getSequences(hashtable).elements();
+    while (en.hasMoreElements())
+    {
+      SequenceI elem = (SequenceI) en.nextElement();
+      if (alignment.getSequences().contains(elem))
+      {
+        sgroup.addSequence(elem, false);
+      }
+    }
+    return sgroup;
+  }
+
+  /**
+   * @return the showUnconserved
+   */
+  public boolean getShowunconserved()
+  {
+    return showUnconserved;
+  }
+
+  /**
+   * @param showUnconserved the showUnconserved to set
+   */
+  public void setShowunconserved(boolean displayNonconserved)
+  {
+    this.showUnconserved = displayNonconserved;
+  }
+
+  public AlignmentAnnotation getConsensus()
+  {
+    // TODO get or calculate and get consensus annotation row for this group
+    this.conserve.getConsSequence();
+    return null;
+  }
 }