JAL-1620 version bump and release notes
[jalview.git] / src / jalview / datamodel / SeqCigar.java
index f2777f4..77e9111 100644 (file)
@@ -1,22 +1,26 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- * 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.datamodel;
 
+import java.util.Enumeration;
 import java.util.Hashtable;
 
 import jalview.analysis.*;
@@ -68,8 +72,8 @@ public class SeqCigar extends CigarSimple
    */
   public String getSequenceString(char GapChar)
   {
-    return (length == 0) ? "" : (String) getSequenceAndDeletions(refseq
-            .getSequenceAsString(start, end), GapChar)[0];
+    return (length == 0) ? "" : (String) getSequenceAndDeletions(
+            refseq.getSequenceAsString(start, end), GapChar)[0];
   }
 
   /**
@@ -85,18 +89,16 @@ public class SeqCigar extends CigarSimple
     {
       return null;
     }
-    Object[] edit_result = getSequenceAndDeletions(refseq
-            .getSequenceAsString(start, end), GapChar);
+    Object[] edit_result = getSequenceAndDeletions(
+            refseq.getSequenceAsString(start, end), GapChar);
     if (edit_result == null)
     {
-      throw new Error(
-              "Implementation Error - unexpected null from getSequenceAndDeletions");
+      throw new Error(MessageManager.getString("error.implementation_error_unexpected_null_from_get_sequence_and_deletions"));
     }
     int bounds[] = (int[]) edit_result[1];
-    seq = new Sequence(refseq.getName(), (String) edit_result[0], refseq
-            .getStart()
-            + start + bounds[0], refseq.getStart() + start
-            + ((bounds[2] == 0) ? -1 : bounds[2]));
+    seq = new Sequence(refseq.getName(), (String) edit_result[0],
+            refseq.getStart() + start + bounds[0], refseq.getStart()
+                    + start + ((bounds[2] == 0) ? -1 : bounds[2]));
     seq.setDescription(refseq.getDescription());
     int sstart = seq.getStart(), send = seq.getEnd();
     // seq.checkValidRange(); probably not needed
@@ -139,11 +141,11 @@ public class SeqCigar extends CigarSimple
     boolean hasgaps = false;
     if (seq == null)
     {
-      throw new Error("Implementation Error - _setSeq(null,...)");
+      throw new Error(MessageManager.getString("error.implementation_error_set_seq_null"));
     }
     if (_s < 0)
     {
-      throw new Error("Implementation Error: _s=" + _s);
+      throw new Error(MessageManager.formatMessage("error.implementation_error_s", new String[]{Integer.valueOf(_s).toString()}));
     }
     String seq_string = seq.getSequenceAsString();
     if (_e == 0 || _e < _s || _e > seq_string.length())
@@ -170,9 +172,8 @@ public class SeqCigar extends CigarSimple
       }
       else
       {
-        ds = new Sequence(seq.getName(), ungapped, seq.getStart(), seq
-                .getStart()
-                + ungapped.length() - 1);
+        ds = new Sequence(seq.getName(), ungapped, seq.getStart(),
+                seq.getStart() + ungapped.length() - 1);
         // JBPNote: this would be consistent but may not be useful
         // seq.setDatasetSequence(ds);
       }
@@ -210,8 +211,7 @@ public class SeqCigar extends CigarSimple
     // Check offsets
     if (end > ds.getLength())
     {
-      throw new Error(
-              "SeqCigar: Possible implementation error: sequence is longer than dataset sequence");
+      throw new Error(MessageManager.getString("error.implementation_error_seqcigar_possible"));
       // end = ds.getLength();
     }
 
@@ -235,12 +235,11 @@ public class SeqCigar extends CigarSimple
     super();
     if (seq == null)
     {
-      throw new Error("Implementation Bug. Null seq !");
+      throw new Error(MessageManager.getString("error.implmentation_bug_seq_null"));
     }
     if (operation.length != range.length)
     {
-      throw new Error(
-              "Implementation Bug. Cigar Operation list!= range list");
+      throw new Error(MessageManager.getString("error.implementation_bug_cigar_operation_list_range_list"));
     }
 
     if (operation != null)
@@ -250,17 +249,14 @@ public class SeqCigar extends CigarSimple
 
       if (_setSeq(seq, false, 0, 0))
       {
-        throw new Error(
-                "NOT YET Implemented: Constructing a Cigar object from a cigar string and a gapped sequence.");
+        throw new Error(MessageManager.getString("error.not_yet_implemented_cigar_object_from_cigar_string"));
       }
       for (int i = this.length, j = 0; j < operation.length; i++, j++)
       {
         char op = operation[j];
         if (op != M && op != I && op != D)
         {
-          throw new Error("Implementation Bug. Cigar Operation '" + j
-                  + "' '" + op + "' not one of '" + M + "', '" + I
-                  + "', or '" + D + "'.");
+          throw new Error(MessageManager.formatMessage("error.implementation_bug_cigar_operation", new String[]{Integer.valueOf(j).toString(),Integer.valueOf(op).toString(),Integer.valueOf(M).toString(),Integer.valueOf(I).toString(),Integer.valueOf(D).toString()}));
         }
         this.operation[i] = op;
         this.range[i] = range[j];
@@ -274,8 +270,7 @@ public class SeqCigar extends CigarSimple
       this.length = 0;
       if (_setSeq(seq, false, 0, 0))
       {
-        throw new Error(
-                "NOT YET Implemented: Constructing a Cigar object from a cigar string and a gapped sequence.");
+        throw new Error(MessageManager.getString("error.not_yet_implemented_cigar_object_from_cigar_string"));
       }
     }
   }
@@ -382,7 +377,7 @@ public class SeqCigar extends CigarSimple
     super();
     if (seq == null)
     {
-      throw new Error("Implementation error for new Cigar(SequenceI)");
+      throw new Error(MessageManager.getString("error.implementation_error_for_new_cigar"));
     }
     _setSeq(seq, false, 0, 0);
     // there is still work to do
@@ -404,7 +399,7 @@ public class SeqCigar extends CigarSimple
     super();
     if (seq == null)
     {
-      throw new Error("Implementation error for new Cigar(SequenceI)");
+      throw new Error(MessageManager.getString("error.implementation_error_for_new_cigar"));
     }
     _setSeq(seq, false, start, end + 1);
     // there is still work to do
@@ -431,12 +426,16 @@ public class SeqCigar extends CigarSimple
   }
 
   /**
-   * createAlignment
+   * create an alignment from the given array of cigar sequences and gap
+   * character, and marking the given segments as visible in the given
+   * columselection.
    * 
    * @param alseqs
-   *          SeqCigar[]
    * @param gapCharacter
-   *          char
+   * @param colsel
+   *          - columnSelection where hidden regions are marked
+   * @param segments
+   *          - visible regions of alignment
    * @return SequenceI[]
    */
   public static SequenceI[] createAlignmentSequences(SeqCigar[] alseqs,
@@ -455,8 +454,7 @@ public class SeqCigar extends CigarSimple
       // endcol}, hidden regions {{start, end, col}})
       if (gs_regions[i] == null)
       {
-        throw new Error("Implementation error: " + i
-                + "'th sequence Cigar has no operations.");
+        throw new Error(MessageManager.formatMessage("error.implementation_error_cigar_seq_no_operations", new String[]{Integer.valueOf(i).toString()}));
       }
       g_seqs[i] = new StringBuffer((String) ((Object[]) gs_regions[i])[0]); // the
       // visible
@@ -501,8 +499,8 @@ public class SeqCigar extends CigarSimple
             }
             else
             {
-              g_seqs[s].insert(inspos, alseqs_string[i].substring(
-                      region[0], region[1] + 1));
+              g_seqs[s].insert(inspos,
+                      alseqs_string[i].substring(region[0], region[1] + 1));
             }
           }
           shifts.addShift(region[2], insert.length); // update shift in
@@ -520,10 +518,9 @@ public class SeqCigar extends CigarSimple
     {
       int[] bounds = ((int[]) ((Object[]) gs_regions[i])[1]);
       SequenceI ref = alseqs[i].getRefSeq();
-      seqs[i] = new Sequence(ref.getName(), g_seqs[i].toString(), ref
-              .getStart()
-              + alseqs[i].start + bounds[0], ref.getStart()
-              + alseqs[i].start + (bounds[2] == 0 ? -1 : bounds[2]));
+      seqs[i] = new Sequence(ref.getName(), g_seqs[i].toString(),
+              ref.getStart() + alseqs[i].start + bounds[0], ref.getStart()
+                      + alseqs[i].start + (bounds[2] == 0 ? -1 : bounds[2]));
       seqs[i].setDatasetSequence(ref);
       seqs[i].setDescription(ref.getDescription());
     }
@@ -691,4 +688,77 @@ public class SeqCigar extends CigarSimple
     // System.err.println("Subseqgaped\n------ktryas---dtqwrtsasll----dddptyipqqwa----slchvhryas---dtqwrtsasll--qwa----slchvh\n"+ssgapedseq+"\n"+sub_se_gp.getCigarstring());
   }
 
+  /**
+   * references to entities that this sequence cigar is associated with.
+   */
+  private Hashtable selGroups = null;
+
+  public void setGroupMembership(Object group)
+  {
+    if (selGroups == null)
+    {
+      selGroups = new Hashtable();
+    }
+    selGroups.put(group, new int[0]);
+  }
+
+  /**
+   * Test for and if present remove association to group.
+   * 
+   * @param group
+   * @return true if group was associated and it was removed
+   */
+  public boolean removeGroupMembership(Object group)
+  {
+    if (selGroups != null && selGroups.containsKey(group))
+    {
+      selGroups.remove(group);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * forget all associations for this sequence.
+   */
+  public void clearMemberships()
+  {
+    if (selGroups != null)
+    {
+      selGroups.clear();
+    }
+    selGroups = null;
+  }
+
+  /**
+   * 
+   * @return null or array of all associated entities
+   */
+  public Object[] getAllMemberships()
+  {
+    if (selGroups == null)
+    {
+      return null;
+    }
+    Object[] mmbs = new Object[selGroups.size()];
+    Enumeration en = selGroups.keys();
+    for (int i = 0; en.hasMoreElements(); i++)
+    {
+      mmbs[i] = en.nextElement();
+    }
+    return mmbs;
+  }
+
+  /**
+   * Test for group membership
+   * 
+   * @param sgr
+   *          - a selection group or some other object that may be associated
+   *          with seqCigar
+   * @return true if sgr is associated with this seqCigar
+   */
+  public boolean isMemberOf(Object sgr)
+  {
+    return (selGroups != null) && selGroups.get(sgr) != null;
+  }
 }