JAL-2759 Combine findRegionForColumn code in HiddenColumnsCursor
[jalview.git] / src / jalview / datamodel / HiddenColumns.java
index 402ea25..fd4a9b5 100644 (file)
@@ -66,6 +66,9 @@ public class HiddenColumns
 {
   private static final int HASH_MULTIPLIER = 31;
 
+  private static final int NUMCOLUMNS_RESET = -1; // value of numColumns if it
+                                                  // needs to be recalculated
+
   private static final ReentrantReadWriteLock LOCK = new ReentrantReadWriteLock();
 
   /*
@@ -168,7 +171,8 @@ public class HiddenColumns
       if (!hiddenColumns.isEmpty())
       {
         // set up cursor reset values
-        HiddenCursorPosition cursorPos = cursor.findRegionForColumn(start);
+        HiddenCursorPosition cursorPos = cursor.findRegionForColumn(start,
+                false);
         regionindex = cursorPos.getRegionIndex();
 
         if (regionindex > 0)
@@ -212,7 +216,7 @@ public class HiddenColumns
               prevHiddenCount);
 
       // reset the number of columns so they will be recounted
-      numColumns = 0;
+      resetNumColumns();
 
     } finally
     {
@@ -303,7 +307,7 @@ public class HiddenColumns
         hideColumns(r[0], r[1]);
       }
       cursor = new HiddenColumnsCursor(hiddenColumns);
-      numColumns = 0;
+      resetNumColumns();
     } finally
     {
       LOCK.writeLock().unlock();
@@ -328,7 +332,7 @@ public class HiddenColumns
       }
       hiddenColumns.clear();
       cursor = new HiddenColumnsCursor(hiddenColumns);
-      numColumns = 0;
+      resetNumColumns();
 
     } finally
     {
@@ -353,7 +357,7 @@ public class HiddenColumns
 
       if (!hiddenColumns.isEmpty())
       {
-        int regionIndex = cursor.findRegionForColumn(start)
+        int regionIndex = cursor.findRegionForColumn(start, false)
                 .getRegionIndex();
 
         if (regionIndex != -1 && regionIndex != hiddenColumns.size())
@@ -372,7 +376,7 @@ public class HiddenColumns
 
             if (hiddenColumns.isEmpty())
             {
-              numColumns = 0;
+              resetNumColumns();
             }
             else
             {
@@ -438,7 +442,7 @@ public class HiddenColumns
     {
       LOCK.readLock().lock();
 
-      if (numColumns == 0)
+      if (numColumns == NUMCOLUMNS_RESET)
       {
         // numColumns is out of date, so recalculate
         int size = 0;
@@ -459,6 +463,17 @@ public class HiddenColumns
   }
 
   /**
+   * Reset numColumns so that it gets recalculated. Currently the code does not
+   * recalculate numColumns on hide/reveal as it requires a full sweep of the
+   * hidden columns collection / smarter updating. Placeholder here if later on
+   * a recalculation is added.
+   */
+  private void resetNumColumns()
+  {
+    numColumns = NUMCOLUMNS_RESET;
+  }
+
+  /**
    * Get the number of distinct hidden regions
    * 
    * @return number of regions
@@ -530,7 +545,8 @@ public class HiddenColumns
 
       if (!hiddenColumns.isEmpty())
       {
-        result += cursor.findRegionForVisColumn(column).getHiddenSoFar();
+        result += cursor.findRegionForColumn(column, true)
+                .getHiddenSoFar();
       }
 
       return result;
@@ -560,7 +576,7 @@ public class HiddenColumns
       if (!hiddenColumns.isEmpty())
       {
         HiddenCursorPosition cursorPos = cursor
-                .findRegionForColumn(hiddenColumn);
+                .findRegionForColumn(hiddenColumn, false);
         int index = cursorPos.getRegionIndex();
         int hiddenBeforeCol = cursorPos.getHiddenSoFar();
     
@@ -642,7 +658,8 @@ public class HiddenColumns
       LOCK.readLock().lock();
       if (!hiddenColumns.isEmpty())
       {
-        int index = cursor.findRegionForColumn(alPos).getRegionIndex();
+        int index = cursor.findRegionForColumn(alPos, false)
+                .getRegionIndex();
 
         if (left && index > 0)
         {
@@ -686,7 +703,8 @@ public class HiddenColumns
     {
       LOCK.readLock().lock();
 
-      int regionindex = cursor.findRegionForColumn(column).getRegionIndex();
+      int regionindex = cursor.findRegionForColumn(column, false)
+              .getRegionIndex();
       if (regionindex > -1 && regionindex < hiddenColumns.size())
       {
         int[] region = hiddenColumns.get(regionindex);
@@ -783,7 +801,7 @@ public class HiddenColumns
         hideColumns(firstSet, lastSet - 1);
       }
       cursor = new HiddenColumnsCursor(hiddenColumns);
-      numColumns = 0;
+      resetNumColumns();
     } finally
     {
       LOCK.writeLock().unlock();
@@ -832,7 +850,7 @@ public class HiddenColumns
       
       if (!hiddenColumns.isEmpty())
       {
-        HiddenCursorPosition pos = cursor.findRegionForColumn(start);
+        HiddenCursorPosition pos = cursor.findRegionForColumn(start, false);
         int index = pos.getRegionIndex();
         int startindex = index; // first index in hiddenColumns to remove
 
@@ -849,7 +867,7 @@ public class HiddenColumns
           }
         }
 
-        pos = cursor.findRegionForColumn(end);
+        pos = cursor.findRegionForColumn(end, false);
         index = pos.getRegionIndex();
         int endindex = index - 1; // last index in hiddenColumns to remove
 
@@ -867,7 +885,7 @@ public class HiddenColumns
 
         hiddenColumns.subList(startindex, endindex + 1).clear();
         cursor = new HiddenColumnsCursor(hiddenColumns);
-        numColumns = 0;
+        resetNumColumns();
       }
     } finally
     {
@@ -959,7 +977,7 @@ public class HiddenColumns
       if (!hiddenColumns.isEmpty())
       {
         // look for a region ending just before adjres
-        int regionindex = cursor.findRegionForColumn(adjres - 1)
+        int regionindex = cursor.findRegionForColumn(adjres - 1, false)
                 .getRegionIndex();
         if (regionindex < hiddenColumns.size()
                 && hiddenColumns.get(regionindex)[1] == adjres - 1)
@@ -1041,7 +1059,7 @@ public class HiddenColumns
       // region we'll get the cursor pointing to the region before, which is
       // what we want
       HiddenCursorPosition pos = cursor
-              .findRegionForColumn(absoluteStart - 1);
+              .findRegionForColumn(absoluteStart - 1, false);
 
       return new BoundedStartRegionIterator(pos, start, end,
               hiddenColumns);