+ private static void sort(AlignmentI align, List<SequenceI> tmp,
+ boolean ascending)
+ {
+ sort(align, vectorSubsetToArray(tmp, align.getSequences()), ascending);
+ }
+
+ private static void sort(AlignmentI align, SequenceI[] seqs,
+ boolean ascending)
+ {
+ if (ascending)
+ {
+ setOrder(align, seqs);
+ }
+ else
+ {
+ setReverseOrder(align, seqs);
+ }
+
+ }
+
+
+ /**
+ * Sets the Alignment object with the given sequences
+ *
+ * @param align
+ * DOCUMENT ME!
+ * @param seqs
+ * sequences as an array
+ */
+ public static void setOrder(AlignmentI align, SequenceI[] seqs)
+ {
+ // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work
+ List<SequenceI> algn = align.getSequences();
+ synchronized (algn)
+ {
+ List<SequenceI> tmp = new ArrayList<>();
+
+ for (int i = 0; i < seqs.length; i++)
+ {
+ if (algn.contains(seqs[i]))
+ {
+ tmp.add(seqs[i]);
+ }
+ }
+
+ algn.clear();
+ // User may have hidden seqs, then clicked undo or redo
+ for (int i = 0; i < tmp.size(); i++)
+ {
+ algn.add(tmp.get(i));
+ }
+ }
+ }
+
+ /**
+ * Reverse the order of the sort
+ *
+ * @param align
+ * DOCUMENT ME!
+ * @param seqs
+ * DOCUMENT ME!
+ */
+ private static void setReverseOrder(AlignmentI align, SequenceI[] seqs)
+ {
+ int nSeq = seqs.length;
+
+ int len = (nSeq + (nSeq % 2)) / 2;
+// int len = 0;
+//
+// if ((nSeq % 2) == 0)
+// {
+// len = nSeq / 2;
+// }
+// else
+// {
+// len = (nSeq + 1) / 2;
+// }
+
+ // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work
+ List<SequenceI> asq = align.getSequences();
+ synchronized (asq)
+ {
+ for (int i = 0; i < len; i++)
+ {
+ // SequenceI tmp = seqs[i];
+ asq.set(i, seqs[nSeq - i - 1]);
+ asq.set(nSeq - i - 1, seqs[i]);
+ }
+ }
+ }
+
+