X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FHiddenColumns.java;h=169b0a4e4dca973dd5da9abd0d5ef1204243758a;hb=baee331692f533011f566ba30a7a711f3326320f;hp=be107211b95853ec93fb338956585ff94bff9fe9;hpb=ab67e99fb7336d0f4411488d9f843c720ab6b418;p=jalview.git diff --git a/src/jalview/datamodel/HiddenColumns.java b/src/jalview/datamodel/HiddenColumns.java index be10721..169b0a4 100644 --- a/src/jalview/datamodel/HiddenColumns.java +++ b/src/jalview/datamodel/HiddenColumns.java @@ -38,14 +38,46 @@ public class HiddenColumns * list of hidden column [start, end] ranges; the list is maintained in * ascending start column order */ - private Vector hiddenColumns; + private ArrayList hiddenColumns; /** - * This Method is used to return all the HiddenColumn regions + * Constructor + */ + public HiddenColumns() + { + } + + /** + * Copy constructor + * + * @param copy + */ + public HiddenColumns(HiddenColumns copy) + { + try + { + LOCK.writeLock().lock(); + if (copy != null) + { + if (copy.hiddenColumns != null) + { + hiddenColumns = copy.copyHiddenRegionsToArrayList(); + } + } + } finally + { + LOCK.writeLock().unlock(); + } + } + + /** + * This method is used to return all the HiddenColumn regions and is intended + * to remain private. External callers which need a copy of the regions can + * call getHiddenColumnsCopyAsList. * * @return empty list or List of hidden column intervals */ - public List getHiddenRegions() + private List getHiddenRegions() { return hiddenColumns == null ? Collections. emptyList() : hiddenColumns; @@ -67,13 +99,16 @@ public class HiddenColumns { LOCK.readLock().lock(); StringBuilder regionBuilder = new StringBuilder(); - for (int[] range : hiddenColumns) + if (hiddenColumns != null) { - regionBuilder.append(delimiter).append(range[0]).append(between) - .append(range[1]); - } + for (int[] range : hiddenColumns) + { + regionBuilder.append(delimiter).append(range[0]).append(between) + .append(range[1]); + } - regionBuilder.deleteCharAt(0); + regionBuilder.deleteCharAt(0); + } return regionBuilder.toString(); } finally { @@ -92,7 +127,7 @@ public class HiddenColumns { LOCK.readLock().lock(); int size = 0; - if (hasHidden()) + if (hasHiddenColumns()) { for (int[] range : hiddenColumns) { @@ -107,24 +142,6 @@ public class HiddenColumns } } - /** - * Answers if there are any hidden columns - * - * @return true if there are hidden columns - */ - public boolean hasHidden() - { - try - { - LOCK.readLock().lock(); - return (hiddenColumns != null) && (!hiddenColumns.isEmpty()); - } finally - { - LOCK.readLock().unlock(); - } - - } - @Override public boolean equals(Object obj) { @@ -183,7 +200,7 @@ public class HiddenColumns { for (int i = 0; i < hiddenColumns.size(); i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); if (result >= region[0]) { result += region[1] - region[0] + 1; @@ -218,7 +235,7 @@ public class HiddenColumns int[] region; do { - region = hiddenColumns.elementAt(index++); + region = hiddenColumns.get(index++); if (hiddenColumn > region[1]) { result -= region[1] + 1 - region[0]; @@ -331,29 +348,37 @@ public class HiddenColumns try { LOCK.readLock().lock(); - List positions = new ArrayList<>( - hiddenColumns.size()); + List positions = null; - positions.add(hiddenColumns.elementAt(0)[0]); - for (int i = 1; i < hiddenColumns.size(); ++i) + if (hiddenColumns != null) { + positions = new ArrayList<>(hiddenColumns.size()); - int result = 0; - if (hiddenColumns != null) + positions.add(hiddenColumns.get(0)[0]); + for (int i = 1; i < hiddenColumns.size(); ++i) { - int index = 0; - int gaps = 0; - do + + int result = 0; + if (hiddenColumns != null) { - int[] region = hiddenColumns.elementAt(index); - gaps += region[1] + 1 - region[0]; - result = region[1] + 1; - index++; - } while (index <= i); + int index = 0; + int gaps = 0; + do + { + int[] region = hiddenColumns.get(index); + gaps += region[1] + 1 - region[0]; + result = region[1] + 1; + index++; + } while (index <= i); - result -= gaps; + result -= gaps; + } + positions.add(result); } - positions.add(result); + } + else + { + positions = new ArrayList<>(); } return positions; @@ -381,7 +406,7 @@ public class HiddenColumns int index = 0; do { - int[] region = hiddenColumns.elementAt(index); + int[] region = hiddenColumns.get(index); if (alPos < region[0]) { return region[0]; @@ -417,7 +442,7 @@ public class HiddenColumns int index = hiddenColumns.size() - 1; do { - int[] region = hiddenColumns.elementAt(index); + int[] region = hiddenColumns.get(index); if (alPos > region[1]) { return region[1]; @@ -453,7 +478,7 @@ public class HiddenColumns int index = hiddenColumns.size() - 1; do { - int[] region = hiddenColumns.elementAt(index); + int[] region = hiddenColumns.get(index); if (pos > region[1]) { return index; @@ -479,28 +504,23 @@ public class HiddenColumns */ public void hideColumns(int start, int end) { - hideColumns(start, end, false); - } - - /** - * Adds the specified column range to the hidden columns - * - * @param start - * @param end - */ - private void hideColumns(int start, int end, boolean alreadyLocked) - { + boolean wasAlreadyLocked = false; try { - - if (!alreadyLocked) + // check if the write lock was already locked by this thread, + // as this method can be called internally in loops within HiddenColumns + if (!LOCK.isWriteLockedByCurrentThread()) { LOCK.writeLock().lock(); } + else + { + wasAlreadyLocked = true; + } if (hiddenColumns == null) { - hiddenColumns = new Vector<>(); + hiddenColumns = new ArrayList<>(); } /* @@ -509,14 +529,14 @@ public class HiddenColumns */ for (int i = 0; i < hiddenColumns.size(); i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); if (end < region[0] - 1) { /* * insert discontiguous preceding range */ - hiddenColumns.insertElementAt(new int[] { start, end }, i); + hiddenColumns.add(i, new int[] { start, end }); return; } @@ -563,10 +583,10 @@ public class HiddenColumns /* * remaining case is that the new range follows everything else */ - hiddenColumns.addElement(new int[] { start, end }); + hiddenColumns.add(new int[] { start, end }); } finally { - if (!alreadyLocked) + if (!wasAlreadyLocked) { LOCK.writeLock().unlock(); } @@ -597,64 +617,20 @@ public class HiddenColumns } } - /** - * ColumnSelection - */ - public HiddenColumns() - { - } - - /** - * Copy constructor - * - * @param copy - */ - public HiddenColumns(HiddenColumns copy) - { - try - { - - LOCK.readLock().lock(); - if (copy != null) - { - if (copy.hiddenColumns != null) - { - hiddenColumns = copy.copyHiddenRegions(); - } - } - } - finally - { - LOCK.readLock().unlock(); - } - } - - private Vector copyHiddenRegions() + private ArrayList copyHiddenRegionsToArrayList() { - Vector copy = new Vector<>(hiddenColumns.size()); - for (int i = 0, j = hiddenColumns.size(); i < j; i++) + int size = 0; + if (hiddenColumns != null) { - int[] rh; - int[] cp; - rh = hiddenColumns.elementAt(i); - if (rh != null) - { - cp = new int[rh.length]; - System.arraycopy(rh, 0, cp, 0, rh.length); - copy.addElement(cp); - } + size = hiddenColumns.size(); } - return copy; - } + ArrayList copy = new ArrayList<>(size); - private ArrayList copyHiddenRegionsToArrayList() - { - ArrayList copy = new ArrayList<>(hiddenColumns.size()); - for (int i = 0, j = hiddenColumns.size(); i < j; i++) + for (int i = 0, j = size; i < j; i++) { int[] rh; int[] cp; - rh = hiddenColumns.elementAt(i); + rh = hiddenColumns.get(i); if (rh != null) { cp = new int[rh.length]; @@ -662,22 +638,19 @@ public class HiddenColumns copy.add(cp); } } - return copy; - } - public Vector getHiddenColumnsCopy() - { - try - { - LOCK.readLock().lock(); - return copyHiddenRegions(); - } finally - { - LOCK.readLock().unlock(); - } + return copy; } - - public ArrayList getHiddenColumnsCopyAsList() + + /** + * Returns a copy of the vector of hidden regions, as an ArrayList. Before + * using this method please consider if you really need access to the hidden + * regions - a new (or existing!) method on HiddenColumns might be more + * appropriate. + * + * @return hidden regions as an ArrayList of [start,end] pairs + */ + public ArrayList getHiddenColumnsCopy() { try { @@ -711,12 +684,12 @@ public class HiddenColumns int hSize = hiddenColumns.size(); for (int i = 0; i < hSize; i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); if (region[0] > start && start + change > region[1]) { deletedHiddenColumns.add(region); - hiddenColumns.removeElementAt(i); + hiddenColumns.remove(i); i--; hSize--; continue; @@ -763,7 +736,7 @@ public class HiddenColumns { for (int i = 0; i < hiddenColumns.size(); i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); if (region[0] >= start) { region[0] -= change; @@ -774,7 +747,7 @@ public class HiddenColumns } if (region[1] < region[0]) { - hiddenColumns.removeElementAt(i--); + hiddenColumns.remove(i--); } if (region[0] < 0) @@ -869,7 +842,7 @@ public class HiddenColumns { LOCK.readLock().lock(); int iSize = seqs.length; - String selections[] = new String[iSize]; + String[] selections = new String[iSize]; if (hiddenColumns != null && hiddenColumns.size() > 0) { for (int i = 0; i < iSize; i++) @@ -1194,7 +1167,7 @@ public class HiddenColumns List inserts = sr.getInsertions(); for (int[] r : inserts) { - hideColumns(r[0], r[1], true); + hideColumns(r[0], r[1]); } } finally { @@ -1214,7 +1187,7 @@ public class HiddenColumns { for (int i = 0; i < hiddenColumns.size(); i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); for (int j = region[0]; j < region[1] + 1; j++) { sel.addElement(j); @@ -1243,7 +1216,7 @@ public class HiddenColumns LOCK.writeLock().lock(); for (int i = 0; i < hiddenColumns.size(); i++) { - int[] region = hiddenColumns.elementAt(i); + int[] region = hiddenColumns.get(i); if (start == region[0]) { for (int j = region[0]; j < region[1] + 1; j++) @@ -1251,7 +1224,7 @@ public class HiddenColumns sel.addElement(j); } - hiddenColumns.removeElement(region); + hiddenColumns.remove(region); break; } } @@ -1274,16 +1247,16 @@ public class HiddenColumns * @param intervals * @return */ - private boolean pruneIntervalVector(final List shifts, - Vector intervals) + private boolean pruneIntervalList(final List shifts, + ArrayList intervals) { boolean pruned = false; 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); + int[] hr = intervals.get(i); + int[] sr = shifts.get(s); while (i <= j && s <= t) { boolean trailinghn = hr[1] >= sr[0]; @@ -1291,7 +1264,7 @@ public class HiddenColumns { if (i < j) { - hr = intervals.elementAt(++i); + hr = intervals.get(++i); } else { @@ -1319,12 +1292,12 @@ public class HiddenColumns { if (trailinghc) { // deleted hidden region. - intervals.removeElementAt(i); + intervals.remove(i); pruned = true; j--; if (i <= j) { - hr = intervals.elementAt(i); + hr = intervals.get(i); } continue; } @@ -1378,7 +1351,7 @@ public class HiddenColumns // delete any intervals intersecting. if (hiddenColumns != null) { - pruneIntervalVector(shifts, hiddenColumns); + pruneIntervalList(shifts, hiddenColumns); if (hiddenColumns != null && hiddenColumns.size() == 0) { hiddenColumns = null; @@ -1434,8 +1407,7 @@ public class HiddenColumns // recover mapping between sequence's non-gap positions and positions // mapping to view. pruneDeletions(ShiftList.parseMap(origseq.gapMap())); - int[] viscontigs = al.getHiddenColumns().getVisibleContigs(0, - profileseq.getLength()); + int[] viscontigs = getVisibleContigs(0, profileseq.getLength()); int spos = 0; int offset = 0; @@ -1623,7 +1595,7 @@ public class HiddenColumns .nextSetBit(lastSet)) { lastSet = inserts.nextClearBit(firstSet); - hideColumns(firstSet, lastSet - 1, true); + hideColumns(firstSet, lastSet - 1); } } finally { @@ -1711,4 +1683,37 @@ public class HiddenColumns } + /** + * Finds the hidden region (if any) which starts or ends at res + * + * @param res + * visible residue position, unadjusted for hidden columns + * @return region as [start,end] or null if no matching region is found + */ + public int[] getRegionWithEdgeAtRes(int res) + { + try + { + LOCK.readLock().lock(); + int adjres = adjustForHiddenColumns(res); + + int[] reveal = null; + if (hiddenColumns != null) + { + for (int[] region : hiddenColumns) + { + if (adjres + 1 == region[0] || adjres - 1 == region[1]) + { + reveal = region; + break; + } + } + } + return reveal; + } finally + { + LOCK.readLock().unlock(); + } + } + }