From ab67e99fb7336d0f4411488d9f843c720ab6b418 Mon Sep 17 00:00:00 2001 From: kiramt Date: Wed, 7 Jun 2017 15:32:30 +0100 Subject: [PATCH 1/1] JAL-2591 More refactoring (incomplete) --- src/jalview/appletgui/AnnotationLabels.java | 4 +- src/jalview/datamodel/Alignment.java | 36 --- src/jalview/datamodel/AlignmentI.java | 9 - src/jalview/datamodel/HiddenColumns.java | 366 +++++++++++++++---------- src/jalview/gui/AlignFrame.java | 10 +- src/jalview/gui/AnnotationLabels.java | 14 +- src/jalview/gui/Jalview2XML.java | 4 +- test/jalview/datamodel/AlignmentTest.java | 30 -- test/jalview/datamodel/HiddenColumnsTest.java | 30 ++ 9 files changed, 269 insertions(+), 234 deletions(-) diff --git a/src/jalview/appletgui/AnnotationLabels.java b/src/jalview/appletgui/AnnotationLabels.java index 9ba9cce..0971e56 100755 --- a/src/jalview/appletgui/AnnotationLabels.java +++ b/src/jalview/appletgui/AnnotationLabels.java @@ -837,8 +837,8 @@ public class AnnotationLabels extends Panel implements ActionListener, + sq.getSequenceAsString() + "\n"); if (av.hasHiddenColumns()) { - av.getAlignment().getHiddenColumns().getHiddenColumnsCopy( - jalview.appletgui.AlignFrame.copiedHiddenColumns); + jalview.appletgui.AlignFrame.copiedHiddenColumns = av.getAlignment() + .getHiddenColumns().getHiddenColumnsCopy(); } } diff --git a/src/jalview/datamodel/Alignment.java b/src/jalview/datamodel/Alignment.java index f5e6fc7..098222f 100755 --- a/src/jalview/datamodel/Alignment.java +++ b/src/jalview/datamodel/Alignment.java @@ -1916,42 +1916,6 @@ public class Alignment implements AlignmentI } @Override - public int[] getVisibleStartAndEndIndex(List hiddenCols) - { - int[] alignmentStartEnd = new int[] { 0, getWidth() - 1 }; - int startPos = alignmentStartEnd[0]; - int endPos = alignmentStartEnd[1]; - - int[] lowestRange = new int[] { -1, -1 }; - int[] higestRange = new int[] { -1, -1 }; - - for (int[] hiddenCol : hiddenCols) - { - lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; - higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; - } - - if (lowestRange[0] == -1 && lowestRange[1] == -1) - { - startPos = alignmentStartEnd[0]; - } - else - { - startPos = lowestRange[1] + 1; - } - - if (higestRange[0] == -1 && higestRange[1] == -1) - { - endPos = alignmentStartEnd[1]; - } - else - { - endPos = higestRange[0] - 1; - } - return new int[] { startPos, endPos }; - } - - @Override public void setHiddenColumns(HiddenColumns cols) { hiddenCols = cols; diff --git a/src/jalview/datamodel/AlignmentI.java b/src/jalview/datamodel/AlignmentI.java index 2e61f9d..1b5207f 100755 --- a/src/jalview/datamodel/AlignmentI.java +++ b/src/jalview/datamodel/AlignmentI.java @@ -580,15 +580,6 @@ public interface AlignmentI extends AnnotatedCollectionI */ AlignedCodonFrame getMapping(SequenceI mapFrom, SequenceI mapTo); - /** - * Calculate the visible start and end index of an alignment. The result is - * returned an int array where: int[0] = startIndex, and int[1] = endIndex. - * - * @param hiddenCols - * @return - */ - public int[] getVisibleStartAndEndIndex(List hiddenCols); - public void setHiddenColumns(HiddenColumns cols); } diff --git a/src/jalview/datamodel/HiddenColumns.java b/src/jalview/datamodel/HiddenColumns.java index 0036402..be10721 100644 --- a/src/jalview/datamodel/HiddenColumns.java +++ b/src/jalview/datamodel/HiddenColumns.java @@ -1,3 +1,23 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ 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. + * + * 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 . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.datamodel; import jalview.util.Comparison; @@ -6,14 +26,13 @@ import jalview.util.ShiftList; import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.concurrent.locks.ReentrantReadWriteLock; -public class HiddenColumns implements Iterable +public class HiddenColumns { - private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private static final ReentrantReadWriteLock LOCK = new ReentrantReadWriteLock(); /* * list of hidden column [start, end] ranges; the list is maintained in @@ -46,7 +65,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); StringBuilder regionBuilder = new StringBuilder(); for (int[] range : hiddenColumns) { @@ -58,7 +77,7 @@ public class HiddenColumns implements Iterable return regionBuilder.toString(); } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -71,7 +90,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); int size = 0; if (hasHidden()) { @@ -84,7 +103,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -97,11 +116,11 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); return (hiddenColumns != null) && (!hiddenColumns.isEmpty()); } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -111,7 +130,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (!(obj instanceof HiddenColumns)) { @@ -143,7 +162,7 @@ public class HiddenColumns implements Iterable return true; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -158,7 +177,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); int result = column; if (hiddenColumns != null) { @@ -174,7 +193,7 @@ public class HiddenColumns implements Iterable return result; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -191,7 +210,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); int result = hiddenColumn; if (hiddenColumns != null) { @@ -233,7 +252,7 @@ public class HiddenColumns implements Iterable // columns. } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -253,7 +272,7 @@ public class HiddenColumns implements Iterable try { - lock.readLock().lock(); + LOCK.readLock().lock(); int distance = visibleDistance; // in case startColumn is in a hidden region, move it to the left @@ -297,7 +316,7 @@ public class HiddenColumns implements Iterable return start - distance; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -311,7 +330,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); List positions = new ArrayList<>( hiddenColumns.size()); @@ -341,7 +360,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -356,7 +375,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns != null) { int index = 0; @@ -375,7 +394,7 @@ public class HiddenColumns implements Iterable return alPos; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -391,7 +410,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns != null) { @@ -411,7 +430,7 @@ public class HiddenColumns implements Iterable return alPos; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -428,7 +447,7 @@ public class HiddenColumns implements Iterable try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns != null) { int index = hiddenColumns.size() - 1; @@ -447,7 +466,7 @@ public class HiddenColumns implements Iterable return -1; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -476,69 +495,69 @@ public class HiddenColumns implements Iterable if (!alreadyLocked) { - lock.writeLock().lock(); + LOCK.writeLock().lock(); } - if (hiddenColumns == null) - { - hiddenColumns = new Vector<>(); - } - - /* - * traverse existing hidden ranges and insert / amend / append as - * appropriate - */ - for (int i = 0; i < hiddenColumns.size(); i++) - { - int[] region = hiddenColumns.elementAt(i); - - if (end < region[0] - 1) + if (hiddenColumns == null) { - /* - * insert discontiguous preceding range - */ - hiddenColumns.insertElementAt(new int[] { start, end }, i); - return; + hiddenColumns = new Vector<>(); } - if (end <= region[1]) + /* + * traverse existing hidden ranges and insert / amend / append as + * appropriate + */ + for (int i = 0; i < hiddenColumns.size(); i++) { - /* - * new range overlaps existing, or is contiguous preceding it - adjust - * start column - */ - region[0] = Math.min(region[0], start); - return; - } + int[] region = hiddenColumns.elementAt(i); - if (start <= region[1] + 1) - { - /* - * new range overlaps existing, or is contiguous following it - adjust - * start and end columns - */ - region[0] = Math.min(region[0], start); - region[1] = Math.max(region[1], end); - - /* - * also update or remove any subsequent ranges - * that are overlapped - */ - while (i < hiddenColumns.size() - 1) + if (end < region[0] - 1) + { + /* + * insert discontiguous preceding range + */ + hiddenColumns.insertElementAt(new int[] { start, end }, i); + return; + } + + if (end <= region[1]) { - int[] nextRegion = hiddenColumns.get(i + 1); - if (nextRegion[0] > end + 1) + /* + * new range overlaps existing, or is contiguous preceding it - adjust + * start column + */ + region[0] = Math.min(region[0], start); + return; + } + + if (start <= region[1] + 1) + { + /* + * new range overlaps existing, or is contiguous following it - adjust + * start and end columns + */ + region[0] = Math.min(region[0], start); + region[1] = Math.max(region[1], end); + + /* + * also update or remove any subsequent ranges + * that are overlapped + */ + while (i < hiddenColumns.size() - 1) { - /* - * gap to next hidden range - no more to update - */ - break; + int[] nextRegion = hiddenColumns.get(i + 1); + if (nextRegion[0] > end + 1) + { + /* + * gap to next hidden range - no more to update + */ + break; + } + region[1] = Math.max(nextRegion[1], end); + hiddenColumns.remove(i + 1); } - region[1] = Math.max(nextRegion[1], end); - hiddenColumns.remove(i + 1); + return; } - return; - } } /* @@ -549,7 +568,7 @@ public class HiddenColumns implements Iterable { if (!alreadyLocked) { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } } @@ -558,7 +577,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns != null) { @@ -574,7 +593,7 @@ public class HiddenColumns implements Iterable return true; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -595,7 +614,7 @@ public class HiddenColumns implements Iterable try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (copy != null) { if (copy.hiddenColumns != null) @@ -606,7 +625,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -615,7 +634,8 @@ public class HiddenColumns implements Iterable Vector copy = new Vector<>(hiddenColumns.size()); for (int i = 0, j = hiddenColumns.size(); i < j; i++) { - int[] rh, cp; + int[] rh; + int[] cp; rh = hiddenColumns.elementAt(i); if (rh != null) { @@ -632,7 +652,8 @@ public class HiddenColumns implements Iterable ArrayList copy = new ArrayList<>(hiddenColumns.size()); for (int i = 0, j = hiddenColumns.size(); i < j; i++) { - int[] rh, cp; + int[] rh; + int[] cp; rh = hiddenColumns.elementAt(i); if (rh != null) { @@ -644,27 +665,27 @@ public class HiddenColumns implements Iterable return copy; } - public void getHiddenColumnsCopy(Vector copy) + public Vector getHiddenColumnsCopy() { try { - lock.readLock().lock(); - copy = copyHiddenRegions(); + LOCK.readLock().lock(); + return copyHiddenRegions(); } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } - public void getHiddenColumnsCopy(ArrayList copy) + public ArrayList getHiddenColumnsCopyAsList() { try { - lock.readLock().lock(); - copy = copyHiddenRegionsToArrayList(); + LOCK.readLock().lock(); + return copyHiddenRegionsToArrayList(); } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -681,7 +702,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); List deletedHiddenColumns = null; if (hiddenColumns != null) @@ -720,7 +741,7 @@ public class HiddenColumns implements Iterable return deletedHiddenColumns; } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -737,7 +758,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); if (hiddenColumns != null) { for (int i = 0; i < hiddenColumns.size(); i++) @@ -769,7 +790,7 @@ public class HiddenColumns implements Iterable } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -787,7 +808,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns != null && hiddenColumns.size() > 0) { List visiblecontigs = new ArrayList<>(); @@ -795,7 +816,8 @@ public class HiddenColumns implements Iterable int vstart = start; int[] region; - int hideStart, hideEnd; + int hideStart; + int hideEnd; for (int j = 0; vstart < end && j < regions.size(); j++) { @@ -836,7 +858,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -845,19 +867,21 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); - int i, iSize = seqs.length; + LOCK.readLock().lock(); + int iSize = seqs.length; String selections[] = new String[iSize]; if (hiddenColumns != null && hiddenColumns.size() > 0) { - for (i = 0; i < iSize; i++) + for (int i = 0; i < iSize; i++) { StringBuffer visibleSeq = new StringBuffer(); List regions = getHiddenRegions(); - int blockStart = start, blockEnd = end; + int blockStart = start; + int blockEnd = end; int[] region; - int hideStart, hideEnd; + int hideStart; + int hideEnd; for (int j = 0; j < regions.size(); j++) { @@ -894,7 +918,7 @@ public class HiddenColumns implements Iterable } else { - for (i = 0; i < iSize; i++) + for (int i = 0; i < iSize; i++) { selections[i] = seqs[i].getSequenceAsString(start, end); } @@ -904,7 +928,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -922,23 +946,30 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); - int fpos = seq.getStart(), lpos = seq.getEnd(); + LOCK.readLock().lock(); + int fpos = seq.getStart(); + int lpos = seq.getEnd(); int start = 0; if (hiddenColumns == null || hiddenColumns.size() == 0) { - int ifpos = seq.findIndex(fpos) - 1, - ilpos = seq.findIndex(lpos) - 1; + int ifpos = seq.findIndex(fpos) - 1; + int ilpos = seq.findIndex(lpos) - 1; return new int[] { ifpos, ilpos, fpos, lpos, ifpos, ilpos }; } // Simply walk along the sequence whilst watching for hidden column // boundaries List regions = getHiddenRegions(); - int spos = fpos, lastvispos = -1, rcount = 0, - hideStart = seq.getLength(), hideEnd = -1; - int visPrev = 0, visNext = 0, firstP = -1, lastP = -1; + int spos = fpos; + int lastvispos = -1; + int rcount = 0; + int hideStart = seq.getLength(); + int hideEnd = -1; + int visPrev = 0; + int visNext = 0; + int firstP = -1; + int lastP = -1; boolean foundStart = false; for (int p = 0, pLen = seq.getLength(); spos <= seq.getEnd() && p < pLen; p++) @@ -991,7 +1022,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -1022,7 +1053,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (alignmentAnnotation.annotations == null) { return; @@ -1038,9 +1069,12 @@ public class HiddenColumns implements Iterable Vector annels = new Vector<>(); Annotation[] els = null; List regions = getHiddenRegions(); - int blockStart = start, blockEnd = end; + int blockStart = start; + int blockEnd = end; int[] region; - int hideStart, hideEnd, w = 0; + int hideStart; + int hideEnd; + int w = 0; for (int j = 0; j < regions.size(); j++) { @@ -1110,7 +1144,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -1122,11 +1156,11 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); return hiddenColumns != null && hiddenColumns.size() > 0; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -1138,11 +1172,11 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); return hiddenColumns != null && hiddenColumns.size() > 1; } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -1156,7 +1190,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); List inserts = sr.getInsertions(); for (int[] r : inserts) { @@ -1164,7 +1198,7 @@ public class HiddenColumns implements Iterable } } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -1175,7 +1209,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); if (hiddenColumns != null) { for (int i = 0; i < hiddenColumns.size(); i++) @@ -1192,7 +1226,7 @@ public class HiddenColumns implements Iterable } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -1206,7 +1240,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); for (int i = 0; i < hiddenColumns.size(); i++) { int[] region = hiddenColumns.elementAt(i); @@ -1228,7 +1262,7 @@ public class HiddenColumns implements Iterable } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -1244,7 +1278,10 @@ public class HiddenColumns implements Iterable Vector intervals) { boolean pruned = false; - int i = 0, j = intervals.size() - 1, s = 0, t = shifts.size() - 1; + int i = 0; + int j = intervals.size() - 1; + int s = 0; + int t = shifts.size() - 1; int hr[] = intervals.elementAt(i); int sr[] = shifts.get(s); while (i <= j && s <= t) @@ -1337,7 +1374,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); // delete any intervals intersecting. if (hiddenColumns != null) { @@ -1350,7 +1387,7 @@ public class HiddenColumns implements Iterable } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -1552,7 +1589,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); int hashCode = 1; if (hiddenColumns != null) { @@ -1566,7 +1603,7 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } @@ -1580,7 +1617,7 @@ public class HiddenColumns implements Iterable { try { - lock.writeLock().lock(); + LOCK.writeLock().lock(); for (int firstSet = inserts .nextSetBit(0), lastSet = 0; firstSet >= 0; firstSet = inserts .nextSetBit(lastSet)) @@ -1590,7 +1627,7 @@ public class HiddenColumns implements Iterable } } finally { - lock.writeLock().unlock(); + LOCK.writeLock().unlock(); } } @@ -1603,7 +1640,7 @@ public class HiddenColumns implements Iterable { try { - lock.readLock().lock(); + LOCK.readLock().lock(); if (hiddenColumns == null) { return; @@ -1615,18 +1652,63 @@ public class HiddenColumns implements Iterable } finally { - lock.readLock().unlock(); + LOCK.readLock().unlock(); } } - @Override - public Iterator iterator() + /** + * Calculate the visible start and end index of an alignment. + * + * @param width + * full alignment width + * @return integer array where: int[0] = startIndex, and int[1] = endIndex + */ + public int[] getVisibleStartAndEndIndex(int width) { - if (hiddenColumns == null) + try { - return Collections. emptyList().iterator(); + LOCK.readLock().lock(); + int[] alignmentStartEnd = new int[] { 0, width - 1 }; + int startPos = alignmentStartEnd[0]; + int endPos = alignmentStartEnd[1]; + + int[] lowestRange = new int[] { -1, -1 }; + int[] higestRange = new int[] { -1, -1 }; + + if (hiddenColumns == null) + { + return new int[] { startPos, endPos }; + } + + for (int[] hiddenCol : hiddenColumns) + { + lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; + higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; + } + + if (lowestRange[0] == -1 && lowestRange[1] == -1) + { + startPos = alignmentStartEnd[0]; + } + else + { + startPos = lowestRange[1] + 1; + } + + if (higestRange[0] == -1 && higestRange[1] == -1) + { + endPos = alignmentStartEnd[1]; + } + else + { + endPos = higestRange[0] - 1; + } + return new int[] { startPos, endPos }; + } finally + { + LOCK.readLock().unlock(); } - return hiddenColumns.iterator(); + } } diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index e79e303..ae2e44a 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1320,10 +1320,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { alignmentToExport = viewport.getAlignment(); } - alignmentStartEnd = alignmentToExport - .getVisibleStartAndEndIndex(viewport.getAlignment() - .getHiddenColumns() - .getHiddenRegions()); + alignmentStartEnd = viewport.getAlignment().getHiddenColumns() + .getVisibleStartAndEndIndex(alignmentToExport.getWidth()); AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd, settings); return ed; @@ -1885,8 +1883,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.hasHiddenColumns()) { hiddenColumns = new ArrayList<>(); - int hiddenOffset = viewport.getSelectionGroup().getStartRes(), - hiddenCutoff = viewport.getSelectionGroup().getEndRes(); + int hiddenOffset = viewport.getSelectionGroup().getStartRes(); + int hiddenCutoff = viewport.getSelectionGroup().getEndRes(); for (int[] region : viewport.getAlignment().getHiddenColumns()) { if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff) diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index 07a5ad9..7741956 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -52,7 +52,6 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.List; import java.util.regex.Pattern; import javax.swing.JCheckBoxMenuItem; @@ -953,13 +952,12 @@ public class AnnotationLabels extends JPanel implements MouseListener, } int[] alignmentStartEnd = new int[] { 0, ds.getWidth() - 1 }; - List hiddenCols = av.getAlignment().getHiddenColumns() - .getHiddenRegions(); - if (hiddenCols != null) + if (av.hasHiddenColumns()) { - alignmentStartEnd = av.getAlignment().getVisibleStartAndEndIndex( - hiddenCols); + alignmentStartEnd = av.getAlignment().getHiddenColumns() + .getVisibleStartAndEndIndex(av.getAlignment().getWidth()); } + String output = new FormatAdapter().formatSequences(FileFormat.Fasta, seqs, omitHidden, alignmentStartEnd); @@ -970,8 +968,8 @@ public class AnnotationLabels extends JPanel implements MouseListener, if (av.hasHiddenColumns()) { - av.getAlignment().getHiddenColumns() - .getHiddenColumnsCopy(hiddenColumns); + hiddenColumns = av.getAlignment().getHiddenColumns() + .getHiddenColumnsCopyAsList(); } Desktop.jalviewClipboard = new Object[] { seqs, ds, // what is the dataset diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index 637b590..d18c9b3 100644 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -1421,7 +1421,9 @@ public class Jalview2XML } else { - for (int[] region : hidden) + ArrayList hiddenRegions = hidden + .getHiddenColumnsCopyAsList(); + for (int[] region : hiddenRegions) { HiddenColumns hc = new HiddenColumns(); hc.setStart(region[0]); diff --git a/test/jalview/datamodel/AlignmentTest.java b/test/jalview/datamodel/AlignmentTest.java index d6e09fd..1cfa771 100644 --- a/test/jalview/datamodel/AlignmentTest.java +++ b/test/jalview/datamodel/AlignmentTest.java @@ -37,7 +37,6 @@ import jalview.io.FormatAdapter; import jalview.util.MapList; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -1107,35 +1106,6 @@ public class AlignmentTest "addSequence broke dataset reference integrity"); } - @Test(groups = "Functional") - public void getVisibleStartAndEndIndexTest() - { - Sequence seq = new Sequence("testSeq", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - AlignmentI align = new Alignment(new SequenceI[] { seq }); - ArrayList hiddenCols = new ArrayList(); - - int[] startEnd = align.getVisibleStartAndEndIndex(hiddenCols); - assertEquals(0, startEnd[0]); - assertEquals(25, startEnd[1]); - - hiddenCols.add(new int[] { 0, 0 }); - startEnd = align.getVisibleStartAndEndIndex(hiddenCols); - assertEquals(1, startEnd[0]); - assertEquals(25, startEnd[1]); - - hiddenCols.add(new int[] { 6, 9 }); - hiddenCols.add(new int[] { 11, 12 }); - startEnd = align.getVisibleStartAndEndIndex(hiddenCols); - assertEquals(1, startEnd[0]); - assertEquals(25, startEnd[1]); - - hiddenCols.add(new int[] { 24, 25 }); - startEnd = align.getVisibleStartAndEndIndex(hiddenCols); - System.out.println(startEnd[0] + " : " + startEnd[1]); - assertEquals(1, startEnd[0]); - assertEquals(23, startEnd[1]); - } - /** * Tests that dbrefs with mappings to sequence get updated if the sequence * acquires a dataset sequence diff --git a/test/jalview/datamodel/HiddenColumnsTest.java b/test/jalview/datamodel/HiddenColumnsTest.java index 9f77eaa..5b92677 100644 --- a/test/jalview/datamodel/HiddenColumnsTest.java +++ b/test/jalview/datamodel/HiddenColumnsTest.java @@ -612,4 +612,34 @@ public class HiddenColumnsTest String result = hc.regionsToString(",", "--"); assertEquals("3--7,10--10,14--15", result); } + + @Test(groups = "Functional") + public void getVisibleStartAndEndIndexTest() + { + Sequence seq = new Sequence("testSeq", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + AlignmentI align = new Alignment(new SequenceI[] { seq }); + HiddenColumns hc = new HiddenColumns(); + + int[] startEnd = hc.getVisibleStartAndEndIndex(align.getWidth()); + assertEquals(0, startEnd[0]); + assertEquals(25, startEnd[1]); + + hc.hideColumns(0, 0); + startEnd = hc.getVisibleStartAndEndIndex(align.getWidth()); + assertEquals(1, startEnd[0]); + assertEquals(25, startEnd[1]); + + hc.hideColumns(6, 9); + hc.hideColumns(11, 12); + startEnd = hc.getVisibleStartAndEndIndex(align.getWidth()); + assertEquals(1, startEnd[0]); + assertEquals(25, startEnd[1]); + + hc.hideColumns(24, 25); + startEnd = hc.getVisibleStartAndEndIndex(align.getWidth()); + System.out.println(startEnd[0] + " : " + startEnd[1]); + assertEquals(1, startEnd[0]); + assertEquals(23, startEnd[1]); + } + } -- 1.7.10.2