+ result[i] = (SequenceI) matches.elementAt(i);
+ }
+
+ return result;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SequenceI)
+ */
+ @Override
+ public int findIndex(SequenceI s)
+ {
+ int i = 0;
+
+ while (i < sequences.size())
+ {
+ if (s == getSequenceAt(i))
+ {
+ return i;
+ }
+
+ i++;
+ }
+
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SearchResults)
+ */
+ @Override
+ public int findIndex(SearchResults results)
+ {
+ int i = 0;
+
+ while (i < sequences.size())
+ {
+ if (results.involvesSequence(getSequenceAt(i)))
+ {
+ return i;
+ }
+ i++;
+ }
+ return -1;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getHeight()
+ {
+ return sequences.size();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public int getWidth()
+ {
+ int maxLength = -1;
+
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ if (getSequenceAt(i).getLength() > maxLength)
+ {
+ maxLength = getSequenceAt(i).getLength();
+ }
+ }
+
+ return maxLength;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param gc
+ * DOCUMENT ME!
+ */
+ @Override
+ public void setGapCharacter(char gc)
+ {
+ gapCharacter = gc;
+ synchronized (sequences)
+ {
+ for (SequenceI seq : sequences)
+ {
+ seq.setSequence(seq.getSequenceAsString().replace('.', gc)
+ .replace('-', gc).replace(' ', gc));
+ }
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @return DOCUMENT ME!
+ */
+ @Override
+ public char getGapCharacter()
+ {
+ return gapCharacter;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.datamodel.AlignmentI#isAligned()
+ */
+ @Override
+ public boolean isAligned()
+ {
+ return isAligned(false);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.datamodel.AlignmentI#isAligned(boolean)
+ */
+ @Override
+ public boolean isAligned(boolean includeHidden)
+ {
+ int width = getWidth();
+ if (hiddenSequences == null || hiddenSequences.getSize() == 0)
+ {
+ includeHidden = true; // no hidden sequences to check against.
+ }
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ if (includeHidden || !hiddenSequences.isHidden(getSequenceAt(i)))
+ {
+ if (getSequenceAt(i).getLength() != width)
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Delete all annotations, including auto-calculated if the flag is set true.
+ * Returns true if at least one annotation was deleted, else false.
+ *
+ * @param includingAutoCalculated
+ * @return
+ */
+ @Override
+ public boolean deleteAllAnnotations(boolean includingAutoCalculated)
+ {
+ boolean result = false;
+ for (AlignmentAnnotation alan : getAlignmentAnnotation())
+ {
+ if (!alan.autoCalculated || includingAutoCalculated)
+ {
+ deleteAnnotation(alan);
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seejalview.datamodel.AlignmentI#deleteAnnotation(jalview.datamodel.
+ * AlignmentAnnotation)
+ */
+ @Override
+ public boolean deleteAnnotation(AlignmentAnnotation aa)
+ {
+ return deleteAnnotation(aa, true);
+ }
+
+ @Override
+ public boolean deleteAnnotation(AlignmentAnnotation aa, boolean unhook)
+ {
+ int aSize = 1;
+
+ if (annotations != null)
+ {
+ aSize = annotations.length;
+ }
+
+ if (aSize < 1)
+ {
+ return false;
+ }
+
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize - 1];
+
+ boolean swap = false;
+ int tIndex = 0;
+
+ for (int i = 0; i < aSize; i++)
+ {
+ if (annotations[i] == aa)
+ {
+ swap = true;
+ continue;
+ }
+ if (tIndex < temp.length)
+ {
+ temp[tIndex++] = annotations[i];
+ }
+ }
+
+ if (swap)
+ {
+ annotations = temp;
+ if (unhook)
+ {
+ unhookAnnotation(aa);
+ }
+ }
+ return swap;
+ }
+
+ /**
+ * remove any object references associated with this annotation
+ *
+ * @param aa
+ */
+ private void unhookAnnotation(AlignmentAnnotation aa)
+ {
+ if (aa.sequenceRef != null)
+ {
+ aa.sequenceRef.removeAlignmentAnnotation(aa);
+ }
+ if (aa.groupRef != null)
+ {
+ // probably need to do more here in the future (post 2.5.0)
+ aa.groupRef = null;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seejalview.datamodel.AlignmentI#addAnnotation(jalview.datamodel.
+ * AlignmentAnnotation)
+ */
+ @Override
+ public void addAnnotation(AlignmentAnnotation aa)
+ {
+ addAnnotation(aa, -1);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seejalview.datamodel.AlignmentI#addAnnotation(jalview.datamodel.
+ * AlignmentAnnotation, int)
+ */
+ @Override
+ public void addAnnotation(AlignmentAnnotation aa, int pos)
+ {
+ if (aa.getRNAStruc() != null)
+ {
+ hasRNAStructure = true;
+ }
+
+ int aSize = 1;
+ if (annotations != null)
+ {
+ aSize = annotations.length + 1;
+ }
+
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
+ int i = 0;
+ if (pos == -1 || pos >= aSize)
+ {
+ temp[aSize - 1] = aa;
+ }
+ else
+ {
+ temp[pos] = aa;
+ }
+ if (aSize > 1)
+ {
+ int p = 0;
+ for (i = 0; i < (aSize - 1); i++, p++)
+ {
+ if (p == pos)
+ {
+ p++;
+ }
+ if (p < temp.length)
+ {
+ temp[p] = annotations[i];
+ }
+ }
+ }
+
+ annotations = temp;
+ }
+
+ @Override
+ public void setAnnotationIndex(AlignmentAnnotation aa, int index)
+ {
+ if (aa == null || annotations == null || annotations.length - 1 < index)
+ {
+ return;
+ }
+
+ int aSize = annotations.length;
+ AlignmentAnnotation[] temp = new AlignmentAnnotation[aSize];
+
+ temp[index] = aa;
+
+ for (int i = 0; i < aSize; i++)
+ {
+ if (i == index)
+ {
+ continue;
+ }
+
+ if (i < index)
+ {
+ temp[i] = annotations[i];
+ }
+ else
+ {
+ temp[i] = annotations[i - 1];
+ }
+ }
+
+ annotations = temp;
+ }
+
+ @Override
+ /**
+ * returns all annotation on the alignment
+ */
+ public AlignmentAnnotation[] getAlignmentAnnotation()
+ {
+ return annotations;
+ }
+
+ @Override
+ public void setNucleotide(boolean b)
+ {
+ if (b)
+ {
+ type = NUCLEOTIDE;
+ }
+ else
+ {
+ type = PROTEIN;
+ }
+ }
+
+ @Override
+ public boolean isNucleotide()
+ {
+ if (type == NUCLEOTIDE)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean hasRNAStructure()
+ {
+ // TODO can it happen that structure is removed from alignment?
+ return hasRNAStructure;
+ }
+
+ @Override
+ public void setDataset(Alignment data)
+ {
+ if (dataset == null && data == null)
+ {
+ // Create a new dataset for this alignment.
+ // Can only be done once, if dataset is not null
+ // This will not be performed
+ SequenceI[] seqs = new SequenceI[getHeight()];
+ SequenceI currentSeq;
+ for (int i = 0; i < getHeight(); i++)
+ {
+ currentSeq = getSequenceAt(i);
+ if (currentSeq.getDatasetSequence() != null)
+ {
+ seqs[i] = currentSeq.getDatasetSequence();
+ }
+ else
+ {
+ seqs[i] = currentSeq.createDatasetSequence();
+ }
+ }
+
+ dataset = new Alignment(seqs);
+ }
+ else if (dataset == null && data != null)
+ {
+ dataset = data;
+ for (int i = 0; i < getHeight(); i++)
+ {
+ SequenceI currentSeq = getSequenceAt(i);
+ SequenceI dsq = currentSeq.getDatasetSequence();
+ if (dsq == null)
+ {
+ dsq = currentSeq.createDatasetSequence();
+ dataset.addSequence(dsq);
+ }
+ else
+ {
+ while (dsq.getDatasetSequence() != null)
+ {
+ dsq = dsq.getDatasetSequence();
+ }
+ if (dataset.findIndex(dsq) == -1)
+ {
+ dataset.addSequence(dsq);
+ }
+ }
+ }
+ }
+ dataset.addAlignmentRef();
+ }
+
+ /**
+ * reference count for number of alignments referencing this one.
+ */
+ int alignmentRefs = 0;
+
+ /**
+ * increase reference count to this alignment.
+ */
+ private void addAlignmentRef()
+ {
+ alignmentRefs++;
+ }
+
+ @Override
+ public Alignment getDataset()
+ {
+ return dataset;
+ }
+
+ @Override
+ public boolean padGaps()
+ {
+ boolean modified = false;
+
+ // Remove excess gaps from the end of alignment
+ int maxLength = -1;
+
+ SequenceI current;
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ current = getSequenceAt(i);
+ for (int j = current.getLength(); j > maxLength; j--)
+ {
+ if (j > maxLength
+ && !jalview.util.Comparison.isGap(current.getCharAt(j)))
+ {
+ maxLength = j;
+ break;
+ }
+ }