]> source.dussan.org Git - poi.git/commitdiff
Changed merged region tracking to use object pointers rather than
authorDanny Mui <dmui@apache.org>
Sat, 6 Sep 2003 19:15:53 +0000 (19:15 +0000)
committerDanny Mui <dmui@apache.org>
Sat, 6 Sep 2003 19:15:53 +0000 (19:15 +0000)
 index pointers so we don't have to make sure the indices are up to date.
 PR: 22922
 Submitted by: xuemin@appresso.com (Xuemin Guan)

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353344 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/model/Sheet.java
src/testcases/org/apache/poi/hssf/model/SheetTest.java

index 0a94563c6c1aa8f626ef3c2be26636e645f331a8..d596cc9ac37774eee0d7f41ae21af9c2dec4603d 100644 (file)
@@ -112,7 +112,6 @@ public class Sheet implements Model
     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 @@ public class Sheet implements Model
             {
                 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 @@ public class Sheet implements Model
         {
             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);
+               //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(); 
+                       }
+               }
 
-            mergedLocs.remove(pos);
-            
-            //if we're not tracking merged records, kill the pointer to reset the state
-            if (mergedRecords.size() == 0) merged = null;
-            
-        }
-    }
+               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)
     {
index a2e997d8f71760c3ab12568fbb9f885f4149eb3a..3f604e9cf5f16228bcead2b80614ae13fb54d039 100644 (file)
@@ -12,6 +12,7 @@ import org.apache.poi.hssf.record.ColumnInfoRecord;
 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 @@ public class SheetTest extends TestCase
                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 class SheetTest extends TestCase
                
        }
 
-       public static void main(String [] args) {
-               System.out
-               .println("Testing : "+SheetTest.class.getName());
-               junit.textui.TestRunner.run(SheetTest.class);
-  }
 
 }