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]

Reply via email to