You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by av...@apache.org on 2003/03/01 18:56:56 UTC
cvs commit: jakarta-poi/src/testcases/org/apache/poi/hssf/model SheetTest.java
avik 2003/03/01 09:56:56
Modified: src/java/org/apache/poi/hssf/model Sheet.java
Added: src/testcases/org/apache/poi/hssf/model SheetTest.java
Log:
fix for bug 14729 - cant merge more than 1027 times.
fix submitted by tony poppleton
Revision Changes Path
1.27 +80 -17 jakarta-poi/src/java/org/apache/poi/hssf/model/Sheet.java
Index: Sheet.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/Sheet.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- Sheet.java 1 Mar 2003 14:27:42 -0000 1.26
+++ Sheet.java 1 Mar 2003 17:56:55 -0000 1.27
@@ -109,8 +109,10 @@
protected FooterRecord footer = null;
protected PrintGridlinesRecord printGridlines = null;
protected MergeCellsRecord merged = null;
+ protected ArrayList mergedRecords = new ArrayList();
+ protected ArrayList mergedLocs = new ArrayList();
+ protected int numMergedRegions = 0;
protected SelectionRecord selection = null;
- protected int mergedloc = 0;
private static POILogger log = POILogFactory.getLogger(Sheet.class);
private ArrayList columnSizes = null; // holds column info
protected ValueRecordsAggregate cells = null;
@@ -191,8 +193,10 @@
}
else if (rec.getSid() == MergeCellsRecord.sid)
{
- retval.merged = ( MergeCellsRecord ) rec;
- retval.mergedloc = k - offset;
+ retval.mergedRecords.add(rec);
+ retval.merged = ( MergeCellsRecord ) rec;
+ retval.mergedLocs.add(new Integer(k - offset));
+ retval.numMergedRegions += retval.merged.getNumAreas();
}
else if (rec.getSid() == ColumnInfoRecord.sid)
{
@@ -421,36 +425,95 @@
public int addMergedRegion(int rowFrom, short colFrom, int rowTo,
short colTo)
{
- if (merged == null)
+ if (merged == null || merged.getNumAreas() == 1027)
{
- merged = ( MergeCellsRecord ) createMergedCells();
- mergedloc = records.size() - 1;
+ merged = ( MergeCellsRecord ) createMergedCells();
+ mergedRecords.add(merged);
+ mergedLocs.add(new Integer(records.size() - 1));
records.add(records.size() - 1, merged);
}
- return merged.addArea(rowFrom, colFrom, rowTo, colTo);
+ merged.addArea(rowFrom, colFrom, rowTo, colTo);
+ return numMergedRegions++;
}
public void removeMergedRegion(int index)
{
- merged.removeAreaAt(index);
- if (merged.getNumAreas() == 0)
+ //safety checks
+ if (index >= numMergedRegions || mergedRecords.size() == 0)
+ return;
+
+ int pos = 0;
+ int startNumRegions = 0;
+
+ //optimisation for current record
+ if (numMergedRegions - index < merged.getNumAreas())
{
- merged = null;
- records.remove(mergedloc);
- mergedloc = 0;
+ pos = mergedRecords.size() - 1;
+ startNumRegions = numMergedRegions - merged.getNumAreas();
+ }
+ else
+ {
+ for (int n = 0; n < mergedRecords.size(); n++)
+ {
+ MergeCellsRecord record = (MergeCellsRecord) mergedRecords.get(n);
+ if (startNumRegions + record.getNumAreas() > index)
+ {
+ pos = n;
+ break;
+ }
+ startNumRegions += record.getNumAreas();
+ }
+ }
+
+ MergeCellsRecord rec = (MergeCellsRecord) mergedRecords.get(pos);
+ rec.removeAreaAt(index - startNumRegions);
+ numMergedRegions--;
+ if (rec.getNumAreas() == 0)
+ {
+ mergedRecords.remove(pos);
+ if (merged == rec)
+ merged = (MergeCellsRecord) mergedRecords.get(mergedRecords.size() - 1);
+ int removePos = ((Integer) mergedLocs.get(pos)).intValue();
+ records.remove(removePos);
+ mergedLocs.remove(pos);
}
}
public MergeCellsRecord.MergedRegion getMergedRegionAt(int index)
{
- return merged.getAreaAt(index);
+ //safety checks
+ if (index < numMergedRegions || mergedRecords.size() == 0)
+ return null;
+
+ int pos = 0;
+ int startNumRegions = 0;
+
+ //optimisation for current record
+ if (numMergedRegions - index < merged.getNumAreas())
+ {
+ pos = mergedRecords.size() - 1;
+ startNumRegions = numMergedRegions - merged.getNumAreas();
+ }
+ else
+ {
+ for (int n = 0; n < mergedRecords.size(); n++)
+ {
+ MergeCellsRecord record = (MergeCellsRecord) mergedRecords.get(n);
+ if (startNumRegions + record.getNumAreas() > index)
+ {
+ pos = n;
+ break;
+ }
+ startNumRegions += record.getNumAreas();
+ }
+ }
+ return ((MergeCellsRecord) mergedRecords.get(pos)).getAreaAt(index - startNumRegions);
}
public int getNumMergedRegions()
- {
- return merged!=null ? merged.getNumAreas() : 0;
- }
-
+ {
+ return numMergedRegions;
+ }
/**
* This is basically a kludge to deal with the now obsolete Label records. If
1.1 jakarta-poi/src/testcases/org/apache/poi/hssf/model/SheetTest.java
Index: SheetTest.java
===================================================================
package org.apache.poi.hssf.model;
import junit.framework.TestCase;
/**
* @author Tony Poppleton
*/
public class SheetTest extends TestCase
{
/**
* Constructor for SheetTest.
* @param arg0
*/
public SheetTest(String arg0)
{
super(arg0);
}
public void testAddMergedRegion()
{
Sheet sheet = Sheet.createSheet();
int regionsToAdd = 4096;
int startRecords = sheet.getRecords().size();
//simple test that adds a load of regions
for (int n = 0; n < regionsToAdd; n++)
{
int index = sheet.addMergedRegion(0, (short) 0, 1, (short) 1);
assertTrue("Merged region index expected to be " + n + " got " + index, index == n);
}
//test all the regions were indeed added
assertTrue(sheet.getNumMergedRegions() == regionsToAdd);
//test that the regions were spread out over the appropriate number of records
int recordsAdded = sheet.getRecords().size() - startRecords;
int recordsExpected = regionsToAdd/1027;
if ((regionsToAdd % 1027) != 0)
recordsExpected++;
assertTrue("The " + regionsToAdd + " merged regions should have been spread out over " + recordsExpected + " records, not " + recordsAdded, recordsAdded == recordsExpected);
}
public void testRemoveMergedRegion()
{
Sheet sheet = Sheet.createSheet();
int regionsToAdd = 4096;
for (int n = 0; n < regionsToAdd; n++)
sheet.addMergedRegion(0, (short) 0, 1, (short) 1);
int records = sheet.getRecords().size();
//remove a third from the beginning
for (int n = 0; n < regionsToAdd/3; n++)
{
sheet.removeMergedRegion(0);
//assert they have been deleted
assertTrue("Num of regions should be " + (regionsToAdd - n - 1) + " not " + sheet.getNumMergedRegions(), sheet.getNumMergedRegions() == regionsToAdd - n - 1);
}
//assert any record removing was done
int recordsRemoved = (regionsToAdd/3)/1027; //doesn't work for particular values of regionsToAdd
assertTrue("Expected " + recordsRemoved + " record to be removed from the starting " + records + ". Currently there are " + sheet.getRecords().size() + " records", records - sheet.getRecords().size() == recordsRemoved);
}
public void testGetMergedRegionAt()
{
//TODO
}
public void testGetNumMergedRegions()
{
//TODO
}
}