- if (hiddenColumns.isEmpty())
- {
- return null;
- }
-
- HiddenCursorPosition oldpos = cursorPos;
- int index = oldpos.getRegionIndex();
- int hiddenCount = oldpos.getHiddenSoFar();
-
- if (index == hiddenColumns.size())
- {
- // went past the end of hiddenColumns collection last time
- index--;
- int[] region = hiddenColumns.get(index);
- hiddenCount -= region[1] - region[0] + 1;
- }
-
- // this if statement excludes case where column is in current region
- // - no changes needed
- if (column < firstColumn)
- {
- index = 0;
- hiddenCount = 0;
- }
- // column is after current region
- else if (column > hiddenColumns.get(index)[1])
- {
- // iterate from where we are now, if we're lucky we'll be close by
- // (but still better than iterating from 0)
- // stop when we find the region *before* column
- // i.e. the next region starts after column or if not, ends after column
- while ((index < hiddenColumns.size())
- && (column > hiddenColumns.get(index)[1]))
- {
- int[] region = hiddenColumns.get(index);
- hiddenCount += region[1] - region[0] + 1;
- index++;
- }
- }
- // column is before current region
- else if (column < hiddenColumns.get(index)[0])
- {
- // column is before or in the previous region
- while ((index > 0) && (hiddenColumns.get(index - 1)[1] >= column))
- {
- index--;
- int[] region = hiddenColumns.get(index);
- hiddenCount -= region[1] - region[0] + 1;
- }
- }
-
- if (index != oldpos.getRegionIndex()
- || hiddenCount != oldpos.getHiddenSoFar())
- {
- cursorPos = new HiddenCursorPosition(index,
- hiddenCount);
- return cursorPos;
- }
- return oldpos;
- }