Merge branch 'develop' into efficiency/JAL-2034_JAL-1421
[jalview.git] / src / jalview / datamodel / SequenceGroup.java
index 4727e5e..22c537a 100755 (executable)
@@ -76,8 +76,10 @@ public class SequenceGroup implements AnnotatedCollectionI
    */
   public ColourSchemeI cs;
 
+  // start column (base 0)
   int startRes = 0;
 
+  // end column (base 0)
   int endRes = 0;
 
   public Color outlineColour = Color.black;
@@ -207,7 +209,7 @@ public class SequenceGroup implements AnnotatedCollectionI
       if (seqs[ipos] != null)
       {
         seqs[ipos].setDescription(seq.getDescription());
-        seqs[ipos].setDBRef(seq.getDBRef());
+        seqs[ipos].setDBRefs(seq.getDBRefs());
         seqs[ipos].setSequenceFeatures(seq.getSequenceFeatures());
         if (seq.getDatasetSequence() != null)
         {
@@ -502,14 +504,31 @@ public class SequenceGroup implements AnnotatedCollectionI
   }
 
   /**
-   * calculate residue conservation for group - but only if necessary.
+   * calculate residue conservation and colourschemes for group - but only if
+   * necessary. returns true if the calculation resulted in a visible change to
+   * group
    */
-  public void recalcConservation()
+  public boolean recalcConservation()
+  {
+    return recalcConservation(false);
+  }
+
+  /**
+   * calculate residue conservation for group - but only if necessary. returns
+   * true if the calculation resulted in a visible change to group
+   * 
+   * @param defer
+   *          when set, colourschemes for this group are not refreshed after
+   *          recalculation
+   */
+  public boolean recalcConservation(boolean defer)
   {
     if (cs == null && consensus == null && conservation == null)
     {
-      return;
+      return false;
     }
+    // TODO: try harder to detect changes in state in order to minimise
+    // recalculation effort
     try
     {
       Hashtable cnsns[] = AAFrequency.calculate(sequences, startRes,
@@ -543,16 +562,22 @@ public class SequenceGroup implements AnnotatedCollectionI
           }
         }
       }
-      if (cs != null)
+      if (cs != null && !defer)
       {
+        // TODO: JAL-2034 should cs.alignmentChanged modify return state
         cs.alignmentChanged(context != null ? context : this, null);
+        return true;
+      }
+      else
+      {
+        return false;
       }
     } catch (java.lang.OutOfMemoryError err)
     {
       // TODO: catch OOM
       System.out.println("Out of memory loading groups: " + err);
     }
-
+    return false;
   }
 
   private void _updateConservationRow(Conservation c)
@@ -611,13 +636,13 @@ public class SequenceGroup implements AnnotatedCollectionI
   {
     synchronized (sequences)
     {
-    if (sequences.contains(s))
-    {
-      deleteSequence(s, recalc);
-    }
-    else
-    {
-      addSequence(s, recalc);
+      if (sequences.contains(s))
+      {
+        deleteSequence(s, recalc);
+      }
+      else
+      {
+        addSequence(s, recalc);
       }
     }
   }
@@ -773,8 +798,9 @@ public class SequenceGroup implements AnnotatedCollectionI
     synchronized (sequences)
     {
       // MC This needs to get reset when characters are inserted and deleted
-      boolean first=true;
-      for (SequenceI seq:sequences) {
+      boolean first = true;
+      for (SequenceI seq : sequences)
+      {
         if (first || seq.getLength() > width)
         {
           width = seq.getLength();
@@ -891,6 +917,7 @@ public class SequenceGroup implements AnnotatedCollectionI
   /**
    * @return the representative sequence for this group
    */
+  @Override
   public SequenceI getSeqrep()
   {
     return seqrep;
@@ -903,6 +930,7 @@ public class SequenceGroup implements AnnotatedCollectionI
    * @param seqrep
    *          the seqrep to set (null means no sequence representative)
    */
+  @Override
   public void setSeqrep(SequenceI seqrep)
   {
     this.seqrep = seqrep;
@@ -912,6 +940,7 @@ public class SequenceGroup implements AnnotatedCollectionI
    * 
    * @return true if group has a sequence representative
    */
+  @Override
   public boolean hasSeqrep()
   {
     return seqrep != null;
@@ -1033,7 +1062,8 @@ public class SequenceGroup implements AnnotatedCollectionI
 
   /**
    * 
-   * @return automatically calculated consensus row
+   * @return automatically calculated consensus row note: the row is a stub if a
+   *         consensus calculation has not yet been performed on the group
    */
   public AlignmentAnnotation getConsensus()
   {
@@ -1295,6 +1325,9 @@ public class SequenceGroup implements AnnotatedCollectionI
     return false;
   }
 
+  /**
+   * Remove all sequences from the group (leaving other properties unchanged).
+   */
   public void clear()
   {
     synchronized (sequences)