You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2011/06/25 14:19:50 UTC
svn commit: r1139533 - in /poi/trunk/src: documentation/content/xdocs/
java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/usermodel/
java/org/apache/poi/ss/usermodel/ ooxml/java/org/apache/poi/xssf/usermodel/
ooxml/testcases/org/apache/poi/xssf/u...
Author: yegor
Date: Sat Jun 25 12:19:49 2011
New Revision: 1139533
URL: http://svn.apache.org/viewvc?rev=1139533&view=rev
Log:
Bug 51431 - Avoid IndexOutOfBoundException when removing freeze panes in XSSF
Modified:
poi/trunk/src/documentation/content/xdocs/status.xml
poi/trunk/src/java/org/apache/poi/hssf/model/InternalSheet.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java
Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sat Jun 25 12:19:49 2011
@@ -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>
Modified: poi/trunk/src/java/org/apache/poi/hssf/model/InternalSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/InternalSheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/InternalSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/InternalSheet.java Sat Jun 25 12:19:49 2011
@@ -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);
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Sat Jun 25 12:19:49 2011
@@ -1409,6 +1409,11 @@ public final class HSSFSheet implements
/**
* 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
/**
* 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.
*/
Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java Sat Jun 25 12:19:49 2011
@@ -594,6 +594,9 @@ public interface Sheet extends Iterable<
/**
* 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<
/**
* 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.
*/
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Sat Jun 25 12:19:49 2011
@@ -491,22 +491,40 @@ public class XSSFSheet extends POIXMLDoc
/**
* 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 POIXMLDoc
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 POIXMLDoc
* @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);
}
/**
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Sat Jun 25 12:19:49 2011
@@ -1020,64 +1020,7 @@ public final class TestXSSFBugs extends
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
*/
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java Sat Jun 25 12:19:49 2011
@@ -213,7 +213,7 @@ public final class TestXSSFSheet extends
}
- public void testCreateFreezePane() {
+ public void testCreateFreezePane_XSSF() {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet();
CTWorksheet ctWorksheet = sheet.getCTWorksheet();
Modified: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java Sat Jun 25 12:19:49 2011
@@ -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 BaseTestBugzillaIs
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());
+ }
+
}
Modified: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java?rev=1139533&r1=1139532&r2=1139533&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java Sat Jun 25 12:19:49 2011
@@ -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 exte
}
+ 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());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org