Bug 51431 - Avoid IndexOutOfBoundException when removing freeze panes in XSSF
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1139533 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e4cd5a5b00
commit
af650e26a0
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.8-beta4" date="2011-??-??">
|
<release version="3.8-beta4" date="2011-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">51431 - Avoid IndexOutOfBoundException when removing freeze panes in XSSF </action>
|
||||||
<action dev="poi-developers" type="fix">48877 - Fixed XSSFRichTextString to respect leading and trailing line breaks </action>
|
<action dev="poi-developers" type="fix">48877 - Fixed XSSFRichTextString to respect leading and trailing line breaks </action>
|
||||||
<action dev="poi-developers" type="fix">49564 - Fixed default behaviour of XSSFCellStyle.getLocked() </action>
|
<action dev="poi-developers" type="fix">49564 - Fixed default behaviour of XSSFCellStyle.getLocked() </action>
|
||||||
<action dev="poi-developers" type="fix">48314 - Fixed setting column and row breaks in XSSF</action>
|
<action dev="poi-developers" type="fix">48314 - Fixed setting column and row breaks in XSSF</action>
|
||||||
|
@ -1315,6 +1315,9 @@ public final class InternalSheet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
*
|
||||||
|
* <p>If both colSplit and rowSplit are zero then the existing freeze pane is removed</p>
|
||||||
|
*
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
* @param topRow Top row visible in bottom pane
|
* @param topRow Top row visible in bottom pane
|
||||||
@ -1325,6 +1328,15 @@ public final class InternalSheet {
|
|||||||
if (paneLoc != -1)
|
if (paneLoc != -1)
|
||||||
_records.remove(paneLoc);
|
_records.remove(paneLoc);
|
||||||
|
|
||||||
|
// If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
if(colSplit == 0 && rowSplit == 0){
|
||||||
|
windowTwo.setFreezePanes(false);
|
||||||
|
windowTwo.setFreezePanesNoSplit(false);
|
||||||
|
SelectionRecord sel = (SelectionRecord) findFirstRecordBySid(SelectionRecord.sid);
|
||||||
|
sel.setPane(PaneInformation.PANE_UPPER_LEFT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int loc = findFirstRecordLocBySid(WindowTwoRecord.sid);
|
int loc = findFirstRecordLocBySid(WindowTwoRecord.sid);
|
||||||
PaneRecord pane = new PaneRecord();
|
PaneRecord pane = new PaneRecord();
|
||||||
pane.setX((short)colSplit);
|
pane.setX((short)colSplit);
|
||||||
@ -1335,7 +1347,7 @@ public final class InternalSheet {
|
|||||||
pane.setTopRow((short)0);
|
pane.setTopRow((short)0);
|
||||||
pane.setActivePane((short)1);
|
pane.setActivePane((short)1);
|
||||||
} else if (colSplit == 0) {
|
} else if (colSplit == 0) {
|
||||||
pane.setLeftColumn((short)64);
|
pane.setLeftColumn((short)0);
|
||||||
pane.setActivePane((short)2);
|
pane.setActivePane((short)2);
|
||||||
} else {
|
} else {
|
||||||
pane.setActivePane((short)0);
|
pane.setActivePane((short)0);
|
||||||
|
@ -1409,6 +1409,11 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
* @param leftmostColumn Left column visible in right pane.
|
* @param leftmostColumn Left column visible in right pane.
|
||||||
@ -1424,6 +1429,11 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
*/
|
*/
|
||||||
|
@ -594,6 +594,9 @@ public interface Sheet extends Iterable<Row> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
* <p>
|
||||||
|
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
* </p>
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
* @param leftmostColumn Left column visible in right pane.
|
* @param leftmostColumn Left column visible in right pane.
|
||||||
@ -603,6 +606,9 @@ public interface Sheet extends Iterable<Row> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
* <p>
|
||||||
|
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
* </p>
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
*/
|
*/
|
||||||
|
@ -491,22 +491,40 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
* Creates a split (freezepane). Any existing freezepane or split pane is overwritten.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
* @param colSplit Horizonatal position of split.
|
* @param colSplit Horizonatal position of split.
|
||||||
* @param rowSplit Vertical position of split.
|
* @param rowSplit Vertical position of split.
|
||||||
* @param topRow Top row visible in bottom pane
|
|
||||||
* @param leftmostColumn Left column visible in right pane.
|
* @param leftmostColumn Left column visible in right pane.
|
||||||
|
* @param topRow Top row visible in bottom pane
|
||||||
*/
|
*/
|
||||||
public void createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow) {
|
public void createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow) {
|
||||||
CTPane pane = getPane();
|
CTSheetView ctView = getDefaultSheetView();
|
||||||
|
|
||||||
|
// If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
if(colSplit == 0 && rowSplit == 0){
|
||||||
|
if(ctView.isSetPane()) ctView.unsetPane();
|
||||||
|
ctView.setSelectionArray(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ctView.isSetPane()) {
|
||||||
|
ctView.addNewPane();
|
||||||
|
}
|
||||||
|
CTPane pane = ctView.getPane();
|
||||||
|
|
||||||
if (colSplit > 0) {
|
if (colSplit > 0) {
|
||||||
pane.setXSplit(colSplit);
|
pane.setXSplit(colSplit);
|
||||||
} else {
|
} else {
|
||||||
pane.unsetXSplit();
|
if(pane.isSetXSplit()) pane.unsetXSplit();
|
||||||
}
|
}
|
||||||
if (rowSplit > 0) {
|
if (rowSplit > 0) {
|
||||||
pane.setYSplit(rowSplit);
|
pane.setYSplit(rowSplit);
|
||||||
} else {
|
} else {
|
||||||
pane.unsetYSplit();
|
if(pane.isSetYSplit()) pane.unsetYSplit();
|
||||||
}
|
}
|
||||||
|
|
||||||
pane.setState(STPaneState.FROZEN);
|
pane.setState(STPaneState.FROZEN);
|
||||||
@ -521,7 +539,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
pane.setActivePane(STPane.BOTTOM_RIGHT);
|
pane.setActivePane(STPane.BOTTOM_RIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTSheetView ctView = getDefaultSheetView();
|
|
||||||
ctView.setSelectionArray(null);
|
ctView.setSelectionArray(null);
|
||||||
CTSelection sel = ctView.addNewSelection();
|
CTSelection sel = ctView.addNewSelection();
|
||||||
sel.setPane(pane.getActivePane());
|
sel.setPane(pane.getActivePane());
|
||||||
@ -976,11 +993,14 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
* @return null if no pane configured, or the pane information.
|
* @return null if no pane configured, or the pane information.
|
||||||
*/
|
*/
|
||||||
public PaneInformation getPaneInformation() {
|
public PaneInformation getPaneInformation() {
|
||||||
CTPane pane = getPane();
|
CTPane pane = getDefaultSheetView().getPane();
|
||||||
|
// no pane configured
|
||||||
|
if(pane == null) return null;
|
||||||
|
|
||||||
CellReference cellRef = pane.isSetTopLeftCell() ? new CellReference(pane.getTopLeftCell()) : null;
|
CellReference cellRef = pane.isSetTopLeftCell() ? new CellReference(pane.getTopLeftCell()) : null;
|
||||||
return new PaneInformation((short)pane.getXSplit(), (short)pane.getYSplit(),
|
return new PaneInformation((short)pane.getXSplit(), (short)pane.getYSplit(),
|
||||||
(short)(cellRef == null ? 0 : cellRef.getRow()),(cellRef == null ? 0 : cellRef.getCol()),
|
(short)(cellRef == null ? 0 : cellRef.getRow()),(cellRef == null ? 0 : cellRef.getCol()),
|
||||||
(byte)pane.getActivePane().intValue(), pane.getState() == STPaneState.FROZEN);
|
(byte)(pane.getActivePane().intValue() - 1), pane.getState() == STPaneState.FROZEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1021,63 +1021,6 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||||||
assertEquals(false, ps2.getLandscape());
|
assertEquals(false, ps2.getLandscape());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* CreateFreezePane column/row order check
|
|
||||||
*/
|
|
||||||
public void test49381() throws Exception {
|
|
||||||
Workbook[] wbs = new Workbook[] { new HSSFWorkbook(), new XSSFWorkbook() };
|
|
||||||
int colSplit = 1;
|
|
||||||
int rowSplit = 2;
|
|
||||||
int leftmostColumn = 3;
|
|
||||||
int topRow = 4;
|
|
||||||
|
|
||||||
for(Workbook wb : wbs) {
|
|
||||||
Sheet s = wb.createSheet();
|
|
||||||
|
|
||||||
// Populate
|
|
||||||
for(int rn=0; rn<= topRow; rn++) {
|
|
||||||
Row r = s.createRow(rn);
|
|
||||||
for(int cn=0; cn<leftmostColumn; cn++) {
|
|
||||||
Cell c = r.createCell(cn, Cell.CELL_TYPE_NUMERIC);
|
|
||||||
c.setCellValue(100*rn + cn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the Freeze Pane
|
|
||||||
s.createFreezePane(colSplit, rowSplit, leftmostColumn, topRow);
|
|
||||||
PaneInformation paneInfo = s.getPaneInformation();
|
|
||||||
|
|
||||||
// Check it
|
|
||||||
assertEquals(colSplit, paneInfo.getVerticalSplitPosition());
|
|
||||||
assertEquals(rowSplit, paneInfo.getHorizontalSplitPosition());
|
|
||||||
assertEquals(leftmostColumn, paneInfo.getVerticalSplitLeftColumn());
|
|
||||||
assertEquals(topRow, paneInfo.getHorizontalSplitTopRow());
|
|
||||||
|
|
||||||
|
|
||||||
// Now a row only freezepane
|
|
||||||
s.createFreezePane(0, 3);
|
|
||||||
paneInfo = s.getPaneInformation();
|
|
||||||
|
|
||||||
assertEquals(0, paneInfo.getVerticalSplitPosition());
|
|
||||||
assertEquals(3, paneInfo.getHorizontalSplitPosition());
|
|
||||||
if(wb == wbs[0]) {
|
|
||||||
assertEquals(64, paneInfo.getVerticalSplitLeftColumn()); // HSSF
|
|
||||||
} else {
|
|
||||||
assertEquals(0, paneInfo.getVerticalSplitLeftColumn()); // XSSF
|
|
||||||
}
|
|
||||||
assertEquals(3, paneInfo.getHorizontalSplitTopRow());
|
|
||||||
|
|
||||||
// Now a column only freezepane
|
|
||||||
s.createFreezePane(4, 0);
|
|
||||||
paneInfo = s.getPaneInformation();
|
|
||||||
|
|
||||||
assertEquals(4, paneInfo.getVerticalSplitPosition());
|
|
||||||
assertEquals(0, paneInfo.getHorizontalSplitPosition());
|
|
||||||
assertEquals(4 , paneInfo.getVerticalSplitLeftColumn());
|
|
||||||
assertEquals(0, paneInfo.getHorizontalSplitTopRow());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Column style
|
* Default Column style
|
||||||
*/
|
*/
|
||||||
|
@ -213,7 +213,7 @@ public final class TestXSSFSheet extends BaseTestSheet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreateFreezePane() {
|
public void testCreateFreezePane_XSSF() {
|
||||||
XSSFWorkbook workbook = new XSSFWorkbook();
|
XSSFWorkbook workbook = new XSSFWorkbook();
|
||||||
XSSFSheet sheet = workbook.createSheet();
|
XSSFSheet sheet = workbook.createSheet();
|
||||||
CTWorksheet ctWorksheet = sheet.getCTWorksheet();
|
CTWorksheet ctWorksheet = sheet.getCTWorksheet();
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.ss.usermodel;
|
|||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.util.PaneInformation;
|
||||||
import org.apache.poi.ss.ITestDataProvider;
|
import org.apache.poi.ss.ITestDataProvider;
|
||||||
import org.apache.poi.ss.SpreadsheetVersion;
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
@ -326,4 +327,56 @@ public abstract class BaseTestBugzillaIssues extends TestCase {
|
|||||||
assertEquals(255*256, sheet.getColumnWidth(0)); // maximum column width is 255 characters
|
assertEquals(255*256, sheet.getColumnWidth(0)); // maximum column width is 255 characters
|
||||||
sheet.setColumnWidth(0, sheet.getColumnWidth(0)); // Bug 506819 reports exception at this point
|
sheet.setColumnWidth(0, sheet.getColumnWidth(0)); // Bug 506819 reports exception at this point
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CreateFreezePane column/row order check
|
||||||
|
*/
|
||||||
|
public void test49381() throws Exception {
|
||||||
|
Workbook wb = _testDataProvider.createWorkbook();
|
||||||
|
int colSplit = 1;
|
||||||
|
int rowSplit = 2;
|
||||||
|
int leftmostColumn = 3;
|
||||||
|
int topRow = 4;
|
||||||
|
|
||||||
|
Sheet s = wb.createSheet();
|
||||||
|
|
||||||
|
// Populate
|
||||||
|
for(int rn=0; rn<= topRow; rn++) {
|
||||||
|
Row r = s.createRow(rn);
|
||||||
|
for(int cn=0; cn<leftmostColumn; cn++) {
|
||||||
|
Cell c = r.createCell(cn, Cell.CELL_TYPE_NUMERIC);
|
||||||
|
c.setCellValue(100*rn + cn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the Freeze Pane
|
||||||
|
s.createFreezePane(colSplit, rowSplit, leftmostColumn, topRow);
|
||||||
|
PaneInformation paneInfo = s.getPaneInformation();
|
||||||
|
|
||||||
|
// Check it
|
||||||
|
assertEquals(colSplit, paneInfo.getVerticalSplitPosition());
|
||||||
|
assertEquals(rowSplit, paneInfo.getHorizontalSplitPosition());
|
||||||
|
assertEquals(leftmostColumn, paneInfo.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(topRow, paneInfo.getHorizontalSplitTopRow());
|
||||||
|
|
||||||
|
|
||||||
|
// Now a row only freezepane
|
||||||
|
s.createFreezePane(0, 3);
|
||||||
|
paneInfo = s.getPaneInformation();
|
||||||
|
|
||||||
|
assertEquals(0, paneInfo.getVerticalSplitPosition());
|
||||||
|
assertEquals(3, paneInfo.getHorizontalSplitPosition());
|
||||||
|
assertEquals(0, paneInfo.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(3, paneInfo.getHorizontalSplitTopRow());
|
||||||
|
|
||||||
|
// Now a column only freezepane
|
||||||
|
s.createFreezePane(4, 0);
|
||||||
|
paneInfo = s.getPaneInformation();
|
||||||
|
|
||||||
|
assertEquals(4, paneInfo.getVerticalSplitPosition());
|
||||||
|
assertEquals(0, paneInfo.getHorizontalSplitPosition());
|
||||||
|
assertEquals(4 , paneInfo.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(0, paneInfo.getHorizontalSplitTopRow());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import java.util.Iterator;
|
|||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.util.PaneInformation;
|
||||||
import org.apache.poi.ss.ITestDataProvider;
|
import org.apache.poi.ss.ITestDataProvider;
|
||||||
import org.apache.poi.ss.SpreadsheetVersion;
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
@ -653,5 +654,53 @@ public abstract class BaseTestSheet extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCreateFreezePane() {
|
||||||
|
Workbook wb = _testDataProvider.createWorkbook();
|
||||||
|
// create a workbook
|
||||||
|
Sheet sheet = wb.createSheet();
|
||||||
|
assertNull(sheet.getPaneInformation());
|
||||||
|
sheet.createFreezePane(0, 0);
|
||||||
|
// still null
|
||||||
|
assertNull(sheet.getPaneInformation());
|
||||||
|
|
||||||
|
sheet.createFreezePane(2, 3);
|
||||||
|
|
||||||
|
PaneInformation info = sheet.getPaneInformation();
|
||||||
|
|
||||||
|
|
||||||
|
assertEquals(PaneInformation.PANE_LOWER_RIGHT, info.getActivePane());
|
||||||
|
assertEquals(3, info.getHorizontalSplitPosition());
|
||||||
|
assertEquals(3, info.getHorizontalSplitTopRow());
|
||||||
|
assertEquals(2, info.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(2, info.getVerticalSplitPosition());
|
||||||
|
|
||||||
|
sheet.createFreezePane(0, 0);
|
||||||
|
// If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
assertNull(sheet.getPaneInformation());
|
||||||
|
|
||||||
|
sheet.createFreezePane(0, 3);
|
||||||
|
|
||||||
|
info = sheet.getPaneInformation();
|
||||||
|
|
||||||
|
assertEquals(PaneInformation.PANE_LOWER_LEFT, info.getActivePane());
|
||||||
|
assertEquals(3, info.getHorizontalSplitPosition());
|
||||||
|
assertEquals(3, info.getHorizontalSplitTopRow());
|
||||||
|
assertEquals(0, info.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(0, info.getVerticalSplitPosition());
|
||||||
|
|
||||||
|
sheet.createFreezePane(3, 0);
|
||||||
|
|
||||||
|
info = sheet.getPaneInformation();
|
||||||
|
|
||||||
|
assertEquals(PaneInformation.PANE_UPPER_RIGHT, info.getActivePane());
|
||||||
|
assertEquals(0, info.getHorizontalSplitPosition());
|
||||||
|
assertEquals(0, info.getHorizontalSplitTopRow());
|
||||||
|
assertEquals(3, info.getVerticalSplitLeftColumn());
|
||||||
|
assertEquals(3, info.getVerticalSplitPosition());
|
||||||
|
|
||||||
|
sheet.createFreezePane(0, 0);
|
||||||
|
// If both colSplit and rowSplit are zero then the existing freeze pane is removed
|
||||||
|
assertNull(sheet.getPaneInformation());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user