private HiddenColumnsCursor cursor = new HiddenColumnsCursor();
+ private int numColumns = 0;
+
/*
* list of hidden column [start, end] ranges; the list is maintained in
* ascending start column order
if (copy != null)
{
hiddenColumns = new ArrayList<>();
+ numColumns = 0;
Iterator<int[]> it = copy.getBoundedIterator(start, end);
while (it.hasNext())
{
hiddenColumns.add(
new int[]
{ region[0] - offset, region[1] - offset });
+ numColumns += region[1] - region[0] + 1;
}
}
cursor.resetCursor(hiddenColumns);
try
{
LOCK.readLock().lock();
- int size = 0;
- if (hiddenColumns != null)
+
+ if (numColumns == 0 && hiddenColumns != null)
{
- Iterator<int[]> it = hiddenColumns.iterator();
- while (it.hasNext())
+ // numColumns is out of date, so recalculate
+ int size = 0;
+ if (hiddenColumns != null)
{
- int[] range = it.next();
- size += range[1] - range[0] + 1;
+ Iterator<int[]> it = hiddenColumns.iterator();
+ while (it.hasNext())
+ {
+ int[] range = it.next();
+ size += range[1] - range[0] + 1;
+ }
}
+ numColumns = size;
}
- return size;
+
+ return numColumns;
} finally
{
LOCK.readLock().unlock();
if (hiddenColumns != null)
{
- result += cursor.getHiddenOffset(column);
+ result += cursor.getHiddenOffset(column).getHiddenSoFar();
}
return result;
if (hiddenColumns != null)
{
- int index = cursor.findRegionForColumn(hiddenColumn);
- int hiddenBeforeCol = cursor.getHiddenSoFar();
+ HiddenCursorPosition cursorPos = cursor
+ .findRegionForColumn(hiddenColumn);
+ int index = cursorPos.getRegionIndex();
+ int hiddenBeforeCol = cursorPos.getHiddenSoFar();
// just subtract hidden cols count - this works fine if column is
// visible
}
}
}
+
return result; // return the shifted position after removing hidden
// columns.
} finally
LOCK.readLock().lock();
if (hiddenColumns != null)
{
- int index = cursor.findRegionForColumn(alPos);
+ int index = cursor.findRegionForColumn(alPos).getRegionIndex();
if (index < hiddenColumns.size())
{
int[] region = hiddenColumns.get(index);
if (hiddenColumns != null)
{
- int index = cursor.findRegionForColumn(alPos);
+ int index = cursor.findRegionForColumn(alPos).getRegionIndex();
if (index > 0)
{
if (!wasAlreadyLocked)
{
cursor.resetCursor(hiddenColumns);
+
+ // reset the number of columns so they will be recounted
+ numColumns = 0;
}
} finally
{
{
LOCK.readLock().lock();
- Iterator<int[]> it = new RegionsIterator(column, column,
- hiddenColumns, cursor);
- while (it.hasNext())
+ int regionindex = cursor.findRegionForColumn(column).getRegionIndex();
+ if (regionindex > -1 && regionindex < hiddenColumns.size())
{
- int[] region = it.next();
+ int[] region = hiddenColumns.get(regionindex);
if (column >= region[0] && column <= region[1])
{
return false;
}
}
-
return true;
+
} finally
{
LOCK.readLock().unlock();
hideColumns(r[0], r[1]);
}
cursor.resetCursor(hiddenColumns);
+ numColumns = 0;
} finally
{
LOCK.writeLock().unlock();
}
hiddenColumns = null;
cursor.resetCursor(hiddenColumns);
+ numColumns = 0;
}
} finally
{
if (hiddenColumns != null)
{
- int regionIndex = cursor.findRegionForColumn(start);
+ int regionIndex = cursor.findRegionForColumn(start)
+ .getRegionIndex();
if (regionIndex != -1 && regionIndex != hiddenColumns.size())
{
{
sel.addElement(j);
}
+ int colsToRemove = region[1] - region[0] + 1;
hiddenColumns.remove(regionIndex);
if (hiddenColumns.isEmpty())
{
hiddenColumns = null;
+ numColumns = 0;
+ }
+ else
+ {
+ numColumns -= colsToRemove;
}
cursor.updateForDeletedRegion(hiddenColumns);
+
}
}
}
}
hiddenColumns = newhidden;
cursor.resetCursor(hiddenColumns);
+ numColumns = 0;
} finally
{
LOCK.writeLock().unlock();
hideColumns(firstSet, lastSet - 1);
}
cursor.resetCursor(hiddenColumns);
+ numColumns = 0;
} finally
{
LOCK.writeLock().unlock();
if (hiddenColumns != null)
{
- int regionindex = cursor.findRegionForColumn(adjres - 1);
+ // look for a region ending just before adjres
+ int regionindex = cursor.findRegionForColumn(adjres - 1)
+ .getRegionIndex();
if (regionindex < hiddenColumns.size()
&& hiddenColumns.get(regionindex)[1] == adjres - 1)
{
reveal = hiddenColumns.get(regionindex);
}
+ // check if the region ends just after adjres
+ else if (regionindex < hiddenColumns.size()
+ && hiddenColumns.get(regionindex)[0] == adjres + 1)
+ {
+ reveal = hiddenColumns.get(regionindex);
+ }
+ // or try the next region
else
{
- regionindex = cursor.findRegionForColumn(adjres + 1);
+ regionindex++;
if (regionindex < hiddenColumns.size()
&& hiddenColumns.get(regionindex)[0] == adjres + 1)
{