+ resolveAndAddDatasetSeq(ssm.getFromSeq(), seqs, false);
+ }
+ if (!seqs.contains(ssm.getMapping().getTo()))
+ {
+ resolveAndAddDatasetSeq(ssm.getMapping().getTo(), seqs, false);
+ }
+ }
+ }
+ // finally construct dataset
+ dataset = new Alignment(seqs.toArray(new SequenceI[seqs.size()]));
+ // move mappings to the dataset alignment
+ dataset.codonFrameList = this.codonFrameList;
+ this.codonFrameList = null;
+ }
+
+ /**
+ * 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;
+ int nseq = sequences.size();
+ for (int i = 0; i < nseq; 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;
+ }
+ }
+ }
+
+ maxLength++;
+
+ int cLength;
+ for (int i = 0; i < nseq; i++)
+ {
+ current = getSequenceAt(i);
+ cLength = current.getLength();
+
+ if (cLength < maxLength)
+ {
+ current.insertCharAt(cLength, maxLength - cLength, gapCharacter);
+ modified = true;
+ }
+ else if (current.getLength() > maxLength)
+ {
+ current.deleteChars(maxLength, current.getLength());
+ }
+ }
+ return modified;
+ }
+
+ /**
+ * Justify the sequences to the left or right by deleting and inserting gaps
+ * before the initial residue or after the terminal residue
+ *
+ * @param right
+ * true if alignment padded to right, false to justify to left
+ * @return true if alignment was changed
+ */
+ @Override
+ public boolean justify(boolean right)
+ {
+ boolean modified = false;