JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / datamodel / AlignmentView.java
index e089a11..9db9f38 100644 (file)
@@ -26,7 +26,6 @@ import jalview.util.ShiftList;
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Vector;
 
 /**
  * Transient object compactly representing a 'view' of an alignment - with
@@ -47,7 +46,7 @@ public class AlignmentView
    * one or more ScGroup objects, which are referenced by each seqCigar's group
    * membership
    */
-  private List<ScGroup> scGroups=null;
+  private List<ScGroup> scGroups = null;
 
   private boolean isNa = false;
 
@@ -69,13 +68,51 @@ public class AlignmentView
    */
   private class ScGroup
   {
-    public Vector seqs;
+    public List<SeqCigar> seqs;
 
     public SequenceGroup sg;
 
     ScGroup()
     {
-      seqs = new Vector();
+      seqs = new ArrayList<SeqCigar>();
+    }
+
+    /**
+     * @param seq
+     * @return true if seq was not a member before and was added to group
+     */
+    public boolean add(SeqCigar seq)
+    {
+      if (!seq.isMemberOf(this))
+      {
+        seqs.add(seq);
+        seq.setGroupMembership(this);
+        return true;
+      }
+      else
+      {
+        return false;
+      }
+    }
+
+    /**
+     * 
+     * @param seq
+     * @return true if seq was a member and was removed from group
+     */
+    public boolean remove(SeqCigar seq)
+    {
+      if (seq.removeGroupMembership(this))
+      {
+        seqs.remove(seq);
+        return true;
+      }
+      return false;
+    }
+
+    public int size()
+    {
+      return seqs.size();
     }
   }
 
@@ -83,7 +120,7 @@ public class AlignmentView
    * vector of selected seqCigars. This vector is also referenced by each
    * seqCigar contained in it.
    */
-  private Vector selected;
+  private ScGroup selected;
 
   /**
    * Construct an alignmentView from a live jalview alignment view. Note -
@@ -124,7 +161,7 @@ public class AlignmentView
     if (selection != null && selection.getSize() > 0)
     {
       List<SequenceI> sel = selection.getSequences(null);
-      this.selected = new Vector();
+      this.selected = new ScGroup();
       selseqs = selection
               .getSequencesInOrder(alignment, selectedRegionOnly);
     }
@@ -133,7 +170,7 @@ public class AlignmentView
       selseqs = alignment.getSequencesArray();
     }
 
-    List<List<SequenceI>> seqsets=new ArrayList<List<SequenceI>>();
+    List<List<SequenceI>> seqsets = new ArrayList<List<SequenceI>>();
     // get the alignment's group list and make a copy
     List<SequenceGroup> grps = new ArrayList<SequenceGroup>();
     List<SequenceGroup> gg = alignment.getGroups();
@@ -194,8 +231,7 @@ public class AlignmentView
         if (selection != null && selection.getSize() > 0
                 && !selectedRegionOnly)
         {
-          sequences[csi].setGroupMembership(selected);
-          selected.addElement(sequences[csi]);
+          selected.add(sequences[csi]);
         }
         if (seqsets != null)
         {
@@ -203,9 +239,8 @@ public class AlignmentView
           {
             if ((seqsets.get(sg)).contains(selseqs[i]))
             {
-              sequences[csi].setGroupMembership(sgrps[sg]);
               sgrps[sg].sg.deleteSequence(selseqs[i], false);
-              sgrps[sg].seqs.addElement(sequences[csi]);
+              sgrps[sg].add(sequences[csi]);
               if (!addedgps[sg])
               {
                 if (scGroups == null)
@@ -241,7 +276,8 @@ public class AlignmentView
   {
     if (!seqcigararray.isSeqCigarArray())
     {
-      throw new Error(MessageManager.getString("error.implementation_error_can_only_make_alignmnet_from_cigararray"));
+      throw new Error(
+              "Implementation Error - can only make an alignment view from a CigarArray of sequences.");
     }
     // contigs = seqcigararray.applyDeletions();
     contigs = seqcigararray.getDeletedRegions();
@@ -298,8 +334,7 @@ public class AlignmentView
   {
     ColumnSelection colsel = new ColumnSelection();
 
-    return new Object[]
-    {
+    return new Object[] {
         SeqCigar.createAlignmentSequences(sequences, gapCharacter, colsel,
                 contigs), colsel };
   }
@@ -663,7 +698,9 @@ public class AlignmentView
   {
     if (sequences == null || width <= 0)
     {
-      throw new Error(MessageManager.getString("error.empty_view_cannot_be_updated"));
+      throw new Error(
+              MessageManager
+                      .getString("error.empty_view_cannot_be_updated"));
     }
     if (nvismsa == null)
     {
@@ -693,7 +730,17 @@ public class AlignmentView
               j++;
               if (mseq.length != sequences.length)
               {
-                throw new Error(MessageManager.formatMessage("error.mismatch_between_number_of_sequences_in_block", new String[]{Integer.valueOf(j).toString(),Integer.valueOf(mseq.length).toString(),Integer.valueOf(sequences.length).toString() }));
+                throw new Error(
+                        MessageManager
+                                .formatMessage(
+                                        "error.mismatch_between_number_of_sequences_in_block",
+                                        new String[] {
+                                            Integer.valueOf(j).toString(),
+                                            Integer.valueOf(mseq.length)
+                                                    .toString(),
+                                            Integer.valueOf(
+                                                    sequences.length)
+                                                    .toString() }));
               }
               swidth = mseq[0].getLength(); // JBPNote: could ensure padded
               // here.
@@ -846,25 +893,30 @@ public class AlignmentView
               else
               {
                 // place gaps.
-                throw new Error(MessageManager.getString("error.padding_not_yet_implemented"));
+                throw new Error(
+                        MessageManager
+                                .getString("error.padding_not_yet_implemented"));
               }
             }
           }
         }
       }
-      return new Object[]
-      { alignment, columnselection };
+      return new Object[] { alignment, columnselection };
     }
     else
     {
       if (nvismsa.length != 1)
       {
-        throw new Error(MessageManager.formatMessage("error.mismatch_between_visible_blocks_to_update_and_number_of_contigs_in_view", new String[]{Integer.valueOf(nvismsa.length).toString()}));
+        throw new Error(
+                MessageManager
+                        .formatMessage(
+                                "error.mismatch_between_visible_blocks_to_update_and_number_of_contigs_in_view",
+                                new String[] { Integer.valueOf(
+                                        nvismsa.length).toString() }));
       }
       if (nvismsa[0] != null)
       {
-        return new Object[]
-        { nvismsa[0], new ColumnSelection() };
+        return new Object[] { nvismsa[0], new ColumnSelection() };
       }
       else
       {
@@ -925,8 +977,7 @@ public class AlignmentView
     }
     else
     {
-      return new int[]
-      { 0, width };
+      return new int[] { 0, width };
     }
   }
 
@@ -1056,10 +1107,10 @@ public class AlignmentView
                 + sgr.sg.getEndRes());
         for (int s = 0; s < sgr.seqs.size(); s++)
         {
-          if (!((SeqCigar) sgr.seqs.elementAt(s)).isMemberOf(sgr))
+          // JBPnote this should be a unit test for ScGroup
+          if (!sgr.seqs.get(s).isMemberOf(sgr))
           {
-            os.println("** WARNING: sequence "
-                    + ((SeqCigar) sgr.seqs.elementAt(s)).toString()
+            os.println("** WARNING: sequence " + sgr.seqs.get(s).toString()
                     + " is not marked as member of group.");
           }
         }