public void handleLayerEvent(IStructuralChangeEvent event) { PositionCoordinate topLeftPosition = freezeLayer.getTopLeftPosition(); PositionCoordinate bottomRightPosition = freezeLayer.getBottomRightPosition(); Collection<StructuralDiff> columnDiffs = event.getColumnDiffs(); if (columnDiffs != null) { int leftOffset = 0; int rightOffset = 0; for (StructuralDiff columnDiff : columnDiffs) { switch (columnDiff.getDiffType()) { case ADD: Range afterPositionRange = columnDiff.getAfterPositionRange(); if (afterPositionRange.start < topLeftPosition.columnPosition) { leftOffset += afterPositionRange.size(); } if (afterPositionRange.start <= bottomRightPosition.columnPosition) { rightOffset += afterPositionRange.size(); } break; case DELETE: Range beforePositionRange = columnDiff.getBeforePositionRange(); if (beforePositionRange.start < topLeftPosition.columnPosition) { leftOffset -= Math.min(beforePositionRange.end, topLeftPosition.columnPosition + 1) - beforePositionRange.start; } if (beforePositionRange.start <= bottomRightPosition.columnPosition) { rightOffset -= Math.min(beforePositionRange.end, bottomRightPosition.columnPosition + 1) - beforePositionRange.start; } break; } } topLeftPosition.columnPosition += leftOffset; bottomRightPosition.columnPosition += rightOffset; } Collection<StructuralDiff> rowDiffs = event.getRowDiffs(); if (rowDiffs != null) { int leftOffset = 0; int rightOffset = 0; for (StructuralDiff rowDiff : rowDiffs) { switch (rowDiff.getDiffType()) { case ADD: Range afterPositionRange = rowDiff.getAfterPositionRange(); if (afterPositionRange.start < topLeftPosition.rowPosition) { leftOffset += afterPositionRange.size(); } if (afterPositionRange.start <= bottomRightPosition.rowPosition) { rightOffset += afterPositionRange.size(); } break; case DELETE: Range beforePositionRange = rowDiff.getBeforePositionRange(); if (beforePositionRange.start < topLeftPosition.rowPosition) { leftOffset -= Math.min(beforePositionRange.end, topLeftPosition.rowPosition + 1) - beforePositionRange.start; } if (beforePositionRange.start <= bottomRightPosition.rowPosition) { rightOffset -= Math.min(beforePositionRange.end, bottomRightPosition.rowPosition + 1) - beforePositionRange.start; } break; } } topLeftPosition.rowPosition += leftOffset; bottomRightPosition.rowPosition += rightOffset; } }