Browse Source

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
tags/REL_3_8_BETA4
Yegor Kozlov 13 years ago
parent
commit
d0f07c56da

+ 1
- 0
src/documentation/content/xdocs/status.xml View File

@@ -34,6 +34,7 @@

<changes>
<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">49564 - Fixed default behaviour of XSSFCellStyle.getLocked() </action>
<action dev="poi-developers" type="fix">48314 - Fixed setting column and row breaks in XSSF</action>

+ 13
- 1
src/java/org/apache/poi/hssf/model/InternalSheet.java View File

@@ -1315,6 +1315,9 @@ public final class InternalSheet {

/**
* 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 rowSplit Vertical position of split.
* @param topRow Top row visible in bottom pane
@@ -1325,6 +1328,15 @@ public final class InternalSheet {
if (paneLoc != -1)
_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);
PaneRecord pane = new PaneRecord();
pane.setX((short)colSplit);
@@ -1335,7 +1347,7 @@ public final class InternalSheet {
pane.setTopRow((short)0);
pane.setActivePane((short)1);
} else if (colSplit == 0) {
pane.setLeftColumn((short)64);
pane.setLeftColumn((short)0);
pane.setActivePane((short)2);
} else {
pane.setActivePane((short)0);

+ 10
- 0
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java View File

@@ -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.
*
* <p>
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
* </p>
*
* @param colSplit Horizonatal position of split.
* @param rowSplit Vertical position of split.
* @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.
*
* <p>
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
* </p>
*
* @param colSplit Horizonatal position of split.
* @param rowSplit Vertical position of split.
*/

+ 6
- 0
src/java/org/apache/poi/ss/usermodel/Sheet.java View File

@@ -594,6 +594,9 @@ public interface Sheet extends Iterable<Row> {

/**
* 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 rowSplit Vertical position of split.
* @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.
* <p>
* If both colSplit and rowSplit are zero then the existing freeze pane is removed
* </p>
* @param colSplit Horizonatal position of split.
* @param rowSplit Vertical position of split.
*/

+ 28
- 8
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java View File

@@ -491,22 +491,40 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {

/**
* 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 rowSplit Vertical position of split.
* @param topRow Top row visible in bottom 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) {
CTPane pane = getPane();
if (colSplit > 0) {
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) {
pane.setXSplit(colSplit);
} else {
pane.unsetXSplit();
if(pane.isSetXSplit()) pane.unsetXSplit();
}
if (rowSplit > 0) {
pane.setYSplit(rowSplit);
} else {
pane.unsetYSplit();
if(pane.isSetYSplit()) pane.unsetYSplit();
}
pane.setState(STPaneState.FROZEN);
@@ -521,7 +539,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
pane.setActivePane(STPane.BOTTOM_RIGHT);
}

CTSheetView ctView = getDefaultSheetView();
ctView.setSelectionArray(null);
CTSelection sel = ctView.addNewSelection();
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.
*/
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;
return new PaneInformation((short)pane.getXSplit(), (short)pane.getYSplit(),
(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);
}

/**

+ 0
- 57
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java View File

@@ -1020,64 +1020,7 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals(true, ps2.getValidSettings());
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
*/

+ 1
- 1
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java View File

@@ -213,7 +213,7 @@ public final class TestXSSFSheet extends BaseTestSheet {

}

public void testCreateFreezePane() {
public void testCreateFreezePane_XSSF() {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet();
CTWorksheet ctWorksheet = sheet.getCTWorksheet();

+ 53
- 0
src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java View File

@@ -19,6 +19,7 @@ package org.apache.poi.ss.usermodel;

import junit.framework.TestCase;

import org.apache.poi.hssf.util.PaneInformation;
import org.apache.poi.ss.ITestDataProvider;
import org.apache.poi.ss.SpreadsheetVersion;
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
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());
}

}

+ 49
- 0
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java View File

@@ -21,6 +21,7 @@ import java.util.Iterator;

import junit.framework.TestCase;

import org.apache.poi.hssf.util.PaneInformation;
import org.apache.poi.ss.ITestDataProvider;
import org.apache.poi.ss.SpreadsheetVersion;
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…
Cancel
Save