dmui 2003/09/06 12:15:53
Modified: src/testcases/org/apache/poi/hssf/model SheetTest.java
src/java/org/apache/poi/hssf/model Sheet.java
Log:
Changed merged region tracking to use object pointers rather than
index pointers so we don't have to make sure the indices are up to date.
PR: 22922
Submitted by: [EMAIL PROTECTED] (Xuemin Guan)
Revision Changes Path
1.5 +26 -5
jakarta-poi/src/testcases/org/apache/poi/hssf/model/SheetTest.java
Index: SheetTest.java
===================================================================
RCS file:
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/model/SheetTest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SheetTest.java 2 Jun 2003 02:47:44 -0000 1.4
+++ SheetTest.java 6 Sep 2003 19:15:53 -0000 1.5
@@ -12,6 +12,7 @@
import org.apache.poi.hssf.record.EOFRecord;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.MergeCellsRecord;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SharedFormulaRecord;
import org.apache.poi.hssf.record.StringRecord;
@@ -80,6 +81,31 @@
assertTrue("Expected " + recordsRemoved + " record to be removed from
the starting " + records + ". Currently there are " + sheet.getRecords().size() + "
records", records - sheet.getRecords().size() == recordsRemoved);
}
+ /**
+ * Bug: 22922 (Reported by Xuemin Guan)
+ * <p>
+ * Remove mergedregion fails when a sheet loses records after an initial
CreateSheet
+ * fills up the records.
+ *
+ */
+ public void testMovingMergedRegion() {
+ List records = new ArrayList();
+
+ MergeCellsRecord merged = new MergeCellsRecord();
+ merged.addArea(0, (short)0, 1, (short)2);
+ records.add(new RowRecord());
+ records.add(new RowRecord());
+ records.add(new RowRecord());
+ records.add(merged);
+
+ Sheet sheet = Sheet.createSheet(records, 0);
+ sheet.records.remove(0);
+
+ //stub object to throw off list INDEX operations
+ sheet.removeMergedRegion(0);
+ assertEquals("Should be no more merged regions", 0,
sheet.getNumMergedRegions());
+ }
+
public void testGetMergedRegionAt()
{
//TODO
@@ -231,11 +257,6 @@
}
- public static void main(String [] args) {
- System.out
- .println("Testing : "+SheetTest.class.getName());
- junit.textui.TestRunner.run(SheetTest.class);
- }
}
1.41 +46 -56 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.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- Sheet.java 23 Aug 2003 19:01:52 -0000 1.40
+++ Sheet.java 6 Sep 2003 19:15:53 -0000 1.41
@@ -112,7 +112,6 @@
protected MergeCellsRecord merged = null;
protected Margin margins[] = null;
protected ArrayList mergedRecords = new ArrayList();
- protected ArrayList mergedLocs = new ArrayList();
protected int numMergedRegions = 0;
protected SelectionRecord selection = null;
private static POILogger log =
POILogFactory.getLogger(Sheet.class);
@@ -198,7 +197,6 @@
{
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)
@@ -455,68 +453,60 @@
{
merged = ( MergeCellsRecord ) createMergedCells();
mergedRecords.add(merged);
- mergedLocs.add(new Integer(records.size() - 1));
records.add(records.size() - 1, merged);
}
merged.addArea(rowFrom, colFrom, rowTo, colTo);
return numMergedRegions++;
}
- public void removeMergedRegion(int index)
- {
- //safety checks
- if (index >= numMergedRegions || mergedRecords.size() == 0)
- return;
+ public void removeMergedRegion(int index)
+ {
+ //safety checks
+ if (index >= numMergedRegions || mergedRecords.size() == 0)
+ return;
- int pos = 0;
- int startNumRegions = 0;
+ 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();
- }
- }
-
- MergeCellsRecord rec = (MergeCellsRecord) mergedRecords.get(pos);
- rec.removeAreaAt(index - startNumRegions);
- numMergedRegions--;
- if (rec.getNumAreas() == 0)
- {
- mergedRecords.remove(pos);
- if (merged == rec) {
- //pull up the LAST record for operations when we finally
- //support continue records for mergedRegions
- if (mergedRecords.size() > 0) {
- merged = (MergeCellsRecord)
mergedRecords.get(mergedRecords.size() - 1);
- } else {
- merged = null;
- }
- }
-
- int removePos = ((Integer) mergedLocs.get(pos)).intValue();
- records.remove(removePos);
-
- mergedLocs.remove(pos);
-
- //if we're not tracking merged records, kill the pointer to reset the
state
- if (mergedRecords.size() == 0) merged = null;
-
- }
- }
+ //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();
+ }
+ }
+
+ MergeCellsRecord rec = (MergeCellsRecord) mergedRecords.get(pos);
+ rec.removeAreaAt(index - startNumRegions);
+ numMergedRegions--;
+ if (rec.getNumAreas() == 0)
+ {
+ mergedRecords.remove(pos);
+ //get rid of the record from the sheet
+ records.remove(merged);
+ if (merged == rec) {
+ //pull up the LAST record for operations when we
finally
+ //support continue records for mergedRegions
+ if (mergedRecords.size() > 0) {
+ merged = (MergeCellsRecord)
mergedRecords.get(mergedRecords.size() - 1);
+ } else {
+ merged = null;
+ }
+ }
+ }
+ }
public MergeCellsRecord.MergedRegion getMergedRegionAt(int index)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]